#include <data/settings.h>
#include <libpspp/str.h>
+#include "size_max.h"
+
#include "gettext.h"
#define _(msgid) gettext (msgid)
#define N_(msgid) msgid
void
lex_init (void)
{
- ds_init (&tokstr, 64);
- ds_init (&put_tokstr, 64);
+ ds_init (&tokstr);
+ ds_init (&put_tokstr);
if (!lex_get_line ())
eof = true;
}
{
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;
save_token (void)
{
put_token = token;
- ds_replace (&put_tokstr, ds_c_str (&tokstr));
+ ds_assign_string (&put_tokstr, &tokstr);
put_tokval = tokval;
}
if (token != '.')
{
lex_error (_("expecting end of command"));
- return CMD_TRAILING_GARBAGE;
+ return CMD_FAILURE;
}
else
return CMD_SUCCESS;
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));
}
\f
{
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 ();
+}
\f
/* Weird line reading functions. */
{
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 = '-';
}