#include <ctype.h>
#include <errno.h>
#include <float.h>
+#include <limits.h>
#include <stdlib.h>
#include "alloc.h"
#include "command.h"
struct varname
{
struct varname *next;
- char name[1];
+ char name[9];
};
/* New variable names. */
if (lex_match_id ("VARIABLES"))
{
lex_match ('=');
- if (!parse_variables (&default_dict, &var, &nvar, PV_NO_DUPLICATE))
+ if (!parse_variables (default_dict, &var, &nvar, PV_NO_DUPLICATE))
return CMD_FAILURE;
lex_match ('/');
}
else
- fill_all_vars (&var, &nvar, FV_NO_SYSTEM);
+ dict_get_vars (default_dict, &var, &nvar, 1u << DC_SYSTEM);
lex_match ('/');
if (lex_match_id ("NEWNAMES"))
}
}
else
- newnames = find_variable ("CASE_LBL");
+ newnames = dict_lookup_var (default_dict, "CASE_LBL");
if (newnames)
{
new_names_tail = NULL;
procedure (NULL, NULL, NULL);
- clear_default_dict ();
+ dict_clear (default_dict);
if (!build_dictionary ())
{
discard_variables ();
{
*cp = toupper ((unsigned char) *cp);
if (!isalpha (*cp) && *cp != '@' && *cp != '#'
- && (cp == name || (*cp != '.' && *cp != '$' && *cp != '_')))
+ && (cp == name || (*cp != '.' && *cp != '$' && *cp != '_'
+ && !isdigit (*cp))))
{
if (cp == name)
*cp = 'V'; /* _ not valid in first position. */
*cp = 0;
}
- if (create_variable (&default_dict, name, NUMERIC, 0))
+ if (dict_create_var (default_dict, name, 0))
return 1;
/* Add numeric extensions until acceptable. */
memcpy (n, name, ofs);
sprintf (&n[ofs], "%d", i);
- if (create_variable (&default_dict, n, NUMERIC, 0))
+ if (dict_create_var (default_dict, n, 0))
return 1;
}
}
static int
build_dictionary (void)
{
- force_create_variable (&default_dict, "CASE_LBL", ALPHA, 8);
+ if (!dict_create_var (default_dict, "CASE_LBL", 8))
+ assert (0);
if (!new_names_tail)
{
for (i = 0; i < case_count; i++)
{
+ struct variable *v;
char s[9];
sprintf (s, "VAR%03d", i);
- force_create_variable (&default_dict, s, NUMERIC, 0);
+ v = dict_create_var (default_dict, s, 0);
+ assert (v != NULL);
}
}
else
if (newnames)
{
- struct varname *v;
- char name[INT_DIGITS + 2];
-
- if (newnames->type == NUMERIC)
- sprintf (name, "V%d", (int) temp_case->data[newnames->fv].f);
+ struct varname *v = xmalloc (sizeof (struct varname));
+ if (newnames->type == NUMERIC)
+ {
+ double f = temp_case->data[newnames->fv].f;
+
+ if (f == SYSMIS)
+ strcpy (v->name, "VSYSMIS");
+ else if (f < INT_MIN)
+ strcpy (v->name, "VNEGINF");
+ else if (f > INT_MAX)
+ strcpy (v->name, "VPOSINF");
+ else
+ {
+ char name[INT_DIGITS + 2];
+ sprintf (name, "V%d", (int) f);
+ strncpy (v->name, name, 8);
+ name[8] = 0;
+ }
+ }
else
{
int width = min (newnames->width, 8);
- memcpy (name, temp_case->data[newnames->fv].s, width);
- name[width] = 0;
+ memcpy (v->name, temp_case->data[newnames->fv].s, width);
+ v->name[width] = 0;
}
-
- v = xmalloc (sizeof (struct varname) + strlen (name) - 1);
- strcpy (v->name, name);
if (new_names_tail == NULL)
new_names_head = v;