case: Introduce new functions for numbers and substrings in cases.
[pspp] / src / language / stats / flip.c
index 68152b1b190b4c90d8754205279f45e623ab75c3..993f8975a629d6beae47ba95b7fed7f0c0cf2747 100644 (file)
@@ -144,6 +144,8 @@ cmd_flip (struct lexer *lexer, struct dataset *ds)
            break;
          }
     }
+  if (flip->n_vars <= 0)
+    goto error;
 
   flip->file = pool_create_temp_file (flip->pool);
   if (flip->file == NULL)
@@ -192,7 +194,7 @@ cmd_flip (struct lexer *lexer, struct dataset *ds)
             {
               name = data_out_pool (value, dict_get_encoding (old_dict),
                                     var_get_write_format (flip->new_names_var),
-                                    flip->pool);
+                                    settings_get_fmt_settings (), flip->pool);
             }
           var_names_add (flip->pool, &flip->new_names, name);
         }
@@ -229,7 +231,7 @@ cmd_flip (struct lexer *lexer, struct dataset *ds)
   return CMD_SUCCESS;
 
  error:
-  dict_destroy (new_dict);
+  dict_unref (new_dict);
   destroy_flip_pgm (flip);
   return CMD_CASCADING_FAILURE;
 }
@@ -269,9 +271,15 @@ make_new_var (struct dictionary *dict, const char *name_)
       }
   *cp = '\0';
 
+  if (strlen (name) == 0)
+    {
+      free (name);
+      name = xstrdup ("v");
+    }
+
   /* Use the mangled name, if it is available, or add numeric
      extensions until we find one that is. */
-  if (!dict_create_var (dict, name, 0))
+  if (!id_is_plausible (name, false) || !dict_create_var (dict, name, 0))
     {
       int len = strlen (name);
       int i;
@@ -282,7 +290,7 @@ make_new_var (struct dictionary *dict, const char *name_)
           strncpy (n, name, ofs);
           sprintf (&n[ofs], "%d", i);
 
-          if (dict_create_var (dict, n, 0))
+          if (id_is_plausible (n, false) && dict_create_var (dict, n, 0))
             break;
         }
     }
@@ -341,7 +349,7 @@ flip_file (struct flip_pgm *flip)
       return false;
     }
 
-  for (case_idx = 0; case_idx < flip->n_cases; )
+  for (case_idx = 0; case_idx < flip->n_cases;)
     {
       unsigned long read_cases = MIN (flip->n_cases - case_idx,
                                       case_capacity);
@@ -413,7 +421,8 @@ flip_casereader_read (struct casereader *reader, void *flip_)
 
   c = case_create (casereader_get_proto (reader));
   data_in (ss_cstr (flip->old_names.names[flip->cases_read]), flip->encoding,
-           FMT_A, case_data_rw_idx (c, 0), 8, flip->encoding);
+           FMT_A, settings_get_fmt_settings (), case_data_rw_idx (c, 0),
+           8, flip->encoding);
 
   for (i = 0; i < flip->n_cases; i++)
     {
@@ -431,7 +440,7 @@ flip_casereader_read (struct casereader *reader, void *flip_)
           flip->error = true;
           return NULL;
         }
-      case_data_rw_idx (c, i + 1)->f = in;
+      *case_num_rw_idx (c, i + 1) = in;
     }
 
   flip->cases_read++;
@@ -443,7 +452,7 @@ flip_casereader_read (struct casereader *reader, void *flip_)
    Returns true if successful read, false if an I/O occurred
    during destruction or previously. */
 static void
-flip_casereader_destroy (struct casereader *reader UNUSED, void *flip_)
+flip_casereader_destroy (struct casereader *reader, void *flip_)
 {
   struct flip_pgm *flip = flip_;
   if (flip->error)