diff options
| author | Karl Heuer | 1997-05-15 02:23:20 +0000 |
|---|---|---|
| committer | Karl Heuer | 1997-05-15 02:23:20 +0000 |
| commit | c0c15b93398f689277e3e698dd12368475bfc978 (patch) | |
| tree | 19874715e88c75e590138e9ba3cdcf885118ff53 /src | |
| parent | b7064fbe243a8fd7b98f2fca6fad08b47474f5df (diff) | |
| download | emacs-c0c15b93398f689277e3e698dd12368475bfc978.tar.gz emacs-c0c15b93398f689277e3e698dd12368475bfc978.zip | |
Include charset.h.
(compute_trt_inverse): Totally rewritten.
Args are now Lisp_Object. Callers changed.
(compute_trt_identity, compute_trt_shuffle): New subroutines.
(init_casetab_once): Use XSETFASTINT to store into case table;
use CHAR_TABLE_SINGLE_BYTE_SLOTS to end the loop.
Diffstat (limited to 'src')
| -rw-r--r-- | src/casetab.c | 111 |
1 files changed, 83 insertions, 28 deletions
diff --git a/src/casetab.c b/src/casetab.c index 9bec57f068e..4e901cc1cb4 100644 --- a/src/casetab.c +++ b/src/casetab.c | |||
| @@ -23,6 +23,7 @@ Boston, MA 02111-1307, USA. */ | |||
| 23 | #include <config.h> | 23 | #include <config.h> |
| 24 | #include "lisp.h" | 24 | #include "lisp.h" |
| 25 | #include "buffer.h" | 25 | #include "buffer.h" |
| 26 | #include "charset.h" | ||
| 26 | 27 | ||
| 27 | Lisp_Object Qcase_table_p, Qcase_table; | 28 | Lisp_Object Qcase_table_p, Qcase_table; |
| 28 | Lisp_Object Vascii_downcase_table, Vascii_upcase_table; | 29 | Lisp_Object Vascii_downcase_table, Vascii_upcase_table; |
| @@ -129,7 +130,7 @@ set_case_table (table, standard) | |||
| 129 | if (NILP (up)) | 130 | if (NILP (up)) |
| 130 | { | 131 | { |
| 131 | up = Fmake_char_table (Qcase_table, Qnil); | 132 | up = Fmake_char_table (Qcase_table, Qnil); |
| 132 | compute_trt_inverse (XCHAR_TABLE (table), XCHAR_TABLE (up)); | 133 | compute_trt_inverse (table, up); |
| 133 | XCHAR_TABLE (table)->extras[0] = up; | 134 | XCHAR_TABLE (table)->extras[0] = up; |
| 134 | } | 135 | } |
| 135 | 136 | ||
| @@ -144,7 +145,7 @@ set_case_table (table, standard) | |||
| 144 | /* Set up the CANON vector; for each character, | 145 | /* Set up the CANON vector; for each character, |
| 145 | this sequence of upcasing and downcasing ought to | 146 | this sequence of upcasing and downcasing ought to |
| 146 | get the "preferred" lowercase equivalent. */ | 147 | get the "preferred" lowercase equivalent. */ |
| 147 | for (i = 0; i < 256; i++) | 148 | for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++) |
| 148 | XCHAR_TABLE (canon)->contents[i] = downvec[upvec[downvec[i]]]; | 149 | XCHAR_TABLE (canon)->contents[i] = downvec[upvec[downvec[i]]]; |
| 149 | XCHAR_TABLE (table)->extras[1] = canon; | 150 | XCHAR_TABLE (table)->extras[1] = canon; |
| 150 | } | 151 | } |
| @@ -152,7 +153,7 @@ set_case_table (table, standard) | |||
| 152 | if (NILP (eqv)) | 153 | if (NILP (eqv)) |
| 153 | { | 154 | { |
| 154 | eqv = Fmake_char_table (Qcase_table, Qnil); | 155 | eqv = Fmake_char_table (Qcase_table, Qnil); |
| 155 | compute_trt_inverse (XCHAR_TABLE (canon), XCHAR_TABLE (eqv)); | 156 | compute_trt_inverse (canon, eqv); |
| 156 | XCHAR_TABLE (table)->extras[2] = eqv; | 157 | XCHAR_TABLE (table)->extras[2] = eqv; |
| 157 | } | 158 | } |
| 158 | 159 | ||
| @@ -169,32 +170,85 @@ set_case_table (table, standard) | |||
| 169 | return table; | 170 | return table; |
| 170 | } | 171 | } |
| 171 | 172 | ||
| 172 | /* Given a translate table TRT, store the inverse mapping into INVERSE. | 173 | static void |
| 173 | Since TRT is not one-to-one, INVERSE is not a simple mapping. | 174 | compute_trt_identity (bytes, depth, trt, inverse) |
| 174 | Instead, it divides the space of characters into equivalence classes. | 175 | unsigned char *bytes; |
| 175 | All characters in a given class form one circular list, chained through | 176 | int depth; |
| 176 | the elements of INVERSE. */ | 177 | struct Lisp_Char_Table *trt, *inverse; |
| 178 | { | ||
| 179 | register int i; | ||
| 180 | |||
| 181 | for (i = 0; i < CHAR_TABLE_ORDINARY_SLOTS; i++) | ||
| 182 | { | ||
| 183 | if (NATNUMP (trt->contents[i])) | ||
| 184 | { | ||
| 185 | bytes[depth] = i; | ||
| 186 | XSETFASTINT (inverse->contents[i], | ||
| 187 | (depth == 0 && i < CHAR_TABLE_SINGLE_BYTE_SLOTS ? i | ||
| 188 | : MAKE_NON_ASCII_CHAR (bytes[0]-128, | ||
| 189 | bytes[1], bytes[2]))); | ||
| 190 | } | ||
| 191 | else if (CHAR_TABLE_P (trt->contents[i])) | ||
| 192 | { | ||
| 193 | bytes[depth] = i; | ||
| 194 | inverse->contents[i] = Fmake_char_table (Qnil, Qnil); | ||
| 195 | compute_trt_identity (bytes, depth + 1, | ||
| 196 | XCHAR_TABLE (trt->contents[i]), | ||
| 197 | XCHAR_TABLE (inverse->contents[i])); | ||
| 198 | } | ||
| 199 | else /* must be Qnil or Qidentity */ | ||
| 200 | inverse->contents[i] = trt->contents[i]; | ||
| 201 | } | ||
| 202 | } | ||
| 177 | 203 | ||
| 178 | static void | 204 | static void |
| 179 | compute_trt_inverse (trt, inverse) | 205 | compute_trt_shuffle (bytes, depth, ibase, trt, inverse) |
| 206 | unsigned char *bytes; | ||
| 207 | int depth; | ||
| 208 | Lisp_Object ibase; | ||
| 180 | struct Lisp_Char_Table *trt, *inverse; | 209 | struct Lisp_Char_Table *trt, *inverse; |
| 181 | { | 210 | { |
| 182 | register int i = 0400; | 211 | register int i; |
| 183 | register unsigned char c, q; | 212 | Lisp_Object j, tem, q; |
| 184 | 213 | ||
| 185 | while (i--) | 214 | for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++) |
| 186 | inverse->contents[i] = i; | ||
| 187 | i = 0400; | ||
| 188 | while (i--) | ||
| 189 | { | 215 | { |
| 190 | if ((q = trt->contents[i]) != (unsigned char) i) | 216 | bytes[depth] = i; |
| 217 | XSETFASTINT (j, | ||
| 218 | (depth == 0 && i < CHAR_TABLE_SINGLE_BYTE_SLOTS ? i | ||
| 219 | : MAKE_NON_ASCII_CHAR (bytes[0]-128, | ||
| 220 | bytes[1], bytes[2]))); | ||
| 221 | q = trt->contents[i]; | ||
| 222 | if (NATNUMP (q) && XFASTINT (q) != XFASTINT (j)) | ||
| 223 | { | ||
| 224 | tem = Faref (ibase, q); | ||
| 225 | Faset (ibase, q, j); | ||
| 226 | Faset (ibase, j, tem); | ||
| 227 | } | ||
| 228 | else if (CHAR_TABLE_P (q)) | ||
| 191 | { | 229 | { |
| 192 | c = inverse->contents[q]; | 230 | bytes[depth] = i; |
| 193 | inverse->contents[q] = i; | 231 | compute_trt_shuffle (bytes, depth + 1, ibase, |
| 194 | inverse->contents[i] = c; | 232 | XCHAR_TABLE (trt->contents[i]), |
| 233 | XCHAR_TABLE (inverse->contents[i])); | ||
| 195 | } | 234 | } |
| 196 | } | 235 | } |
| 197 | } | 236 | } |
| 237 | |||
| 238 | /* Given a translate table TRT, store the inverse mapping into INVERSE. | ||
| 239 | Since TRT is not one-to-one, INVERSE is not a simple mapping. | ||
| 240 | Instead, it divides the space of characters into equivalence classes. | ||
| 241 | All characters in a given class form one circular list, chained through | ||
| 242 | the elements of INVERSE. */ | ||
| 243 | |||
| 244 | static void | ||
| 245 | compute_trt_inverse (trt, inv) | ||
| 246 | Lisp_Object trt, inv; | ||
| 247 | { | ||
| 248 | unsigned char bytes[3]; | ||
| 249 | compute_trt_identity (bytes, 0, XCHAR_TABLE (trt), XCHAR_TABLE (inv)); | ||
| 250 | compute_trt_shuffle (bytes, 0, inv, XCHAR_TABLE (trt), XCHAR_TABLE (inv)); | ||
| 251 | } | ||
| 198 | 252 | ||
| 199 | init_casetab_once () | 253 | init_casetab_once () |
| 200 | { | 254 | { |
| @@ -216,21 +270,22 @@ init_casetab_once () | |||
| 216 | Vascii_downcase_table = down; | 270 | Vascii_downcase_table = down; |
| 217 | XCHAR_TABLE (down)->purpose = Qcase_table; | 271 | XCHAR_TABLE (down)->purpose = Qcase_table; |
| 218 | 272 | ||
| 219 | for (i = 0; i < 256; i++) | 273 | for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++) |
| 220 | XCHAR_TABLE (down)->contents[i] = (i >= 'A' && i <= 'Z') ? i + 040 : i; | 274 | XSETFASTINT (XCHAR_TABLE (down)->contents[i], |
| 275 | (i >= 'A' && i <= 'Z') ? i + ('a' - 'A') : i); | ||
| 221 | 276 | ||
| 222 | XCHAR_TABLE (down)->extras[1] = Fcopy_sequence (down); | 277 | XCHAR_TABLE (down)->extras[1] = Fcopy_sequence (down); |
| 223 | 278 | ||
| 224 | up = Fmake_char_table (Qcase_table, Qnil); | 279 | up = Fmake_char_table (Qcase_table, Qnil); |
| 225 | XCHAR_TABLE (down)->extras[0] = up; | 280 | XCHAR_TABLE (down)->extras[0] = up; |
| 226 | 281 | ||
| 227 | for (i = 0; i < 256; i++) | 282 | for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++) |
| 228 | XCHAR_TABLE (up)->contents[i] | 283 | XSETFASTINT (XCHAR_TABLE (up)->contents[i], |
| 229 | = ((i >= 'A' && i <= 'Z') | 284 | ((i >= 'A' && i <= 'Z') |
| 230 | ? i + ('a' - 'A') | 285 | ? i + ('a' - 'A') |
| 231 | : ((i >= 'a' && i <= 'z') | 286 | : ((i >= 'a' && i <= 'z') |
| 232 | ? i + ('A' - 'a') | 287 | ? i + ('A' - 'a') |
| 233 | : i)); | 288 | : i))); |
| 234 | 289 | ||
| 235 | XCHAR_TABLE (down)->extras[2] = Fcopy_sequence (up); | 290 | XCHAR_TABLE (down)->extras[2] = Fcopy_sequence (up); |
| 236 | } | 291 | } |