X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Flexer.c;h=4cb3f593095f5c9f4c18d82a0e54a53ccbfbb0b0;hb=0e614c6c80612cdd413ffc3a8bdb2619ba5a8a7d;hp=391fa79a3e1332fb324e4aa2871be3dba8d0b9c8;hpb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;p=pspp diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 391fa79a3e..4cb3f59309 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -19,20 +19,22 @@ #include #include "lexer.h" -#include "message.h" +#include #include #include #include #include #include #include -#include "alloc.h" -#include "command.h" -#include "message.h" -#include "line-buffer.h" -#include "magic.h" -#include "settings.h" -#include "str.h" +#include +#include +#include +#include +#include +#include +#include + +#include "size_max.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -125,7 +127,7 @@ restore_token (void) { assert (put_token != 0); token = put_token; - ds_replace (&tokstr, ds_c_str (&put_tokstr)); + ds_assign_string (&tokstr, &put_tokstr); str_copy_trunc (tokid, sizeof tokid, ds_c_str (&tokstr)); tokval = put_tokval; put_token = 0; @@ -137,7 +139,7 @@ static void save_token (void) { put_token = token; - ds_replace (&put_tokstr, ds_c_str (&tokstr)); + ds_assign_string (&put_tokstr, &tokstr); put_tokval = tokval; } @@ -449,7 +451,7 @@ lex_end_of_command (void) if (token != '.') { lex_error (_("expecting end of command")); - return CMD_TRAILING_GARBAGE; + return CMD_FAILURE; } else return CMD_SUCCESS; @@ -693,7 +695,7 @@ lex_put_back_id (const char *id) assert (lex_id_to_token (id, strlen (id)) == T_ID); save_token (); token = T_ID; - ds_replace (&tokstr, id); + ds_assign_c_str (&tokstr, id); str_copy_trunc (tokid, sizeof tokid, ds_c_str (&tokstr)); } @@ -734,6 +736,25 @@ lex_set_prog (char *p) { prog = p; } + +/* Discards the rest of the current command. + When we're reading commands from a file, we skip tokens until + a terminal dot or EOF. + When we're reading commands interactively from the user, + that's just discarding the current line, because presumably + the user doesn't want to finish typing a command that will be + ignored anyway. */ +void +lex_discard_rest_of_command (void) +{ + if (!getl_is_interactive ()) + { + while (token != T_STOP && token != '.') + lex_get (); + } + else + lex_discard_line (); +} /* Weird line reading functions. */ @@ -930,7 +951,7 @@ lex_negative_to_dash (void) { token = T_POS_NUM; tokval = -tokval; - ds_replace (&tokstr, ds_c_str (&tokstr) + 1); + ds_assign_substring (&tokstr, &tokstr, 1, SIZE_MAX); save_token (); token = '-'; }