dict: Make dict_make_unique_var_name() return an allocated string.
[pspp-builds.git] / src / data / gnumeric-reader.c
index f166ee6aba86f1a00acefb409c466e253635a574..9772d82af576f36af9219c06ee15d2e196f93529 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -40,25 +40,26 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
 
 #else
 
-#include <data/casereader-provider.h>
+#include <assert.h>
+#include <stdbool.h>
 #include <errno.h>
-#include <libpspp/str.h>
-#include <libpspp/i18n.h>
-#include <data/dictionary.h>
-#include <data/variable.h>
+
 #include <xalloc.h>
 
-#include <errno.h>
 #include <libxml/xmlreader.h>
 #include <zlib.h>
-#include <stdbool.h>
 
 #include <data/case.h>
+#include <data/casereader-provider.h>
+#include <data/dictionary.h>
+#include <data/identifier.h>
+#include <data/variable.h>
 #include <data/value.h>
 
+#include <libpspp/i18n.h>
+#include <libpspp/str.h>
+
 #include "gnumeric-reader.h"
-#include <data/identifier.h>
-#include <assert.h>
 
 /* Default width of string variables. */
 #define GNUMERIC_DEFAULT_WIDTH 8
@@ -181,9 +182,9 @@ struct gnumeric_reader
 
 static void process_node (struct gnumeric_reader *r);
 
-#define _xml(X) (const xmlChar *)(X)
+#define _xml(X) (CHAR_CAST (const xmlChar *, X))
 
-#define _xmlchar_to_int(X) atoi((const char *)X)
+#define _xmlchar_to_int(X) (atoi(CHAR_CAST (const char *, X)))
 
 static void
 gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
@@ -320,21 +321,17 @@ static void
 convert_xml_string_to_value (struct ccase *c, const struct variable *var,
                             const xmlChar *xv)
 {
-  int n_bytes = 0;
   union value *v = case_data_rw (c, var);
 
-  const char *text = (const char *) xv;
-
-  if ( text)
-    n_bytes = MIN (var_get_width (var), strlen (text));
-
-  if ( var_is_alpha (var))
-    {
-      memcpy (value_str_rw (v, var_get_width (var)), text, n_bytes);
-    }
+  if (xv == NULL)
+    value_set_missing (v, var_get_width (var));
+  else if ( var_is_alpha (var))
+    value_copy_str_rpad (v, var_get_width (var), xv, ' ');
   else
     {
+      const char *text = CHAR_CAST (const char *, xv);
       char *endptr;
+
       errno = 0;
       v->f = strtod (text, &endptr);
       if ( errno != 0 || endptr == text)
@@ -365,7 +362,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;
@@ -385,7 +382,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
                               &r->start_col, &r->start_row,
                               &r->stop_col, &r->stop_row))
        {
-         msg (SE, _("Invalid cell range \"%s\""),
+         msg (SE, _("Invalid cell range `%s'"),
               gri->cell_range);
          goto error;
        }
@@ -463,7 +460,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
       if ( r->node_type == XML_READER_TYPE_TEXT )
        {
          xmlChar *value = xmlTextReaderValue (r->xtr);
-         const char *text  = (const char *) value;
+         const char *text  = CHAR_CAST (const char *, value);
 
          if ( r->row < r->start_row)
            {
@@ -503,25 +500,20 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
   /* Create the dictionary and populate it */
   *dict = r->dict = dict_create ();
 
-  dict_set_encoding (r->dict, (const char *) xmlTextReaderConstEncoding (r->xtr));
+  dict_set_encoding (r->dict, CHAR_CAST (const char *, xmlTextReaderConstEncoding (r->xtr)));
 
   for (i = 0 ; i < n_var_specs ; ++i )
     {
-      char name[VAR_NAME_LEN + 1];
+      char *name;
 
       /* Probably no data exists for this variable, so allocate a
         default width */
       if ( var_spec[i].width == -1 )
        var_spec[i].width = GNUMERIC_DEFAULT_WIDTH;
 
-      if  ( ! dict_make_unique_var_name (r->dict, var_spec[i].name,
-                                        &vstart, name))
-       {
-         msg (ME, _("Cannot create variable name from %s"), var_spec[i].name);
-         goto error;
-       }
-
+      name = dict_make_unique_var_name (r->dict, var_spec[i].name, &vstart);
       dict_create_var (r->dict, name, var_spec[i].width);
+      free (name);
     }
 
   /* Create the first case, and cache it */
@@ -529,7 +521,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
 
   if ( n_var_specs ==  0 )
     {
-      msg (MW, _("Selected sheet or range of spreadsheet \"%s\" is empty."),
+      msg (MW, _("Selected sheet or range of spreadsheet `%s' is empty."),
            gri->file_name);
       goto error;
     }