Mercurial > hg > xemacs-beta
diff 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 |
line wrap: on
line diff
--- a/src/chartab.c Mon Aug 13 09:53:23 2007 +0200 +++ b/src/chartab.c Mon Aug 13 09:54:23 2007 +0200 @@ -51,16 +51,16 @@ Lisp_Object Qcategory_table_value_p; Lisp_Object Vstandard_category_table; -#endif +#endif /* MULE */ /* A char table maps from ranges of characters to values. Implementing a general data structure that maps from arbitrary ranges of numbers to values is tricky to do efficiently. As it - happens, it should suffice fine (and is usually more convenient, - anyway) when dealing with characters to restrict the sorts of - ranges that can be assigned values, as follows: + happens, it should suffice (and is usually more convenient, anyway) + when dealing with characters to restrict the sorts of ranges that + can be assigned values, as follows: 1) All characters. 2) All characters in a charset. @@ -68,7 +68,6 @@ means all characters with the same first byte. 4) A particular character in a charset. - We use char tables to generalize the 256-element vectors now littering the Emacs code. @@ -86,7 +85,7 @@ */ /************************************************************************/ -/* Char Table object */ +/* Char Table object */ /************************************************************************/ #ifdef MULE @@ -199,7 +198,7 @@ case CHAR_TABLE_TYPE_CATEGORY: return Qcategory; #endif } - + abort (); return Qnil; /* not reached */ } @@ -208,7 +207,7 @@ symbol_to_char_table_type (Lisp_Object symbol) { CHECK_SYMBOL (symbol); - + if (EQ (symbol, Qgeneric)) return CHAR_TABLE_TYPE_GENERIC; if (EQ (symbol, Qsyntax)) return CHAR_TABLE_TYPE_SYNTAX; if (EQ (symbol, Qdisplay)) return CHAR_TABLE_TYPE_DISPLAY; @@ -216,7 +215,7 @@ #ifdef MULE if (EQ (symbol, Qcategory)) return CHAR_TABLE_TYPE_CATEGORY; #endif - + signal_simple_error ("Unrecognized char table type", symbol); return CHAR_TABLE_TYPE_GENERIC; /* not reached */ } @@ -279,7 +278,7 @@ i--; } } - + if (first != -1) { if (row == -1) @@ -327,7 +326,7 @@ { struct Lisp_Char_Table *ct = XCHAR_TABLE (obj); char buf[200]; - + sprintf (buf, "#s(char-table type %s data (", string_data (symbol_name (XSYMBOL (char_table_type_to_symbol (ct->type))))); @@ -567,7 +566,7 @@ case CHAR_TABLE_TYPE_CATEGORY: fill_char_table (ct, Qnil); break; -#endif +#endif /* MULE */ case CHAR_TABLE_TYPE_SYNTAX: fill_char_table (ct, make_int (Sinherit)); @@ -786,16 +785,16 @@ #endif /* MULE */ static Lisp_Object -get_char_table (Emchar ch, struct Lisp_Char_Table *ct) +get_char_table (Emchar ch, struct Lisp_Char_Table *ct) { #ifdef MULE { Lisp_Object charset; int byte1, byte2; Lisp_Object val; - + BREAKUP_CHAR (ch, charset, byte1, byte2); - + if (EQ (charset, Vcharset_ascii)) val = ct->ascii[byte1]; else if (EQ (charset, Vcharset_control_1)) @@ -832,14 +831,12 @@ (ch, table)) { struct Lisp_Char_Table *ct; - Emchar chr; - + CHECK_CHAR_TABLE (table); ct = XCHAR_TABLE (table); CHECK_CHAR_COERCE_INT (ch); - chr = XCHAR(ch); - - return get_char_table (chr, ct); + + return get_char_table (XCHAR (ch), ct); } DEFUN ("get-range-char-table", Fget_range_char_table, 2, 3, 0, /* @@ -863,11 +860,11 @@ { int i; Lisp_Object first = ct->ascii[0]; - + for (i = 1; i < NUM_ASCII_CHARS; i++) if (!EQ (first, ct->ascii[i])) return multi; - + #ifdef MULE for (i = MIN_LEADING_BYTE; i < MIN_LEADING_BYTE + NUM_LEADING_BYTES; i++) @@ -890,24 +887,24 @@ { int i; Lisp_Object first = ct->ascii[0]; - + for (i = 1; i < 128; i++) if (!EQ (first, ct->ascii[i])) return multi; return first; } - + if (EQ (rainj.charset, Vcharset_control_1)) { int i; Lisp_Object first = ct->ascii[128]; - + for (i = 129; i < 160; i++) if (!EQ (first, ct->ascii[i])) return multi; return first; } - + { Lisp_Object val = ct->level1[XCHARSET_LEADING_BYTE (rainj.charset) - MIN_LEADING_BYTE]; @@ -962,7 +959,7 @@ return CATEGORY_TABLE_VALUEP (value); CHECK_CATEGORY_TABLE_VALUE (value); break; -#endif +#endif /* MULE */ case CHAR_TABLE_TYPE_GENERIC: return 1; @@ -1078,7 +1075,7 @@ { Lisp_Object charset; int byte1, byte2; - + BREAKUP_CHAR (range->ch, charset, byte1, byte2); if (EQ (charset, Vcharset_ascii)) ct->ascii[byte1] = val; @@ -1157,26 +1154,24 @@ Lisp_Object val, void *arg), void *arg) { - int i; - + struct chartab_range rainj; + int i, retval; + int start = 0; #ifdef MULE - for (i = 0; i < 128; i++) + int stop = 128; #else - for (i = 0; i < 256; i++) + int stop = 256; #endif + + rainj.type = CHARTAB_RANGE_CHAR; + + for (i = start, retval = 0; i < stop && retval == 0; i++) { - Lisp_Object val = ct->ascii[i]; - struct chartab_range rainj; - int retval; - - rainj.type = CHARTAB_RANGE_CHAR; rainj.ch = (Emchar) i; - retval = (fn) (&rainj, val, arg); - if (retval) - return retval; + retval = (fn) (&rainj, ct->ascii[i], arg); } - return 0; + return retval; } #ifdef MULE @@ -1189,22 +1184,20 @@ Lisp_Object val, void *arg), void *arg) { - int i; + struct chartab_range rainj; + int i, retval; + int start = 128; + int stop = start + 32; - for (i = 0; i < 32; i++) + rainj.type = CHARTAB_RANGE_CHAR; + + for (i = start, retval = 0; i < stop && retval == 0; i++) { - Lisp_Object val = ct->ascii[i + 128]; - struct chartab_range rainj; - int retval; - - rainj.type = CHARTAB_RANGE_CHAR; - rainj.ch = (Emchar) (i + 128); - retval = (fn) (&rainj, val, arg); - if (retval) - return retval; + rainj.ch = (Emchar) (i); + retval = (fn) (&rainj, ct->ascii[i], arg); } - return 0; + return retval; } /* Map FN over the row ROW of two-byte charset CHARSET. @@ -1218,9 +1211,8 @@ Lisp_Object val, void *arg), void *arg) { - Lisp_Object val; + Lisp_Object val = cte->level2[row - 32]; - val = cte->level2[row - 32]; if (!CHAR_TABLE_ENTRYP (val)) { struct chartab_range rainj; @@ -1232,38 +1224,25 @@ } else { - int i; - int start, stop; - + struct chartab_range rainj; + int i, retval; + int charset94_p = (XCHARSET_CHARS (charset) == 94); + int start = charset94_p ? 33 : 32; + int stop = charset94_p ? 127 : 128; + cte = XCHAR_TABLE_ENTRY (val); - if (XCHARSET_CHARS (charset) == 94) + + rainj.type = CHARTAB_RANGE_CHAR; + + for (i = start, retval = 0; i < stop && retval == 0; i++) { - start = 33; - stop = 127; - } - else - { - start = 32; - stop = 128; + rainj.ch = MAKE_CHAR (charset, row, i); + retval = (fn) (&rainj, cte->level2[i - 32], arg); } - - for (i = start; i < stop; i++) - { - int retval; - struct chartab_range rainj; - - rainj.type = CHARTAB_RANGE_CHAR; - rainj.ch = MAKE_CHAR (charset, row, i); + return retval; + } +} - val = cte->level2[i - 32]; - retval = (fn) (&rainj, val, arg); - if (retval) - return retval; - } - } - - return 0; -} static int map_over_other_charset (struct Lisp_Char_Table *ct, int lb, @@ -1273,12 +1252,12 @@ { Lisp_Object val = ct->level1[lb - MIN_LEADING_BYTE]; Lisp_Object charset = CHARSET_BY_LEADING_BYTE (lb); - + if (!CHARSETP (charset) || lb == LEADING_BYTE_ASCII || lb == LEADING_BYTE_CONTROL_1) return 0; - + if (!CHAR_TABLE_ENTRYP (val)) { struct chartab_range rainj; @@ -1287,35 +1266,33 @@ rainj.charset = charset; return (fn) (&rainj, val, arg); } - + { struct Lisp_Char_Table_Entry *cte = XCHAR_TABLE_ENTRY (val); int charset94_p = (XCHARSET_CHARS (charset) == 94); int start = charset94_p ? 33 : 32; int stop = charset94_p ? 127 : 128; int i, retval; - + if (XCHARSET_DIMENSION (charset) == 1) - for (i = start; i < stop; i++) - { - struct chartab_range rainj; + { + struct chartab_range rainj; + rainj.type = CHARTAB_RANGE_CHAR; - rainj.type = CHARTAB_RANGE_CHAR; - rainj.ch = MAKE_CHAR (charset, i, 0); - retval = (fn) (&rainj, cte->level2[i - 32], arg); - if (retval) - return retval; - } + for (i = start, retval = 0; i < stop && retval == 0; i++) + { + rainj.ch = MAKE_CHAR (charset, i, 0); + retval = (fn) (&rainj, cte->level2[i - 32], arg); + } + } else - for (i = start; i < stop; i++) - { + { + for (i = start, retval = 0; i < stop && retval == 0; i++) retval = map_over_charset_row (cte, charset, i, fn, arg); - if (retval) - return retval; - } + } + + return retval; } - - return 0; } #endif /* MULE */ @@ -1336,7 +1313,7 @@ case CHARTAB_RANGE_ALL: { int retval; - + retval = map_over_charset_ascii (ct, fn, arg); if (retval) return retval; @@ -1346,17 +1323,17 @@ return retval; { int i; - for (i = MIN_LEADING_BYTE; i < MIN_LEADING_BYTE + NUM_LEADING_BYTES; - i++) + int start = MIN_LEADING_BYTE; + int stop = start + NUM_LEADING_BYTES; + + for (i = start, retval = 0; i < stop && retval == 0; i++) { retval = map_over_other_charset (ct, i, fn, arg); - if (retval) - return retval; } } #endif /* MULE */ + return retval; } - break; #ifdef MULE case CHARTAB_RANGE_CHARSET: @@ -1430,7 +1407,7 @@ ranjarg = vector2 (XCHARSET_NAME (range->charset), make_int (range->row)); break; -#endif +#endif /* MULE */ case CHARTAB_RANGE_CHAR: ranjarg = make_char (range->ch); break; @@ -1439,7 +1416,7 @@ } closure->retval = call2 (closure->function, ranjarg, val); - return (!NILP (closure->retval)); + return !NILP (closure->retval); } DEFUN ("map-char-table", Fmap_char_table, 2, 3, 0, /* @@ -1482,7 +1459,7 @@ Error_behavior errb) { /* #### should deal with ERRB */ - (void) symbol_to_char_table_type (value); + symbol_to_char_table_type (value); return 1; } @@ -1544,7 +1521,7 @@ { Lisp_Object range = Fcar (data); Lisp_Object val = Fcar (Fcdr (data)); - + data = Fcdr (Fcdr (data)); if (CONSP (range)) { @@ -1600,9 +1577,9 @@ */ (obj)) { - if (CHAR_TABLEP (obj) && XCHAR_TABLE_TYPE (obj) == CHAR_TABLE_TYPE_CATEGORY) - return Qt; - return Qnil; + return (CHAR_TABLEP (obj) && + XCHAR_TABLE_TYPE (obj) == CHAR_TABLE_TYPE_CATEGORY) ? + Qt : Qnil; } static Lisp_Object @@ -1612,25 +1589,25 @@ obj = def; while (NILP (Fcategory_table_p (obj))) obj = wrong_type_argument (Qcategory_table_p, obj); - return (obj); -} + return obj; +} int -check_category_char(Emchar ch, Lisp_Object table, - unsigned int designator, unsigned int not) +check_category_char (Emchar ch, Lisp_Object table, + unsigned int designator, unsigned int not) { register Lisp_Object temp; - struct Lisp_Char_Table *ctbl; + struct Lisp_Char_Table *ctbl; #ifdef ERROR_CHECK_TYPECHECK if (NILP (Fcategory_table_p (table))) - signal_simple_error("Expected category table", table); + signal_simple_error ("Expected category table", table); #endif - ctbl = XCHAR_TABLE(table); - temp = get_char_table(ch, ctbl); + ctbl = XCHAR_TABLE (table); + temp = get_char_table (ch, ctbl); if (EQ (temp, Qnil)) return not; - + designator -= ' '; - return bit_vector_bit(XBIT_VECTOR (temp), designator) ? !not : not; + return bit_vector_bit (XBIT_VECTOR (temp), designator) ? !not : not; } DEFUN ("check-category-at", Fcheck_category_at, 2, 4, 0, /* @@ -1644,20 +1621,19 @@ Lisp_Object ctbl; Emchar ch; unsigned int des; - struct buffer *buf = decode_buffer(buffer, 0); + struct buffer *buf = decode_buffer (buffer, 0); CHECK_INT (pos); CHECK_CATEGORY_DESIGNATOR (designator); - des = XREALINT(designator); + des = XREALINT (designator); ctbl = check_category_table (category_table, Vstandard_category_table); - ch = BUF_FETCH_CHAR (buf, XINT(pos)); - return check_category_char(ch, ctbl, des, 0) ? Qt : Qnil; + ch = BUF_FETCH_CHAR (buf, XINT (pos)); + return check_category_char (ch, ctbl, des, 0) ? Qt : Qnil; } DEFUN ("char-in-category-p", Fchar_in_category_p, 2, 3, 0, /* -Return t if category of character CHR includes DESIGNATOR, else -return nil. Optional third arg specifies the CATEGORY-TABLE to use, - +Return t if category of character CHR includes DESIGNATOR, else nil. +Optional third arg specifies the CATEGORY-TABLE to use, which defaults to the system default table. */ (chr, designator, category_table)) @@ -1667,11 +1643,11 @@ unsigned int des; CHECK_CATEGORY_DESIGNATOR (designator); - des = XREALINT(designator); - CHECK_CHAR(chr); - ch = XCHAR(chr); + des = XREALINT (designator); + CHECK_CHAR (chr); + ch = XCHAR (chr); ctbl = check_category_table (category_table, Vstandard_category_table); - return check_category_char(ch, ctbl, des, 0) ? Qt : Qnil; + return check_category_char (ch, ctbl, des, 0) ? Qt : Qnil; } DEFUN ("category-table", Fcategory_table, 0, 1, 0, /*