X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flexer.c;h=cc2f8ca8e54e35407569b3a26bcb62923846fbee;hb=d594340cb1ae007a92d094ae67116f9f622f2b5d;hp=8a3ccc21881c1cea1d2e9510fe88b9e1741c650e;hpb=c9e2bf6cb988f8c00d89ccf191a28388cccbd868;p=pspp-builds.git diff --git a/src/lexer.c b/src/lexer.c index 8a3ccc21..cc2f8ca8 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -45,6 +45,9 @@ /* Global variables. */ +extern const char *keywords[T_N_KEYWORDS + 1]; + + /* Current token. */ int token; @@ -60,15 +63,6 @@ struct string tokstr; /* Static variables. */ -/* 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, - }; - /* Pointer to next token in getl_buf. */ static char *prog; @@ -98,6 +92,7 @@ static void dump_token (void); void lex_init (void) { + ds_init (&tokstr, 64); ds_init (&put_tokstr, 64); if (!lex_get_line ()) unexpected_eof (); @@ -106,7 +101,8 @@ lex_init (void) void lex_done (void) { - ds_destroy(&put_tokstr); + ds_destroy (&put_tokstr); + ds_destroy (&tokstr); } @@ -624,60 +620,6 @@ lex_force_id (void) return 0; } } - -/* 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; -} - /* Weird token functions. */ /* Returns the first character of the next token, except that if the @@ -861,12 +803,12 @@ lex_preprocess_line (void) len--; /* Check for and remove terminal dot. */ - if (len > 0 && s[len - 1] == get_endcmd() ) + if (len > 0 && s[len - 1] == get_endcmd ()) { dot = 1; len--; } - else if (len == 0 && get_nullline() ) + else if (len == 0 && get_nulline ()) dot = 1; else dot = 0;