45 |
|
|
46 |
/* Global variables. */ |
/* Global variables. */ |
47 |
|
|
48 |
|
extern const char *keywords[T_N_KEYWORDS + 1]; |
49 |
|
|
50 |
|
|
51 |
/* Current token. */ |
/* Current token. */ |
52 |
int token; |
int token; |
53 |
|
|
63 |
|
|
64 |
/* Static variables. */ |
/* Static variables. */ |
65 |
|
|
|
/* Table of keywords. */ |
|
|
static const char *keywords[T_N_KEYWORDS + 1] = |
|
|
{ |
|
|
"AND", "OR", "NOT", |
|
|
"EQ", "GE", "GT", "LE", "LT", "NE", |
|
|
"ALL", "BY", "TO", "WITH", |
|
|
NULL, |
|
|
}; |
|
|
|
|
66 |
/* Pointer to next token in getl_buf. */ |
/* Pointer to next token in getl_buf. */ |
67 |
static char *prog; |
static char *prog; |
68 |
|
|
618 |
return 0; |
return 0; |
619 |
} |
} |
620 |
} |
} |
|
|
|
|
/* Comparing identifiers. */ |
|
|
|
|
|
/* Keywords match if one of the following is true: KW and TOK are |
|
|
identical (except for differences in case), or TOK is at least 3 |
|
|
characters long and those characters are identical to KW. KW_LEN |
|
|
is the length of KW, TOK_LEN is the length of TOK. */ |
|
|
int |
|
|
lex_id_match_len (const char *kw, size_t kw_len, |
|
|
const char *tok, size_t tok_len) |
|
|
{ |
|
|
size_t i = 0; |
|
|
|
|
|
assert (kw && tok); |
|
|
for (;;) |
|
|
{ |
|
|
if (i == kw_len && i == tok_len) |
|
|
return 1; |
|
|
else if (i == tok_len) |
|
|
return i >= 3; |
|
|
else if (i == kw_len) |
|
|
return 0; |
|
|
else if (toupper ((unsigned char) kw[i]) |
|
|
!= toupper ((unsigned char) tok[i])) |
|
|
return 0; |
|
|
|
|
|
i++; |
|
|
} |
|
|
} |
|
|
|
|
|
/* Same as lex_id_match_len() minus the need to pass in the lengths. */ |
|
|
int |
|
|
lex_id_match (const char *kw, const char *tok) |
|
|
{ |
|
|
return lex_id_match_len (kw, strlen (kw), tok, strlen (tok)); |
|
|
} |
|
|
|
|
|
/* Returns the proper token type, either T_ID or a reserved keyword |
|
|
enum, for ID[], which must contain LEN characters. */ |
|
|
int |
|
|
lex_id_to_token (const char *id, size_t len) |
|
|
{ |
|
|
const char **kwp; |
|
|
|
|
|
if (len < 2 || len > 4) |
|
|
return T_ID; |
|
|
|
|
|
for (kwp = keywords; *kwp; kwp++) |
|
|
if (!strcasecmp (*kwp, id)) |
|
|
return T_FIRST_KEYWORD + (kwp - keywords); |
|
|
|
|
|
return T_ID; |
|
|
} |
|
|
|
|
621 |
/* Weird token functions. */ |
/* Weird token functions. */ |
622 |
|
|
623 |
/* Returns the first character of the next token, except that if the |
/* Returns the first character of the next token, except that if the |