projects
/
pspp
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
910e343
)
New function reading_target_sheet
author
John Darrington
<john@darrington.wattle.id.au>
Sun, 24 Feb 2013 03:59:51 +0000
(
04:59
+0100)
committer
John Darrington
<john@darrington.wattle.id.au>
Sun, 24 Feb 2013 03:59:51 +0000
(
04:59
+0100)
src/data/ods-reader.c
patch
|
blob
|
history
diff --git
a/src/data/ods-reader.c
b/src/data/ods-reader.c
index c48fbfc1efbacce3f25b1f55f81ddc6c0fda68a6..5f09f1227e21215e404e9ab1c73c5c6894ea4a7a 100644
(file)
--- a/
src/data/ods-reader.c
+++ b/
src/data/ods-reader.c
@@
-106,11
+106,11
@@
struct ods_reader
xmlTextReaderPtr xtr;
enum reader_state state;
xmlTextReaderPtr xtr;
enum reader_state state;
- bool sheet_found;
int row;
int col;
int node_type;
int current_sheet;
int row;
int col;
int node_type;
int current_sheet;
+ xmlChar *current_sheet_name;
const xmlChar *target_sheet_name;
int target_sheet_index;
const xmlChar *target_sheet_name;
int target_sheet_index;
@@
-141,6
+141,22
@@
struct ods_reader
};
};
+static bool
+reading_target_sheet (const struct ods_reader *r)
+{
+ if (r->target_sheet_name != NULL)
+ {
+ if ( 0 == xmlStrcmp (r->target_sheet_name, r->current_sheet_name))
+ return true;
+ }
+
+ if (r->target_sheet_index == r->current_sheet + 1)
+ return true;
+
+ return false;
+}
+
+
static void process_node (struct ods_reader *r);
static void process_node (struct ods_reader *r);
@@
-234,6
+250,7
@@
process_node (struct ods_reader *r)
{
r->state = STATE_SPREADSHEET;
r->current_sheet = -1;
{
r->state = STATE_SPREADSHEET;
r->current_sheet = -1;
+ r->current_sheet_name = NULL;
}
break;
case STATE_SPREADSHEET:
}
break;
case STATE_SPREADSHEET:
@@
-241,7
+258,8
@@
process_node (struct ods_reader *r)
&&
(XML_READER_TYPE_ELEMENT == r->node_type))
{
&&
(XML_READER_TYPE_ELEMENT == r->node_type))
{
- xmlChar *value = xmlTextReaderGetAttribute (r->xtr, _xml ("table:name"));
+ xmlFree (r->current_sheet_name);
+ r->current_sheet_name = xmlTextReaderGetAttribute (r->xtr, _xml ("table:name"));
++r->current_sheet;
++r->current_sheet;
@@
-252,31
+270,18
@@
process_node (struct ods_reader *r)
r->sheets[r->n_allocated_sheets - 1].stop_col = -1;
r->sheets[r->n_allocated_sheets - 1].start_row = -1;
r->sheets[r->n_allocated_sheets - 1].stop_row = -1;
r->sheets[r->n_allocated_sheets - 1].stop_col = -1;
r->sheets[r->n_allocated_sheets - 1].start_row = -1;
r->sheets[r->n_allocated_sheets - 1].stop_row = -1;
- r->sheets[r->n_allocated_sheets - 1].name =
value
;
+ r->sheets[r->n_allocated_sheets - 1].name =
xmlStrdup (r->current_sheet_name)
;
}
r->col = 0;
r->row = 0;
}
r->col = 0;
r->row = 0;
- if ( r->target_sheet_name != NULL)
- {
- if ( 0 == xmlStrcmp (value, r->target_sheet_name))
- {
- r->sheet_found = true;
- }
- }
- else if (r->target_sheet_index == r->current_sheet)
- {
- r->sheet_found = true;
- }
r->state = STATE_TABLE;
}
else if (0 == xmlStrcasecmp (name, _xml("office:spreadsheet")) &&
XML_READER_TYPE_ELEMENT == r->node_type)
{
r->state = STATE_INIT;
r->state = STATE_TABLE;
}
else if (0 == xmlStrcasecmp (name, _xml("office:spreadsheet")) &&
XML_READER_TYPE_ELEMENT == r->node_type)
{
r->state = STATE_INIT;
- printf ("%s:%d End of Workbook %d: Rows %d Cols %d\n", __FILE__, __LINE__,
- r->current_sheet, r->row, r->col);
}
break;
case STATE_TABLE:
}
break;
case STATE_TABLE:
@@
-620,9
+625,7
@@
ods_make_reader (struct spreadsheet *spreadsheet,
#endif
/* Advance to the start of the cells for the target sheet */
#endif
/* Advance to the start of the cells for the target sheet */
- while ( r->current_sheet < r->target_sheet_index - 1 ||
- r->state != STATE_TABLE
- )
+ while ( ! reading_target_sheet (r) || r->state != STATE_ROW )
{
if (1 != (ret = xmlTextReaderRead (r->xtr)))
break;
{
if (1 != (ret = xmlTextReaderRead (r->xtr)))
break;
@@
-716,6
+719,7
@@
ods_make_reader (struct spreadsheet *spreadsheet,
}
}
}
}
+
/* Create the dictionary and populate it */
r->spreadsheet.dict = r->dict = dict_create (
CHAR_CAST (const char *, xmlTextReaderConstEncoding (r->xtr)));
/* Create the dictionary and populate it */
r->spreadsheet.dict = r->dict = dict_create (
CHAR_CAST (const char *, xmlTextReaderConstEncoding (r->xtr)));
@@
-826,32
+830,25
@@
ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
struct ods_reader *r = r_;
int current_row = r->row;
struct ods_reader *r = r_;
int current_row = r->row;
- if (
!r->used_first_case
)
+ if (
!r->used_first_case
)
{
r->used_first_case = true;
return r->first_case;
}
{
r->used_first_case = true;
return r->first_case;
}
- if (
r->state > STATE_INIT
)
+ if (
reading_target_sheet (r) && r->state != STATE_TABLE
)
{
c = case_create (r->proto);
case_set_missing (c);
}
{
c = case_create (r->proto);
case_set_missing (c);
}
-
- if (r->state == STATE_SPREADSHEET
- &&
- r->current_sheet == r->target_sheet_index - 1
- )
- {
- return NULL;
- }
-
+
while (1 == xmlTextReaderRead (r->xtr))
{
process_node (r);
while (1 == xmlTextReaderRead (r->xtr))
{
process_node (r);
-
+#if 0
if (r->row > current_row && r->state == STATE_ROW)
break;
if (r->row > current_row && r->state == STATE_ROW)
break;
+#endif
if ( r->state == STATE_CELL &&
r->node_type == XML_READER_TYPE_ELEMENT )
if ( r->state == STATE_CELL &&
r->node_type == XML_READER_TYPE_ELEMENT )
@@
-880,7
+877,7
@@
ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
free (xmv);
}
free (xmv);
}
- if ( r->state
<
STATE_TABLE)
+ if ( r->state
==
STATE_TABLE)
break;
}
break;
}