From ec31bc43b14f5882d16d5aba50f1e7f22fca089c Mon Sep 17 00:00:00 2001
From: John Darrington <john@darrington.wattle.id.au>
Date: Sun, 24 Feb 2013 21:38:42 +0100
Subject: [PATCH] Another test works

---
 src/data/ods-reader.c | 42 +++++++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/src/data/ods-reader.c b/src/data/ods-reader.c
index 5f09f1227e..7c12af2215 100644
--- a/src/data/ods-reader.c
+++ b/src/data/ods-reader.c
@@ -307,6 +307,7 @@ process_node (struct ods_reader *r)
 	}
       break;
     case STATE_ROW:
+      //      printf ("%s:%d Name is %s\n", __FILE__, __LINE__, name);
       if ( (0 == xmlStrcasecmp (name, _xml ("table:table-cell")))
 	   && 
 	   (XML_READER_TYPE_ELEMENT  == r->node_type))
@@ -318,6 +319,8 @@ process_node (struct ods_reader *r)
 	  r->col_span = value ? _xmlchar_to_int (value) : 1;
 	  r->col += r->col_span;
 
+	  //	  printf ("%s:%d %s\n", __FILE__, __LINE__, value);
+
 	  if (! xmlTextReaderIsEmptyElement (r->xtr))
 	    r->state = STATE_CELL;
 	}
@@ -836,11 +839,21 @@ ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
       return r->first_case;
     }
 
-  if (reading_target_sheet (r)  && r->state != STATE_TABLE)
+
+  /* Advance to the start of a row. (If there is one) */
+  while (r->state != STATE_ROW && 1 == xmlTextReaderRead (r->xtr))
     {
-      c = case_create (r->proto);
-      case_set_missing (c);
+      process_node (r);
     }
+
+
+  if ( ! reading_target_sheet (r)  ||  r->state < STATE_TABLE)
+    {
+      return NULL;
+    }
+
+  c = case_create (r->proto);
+  case_set_missing (c);
   
   while (1 == xmlTextReaderRead (r->xtr))
     {
@@ -849,15 +862,15 @@ ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
       if (r->row > current_row && r->state == STATE_ROW)
 	break;
 #endif
-
-      if ( r->state == STATE_CELL &&
-	   r->node_type == XML_READER_TYPE_ELEMENT )
+      //      printf ("%s:%d\n", __FILE__, __LINE__);
+      if (r->state == STATE_CELL &&
+	   r->node_type == XML_READER_TYPE_ELEMENT)
 	{
 	  val_string = xmlTextReaderGetAttribute (r->xtr, _xml ("office:value"));
 	}
 
-      if ( r->state == STATE_CELL_CONTENT && 
-	   r->node_type == XML_READER_TYPE_TEXT )
+      if (r->state == STATE_CELL_CONTENT && 
+	   r->node_type == XML_READER_TYPE_TEXT)
 	{
 	  int col;
 	  struct xml_value *xmv = xzalloc (sizeof *xmv);
@@ -876,19 +889,10 @@ ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
 	  free (xmv->value);
 	  free (xmv);
 	}
-
-      if ( r->state == STATE_TABLE)
+      if ( r->state <= STATE_TABLE)
 	break;
     }
 
-  if (NULL == c)
-    {
-      case_unref (c);
-      return NULL;
-    }
-  else
-    {
-      return c;
-    }
+  return c;
 }
 #endif
-- 
2.30.2