Mercurial > hg > xemacs-beta
comparison src/chartab.c @ 183:e121b013d1f0 r20-3b18
Import from CVS: tag r20-3b18
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:54:23 +0200 |
parents | bfd6434d15b3 |
children | 3d6bfa290dbd |
comparison
equal
deleted
inserted
replaced
182:f07455f06202 | 183:e121b013d1f0 |
---|---|
49 Lisp_Object Qcategory_table_p; | 49 Lisp_Object Qcategory_table_p; |
50 Lisp_Object Qcategory_designator_p; | 50 Lisp_Object Qcategory_designator_p; |
51 Lisp_Object Qcategory_table_value_p; | 51 Lisp_Object Qcategory_table_value_p; |
52 | 52 |
53 Lisp_Object Vstandard_category_table; | 53 Lisp_Object Vstandard_category_table; |
54 #endif | 54 #endif /* MULE */ |
55 | 55 |
56 | 56 |
57 /* A char table maps from ranges of characters to values. | 57 /* A char table maps from ranges of characters to values. |
58 | 58 |
59 Implementing a general data structure that maps from arbitrary | 59 Implementing a general data structure that maps from arbitrary |
60 ranges of numbers to values is tricky to do efficiently. As it | 60 ranges of numbers to values is tricky to do efficiently. As it |
61 happens, it should suffice fine (and is usually more convenient, | 61 happens, it should suffice (and is usually more convenient, anyway) |
62 anyway) when dealing with characters to restrict the sorts of | 62 when dealing with characters to restrict the sorts of ranges that |
63 ranges that can be assigned values, as follows: | 63 can be assigned values, as follows: |
64 | 64 |
65 1) All characters. | 65 1) All characters. |
66 2) All characters in a charset. | 66 2) All characters in a charset. |
67 3) All characters in a particular row of a charset, where a "row" | 67 3) All characters in a particular row of a charset, where a "row" |
68 means all characters with the same first byte. | 68 means all characters with the same first byte. |
69 4) A particular character in a charset. | 69 4) A particular character in a charset. |
70 | 70 |
71 | |
72 We use char tables to generalize the 256-element vectors now | 71 We use char tables to generalize the 256-element vectors now |
73 littering the Emacs code. | 72 littering the Emacs code. |
74 | 73 |
75 Possible uses (all should be converted at some point): | 74 Possible uses (all should be converted at some point): |
76 | 75 |
84 abstract type to generalize the Emacs vectors and Mule | 83 abstract type to generalize the Emacs vectors and Mule |
85 vectors-of-vectors goo. | 84 vectors-of-vectors goo. |
86 */ | 85 */ |
87 | 86 |
88 /************************************************************************/ | 87 /************************************************************************/ |
89 /* Char Table object */ | 88 /* Char Table object */ |
90 /************************************************************************/ | 89 /************************************************************************/ |
91 | 90 |
92 #ifdef MULE | 91 #ifdef MULE |
93 | 92 |
94 static Lisp_Object mark_char_table_entry (Lisp_Object, void (*) (Lisp_Object)); | 93 static Lisp_Object mark_char_table_entry (Lisp_Object, void (*) (Lisp_Object)); |
197 case CHAR_TABLE_TYPE_CHAR: return Qchar; | 196 case CHAR_TABLE_TYPE_CHAR: return Qchar; |
198 #ifdef MULE | 197 #ifdef MULE |
199 case CHAR_TABLE_TYPE_CATEGORY: return Qcategory; | 198 case CHAR_TABLE_TYPE_CATEGORY: return Qcategory; |
200 #endif | 199 #endif |
201 } | 200 } |
202 | 201 |
203 abort (); | 202 abort (); |
204 return Qnil; /* not reached */ | 203 return Qnil; /* not reached */ |
205 } | 204 } |
206 | 205 |
207 static enum char_table_type | 206 static enum char_table_type |
208 symbol_to_char_table_type (Lisp_Object symbol) | 207 symbol_to_char_table_type (Lisp_Object symbol) |
209 { | 208 { |
210 CHECK_SYMBOL (symbol); | 209 CHECK_SYMBOL (symbol); |
211 | 210 |
212 if (EQ (symbol, Qgeneric)) return CHAR_TABLE_TYPE_GENERIC; | 211 if (EQ (symbol, Qgeneric)) return CHAR_TABLE_TYPE_GENERIC; |
213 if (EQ (symbol, Qsyntax)) return CHAR_TABLE_TYPE_SYNTAX; | 212 if (EQ (symbol, Qsyntax)) return CHAR_TABLE_TYPE_SYNTAX; |
214 if (EQ (symbol, Qdisplay)) return CHAR_TABLE_TYPE_DISPLAY; | 213 if (EQ (symbol, Qdisplay)) return CHAR_TABLE_TYPE_DISPLAY; |
215 if (EQ (symbol, Qchar)) return CHAR_TABLE_TYPE_CHAR; | 214 if (EQ (symbol, Qchar)) return CHAR_TABLE_TYPE_CHAR; |
216 #ifdef MULE | 215 #ifdef MULE |
217 if (EQ (symbol, Qcategory)) return CHAR_TABLE_TYPE_CATEGORY; | 216 if (EQ (symbol, Qcategory)) return CHAR_TABLE_TYPE_CATEGORY; |
218 #endif | 217 #endif |
219 | 218 |
220 signal_simple_error ("Unrecognized char table type", symbol); | 219 signal_simple_error ("Unrecognized char table type", symbol); |
221 return CHAR_TABLE_TYPE_GENERIC; /* not reached */ | 220 return CHAR_TABLE_TYPE_GENERIC; /* not reached */ |
222 } | 221 } |
223 | 222 |
224 static void | 223 static void |
277 cat, printcharfun); | 276 cat, printcharfun); |
278 first = -1; | 277 first = -1; |
279 i--; | 278 i--; |
280 } | 279 } |
281 } | 280 } |
282 | 281 |
283 if (first != -1) | 282 if (first != -1) |
284 { | 283 { |
285 if (row == -1) | 284 if (row == -1) |
286 print_chartab_range (MAKE_CHAR (charset, first, 0), | 285 print_chartab_range (MAKE_CHAR (charset, first, 0), |
287 MAKE_CHAR (charset, i - 1, 0), | 286 MAKE_CHAR (charset, i - 1, 0), |
325 static void | 324 static void |
326 print_char_table (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) | 325 print_char_table (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) |
327 { | 326 { |
328 struct Lisp_Char_Table *ct = XCHAR_TABLE (obj); | 327 struct Lisp_Char_Table *ct = XCHAR_TABLE (obj); |
329 char buf[200]; | 328 char buf[200]; |
330 | 329 |
331 sprintf (buf, "#s(char-table type %s data (", | 330 sprintf (buf, "#s(char-table type %s data (", |
332 string_data (symbol_name (XSYMBOL | 331 string_data (symbol_name (XSYMBOL |
333 (char_table_type_to_symbol (ct->type))))); | 332 (char_table_type_to_symbol (ct->type))))); |
334 write_c_string (buf, printcharfun); | 333 write_c_string (buf, printcharfun); |
335 | 334 |
565 case CHAR_TABLE_TYPE_GENERIC: | 564 case CHAR_TABLE_TYPE_GENERIC: |
566 #ifdef MULE | 565 #ifdef MULE |
567 case CHAR_TABLE_TYPE_CATEGORY: | 566 case CHAR_TABLE_TYPE_CATEGORY: |
568 fill_char_table (ct, Qnil); | 567 fill_char_table (ct, Qnil); |
569 break; | 568 break; |
570 #endif | 569 #endif /* MULE */ |
571 | 570 |
572 case CHAR_TABLE_TYPE_SYNTAX: | 571 case CHAR_TABLE_TYPE_SYNTAX: |
573 fill_char_table (ct, make_int (Sinherit)); | 572 fill_char_table (ct, make_int (Sinherit)); |
574 break; | 573 break; |
575 | 574 |
784 } | 783 } |
785 | 784 |
786 #endif /* MULE */ | 785 #endif /* MULE */ |
787 | 786 |
788 static Lisp_Object | 787 static Lisp_Object |
789 get_char_table (Emchar ch, struct Lisp_Char_Table *ct) | 788 get_char_table (Emchar ch, struct Lisp_Char_Table *ct) |
790 { | 789 { |
791 #ifdef MULE | 790 #ifdef MULE |
792 { | 791 { |
793 Lisp_Object charset; | 792 Lisp_Object charset; |
794 int byte1, byte2; | 793 int byte1, byte2; |
795 Lisp_Object val; | 794 Lisp_Object val; |
796 | 795 |
797 BREAKUP_CHAR (ch, charset, byte1, byte2); | 796 BREAKUP_CHAR (ch, charset, byte1, byte2); |
798 | 797 |
799 if (EQ (charset, Vcharset_ascii)) | 798 if (EQ (charset, Vcharset_ascii)) |
800 val = ct->ascii[byte1]; | 799 val = ct->ascii[byte1]; |
801 else if (EQ (charset, Vcharset_control_1)) | 800 else if (EQ (charset, Vcharset_control_1)) |
802 val = ct->ascii[byte1 + 128]; | 801 val = ct->ascii[byte1 + 128]; |
803 else | 802 else |
830 Find value for char CH in TABLE. | 829 Find value for char CH in TABLE. |
831 */ | 830 */ |
832 (ch, table)) | 831 (ch, table)) |
833 { | 832 { |
834 struct Lisp_Char_Table *ct; | 833 struct Lisp_Char_Table *ct; |
835 Emchar chr; | 834 |
836 | |
837 CHECK_CHAR_TABLE (table); | 835 CHECK_CHAR_TABLE (table); |
838 ct = XCHAR_TABLE (table); | 836 ct = XCHAR_TABLE (table); |
839 CHECK_CHAR_COERCE_INT (ch); | 837 CHECK_CHAR_COERCE_INT (ch); |
840 chr = XCHAR(ch); | 838 |
841 | 839 return get_char_table (XCHAR (ch), ct); |
842 return get_char_table (chr, ct); | |
843 } | 840 } |
844 | 841 |
845 DEFUN ("get-range-char-table", Fget_range_char_table, 2, 3, 0, /* | 842 DEFUN ("get-range-char-table", Fget_range_char_table, 2, 3, 0, /* |
846 Find value for a range in TABLE. | 843 Find value for a range in TABLE. |
847 If there is more than one value, return MULTI (defaults to nil). | 844 If there is more than one value, return MULTI (defaults to nil). |
861 { | 858 { |
862 case CHARTAB_RANGE_ALL: | 859 case CHARTAB_RANGE_ALL: |
863 { | 860 { |
864 int i; | 861 int i; |
865 Lisp_Object first = ct->ascii[0]; | 862 Lisp_Object first = ct->ascii[0]; |
866 | 863 |
867 for (i = 1; i < NUM_ASCII_CHARS; i++) | 864 for (i = 1; i < NUM_ASCII_CHARS; i++) |
868 if (!EQ (first, ct->ascii[i])) | 865 if (!EQ (first, ct->ascii[i])) |
869 return multi; | 866 return multi; |
870 | 867 |
871 #ifdef MULE | 868 #ifdef MULE |
872 for (i = MIN_LEADING_BYTE; i < MIN_LEADING_BYTE + NUM_LEADING_BYTES; | 869 for (i = MIN_LEADING_BYTE; i < MIN_LEADING_BYTE + NUM_LEADING_BYTES; |
873 i++) | 870 i++) |
874 { | 871 { |
875 if (!CHARSETP (CHARSET_BY_LEADING_BYTE (i)) | 872 if (!CHARSETP (CHARSET_BY_LEADING_BYTE (i)) |
888 case CHARTAB_RANGE_CHARSET: | 885 case CHARTAB_RANGE_CHARSET: |
889 if (EQ (rainj.charset, Vcharset_ascii)) | 886 if (EQ (rainj.charset, Vcharset_ascii)) |
890 { | 887 { |
891 int i; | 888 int i; |
892 Lisp_Object first = ct->ascii[0]; | 889 Lisp_Object first = ct->ascii[0]; |
893 | 890 |
894 for (i = 1; i < 128; i++) | 891 for (i = 1; i < 128; i++) |
895 if (!EQ (first, ct->ascii[i])) | 892 if (!EQ (first, ct->ascii[i])) |
896 return multi; | 893 return multi; |
897 return first; | 894 return first; |
898 } | 895 } |
899 | 896 |
900 if (EQ (rainj.charset, Vcharset_control_1)) | 897 if (EQ (rainj.charset, Vcharset_control_1)) |
901 { | 898 { |
902 int i; | 899 int i; |
903 Lisp_Object first = ct->ascii[128]; | 900 Lisp_Object first = ct->ascii[128]; |
904 | 901 |
905 for (i = 129; i < 160; i++) | 902 for (i = 129; i < 160; i++) |
906 if (!EQ (first, ct->ascii[i])) | 903 if (!EQ (first, ct->ascii[i])) |
907 return multi; | 904 return multi; |
908 return first; | 905 return first; |
909 } | 906 } |
910 | 907 |
911 { | 908 { |
912 Lisp_Object val = ct->level1[XCHARSET_LEADING_BYTE (rainj.charset) - | 909 Lisp_Object val = ct->level1[XCHARSET_LEADING_BYTE (rainj.charset) - |
913 MIN_LEADING_BYTE]; | 910 MIN_LEADING_BYTE]; |
914 if (CHAR_TABLE_ENTRYP (val)) | 911 if (CHAR_TABLE_ENTRYP (val)) |
915 return multi; | 912 return multi; |
960 case CHAR_TABLE_TYPE_CATEGORY: | 957 case CHAR_TABLE_TYPE_CATEGORY: |
961 if (!ERRB_EQ (errb, ERROR_ME)) | 958 if (!ERRB_EQ (errb, ERROR_ME)) |
962 return CATEGORY_TABLE_VALUEP (value); | 959 return CATEGORY_TABLE_VALUEP (value); |
963 CHECK_CATEGORY_TABLE_VALUE (value); | 960 CHECK_CATEGORY_TABLE_VALUE (value); |
964 break; | 961 break; |
965 #endif | 962 #endif /* MULE */ |
966 | 963 |
967 case CHAR_TABLE_TYPE_GENERIC: | 964 case CHAR_TABLE_TYPE_GENERIC: |
968 return 1; | 965 return 1; |
969 | 966 |
970 case CHAR_TABLE_TYPE_DISPLAY: | 967 case CHAR_TABLE_TYPE_DISPLAY: |
1076 case CHARTAB_RANGE_CHAR: | 1073 case CHARTAB_RANGE_CHAR: |
1077 #ifdef MULE | 1074 #ifdef MULE |
1078 { | 1075 { |
1079 Lisp_Object charset; | 1076 Lisp_Object charset; |
1080 int byte1, byte2; | 1077 int byte1, byte2; |
1081 | 1078 |
1082 BREAKUP_CHAR (range->ch, charset, byte1, byte2); | 1079 BREAKUP_CHAR (range->ch, charset, byte1, byte2); |
1083 if (EQ (charset, Vcharset_ascii)) | 1080 if (EQ (charset, Vcharset_ascii)) |
1084 ct->ascii[byte1] = val; | 1081 ct->ascii[byte1] = val; |
1085 else if (EQ (charset, Vcharset_control_1)) | 1082 else if (EQ (charset, Vcharset_control_1)) |
1086 ct->ascii[byte1 + 128] = val; | 1083 ct->ascii[byte1 + 128] = val; |
1155 map_over_charset_ascii (struct Lisp_Char_Table *ct, | 1152 map_over_charset_ascii (struct Lisp_Char_Table *ct, |
1156 int (*fn) (struct chartab_range *range, | 1153 int (*fn) (struct chartab_range *range, |
1157 Lisp_Object val, void *arg), | 1154 Lisp_Object val, void *arg), |
1158 void *arg) | 1155 void *arg) |
1159 { | 1156 { |
1160 int i; | 1157 struct chartab_range rainj; |
1161 | 1158 int i, retval; |
1162 #ifdef MULE | 1159 int start = 0; |
1163 for (i = 0; i < 128; i++) | 1160 #ifdef MULE |
1161 int stop = 128; | |
1164 #else | 1162 #else |
1165 for (i = 0; i < 256; i++) | 1163 int stop = 256; |
1166 #endif | 1164 #endif |
1167 { | 1165 |
1168 Lisp_Object val = ct->ascii[i]; | 1166 rainj.type = CHARTAB_RANGE_CHAR; |
1169 struct chartab_range rainj; | 1167 |
1170 int retval; | 1168 for (i = start, retval = 0; i < stop && retval == 0; i++) |
1171 | 1169 { |
1172 rainj.type = CHARTAB_RANGE_CHAR; | |
1173 rainj.ch = (Emchar) i; | 1170 rainj.ch = (Emchar) i; |
1174 retval = (fn) (&rainj, val, arg); | 1171 retval = (fn) (&rainj, ct->ascii[i], arg); |
1175 if (retval) | 1172 } |
1176 return retval; | 1173 |
1177 } | 1174 return retval; |
1178 | |
1179 return 0; | |
1180 } | 1175 } |
1181 | 1176 |
1182 #ifdef MULE | 1177 #ifdef MULE |
1183 | 1178 |
1184 /* Map FN over the Control-1 chars in CT. */ | 1179 /* Map FN over the Control-1 chars in CT. */ |
1187 map_over_charset_control_1 (struct Lisp_Char_Table *ct, | 1182 map_over_charset_control_1 (struct Lisp_Char_Table *ct, |
1188 int (*fn) (struct chartab_range *range, | 1183 int (*fn) (struct chartab_range *range, |
1189 Lisp_Object val, void *arg), | 1184 Lisp_Object val, void *arg), |
1190 void *arg) | 1185 void *arg) |
1191 { | 1186 { |
1192 int i; | 1187 struct chartab_range rainj; |
1193 | 1188 int i, retval; |
1194 for (i = 0; i < 32; i++) | 1189 int start = 128; |
1195 { | 1190 int stop = start + 32; |
1196 Lisp_Object val = ct->ascii[i + 128]; | 1191 |
1197 struct chartab_range rainj; | 1192 rainj.type = CHARTAB_RANGE_CHAR; |
1198 int retval; | 1193 |
1199 | 1194 for (i = start, retval = 0; i < stop && retval == 0; i++) |
1200 rainj.type = CHARTAB_RANGE_CHAR; | 1195 { |
1201 rainj.ch = (Emchar) (i + 128); | 1196 rainj.ch = (Emchar) (i); |
1202 retval = (fn) (&rainj, val, arg); | 1197 retval = (fn) (&rainj, ct->ascii[i], arg); |
1203 if (retval) | 1198 } |
1204 return retval; | 1199 |
1205 } | 1200 return retval; |
1206 | |
1207 return 0; | |
1208 } | 1201 } |
1209 | 1202 |
1210 /* Map FN over the row ROW of two-byte charset CHARSET. | 1203 /* Map FN over the row ROW of two-byte charset CHARSET. |
1211 There must be a separate value for that row in the char table. | 1204 There must be a separate value for that row in the char table. |
1212 CTE specifies the char table entry for CHARSET. */ | 1205 CTE specifies the char table entry for CHARSET. */ |
1216 Lisp_Object charset, int row, | 1209 Lisp_Object charset, int row, |
1217 int (*fn) (struct chartab_range *range, | 1210 int (*fn) (struct chartab_range *range, |
1218 Lisp_Object val, void *arg), | 1211 Lisp_Object val, void *arg), |
1219 void *arg) | 1212 void *arg) |
1220 { | 1213 { |
1221 Lisp_Object val; | 1214 Lisp_Object val = cte->level2[row - 32]; |
1222 | 1215 |
1223 val = cte->level2[row - 32]; | |
1224 if (!CHAR_TABLE_ENTRYP (val)) | 1216 if (!CHAR_TABLE_ENTRYP (val)) |
1225 { | 1217 { |
1226 struct chartab_range rainj; | 1218 struct chartab_range rainj; |
1227 | 1219 |
1228 rainj.type = CHARTAB_RANGE_ROW; | 1220 rainj.type = CHARTAB_RANGE_ROW; |
1230 rainj.row = row; | 1222 rainj.row = row; |
1231 return (fn) (&rainj, val, arg); | 1223 return (fn) (&rainj, val, arg); |
1232 } | 1224 } |
1233 else | 1225 else |
1234 { | 1226 { |
1235 int i; | 1227 struct chartab_range rainj; |
1236 int start, stop; | 1228 int i, retval; |
1237 | 1229 int charset94_p = (XCHARSET_CHARS (charset) == 94); |
1230 int start = charset94_p ? 33 : 32; | |
1231 int stop = charset94_p ? 127 : 128; | |
1232 | |
1238 cte = XCHAR_TABLE_ENTRY (val); | 1233 cte = XCHAR_TABLE_ENTRY (val); |
1239 if (XCHARSET_CHARS (charset) == 94) | 1234 |
1235 rainj.type = CHARTAB_RANGE_CHAR; | |
1236 | |
1237 for (i = start, retval = 0; i < stop && retval == 0; i++) | |
1240 { | 1238 { |
1241 start = 33; | 1239 rainj.ch = MAKE_CHAR (charset, row, i); |
1242 stop = 127; | 1240 retval = (fn) (&rainj, cte->level2[i - 32], arg); |
1243 } | 1241 } |
1244 else | 1242 return retval; |
1245 { | 1243 } |
1246 start = 32; | 1244 } |
1247 stop = 128; | 1245 |
1248 } | |
1249 | |
1250 for (i = start; i < stop; i++) | |
1251 { | |
1252 int retval; | |
1253 struct chartab_range rainj; | |
1254 | |
1255 rainj.type = CHARTAB_RANGE_CHAR; | |
1256 rainj.ch = MAKE_CHAR (charset, row, i); | |
1257 | |
1258 val = cte->level2[i - 32]; | |
1259 retval = (fn) (&rainj, val, arg); | |
1260 if (retval) | |
1261 return retval; | |
1262 } | |
1263 } | |
1264 | |
1265 return 0; | |
1266 } | |
1267 | 1246 |
1268 static int | 1247 static int |
1269 map_over_other_charset (struct Lisp_Char_Table *ct, int lb, | 1248 map_over_other_charset (struct Lisp_Char_Table *ct, int lb, |
1270 int (*fn) (struct chartab_range *range, | 1249 int (*fn) (struct chartab_range *range, |
1271 Lisp_Object val, void *arg), | 1250 Lisp_Object val, void *arg), |
1272 void *arg) | 1251 void *arg) |
1273 { | 1252 { |
1274 Lisp_Object val = ct->level1[lb - MIN_LEADING_BYTE]; | 1253 Lisp_Object val = ct->level1[lb - MIN_LEADING_BYTE]; |
1275 Lisp_Object charset = CHARSET_BY_LEADING_BYTE (lb); | 1254 Lisp_Object charset = CHARSET_BY_LEADING_BYTE (lb); |
1276 | 1255 |
1277 if (!CHARSETP (charset) | 1256 if (!CHARSETP (charset) |
1278 || lb == LEADING_BYTE_ASCII | 1257 || lb == LEADING_BYTE_ASCII |
1279 || lb == LEADING_BYTE_CONTROL_1) | 1258 || lb == LEADING_BYTE_CONTROL_1) |
1280 return 0; | 1259 return 0; |
1281 | 1260 |
1282 if (!CHAR_TABLE_ENTRYP (val)) | 1261 if (!CHAR_TABLE_ENTRYP (val)) |
1283 { | 1262 { |
1284 struct chartab_range rainj; | 1263 struct chartab_range rainj; |
1285 | 1264 |
1286 rainj.type = CHARTAB_RANGE_CHARSET; | 1265 rainj.type = CHARTAB_RANGE_CHARSET; |
1287 rainj.charset = charset; | 1266 rainj.charset = charset; |
1288 return (fn) (&rainj, val, arg); | 1267 return (fn) (&rainj, val, arg); |
1289 } | 1268 } |
1290 | 1269 |
1291 { | 1270 { |
1292 struct Lisp_Char_Table_Entry *cte = XCHAR_TABLE_ENTRY (val); | 1271 struct Lisp_Char_Table_Entry *cte = XCHAR_TABLE_ENTRY (val); |
1293 int charset94_p = (XCHARSET_CHARS (charset) == 94); | 1272 int charset94_p = (XCHARSET_CHARS (charset) == 94); |
1294 int start = charset94_p ? 33 : 32; | 1273 int start = charset94_p ? 33 : 32; |
1295 int stop = charset94_p ? 127 : 128; | 1274 int stop = charset94_p ? 127 : 128; |
1296 int i, retval; | 1275 int i, retval; |
1297 | 1276 |
1298 if (XCHARSET_DIMENSION (charset) == 1) | 1277 if (XCHARSET_DIMENSION (charset) == 1) |
1299 for (i = start; i < stop; i++) | 1278 { |
1300 { | 1279 struct chartab_range rainj; |
1301 struct chartab_range rainj; | 1280 rainj.type = CHARTAB_RANGE_CHAR; |
1302 | 1281 |
1303 rainj.type = CHARTAB_RANGE_CHAR; | 1282 for (i = start, retval = 0; i < stop && retval == 0; i++) |
1304 rainj.ch = MAKE_CHAR (charset, i, 0); | 1283 { |
1305 retval = (fn) (&rainj, cte->level2[i - 32], arg); | 1284 rainj.ch = MAKE_CHAR (charset, i, 0); |
1306 if (retval) | 1285 retval = (fn) (&rainj, cte->level2[i - 32], arg); |
1307 return retval; | 1286 } |
1308 } | 1287 } |
1309 else | 1288 else |
1310 for (i = start; i < stop; i++) | 1289 { |
1311 { | 1290 for (i = start, retval = 0; i < stop && retval == 0; i++) |
1312 retval = map_over_charset_row (cte, charset, i, fn, arg); | 1291 retval = map_over_charset_row (cte, charset, i, fn, arg); |
1313 if (retval) | 1292 } |
1314 return retval; | 1293 |
1315 } | 1294 return retval; |
1316 } | 1295 } |
1317 | |
1318 return 0; | |
1319 } | 1296 } |
1320 | 1297 |
1321 #endif /* MULE */ | 1298 #endif /* MULE */ |
1322 | 1299 |
1323 /* Map FN (with client data ARG) over range RANGE in char table CT. | 1300 /* Map FN (with client data ARG) over range RANGE in char table CT. |
1334 switch (range->type) | 1311 switch (range->type) |
1335 { | 1312 { |
1336 case CHARTAB_RANGE_ALL: | 1313 case CHARTAB_RANGE_ALL: |
1337 { | 1314 { |
1338 int retval; | 1315 int retval; |
1339 | 1316 |
1340 retval = map_over_charset_ascii (ct, fn, arg); | 1317 retval = map_over_charset_ascii (ct, fn, arg); |
1341 if (retval) | 1318 if (retval) |
1342 return retval; | 1319 return retval; |
1343 #ifdef MULE | 1320 #ifdef MULE |
1344 retval = map_over_charset_control_1 (ct, fn, arg); | 1321 retval = map_over_charset_control_1 (ct, fn, arg); |
1345 if (retval) | 1322 if (retval) |
1346 return retval; | 1323 return retval; |
1347 { | 1324 { |
1348 int i; | 1325 int i; |
1349 for (i = MIN_LEADING_BYTE; i < MIN_LEADING_BYTE + NUM_LEADING_BYTES; | 1326 int start = MIN_LEADING_BYTE; |
1350 i++) | 1327 int stop = start + NUM_LEADING_BYTES; |
1328 | |
1329 for (i = start, retval = 0; i < stop && retval == 0; i++) | |
1351 { | 1330 { |
1352 retval = map_over_other_charset (ct, i, fn, arg); | 1331 retval = map_over_other_charset (ct, i, fn, arg); |
1353 if (retval) | |
1354 return retval; | |
1355 } | 1332 } |
1356 } | 1333 } |
1357 #endif /* MULE */ | 1334 #endif /* MULE */ |
1335 return retval; | |
1358 } | 1336 } |
1359 break; | |
1360 | 1337 |
1361 #ifdef MULE | 1338 #ifdef MULE |
1362 case CHARTAB_RANGE_CHARSET: | 1339 case CHARTAB_RANGE_CHARSET: |
1363 return map_over_other_charset (ct, | 1340 return map_over_other_charset (ct, |
1364 XCHARSET_LEADING_BYTE (range->charset), | 1341 XCHARSET_LEADING_BYTE (range->charset), |
1428 | 1405 |
1429 case CHARTAB_RANGE_ROW: | 1406 case CHARTAB_RANGE_ROW: |
1430 ranjarg = vector2 (XCHARSET_NAME (range->charset), | 1407 ranjarg = vector2 (XCHARSET_NAME (range->charset), |
1431 make_int (range->row)); | 1408 make_int (range->row)); |
1432 break; | 1409 break; |
1433 #endif | 1410 #endif /* MULE */ |
1434 case CHARTAB_RANGE_CHAR: | 1411 case CHARTAB_RANGE_CHAR: |
1435 ranjarg = make_char (range->ch); | 1412 ranjarg = make_char (range->ch); |
1436 break; | 1413 break; |
1437 default: | 1414 default: |
1438 abort (); | 1415 abort (); |
1439 } | 1416 } |
1440 | 1417 |
1441 closure->retval = call2 (closure->function, ranjarg, val); | 1418 closure->retval = call2 (closure->function, ranjarg, val); |
1442 return (!NILP (closure->retval)); | 1419 return !NILP (closure->retval); |
1443 } | 1420 } |
1444 | 1421 |
1445 DEFUN ("map-char-table", Fmap_char_table, 2, 3, 0, /* | 1422 DEFUN ("map-char-table", Fmap_char_table, 2, 3, 0, /* |
1446 Map FUNCTION over entries in TABLE, calling it with two args, | 1423 Map FUNCTION over entries in TABLE, calling it with two args, |
1447 each key and value in the table. | 1424 each key and value in the table. |
1480 static int | 1457 static int |
1481 chartab_type_validate (Lisp_Object keyword, Lisp_Object value, | 1458 chartab_type_validate (Lisp_Object keyword, Lisp_Object value, |
1482 Error_behavior errb) | 1459 Error_behavior errb) |
1483 { | 1460 { |
1484 /* #### should deal with ERRB */ | 1461 /* #### should deal with ERRB */ |
1485 (void) symbol_to_char_table_type (value); | 1462 symbol_to_char_table_type (value); |
1486 return 1; | 1463 return 1; |
1487 } | 1464 } |
1488 | 1465 |
1489 static int | 1466 static int |
1490 chartab_data_validate (Lisp_Object keyword, Lisp_Object value, | 1467 chartab_data_validate (Lisp_Object keyword, Lisp_Object value, |
1542 data = dataval; | 1519 data = dataval; |
1543 while (!NILP (data)) | 1520 while (!NILP (data)) |
1544 { | 1521 { |
1545 Lisp_Object range = Fcar (data); | 1522 Lisp_Object range = Fcar (data); |
1546 Lisp_Object val = Fcar (Fcdr (data)); | 1523 Lisp_Object val = Fcar (Fcdr (data)); |
1547 | 1524 |
1548 data = Fcdr (Fcdr (data)); | 1525 data = Fcdr (Fcdr (data)); |
1549 if (CONSP (range)) | 1526 if (CONSP (range)) |
1550 { | 1527 { |
1551 if (CHAR_OR_CHAR_INTP (XCAR (range))) | 1528 if (CHAR_OR_CHAR_INTP (XCAR (range))) |
1552 { | 1529 { |
1598 Special Lisp functions are provided that abstract this, so you do not | 1575 Special Lisp functions are provided that abstract this, so you do not |
1599 have to directly manipulate bit vectors. | 1576 have to directly manipulate bit vectors. |
1600 */ | 1577 */ |
1601 (obj)) | 1578 (obj)) |
1602 { | 1579 { |
1603 if (CHAR_TABLEP (obj) && XCHAR_TABLE_TYPE (obj) == CHAR_TABLE_TYPE_CATEGORY) | 1580 return (CHAR_TABLEP (obj) && |
1604 return Qt; | 1581 XCHAR_TABLE_TYPE (obj) == CHAR_TABLE_TYPE_CATEGORY) ? |
1605 return Qnil; | 1582 Qt : Qnil; |
1606 } | 1583 } |
1607 | 1584 |
1608 static Lisp_Object | 1585 static Lisp_Object |
1609 check_category_table (Lisp_Object obj, Lisp_Object def) | 1586 check_category_table (Lisp_Object obj, Lisp_Object def) |
1610 { | 1587 { |
1611 if (NILP (obj)) | 1588 if (NILP (obj)) |
1612 obj = def; | 1589 obj = def; |
1613 while (NILP (Fcategory_table_p (obj))) | 1590 while (NILP (Fcategory_table_p (obj))) |
1614 obj = wrong_type_argument (Qcategory_table_p, obj); | 1591 obj = wrong_type_argument (Qcategory_table_p, obj); |
1615 return (obj); | 1592 return obj; |
1616 } | 1593 } |
1617 | 1594 |
1618 int | 1595 int |
1619 check_category_char(Emchar ch, Lisp_Object table, | 1596 check_category_char (Emchar ch, Lisp_Object table, |
1620 unsigned int designator, unsigned int not) | 1597 unsigned int designator, unsigned int not) |
1621 { | 1598 { |
1622 register Lisp_Object temp; | 1599 register Lisp_Object temp; |
1623 struct Lisp_Char_Table *ctbl; | 1600 struct Lisp_Char_Table *ctbl; |
1624 #ifdef ERROR_CHECK_TYPECHECK | 1601 #ifdef ERROR_CHECK_TYPECHECK |
1625 if (NILP (Fcategory_table_p (table))) | 1602 if (NILP (Fcategory_table_p (table))) |
1626 signal_simple_error("Expected category table", table); | 1603 signal_simple_error ("Expected category table", table); |
1627 #endif | 1604 #endif |
1628 ctbl = XCHAR_TABLE(table); | 1605 ctbl = XCHAR_TABLE (table); |
1629 temp = get_char_table(ch, ctbl); | 1606 temp = get_char_table (ch, ctbl); |
1630 if (EQ (temp, Qnil)) return not; | 1607 if (EQ (temp, Qnil)) return not; |
1631 | 1608 |
1632 designator -= ' '; | 1609 designator -= ' '; |
1633 return bit_vector_bit(XBIT_VECTOR (temp), designator) ? !not : not; | 1610 return bit_vector_bit (XBIT_VECTOR (temp), designator) ? !not : not; |
1634 } | 1611 } |
1635 | 1612 |
1636 DEFUN ("check-category-at", Fcheck_category_at, 2, 4, 0, /* | 1613 DEFUN ("check-category-at", Fcheck_category_at, 2, 4, 0, /* |
1637 Return t if category of a character at POS includes DESIGNATOR, | 1614 Return t if category of a character at POS includes DESIGNATOR, |
1638 else return nil. Optional third arg specifies which buffer | 1615 else return nil. Optional third arg specifies which buffer |
1642 (pos, designator, buffer, category_table)) | 1619 (pos, designator, buffer, category_table)) |
1643 { | 1620 { |
1644 Lisp_Object ctbl; | 1621 Lisp_Object ctbl; |
1645 Emchar ch; | 1622 Emchar ch; |
1646 unsigned int des; | 1623 unsigned int des; |
1647 struct buffer *buf = decode_buffer(buffer, 0); | 1624 struct buffer *buf = decode_buffer (buffer, 0); |
1648 | 1625 |
1649 CHECK_INT (pos); | 1626 CHECK_INT (pos); |
1650 CHECK_CATEGORY_DESIGNATOR (designator); | 1627 CHECK_CATEGORY_DESIGNATOR (designator); |
1651 des = XREALINT(designator); | 1628 des = XREALINT (designator); |
1652 ctbl = check_category_table (category_table, Vstandard_category_table); | 1629 ctbl = check_category_table (category_table, Vstandard_category_table); |
1653 ch = BUF_FETCH_CHAR (buf, XINT(pos)); | 1630 ch = BUF_FETCH_CHAR (buf, XINT (pos)); |
1654 return check_category_char(ch, ctbl, des, 0) ? Qt : Qnil; | 1631 return check_category_char (ch, ctbl, des, 0) ? Qt : Qnil; |
1655 } | 1632 } |
1656 | 1633 |
1657 DEFUN ("char-in-category-p", Fchar_in_category_p, 2, 3, 0, /* | 1634 DEFUN ("char-in-category-p", Fchar_in_category_p, 2, 3, 0, /* |
1658 Return t if category of character CHR includes DESIGNATOR, else | 1635 Return t if category of character CHR includes DESIGNATOR, else nil. |
1659 return nil. Optional third arg specifies the CATEGORY-TABLE to use, | 1636 Optional third arg specifies the CATEGORY-TABLE to use, |
1660 | |
1661 which defaults to the system default table. | 1637 which defaults to the system default table. |
1662 */ | 1638 */ |
1663 (chr, designator, category_table)) | 1639 (chr, designator, category_table)) |
1664 { | 1640 { |
1665 Lisp_Object ctbl; | 1641 Lisp_Object ctbl; |
1666 Emchar ch; | 1642 Emchar ch; |
1667 unsigned int des; | 1643 unsigned int des; |
1668 | 1644 |
1669 CHECK_CATEGORY_DESIGNATOR (designator); | 1645 CHECK_CATEGORY_DESIGNATOR (designator); |
1670 des = XREALINT(designator); | 1646 des = XREALINT (designator); |
1671 CHECK_CHAR(chr); | 1647 CHECK_CHAR (chr); |
1672 ch = XCHAR(chr); | 1648 ch = XCHAR (chr); |
1673 ctbl = check_category_table (category_table, Vstandard_category_table); | 1649 ctbl = check_category_table (category_table, Vstandard_category_table); |
1674 return check_category_char(ch, ctbl, des, 0) ? Qt : Qnil; | 1650 return check_category_char (ch, ctbl, des, 0) ? Qt : Qnil; |
1675 } | 1651 } |
1676 | 1652 |
1677 DEFUN ("category-table", Fcategory_table, 0, 1, 0, /* | 1653 DEFUN ("category-table", Fcategory_table, 0, 1, 0, /* |
1678 Return the current category table. | 1654 Return the current category table. |
1679 This is the one specified by the current buffer, or by BUFFER if it | 1655 This is the one specified by the current buffer, or by BUFFER if it |