328 |
extern boolean m4_is_syntax_single_comments (m4_syntax_table *); |
extern boolean m4_is_syntax_single_comments (m4_syntax_table *); |
329 |
extern boolean m4_is_syntax_macro_escaped (m4_syntax_table *); |
extern boolean m4_is_syntax_macro_escaped (m4_syntax_table *); |
330 |
|
|
331 |
/* These are simple values, not bit masks. There is no overlap. */ |
/* These are values to be assigned to syntax table entries, although they |
332 |
#define M4_SYNTAX_OTHER (0x0000) |
are bit masks for fast categorisation in m4__next_token(), only one |
333 |
|
value per syntax table entry is allowed. */ |
334 |
|
enum { |
335 |
|
M4_SYNTAX_OTHER = (1 << 0), |
336 |
|
M4_SYNTAX_IGNORE = (1 << 1), |
337 |
|
M4_SYNTAX_SPACE = (1 << 2), |
338 |
|
M4_SYNTAX_OPEN = (1 << 3), |
339 |
|
M4_SYNTAX_CLOSE = (1 << 4), |
340 |
|
M4_SYNTAX_COMMA = (1 << 5), |
341 |
|
M4_SYNTAX_DOLLAR = (1 << 6), |
342 |
|
M4_SYNTAX_ACTIVE = (1 << 7), |
343 |
|
M4_SYNTAX_ESCAPE = (1 << 8), |
344 |
|
M4_SYNTAX_ASSIGN = (1 << 9), |
345 |
|
M4_SYNTAX_ALPHA = (1 << 10), |
346 |
|
M4_SYNTAX_NUM = (1 << 11), |
347 |
|
|
348 |
|
/* These values ARE bit masks to AND with categories above, a syntax entry |
349 |
|
may have any number of these in addition to a maximum of one of the |
350 |
|
values above. */ |
351 |
|
M4_SYNTAX_LQUOTE = (1 << 12), |
352 |
|
M4_SYNTAX_RQUOTE = (1 << 13), |
353 |
|
M4_SYNTAX_BCOMM = (1 << 14), |
354 |
|
M4_SYNTAX_ECOMM = (1 << 15), |
355 |
|
}; |
356 |
|
|
357 |
|
#define M4_SYNTAX_MASKS (M4_SYNTAX_LQUOTE|M4_SYNTAX_RQUOTE|M4_SYNTAX_BCOMM|M4_SYNTAX_ECOMM) |
358 |
|
#define M4_SYNTAX_VALUE (~(M4_SYNTAX_RQUOTE|M4_SYNTAX_ECOMM)) |
359 |
|
|
360 |
|
#define m4_syntab(S,C) ((S)->table[(int)(C)]) |
361 |
|
#define m4_has_syntax(S,C,T) ((m4_syntab((S),(C)) & (T)) > 0) |
362 |
|
#define m4_is_syntax(S,C,T) ((m4_syntab((S),(C)) & M4_SYNTAX_VALUE) == (T)) |
363 |
|
|
|
#define M4_SYNTAX_IGNORE (0x0001) |
|
|
#define M4_SYNTAX_SPACE (0x0002) |
|
|
#define M4_SYNTAX_OPEN (0x0003) |
|
|
#define M4_SYNTAX_CLOSE (0x0004) |
|
|
#define M4_SYNTAX_COMMA (0x0005) |
|
|
#define M4_SYNTAX_DOLLAR (0x0006) |
|
|
#define M4_SYNTAX_ACTIVE (0x0007) |
|
|
#define M4_SYNTAX_ESCAPE (0x0008) |
|
|
#define M4_SYNTAX_ASSIGN (0x0009) |
|
|
|
|
|
/* These are values to be assigned to syntax table entries, but they are |
|
|
used as bit masks with M4_IS_ALNUM.*/ |
|
|
#define M4_SYNTAX_ALPHA (0x0010) |
|
|
#define M4_SYNTAX_NUM (0x0020) |
|
|
#define M4_SYNTAX_ALNUM (M4_SYNTAX_ALPHA|M4_SYNTAX_NUM) |
|
|
|
|
|
/* We can OR the valid M4_TOKEN_STRING chars together, since they are |
|
|
carefully chosen not to overlap. This reduces the number of comparisons |
|
|
the compiled code needs in order to speed up m4__next_token () a bit. */ |
|
|
#define M4__SYNTAX_STRING (M4_SYNTAX_NUM|M4_SYNTAX_DOLLAR) |
|
|
|
|
|
/* These are bit masks to AND with other categories. |
|
|
See input.c for details. */ |
|
|
#define M4_SYNTAX_LQUOTE (0x0100) |
|
|
#define M4_SYNTAX_RQUOTE (0x0200) |
|
|
#define M4_SYNTAX_BCOMM (0x0400) |
|
|
#define M4_SYNTAX_ECOMM (0x0800) |
|
|
|
|
|
/* These bits define the syntax code of a character */ |
|
|
#define M4_SYNTAX_VALUE (0x00FF|M4_SYNTAX_LQUOTE|M4_SYNTAX_BCOMM) |
|
|
#define M4_SYNTAX_MASKS (0xFF00) |
|
|
|
|
|
#define m4__is_syntax(S,C,T) \ |
|
|
(((S)->table[(int)(C)] & M4_SYNTAX_VALUE) == (T)) |
|
|
|
|
|
#define M4_IS_IGNORE(S, C) (((S)->table[(int)(C)]) == M4_SYNTAX_IGNORE) |
|
|
#define M4_IS_OTHER(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_OTHER)) |
|
|
#define M4_IS_SPACE(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_SPACE)) |
|
|
|
|
|
#define M4_IS_OPEN(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_OPEN)) |
|
|
#define M4_IS_CLOSE(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_CLOSE)) |
|
|
#define M4_IS_COMMA(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_COMMA)) |
|
|
#define M4_IS_DOLLAR(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_DOLLAR)) |
|
|
#define M4_IS_ACTIVE(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_ACTIVE)) |
|
|
#define M4_IS_ESCAPE(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_ESCAPE)) |
|
|
#define M4_IS_ASSIGN(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_ASSIGN)) |
|
|
|
|
|
#define M4_IS_ALPHA(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_ALPHA)) |
|
|
#define M4_IS_NUM(S, C) (m4__is_syntax((S), (C), M4_SYNTAX_NUM)) |
|
|
#define M4_IS_ALNUM(S, C) ((S)->table[(int)(C)] & M4_SYNTAX_ALNUM) |
|
|
|
|
|
#define M4_IS_LQUOTE(S, C) ((S)->table[(int)(C)] & M4_SYNTAX_LQUOTE) |
|
|
#define M4_IS_RQUOTE(S, C) ((S)->table[(int)(C)] & M4_SYNTAX_RQUOTE) |
|
|
#define M4_IS_BCOMM(S, C) ((S)->table[(int)(C)] & M4_SYNTAX_BCOMM) |
|
|
#define M4_IS_ECOMM(S, C) ((S)->table[(int)(C)] & M4_SYNTAX_ECOMM) |
|
|
|
|
|
#define M4__IS_STRING(S, C) (m4__is_syntax((S), (C), M4__SYNTAX_STRING)) |
|
|
#define M4_IS_IDENT(S, C) (M4_IS_OTHER((S),(C))||M4_IS_ALNUM((S),(C))) |
|
364 |
|
|
365 |
|
|
366 |
/* --- TOKENISATION AND INPUT --- */ |
/* --- TOKENISATION AND INPUT --- */ |