/* PSPP - computes sample statistics.
Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
- Written by Ben Pfaff <blp@gnu.org>.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
#include <data/variable.h>
#include <language/command.h>
#include <language/lexer/lexer.h>
+#include <language/lexer/variable-parser.h>
#include <libpspp/alloc.h>
+#include <libpspp/assertion.h>
#include <libpspp/message.h>
#include <libpspp/misc.h>
#include <libpspp/str.h>
#define _(msgid) gettext (msgid)
int
-cmd_vector (void)
+cmd_vector (struct lexer *lexer, struct dataset *ds)
{
/* Just to be different, points to a set of null terminated strings
containing the names of the vectors to be created. The list
/* Maximum allocated position for vecnames, plus one position. */
char *endp = NULL;
+ struct dictionary *dict = dataset_dict (ds);
+
cp = vecnames = xmalloc (256);
endp = &vecnames[256];
do
{
/* Get the name(s) of the new vector(s). */
- if (!lex_force_id ())
+ if (!lex_force_id (lexer))
return CMD_CASCADING_FAILURE;
- while (token == T_ID)
+ while (lex_token (lexer) == T_ID)
{
if (cp + 16 > endp)
{
}
for (cp2 = cp; cp2 < cp; cp2 += strlen (cp))
- if (!strcasecmp (cp2, tokid))
+ if (!strcasecmp (cp2, lex_tokid (lexer)))
{
- msg (SE, _("Vector name %s is given twice."), tokid);
+ msg (SE, _("Vector name %s is given twice."), lex_tokid (lexer));
goto fail;
}
- if (dict_lookup_vector (default_dict, tokid))
+ if (dict_lookup_vector (dict, lex_tokid (lexer)))
{
- msg (SE, _("There is already a vector with name %s."), tokid);
+ msg (SE, _("There is already a vector with name %s."), lex_tokid (lexer));
goto fail;
}
- cp = stpcpy (cp, tokid) + 1;
- lex_get ();
- lex_match (',');
+ cp = stpcpy (cp, lex_tokid (lexer)) + 1;
+ lex_get (lexer);
+ lex_match (lexer, ',');
}
*cp++ = 0;
/* Now that we have the names it's time to check for the short
or long forms. */
- if (lex_match ('='))
+ if (lex_match (lexer, '='))
{
/* Long form. */
struct variable **v;
goto fail;
}
- if (!parse_variables (default_dict, &v, &nv,
- PV_SAME_TYPE | PV_DUPLICATE))
+ if (!parse_variables (lexer, dict, &v, &nv,
+ PV_SAME_WIDTH | PV_DUPLICATE))
goto fail;
- dict_create_vector (default_dict, vecnames, v, nv);
+ dict_create_vector (dict, vecnames, v, nv);
free (v);
}
- else if (lex_match ('('))
+ else if (lex_match (lexer, '('))
{
int i;
struct variable **v;
int nv;
- if (!lex_force_int ())
+ if (!lex_force_int (lexer))
return CMD_CASCADING_FAILURE;
- nv = lex_integer ();
- lex_get ();
+ nv = lex_integer (lexer);
+ lex_get (lexer);
if (nv <= 0)
{
msg (SE, _("Vectors must have at least one element."));
goto fail;
}
- if (!lex_force_match (')'))
+ if (!lex_force_match (lexer, ')'))
goto fail;
/* First check that all the generated variable names
for (i = 0; i < nv; i++)
{
sprintf (name, "%s%d", cp, i + 1);
- if (dict_lookup_var (default_dict, name))
+ if (dict_lookup_var (dict, name))
{
msg (SE, _("There is already a variable named %s."),
name);
for (i = 0; i < nv; i++)
{
sprintf (name, "%s%d", cp, i + 1);
- v[i] = dict_create_var_assert (default_dict, name, 0);
+ v[i] = dict_create_var_assert (dict, name, 0);
}
- if (!dict_create_vector (default_dict, cp, v, nv))
- assert (0);
+ if (!dict_create_vector (dict, cp, v, nv))
+ NOT_REACHED ();
cp += strlen (cp) + 1;
}
free (v);
free (vecnames);
vecnames = NULL;
}
- while (lex_match ('/'));
+ while (lex_match (lexer, '/'));
- if (token != '.')
+ if (lex_token (lexer) != '.')
{
- lex_error (_("expecting end of command"));
+ lex_error (lexer, _("expecting end of command"));
goto fail;
}
return CMD_SUCCESS;