|
|
1.1 root 1: /* File - TrieFA.ins.c
2: *
3: * This file contains code to be included in the scanner file using a
4: * generated trie-based FA.
5: */
6:
7: #include "TrieFA.h"
8:
9: #ifdef UNDERLINE
10: static long CharMask[28] = {
11: 0x0000001, 0x0000000, 0x0000004, 0x0000008, // mask for _, unused, a and b.
12: 0x0000010, 0x0000020, 0x0000040, 0x0000080, // mask for c, d, e and f.
13: 0x0000100, 0x0000200, 0x0000400, 0x0000800, // mask for g, h, i and j.
14: 0x0001000, 0x0002000, 0x0004000, 0x0008000, // mask for k, l, m and n.
15: 0x0010000, 0x0020000, 0x0040000, 0x0080000, // mask for o, p, q and r.
16: 0x0100000, 0x0200000, 0x0400000, 0x0800000, // mask for s, t, u and v.
17: 0x1000000, 0x2000000, 0x4000000, 0x8000000, // mask for w, x, y and z.
18: };
19:
20: #define IN_MASK_RANGE(C) (islower(C) || ((C) == '_'))
21: #define MASK_INDEX(C) ((C) - '_')
22:
23: #else
24: static long CharMask[26] = {
25: 0x0000001, 0x0000002, 0x0000004, 0x0000008, // mask for a, b, c and d.
26: 0x0000010, 0x0000020, 0x0000040, 0x0000080, // mask for e, f, g and h
27: 0x0000100, 0x0000200, 0x0000400, 0x0000800, // mask for i, j, k and l.
28: 0x0001000, 0x0002000, 0x0004000, 0x0008000, // mask for m, n, o and p.
29: 0x0010000, 0x0020000, 0x0040000, 0x0080000, // mask for q, r, s and t.
30: 0x0100000, 0x0200000, 0x0400000, 0x0800000, // mask for u, v, w and x.
31: 0x1000000, 0x2000000 // mask for y and z.
32: };
33:
34: #define IN_MASK_RANGE(C) islower(C)
35: #define MASK_INDEX(C) ((C) - 'a')
36:
37: #endif
38:
39: static short TFA_State;
40:
41: /* TFA_Init:
42: *
43: * Initialize the trie FA.
44: */
45: inline void TFA_Init ()
46: {
47: TFA_State = 0;
48:
49: }
50:
51: /* TFA_Advance:
52: *
53: * Advance to the next state (or -1) on the lowercase letter c. This should be an
54: * inline routine, but the C++ implementation isn't advanced enough so we use a macro.
55: */
56: #define TFA_Advance(C) { \
57: char c = C; \
58: if (TFA_State >= 0) { \
59: if (isupper(c)) \
60: c = tolower(c); \
61: else if (! IN_MASK_RANGE(c)) { \
62: TFA_State = -1; \
63: goto TFA_done; \
64: } \
65: if (TrieStateTbl[TFA_State].mask & CharMask[MASK_INDEX(c)]) { \
66: short i = TrieStateTbl[TFA_State].trans_base; \
67: while (TrieTransTbl[i].c != c) \
68: i++; \
69: TFA_State = TrieTransTbl[i].next_state; \
70: } \
71: else \
72: TFA_State = -1; \
73: } \
74: TFA_done:; \
75: } /* end of TFA_Advance. */
76:
77: /* TFA_Definition:
78: *
79: * Return the definition (if any) associated with the current state.
80: */
81: inline int TFA_Definition ()
82: {
83: return (TFA_State < 0) ? -1 : TrieStateTbl[TFA_State].def;
84:
85: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.