X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Flexer.c;h=d161287685beca3bd1956a025764152644805000;hb=a675bf52fd2ed392ff50f0f86e0efd6aefa29a03;hp=71597302032a48cbf31f4d12d028f54bbc009780;hpb=68f08c4bb53fcde16035b622bdb6e9529f9cf3ae;p=pspp diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 7159730203..d161287685 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -22,18 +22,17 @@ #include #include #include +#include #include -#include #include #include #include -#include #include #include #include #include -#include "size_max.h" +#include "xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -53,7 +52,7 @@ struct lexer int token; /* Current token. */ double tokval; /* T_POS_NUM, T_NEG_NUM: the token's value. */ - char tokid [LONG_NAME_LEN + 1]; /* T_ID: the identifier. */ + char tokid [VAR_NAME_LEN + 1]; /* T_ID: the identifier. */ struct string tokstr; /* T_ID, T_STRING: token string value. For T_ID, this is not truncated as is @@ -513,8 +512,7 @@ bool lex_is_integer (struct lexer *lexer) { return (lex_is_number (lexer) - && lexer->tokval != NOT_LONG - && lexer->tokval >= LONG_MIN + && lexer->tokval > LONG_MIN && lexer->tokval <= LONG_MAX && floor (lexer->tokval) == lexer->tokval); } @@ -550,9 +548,19 @@ lex_match (struct lexer *lexer, int t) Otherwise, returns false. */ bool lex_match_id (struct lexer *lexer, const char *s) +{ + return lex_match_id_n (lexer, s, 3); +} + +/* If the current token is the identifier S, skips it and returns + true. The identifier may be abbreviated to its first N + letters. + Otherwise, returns false. */ +bool +lex_match_id_n (struct lexer *lexer, const char *s, size_t n) { if (lexer->token == T_ID - && lex_id_match (ss_cstr (s), ss_cstr (lexer->tokid))) + && lex_id_match_n (ss_cstr (s), ss_cstr (lexer->tokid), n)) { lex_get (lexer); return true; @@ -1071,9 +1079,9 @@ convert_numeric_string_to_char_string (struct lexer *lexer, byte_cnt = ds_length (&lexer->tokstr) / chars_per_byte; if (ds_length (&lexer->tokstr) % chars_per_byte) - msg (SE, _("String of %s digits has %d characters, which is not a " + msg (SE, _("String of %s digits has %zu characters, which is not a " "multiple of %d."), - base_name, (int) ds_length (&lexer->tokstr), chars_per_byte); + base_name, ds_length (&lexer->tokstr), chars_per_byte); p = ds_cstr (&lexer->tokstr); for (i = 0; i < byte_cnt; i++) @@ -1209,8 +1217,8 @@ finish: if (ds_length (&lexer->tokstr) > 255) { - msg (SE, _("String exceeds 255 characters in length (%d characters)."), - (int) ds_length (&lexer->tokstr)); + msg (SE, _("String exceeds 255 characters in length (%zu characters)."), + ds_length (&lexer->tokstr)); ds_truncate (&lexer->tokstr, 255); }