X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fgnumeric-reader.c;h=07b88163398f7df9a4b6aa7380b5fe6f0e607369;hb=1509c6773d7302a2753c4f47b3e52fc5e3cca185;hp=fa00804293a04bc2078e4ae36d5cd3e880a6553e;hpb=32b010ba3a0cfcd82f6d274a64b709777a848421;p=pspp diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index fa00804293..07b8816339 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -115,7 +115,7 @@ struct gnumeric_reader int col; int min_col; int node_type; - int sheet_index; + int current_sheet; int start_col; int stop_col; @@ -140,7 +140,7 @@ gnumeric_get_sheet_name (struct spreadsheet *s, int n) struct gnumeric_reader *gr = (struct gnumeric_reader *) s; assert (n < s->n_sheets); - return gr->sheets[n].name; + return gr->sheets[n].name; // Kludge: Assumes the encoding is utf8 } @@ -164,7 +164,6 @@ gnumeric_get_sheet_range (struct spreadsheet *s, int n) process_node (gr); } - return create_cell_ref ( gr->sheets[n].start_col, gr->sheets[n].start_row, @@ -176,19 +175,20 @@ gnumeric_get_sheet_range (struct spreadsheet *s, int n) static void gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) { - int i; struct gnumeric_reader *r = r_; if ( r == NULL) return ; if ( r->xtr) xmlFreeTextReader (r->xtr); + r->xtr = NULL; if ( ! r->used_first_case ) case_unref (r->first_case); caseproto_unref (r->proto); +#if 0 for (i = 0; i < r->spreadsheet.n_sheets; ++i) { xmlFree (r->sheets[i].name); @@ -196,7 +196,9 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) free (r->sheets); + free (r); +#endif } static void @@ -212,12 +214,11 @@ process_node (struct gnumeric_reader *r) switch ( r->state) { case STATE_PRE_INIT: - r->sheet_index = -1; + r->current_sheet = -1; if (0 == xmlStrcasecmp (name, _xml("gnm:SheetNameIndex")) && XML_READER_TYPE_ELEMENT == r->node_type) { r->state = STATE_SHEET_COUNT; - r->spreadsheet.n_sheets = 0; } break; @@ -225,16 +226,21 @@ process_node (struct gnumeric_reader *r) if (0 == xmlStrcasecmp (name, _xml("gnm:SheetName")) && XML_READER_TYPE_ELEMENT == r->node_type) { - struct sheet_detail *sd ; - r->spreadsheet.n_sheets++; - r->sheets = xrealloc (r->sheets, r->spreadsheet.n_sheets * sizeof *r->sheets); - sd = &r->sheets[r->spreadsheet.n_sheets - 1]; - sd->start_col = sd->stop_col = sd->start_row = sd->stop_row = -1; + ++r->current_sheet; + if (r->current_sheet + 1 > r->spreadsheet.n_sheets) + { + struct sheet_detail *sd ; + r->sheets = xrealloc (r->sheets, (r->current_sheet + 1) * sizeof *r->sheets); + sd = &r->sheets[r->current_sheet]; + sd->start_col = sd->stop_col = sd->start_row = sd->stop_row = -1; + r->spreadsheet.n_sheets = r->current_sheet + 1; + } } else if (0 == xmlStrcasecmp (name, _xml("gnm:SheetNameIndex")) && XML_READER_TYPE_END_ELEMENT == r->node_type) { r->state = STATE_INIT; + r->current_sheet = -1; } else if (XML_READER_TYPE_TEXT == r->node_type) { @@ -246,7 +252,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->current_sheet; r->state = STATE_SHEET_START; } break; @@ -277,7 +283,7 @@ process_node (struct gnumeric_reader *r) r->state = STATE_SHEET_FOUND; free (value); } - else if (r->target_sheet_index == r->sheet_index + 1) + else if (r->target_sheet_index == r->current_sheet + 1) { r->state = STATE_SHEET_FOUND; } @@ -320,7 +326,7 @@ process_node (struct gnumeric_reader *r) else if (r->node_type == XML_READER_TYPE_TEXT) { xmlChar *value = xmlTextReaderValue (r->xtr); - r->sheets[r->sheet_index].maxrow = _xmlchar_to_int (value); + r->sheets[r->current_sheet].maxrow = _xmlchar_to_int (value); xmlFree (value); } break; @@ -333,7 +339,7 @@ process_node (struct gnumeric_reader *r) else if (r->node_type == XML_READER_TYPE_TEXT) { xmlChar *value = xmlTextReaderValue (r->xtr); - r->sheets[r->sheet_index].maxcol = _xmlchar_to_int (value); + r->sheets[r->current_sheet].maxcol = _xmlchar_to_int (value); xmlFree (value); } break; @@ -342,7 +348,6 @@ process_node (struct gnumeric_reader *r) XML_READER_TYPE_ELEMENT == r->node_type) { xmlChar *attr = NULL; - r->state = STATE_CELL; attr = xmlTextReaderGetAttribute (r->xtr, _xml ("Col")); r->col = _xmlchar_to_int (attr); @@ -354,27 +359,28 @@ process_node (struct gnumeric_reader *r) attr = xmlTextReaderGetAttribute (r->xtr, _xml ("Row")); r->row = _xmlchar_to_int (attr); free (attr); - if (r->sheets[r->sheet_index].start_row == -1) + + if (r->sheets[r->current_sheet].start_row == -1) { - r->sheets[r->sheet_index].start_row = r->row; + r->sheets[r->current_sheet].start_row = r->row; } - if (r->sheets[r->sheet_index].start_col == -1) + if (r->sheets[r->current_sheet].start_col == -1) { - r->sheets[r->sheet_index].start_col = r->col; + r->sheets[r->current_sheet].start_col = r->col; } + if (! xmlTextReaderIsEmptyElement (r->xtr)) + r->state = STATE_CELL; } - else if (0 == xmlStrcasecmp (name, _xml("gnm:Cells")) && - XML_READER_TYPE_END_ELEMENT == r->node_type) + else if ( (0 == xmlStrcasecmp (name, _xml("gnm:Cells"))) && (XML_READER_TYPE_END_ELEMENT == r->node_type) ) { - r->sheets[r->sheet_index].stop_col = r->col; - r->sheets[r->sheet_index].stop_row = r->row; + r->sheets[r->current_sheet].stop_col = r->col; + r->sheets[r->current_sheet].stop_row = r->row; r->state = STATE_SHEET_NAME; } break; case STATE_CELL: - if (0 == xmlStrcasecmp (name, _xml("gnm:Cell")) && - XML_READER_TYPE_END_ELEMENT == r->node_type) + if (0 == xmlStrcasecmp (name, _xml("gnm:Cell")) && XML_READER_TYPE_END_ELEMENT == r->node_type) { r->state = STATE_CELLS_START; } @@ -423,7 +429,6 @@ struct var_spec void gnumeric_destroy (struct spreadsheet *s) { - struct gnumeric_reader *r = (struct gnumeric *) s; gnm_file_casereader_destroy (NULL, s); } @@ -483,6 +488,14 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename) process_node (r); } + if ( ret != 1) + { + /* Does not seem to be a gnumeric file */ + xmlFreeTextReader (r->xtr); + free (r); + return NULL; + } + r->spreadsheet.type = SPREADSHEET_GNUMERIC; return r; @@ -538,7 +551,7 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, r->target_sheet = BAD_CAST opts->sheet_name; r->target_sheet_index = opts->sheet_index; r->row = r->col = -1; - r->sheet_index = -1; + r->current_sheet = -1; /* Advance to the start of the cells for the target sheet */ while ( (r->state != STATE_CELL || r->row < r->start_row )