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