Clean up pref.h.orig and deal with the consequences.
[pspp] / src / flip.c
index 3a77334a76ae4f68190c58af46fd950e0682825d..de02119eb485166e7b45d57b2bc89880b59acd5b 100644 (file)
@@ -22,6 +22,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include <float.h>
+#include <limits.h>
 #include <stdlib.h>
 #include "alloc.h"
 #include "command.h"
@@ -43,7 +44,7 @@ static struct variable *newnames;
 struct varname
   {
     struct varname *next;
-    char name[1];
+    char name[9];
   };
 
 /* New variable names. */
@@ -61,12 +62,12 @@ cmd_flip (void)
   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"))
@@ -80,7 +81,7 @@ cmd_flip (void)
        }
     }
   else
-    newnames = find_variable ("CASE_LBL");
+    newnames = dict_lookup_var (default_dict, "CASE_LBL");
 
   if (newnames)
     {
@@ -101,7 +102,7 @@ cmd_flip (void)
   new_names_tail = NULL;
   procedure (NULL, NULL, NULL);
 
-  clear_default_dict ();
+  dict_clear (default_dict);
   if (!build_dictionary ())
     {
       discard_variables ();
@@ -126,7 +127,8 @@ make_new_var (char name[])
       {
        *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. */
@@ -137,7 +139,7 @@ make_new_var (char name[])
     *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. */
@@ -152,7 +154,7 @@ make_new_var (char name[])
        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;
       }
   }
@@ -165,7 +167,8 @@ make_new_var (char name[])
 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)
     {
@@ -179,10 +182,12 @@ build_dictionary (void)
       
       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
@@ -304,20 +309,31 @@ flip_stream_write (void)
 
   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;