Consistently capitalize the name "Gnumeric".
[pspp-builds.git] / src / data / gnumeric-reader.c
index f2f4e52f58294d846aaa05b8d4f36d9df666917f..f166ee6aba86f1a00acefb409c466e253635a574 100644 (file)
@@ -19,6 +19,9 @@
 #include <config.h>
 
 #include <libpspp/message.h>
+#include <libpspp/misc.h>
+
+#include "minmax.h"
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
@@ -57,6 +60,8 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
 #include <data/identifier.h>
 #include <assert.h>
 
+/* Default width of string variables. */
+#define GNUMERIC_DEFAULT_WIDTH 8
 
 static void gnm_file_casereader_destroy (struct casereader *, void *);
 
@@ -168,8 +173,7 @@ struct gnumeric_reader
   int stop_row;
   int stop_col;
 
-
-  size_t value_cnt;
+  struct caseproto *proto;
   struct dictionary *dict;
   struct ccase *first_case;
   bool used_first_case;
@@ -194,6 +198,8 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
   if ( ! r->used_first_case )
     case_unref (r->first_case);
 
+  caseproto_unref (r->proto);
+
   free (r);
 }
 
@@ -324,7 +330,7 @@ convert_xml_string_to_value (struct ccase *c, const struct variable *var,
 
   if ( var_is_alpha (var))
     {
-      memcpy (v->s, text, n_bytes);
+      memcpy (value_str_rw (v, var_get_width (var)), text, n_bytes);
     }
   else
     {
@@ -359,7 +365,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
 
   if ( NULL == gz)
     {
-      msg (ME, _("Error opening \"%s\" for reading as a gnumeric file: %s."),
+      msg (ME, _("Error opening \"%s\" for reading as a Gnumeric file: %s."),
            gri->file_name, strerror (errno));
 
       goto error;
@@ -448,7 +454,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
       if ( idx  >= n_var_specs )
        {
          n_var_specs =  idx + 1 ;
-         var_spec = realloc (var_spec, sizeof (*var_spec) * n_var_specs);
+         var_spec = xrealloc (var_spec, sizeof (*var_spec) * n_var_specs);
          var_spec [idx].name = NULL;
          var_spec [idx].width = -1;
          var_spec [idx].first_value = NULL;
@@ -463,7 +469,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
            {
              if ( gri->read_names )
                {
-                 var_spec [idx].name = strdup (text);
+                 var_spec [idx].name = xstrdup (text);
                }
            }
          else
@@ -472,7 +478,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
 
              if (-1 ==  var_spec [idx].width )
                var_spec [idx].width = (gri->asw == -1) ?
-                 ROUND_UP (strlen(text), MAX_SHORT_STRING) : gri->asw;
+                 ROUND_UP (strlen(text), GNUMERIC_DEFAULT_WIDTH) : gri->asw;
            }
 
          free (value);
@@ -498,8 +504,6 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
   *dict = r->dict = dict_create ();
 
   dict_set_encoding (r->dict, (const char *) xmlTextReaderConstEncoding (r->xtr));
-  
-  r->value_cnt = 0;
 
   for (i = 0 ; i < n_var_specs ; ++i )
     {
@@ -508,9 +512,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
       /* Probably no data exists for this variable, so allocate a
         default width */
       if ( var_spec[i].width == -1 )
-       var_spec[i].width = MAX_SHORT_STRING;
-
-      r->value_cnt += value_cnt_from_width (var_spec[i].width);
+       var_spec[i].width = GNUMERIC_DEFAULT_WIDTH;
 
       if  ( ! dict_make_unique_var_name (r->dict, var_spec[i].name,
                                         &vstart, name))
@@ -532,9 +534,9 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
       goto error;
     }
 
-  r->first_case = case_create (r->value_cnt);
-  memset (case_data_rw_idx (r->first_case, 0)->s,
-         ' ', MAX_SHORT_STRING * r->value_cnt);
+  r->proto = caseproto_ref (dict_get_proto (r->dict));
+  r->first_case = case_create (r->proto);
+  case_set_missing (r->first_case);
 
   for ( i = 0 ; i < n_var_specs ; ++i )
     {
@@ -554,7 +556,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
 
   return casereader_create_sequential
     (NULL,
-     r->value_cnt,
+     r->proto,
      n_cases,
      &gnm_file_casereader_class, r);
 
@@ -592,9 +594,8 @@ gnm_file_casereader_read (struct casereader *reader UNUSED, void *r_)
       return r->first_case;
     }
 
-  c = case_create (r->value_cnt);
-
-  memset (case_data_rw_idx (c, 0)->s, ' ', MAX_SHORT_STRING * r->value_cnt);
+  c = case_create (r->proto);
+  case_set_missing (c);
 
   while ((r->state == STATE_CELL || r->state == STATE_CELLS_START )
         && r->row == current_row && (ret = xmlTextReaderRead (r->xtr)))
@@ -605,7 +606,7 @@ gnm_file_casereader_read (struct casereader *reader UNUSED, void *r_)
                                     r->col > r->stop_col))
        continue;
 
-      if ( r->col - r->start_col >= r->value_cnt)
+      if ( r->col - r->start_col >= caseproto_get_n_widths (r->proto))
        continue;
 
       if ( r->stop_row != -1 && r->row > r->stop_row)