Removed extra free
[pspp-builds.git] / src / flip.c
index f14338da6b4cc53ed9a4cdf6f2f8b8a1e7fdd00b..204982357b043ddb45eddec19502b43c9bbf79f0 100644 (file)
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA. */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
 
-#include <config.h>
+#include "config.h"
 #include "error.h"
 #include <ctype.h>
 #include <errno.h>
 #include <float.h>
 #include <limits.h>
 #include <stdlib.h>
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
+#include "algorithm.h"
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
 #include "misc.h"
 #include "settings.h"
 #include "str.h"
+#include "val.h"
 #include "var.h"
 #include "vfm.h"
 
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
 /* List of variable names. */
 struct varname
   {
     struct varname *next;
-    char name[9];
+    char name[SHORT_NAME_LEN + 1];
   };
 
 /* Represents a FLIP input program. */
@@ -51,7 +57,7 @@ struct flip_pgm
   {
     struct variable **var;      /* Variables to transpose. */
     int *idx_to_fv;             /* var[]->index to compacted sink case fv. */
-    int var_cnt;                /* Number of elements in `var'. */
+    size_t var_cnt;             /* Number of elements in `var'. */
     int case_cnt;               /* Pre-flip case count. */
     size_t case_size;           /* Post-flip bytes per case. */
 
@@ -118,12 +124,12 @@ cmd_flip (void)
 
   if (flip->new_names)
     {
-      int i;
+      size_t i;
       
       for (i = 0; i < flip->var_cnt; i++)
        if (flip->var[i] == flip->new_names)
          {
-           memmove (&flip->var[i], &flip->var[i + 1], sizeof *flip->var * (flip->var_cnt - i - 1));
+            remove_element (flip->var, flip->var_cnt, sizeof *flip->var, i);
            flip->var_cnt--;
            break;
          }
@@ -181,33 +187,35 @@ destroy_flip_pgm (struct flip_pgm *flip)
 static int
 make_new_var (char name[])
 {
+  char *cp;
+
+  /* Trim trailing spaces. */
+  cp = strchr (name, '\0');
+  while (cp > name && isspace ((unsigned char) cp[-1]))
+    *--cp = '\0';
+
   /* Fix invalid characters. */
-  {
-    char *cp;
-  
-    for (cp = name; *cp && !isspace (*cp); cp++)
+  for (cp = name; *cp && cp < name + SHORT_NAME_LEN; cp++)
+    if (cp == name) 
       {
-       *cp = toupper ((unsigned char) *cp);
-       if (!isalpha (*cp) && *cp != '@' && *cp != '#'
-           && (cp == name || (*cp != '.' && *cp != '$' && *cp != '_'
-                               && !isdigit (*cp))))
-         {
-           if (cp == name)
-             *cp = 'V';        /* _ not valid in first position. */
-           else
-             *cp = '_';
-         }
+        if (!CHAR_IS_ID1 (*cp) || *cp == '$')
+          *cp = 'V';
       }
-    *cp = 0;
-  }
+    else
+      {
+        if (!CHAR_IS_IDN (*cp))
+          *cp = '_'; 
+      }
+  *cp = '\0';
+  str_uppercase (name);
   
   if (dict_create_var (default_dict, name, 0))
     return 1;
 
   /* Add numeric extensions until acceptable. */
   {
-    int len = (int) strlen (name);
-    char n[9];
+    const int len = (int) strlen (name);
+    char n[SHORT_NAME_LEN + 1];
     int i;
 
     for (i = 1; i < 10000000; i++)
@@ -244,7 +252,7 @@ build_dictionary (struct flip_pgm *flip)
       for (i = 0; i < flip->case_cnt; i++)
        {
           struct variable *v;
-         char s[9];
+         char s[SHORT_NAME_LEN + 1];
 
          sprintf (s, "VAR%03d", i);
          v = dict_create_var_assert (default_dict, s, 0);
@@ -274,10 +282,10 @@ static struct case_sink *
 flip_sink_create (struct flip_pgm *flip) 
 {
   struct flip_sink_info *info = xmalloc (sizeof *info);
-  int i;
+  size_t i;
 
   info->flip = flip;
-  info->output_buf = xmalloc (sizeof *info->output_buf * flip->var_cnt);
+  info->output_buf = xnmalloc (flip->var_cnt, sizeof *info->output_buf);
 
   flip->file = tmpfile ();
   if (!flip->file)
@@ -285,7 +293,8 @@ flip_sink_create (struct flip_pgm *flip)
 
   /* Write variable names as first case. */
   for (i = 0; i < flip->var_cnt; i++) 
-    st_bare_pad_copy (info->output_buf[i].s, flip->var[i]->name, 8);
+    buf_copy_str_rpad (info->output_buf[i].s, MAX_SHORT_STRING,
+                       flip->var[i]->name);
   if (fwrite (info->output_buf, sizeof *info->output_buf,
               flip->var_cnt, flip->file) != (size_t) flip->var_cnt)
     msg (FE, _("Error writing FLIP file: %s."), strerror (errno));
@@ -301,13 +310,13 @@ flip_sink_write (struct case_sink *sink, const struct ccase *c)
 {
   struct flip_sink_info *info = sink->aux;
   struct flip_pgm *flip = info->flip;
-  int i;
+  size_t i;
   
   flip->case_cnt++;
 
   if (flip->new_names != NULL)
     {
-      struct varname *v = xmalloc (sizeof (struct varname));
+      struct varname *v = xmalloc (sizeof *v);
       v->next = NULL;
       if (flip->new_names->type == NUMERIC) 
         {
@@ -323,13 +332,12 @@ flip_sink_write (struct case_sink *sink, const struct ccase *c)
             {
               char name[INT_DIGITS + 2];
               sprintf (name, "V%d", (int) f);
-              strncpy (v->name, name, 8);
-              name[8] = 0; 
+              str_copy_trunc (v->name, sizeof v->name, name);
             }
         }
       else
        {
-         int width = min (flip->new_names->width, 8);
+         int width = min (flip->new_names->width, MAX_SHORT_STRING);
          memcpy (v->name, case_str (c, flip->idx_to_fv[flip->new_names->index]),
                   width);
          v->name[width] = 0;
@@ -371,7 +379,7 @@ flip_file (struct flip_pgm *flip)
 
   /* Allocate memory for many cases. */
   case_bytes = flip->var_cnt * sizeof *input_buf;
-  case_capacity = get_max_workspace() / case_bytes;
+  case_capacity = get_workspace () / case_bytes;
   if (case_capacity > flip->case_cnt * 2)
     case_capacity = flip->case_cnt * 2;
   if (case_capacity < 2)
@@ -408,7 +416,7 @@ flip_file (struct flip_pgm *flip)
     {
       unsigned long read_cases = min (flip->case_cnt - case_idx,
                                       case_capacity);
-      int i;
+      size_t i;
 
       if (read_cases != fread (input_buf, case_bytes, read_cases, input_file))
        msg (FE, _("Error reading FLIP file: %s."), strerror (errno));
@@ -489,9 +497,9 @@ flip_source_read (struct case_source *source,
 {
   struct flip_pgm *flip = source->aux;
   union value *input_buf;
-  int i;
+  size_t i;
 
-  input_buf = xmalloc (sizeof *input_buf * flip->case_cnt);
+  input_buf = xnmalloc (flip->case_cnt, sizeof *input_buf);
   for (i = 0; i < flip->var_cnt; i++)
     {
       size_t j;