diff options
| author | Karl Heuer | 1997-02-20 06:57:02 +0000 |
|---|---|---|
| committer | Karl Heuer | 1997-02-20 06:57:02 +0000 |
| commit | e0b8ff939dbb3ea39fcd7967d5d45e7b33ee45a1 (patch) | |
| tree | 2c3ca2f7edfd64bbb2bd51f4061ffbb521483374 /src | |
| parent | 93da5fff9b9bdfc4792699433e33db046f26d0d8 (diff) | |
| download | emacs-e0b8ff939dbb3ea39fcd7967d5d45e7b33ee45a1.tar.gz emacs-e0b8ff939dbb3ea39fcd7967d5d45e7b33ee45a1.zip | |
(SET_RAW_SYNTAX_ENTRY): Handle syntax of multibyte
characters.
(SYNTAX_ENTRY_FOLLOW_PARENT): New macro.
(SYNTAX_ENTRY): Handle syntax of multibyte characters.
(SYNTAX, SYNTAX_WITH_FLAGS, SYNTAX_MATCH): Don't signal error even
if a syntax entry is not cons.
Diffstat (limited to 'src')
| -rw-r--r-- | src/syntax.h | 92 |
1 files changed, 44 insertions, 48 deletions
diff --git a/src/syntax.h b/src/syntax.h index a4a8fb2a632..a9cbb1dd901 100644 --- a/src/syntax.h +++ b/src/syntax.h | |||
| @@ -51,95 +51,91 @@ enum syntaxcode | |||
| 51 | Smax /* Upper bound on codes that are meaningful */ | 51 | Smax /* Upper bound on codes that are meaningful */ |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| 54 | /* Fetch the syntax entry for char C from table TABLE. | 54 | /* Set the syntax entry VAL for char C in table TABLE. */ |
| 55 | This returns the whole entry (normally a cons cell) | ||
| 56 | and does not do any kind of inheritance. */ | ||
| 57 | |||
| 58 | #if 1 | ||
| 59 | #define RAW_SYNTAX_ENTRY(table, c) \ | ||
| 60 | (XCHAR_TABLE (table)->contents[(unsigned char) (c)]) | ||
| 61 | 55 | ||
| 62 | #define SET_RAW_SYNTAX_ENTRY(table, c, val) \ | 56 | #define SET_RAW_SYNTAX_ENTRY(table, c, val) \ |
| 63 | (XCHAR_TABLE (table)->contents[(unsigned char) (c)] = (val)) | 57 | ((unsigned)(c) < 128 \ |
| 58 | ? (XCHAR_TABLE (table)->contents[(unsigned) (c)] = (val)) \ | ||
| 59 | : Faset ((table), (unsigned) (c), (val))) | ||
| 60 | |||
| 61 | /* Fetch the syntax entry for char C in syntax table TABLE. | ||
| 62 | This macro is called only when C is less than CHAR_TABLE_ORDINARY_SLOTS. | ||
| 63 | Do inheritance. */ | ||
| 64 | |||
| 65 | #ifdef __GNUC__ | ||
| 66 | #define SYNTAX_ENTRY_FOLLOW_PARENT(table, c) \ | ||
| 67 | ({ Lisp_Object tbl = table; \ | ||
| 68 | Lisp_Object temp = XCHAR_TABLE (tbl)->contents[(c)]; \ | ||
| 69 | while (NILP (temp)) \ | ||
| 70 | { \ | ||
| 71 | tbl = XCHAR_TABLE (tbl)->parent; \ | ||
| 72 | if (NILP (tbl)) \ | ||
| 73 | break; \ | ||
| 74 | temp = XCHAR_TABLE (tbl)->contents[(c)]; \ | ||
| 75 | } \ | ||
| 76 | temp; }) | ||
| 64 | #else | 77 | #else |
| 65 | #define RAW_SYNTAX_ENTRY(table, c) \ | 78 | extern Lisp_Object syntax_temp; |
| 66 | ((c) >= 128 \ | 79 | extern Lisp_Object syntax_parent_lookup (); |
| 67 | ? raw_syntax_table_lookup (table, c) \ | ||
| 68 | : XCHAR_TABLE (table)->contents[(unsigned char) (c)]) | ||
| 69 | 80 | ||
| 70 | #define SET_RAW_SYNTAX_ENTRY(table, c, val) \ | 81 | #define SYNTAX_ENTRY_FOLLOW_PARENT(table, c) \ |
| 71 | ((c) >= 128 \ | 82 | (syntax_temp = XCHAR_TABLE (table)->contents[(c)], \ |
| 72 | ? set_raw_syntax_table_lookup (table, c, (val)) \ | 83 | (NILP (syntax_temp) \ |
| 73 | : XCHAR_TABLE (table)->contents[(unsigned char) (c)] = (val)) | 84 | ? syntax_parent_lookup (table, (c)) \ |
| 85 | : syntax_temp)) | ||
| 74 | #endif | 86 | #endif |
| 75 | 87 | ||
| 88 | /* Fetch the syntax entry for char C in the current syntax table. | ||
| 89 | This returns the whole entry (normally a cons cell). | ||
| 90 | Do Inheritance. */ | ||
| 91 | |||
| 92 | #define SYNTAX_ENTRY(c) \ | ||
| 93 | ((unsigned) (c) < CHAR_TABLE_ORDINARY_SLOTS \ | ||
| 94 | ? SYNTAX_ENTRY_FOLLOW_PARENT (current_buffer->syntax_table, (unsigned) (c))\ | ||
| 95 | : Faref (current_buffer->syntax_table, make_number (c))) | ||
| 96 | |||
| 76 | /* Extract the information from the entry for character C | 97 | /* Extract the information from the entry for character C |
| 77 | in syntax table TABLE. Do inheritance. */ | 98 | in the current syntax table. */ |
| 78 | 99 | ||
| 79 | #ifdef __GNUC__ | 100 | #ifdef __GNUC__ |
| 80 | #define SYNTAX_ENTRY(c) \ | ||
| 81 | ({ Lisp_Object temp, table; \ | ||
| 82 | unsigned char cc = (c); \ | ||
| 83 | table = current_buffer->syntax_table; \ | ||
| 84 | while (!NILP (table)) \ | ||
| 85 | { \ | ||
| 86 | temp = RAW_SYNTAX_ENTRY (table, cc); \ | ||
| 87 | if (!NILP (temp)) \ | ||
| 88 | break; \ | ||
| 89 | table = XCHAR_TABLE (table)->parent; \ | ||
| 90 | } \ | ||
| 91 | temp; }) | ||
| 92 | |||
| 93 | #define SYNTAX(c) \ | 101 | #define SYNTAX(c) \ |
| 94 | ({ Lisp_Object temp; \ | 102 | ({ Lisp_Object temp; \ |
| 95 | temp = SYNTAX_ENTRY (c); \ | 103 | temp = SYNTAX_ENTRY (c); \ |
| 96 | (CONSP (temp) \ | 104 | (CONSP (temp) \ |
| 97 | ? (enum syntaxcode) (XINT (XCONS (temp)->car) & 0xff) \ | 105 | ? (enum syntaxcode) (XINT (XCONS (temp)->car) & 0xff) \ |
| 98 | : wrong_type_argument (Qconsp, temp)); }) | 106 | : Swhitespace); }) |
| 99 | 107 | ||
| 100 | #define SYNTAX_WITH_FLAGS(c) \ | 108 | #define SYNTAX_WITH_FLAGS(c) \ |
| 101 | ({ Lisp_Object temp; \ | 109 | ({ Lisp_Object temp; \ |
| 102 | temp = SYNTAX_ENTRY (c); \ | 110 | temp = SYNTAX_ENTRY (c); \ |
| 103 | (CONSP (temp) \ | 111 | (CONSP (temp) \ |
| 104 | ? XINT (XCONS (temp)->car) \ | 112 | ? XINT (XCONS (temp)->car) \ |
| 105 | : wrong_type_argument (Qconsp, temp)); }) | 113 | : (int) Swhitespace); }) |
| 106 | 114 | ||
| 107 | #define SYNTAX_MATCH(c) \ | 115 | #define SYNTAX_MATCH(c) \ |
| 108 | ({ Lisp_Object temp; \ | 116 | ({ Lisp_Object temp; \ |
| 109 | temp = SYNTAX_ENTRY (c); \ | 117 | temp = SYNTAX_ENTRY (c); \ |
| 110 | (CONSP (temp) \ | 118 | (CONSP (temp) \ |
| 111 | ? XINT (XCONS (temp)->cdr) \ | 119 | ? XINT (XCONS (temp)->cdr) \ |
| 112 | : wrong_type_argument (Qconsp, temp)); }) | 120 | : Qnil); }) |
| 113 | #else | 121 | #else |
| 114 | extern Lisp_Object syntax_temp; | ||
| 115 | extern Lisp_Object syntax_parent_lookup (); | ||
| 116 | |||
| 117 | #define SYNTAX_ENTRY(c) \ | ||
| 118 | (syntax_temp \ | ||
| 119 | = RAW_SYNTAX_ENTRY (current_buffer->syntax_table, (c)), \ | ||
| 120 | (NILP (syntax_temp) \ | ||
| 121 | ? (syntax_temp \ | ||
| 122 | = syntax_parent_lookup (current_buffer->syntax_table, \ | ||
| 123 | (unsigned char) (c))) \ | ||
| 124 | : syntax_temp)) | ||
| 125 | |||
| 126 | #define SYNTAX(c) \ | 122 | #define SYNTAX(c) \ |
| 127 | (syntax_temp = SYNTAX_ENTRY ((c)), \ | 123 | (syntax_temp = SYNTAX_ENTRY ((c)), \ |
| 128 | (CONSP (syntax_temp) \ | 124 | (CONSP (syntax_temp) \ |
| 129 | ? (enum syntaxcode) (XINT (XCONS (syntax_temp)->car) & 0xff) \ | 125 | ? (enum syntaxcode) (XINT (XCONS (syntax_temp)->car) & 0xff) \ |
| 130 | : wrong_type_argument (Qconsp, syntax_temp))) | 126 | : Swhitespace)) |
| 131 | 127 | ||
| 132 | #define SYNTAX_WITH_FLAGS(c) \ | 128 | #define SYNTAX_WITH_FLAGS(c) \ |
| 133 | (syntax_temp = SYNTAX_ENTRY ((c)), \ | 129 | (syntax_temp = SYNTAX_ENTRY ((c)), \ |
| 134 | (CONSP (syntax_temp) \ | 130 | (CONSP (syntax_temp) \ |
| 135 | ? XINT (XCONS (syntax_temp)->car) \ | 131 | ? XINT (XCONS (syntax_temp)->car) \ |
| 136 | : wrong_type_argument (Qconsp, syntax_temp))) | 132 | : (int) Swhitespace)) |
| 137 | 133 | ||
| 138 | #define SYNTAX_MATCH(c) \ | 134 | #define SYNTAX_MATCH(c) \ |
| 139 | (syntax_temp = SYNTAX_ENTRY ((c)), \ | 135 | (syntax_temp = SYNTAX_ENTRY ((c)), \ |
| 140 | (CONSP (syntax_temp) \ | 136 | (CONSP (syntax_temp) \ |
| 141 | ? XINT (XCONS (syntax_temp)->cdr) \ | 137 | ? XINT (XCONS (syntax_temp)->cdr) \ |
| 142 | : wrong_type_argument (Qconsp, syntax_temp))) | 138 | : Qnil)) |
| 143 | #endif | 139 | #endif |
| 144 | 140 | ||
| 145 | /* Then there are six single-bit flags that have the following meanings: | 141 | /* Then there are six single-bit flags that have the following meanings: |