Merge 'master' into 'psppsheet'.
[pspp] / src / data / gnumeric-reader.c
index 56ebc3062aed3090ccf26748b8d96a105bac85dc..4ddd80be00c6cc8225bbeacf97eb5656022c16ea 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009, 2010, 2011, 2012 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
@@ -20,6 +20,7 @@
 #include "libpspp/misc.h"
 
 #include "gl/minmax.h"
+#include "gl/c-strtod.h"
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
@@ -144,6 +145,7 @@ process_node (struct gnumeric_reader *r)
       if (0 == xmlStrcasecmp (name, _xml("gnm:Sheet")) &&
          XML_READER_TYPE_ELEMENT  == r->node_type)
        {
+         ++r->sheet_index;
          r->state = STATE_SHEET_START;
        }
       break;
@@ -153,21 +155,15 @@ process_node (struct gnumeric_reader *r)
        {
          r->state = STATE_SHEET_NAME;
        }
-      else if (0 == xmlStrcasecmp (name, _xml("gnm:Name"))  &&
-              XML_READER_TYPE_END_ELEMENT  == r->node_type)
-       {
-         r->state = STATE_INIT;
-       }
       break;
     case STATE_SHEET_NAME:
       if (0 == xmlStrcasecmp (name, _xml("gnm:Name"))  &&
          XML_READER_TYPE_END_ELEMENT  == r->node_type)
        {
-         r->state = STATE_SHEET_START;
+         r->state = STATE_INIT;
        }
       else if (XML_READER_TYPE_TEXT == r->node_type)
        {
-         ++r->sheet_index;
          if ( r->target_sheet != NULL)
            {
              xmlChar *value = xmlTextReaderValue (r->xtr);
@@ -228,7 +224,9 @@ process_node (struct gnumeric_reader *r)
     case STATE_CELL:
       if (0 == xmlStrcasecmp (name, _xml("gnm:Cell"))  &&
                              XML_READER_TYPE_END_ELEMENT  == r->node_type)
-       r->state = STATE_CELLS_START;
+       {
+         r->state = STATE_CELLS_START;
+       }
       break;
     default:
       break;
@@ -257,7 +255,7 @@ convert_xml_string_to_value (struct ccase *c, const struct variable *var,
       char *endptr;
 
       errno = 0;
-      v->f = strtod (text, &endptr);
+      v->f = c_strtod (text, &endptr);
       if ( errno != 0 || endptr == text)
        v->f = SYSMIS;
     }
@@ -294,10 +292,11 @@ gnumeric_open_reader (struct spreadsheet_read_info *gri, struct dictionary **dic
 
   r = xzalloc (sizeof *r);
 
-  r->xtr = xmlReaderForIO ((xmlInputReadCallback) gzread, gzclose, gz,
+  r->xtr = xmlReaderForIO ((xmlInputReadCallback) gzread,
+                           (xmlInputCloseCallback) gzclose, gz,
                           NULL, NULL, 0);
 
-  if ( r->xtr == NULL)
+  if ( r->xtr == NULL )
     goto error;
 
   if ( gri->cell_range )
@@ -420,10 +419,13 @@ gnumeric_open_reader (struct spreadsheet_read_info *gri, struct dictionary **dic
        }
     }
 
-
-  /* Create the dictionary and populate it */
-  *dict = r->dict = dict_create (
-    CHAR_CAST (const char *, xmlTextReaderConstEncoding (r->xtr)));
+  {
+    const xmlChar *enc = xmlTextReaderConstEncoding (r->xtr);
+    if ( enc == NULL)
+      goto error;
+    /* Create the dictionary and populate it */
+    *dict = r->dict = dict_create (CHAR_CAST (const char *, enc));
+  }
 
   for (i = 0 ; i < n_var_specs ; ++i )
     {