From: John Darrington Date: Sun, 6 Jan 2013 18:14:32 +0000 (+0100) Subject: Fixed a bug reading gnumeric files. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;ds=inline;h=f758c0c7097e197d7b6fb9bb3c3d9d6e9138e0a7;p=pspp Fixed a bug reading gnumeric files. Some gnumeric files use tags for miscellaneous purposes. Our code had always assumed that it represented the name of the Sheet. Hence these files would read the wrong sheet of a workbook. This change fixes it. Closes 38028 --- diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index 1904dabc12..4ddd80be00 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -145,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; @@ -154,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); @@ -229,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; diff --git a/tests/language/data-io/get-data-spreadsheet.at b/tests/language/data-io/get-data-spreadsheet.at index 19b8964dca..c9060aef5f 100644 --- a/tests/language/data-io/get-data-spreadsheet.at +++ b/tests/language/data-io/get-data-spreadsheet.at @@ -175,6 +175,153 @@ AT_BANNER([GET DATA Spreadsheet /TYPE=GNM]) CHECK_SPREADSHEET_READER([GNM]) +dnl Check for a bug where gnumeric files were interpreted incorrectly +AT_SETUP([GET DATA /TYPE=GNM sheet index bug]) +AT_DATA([minimal3.gnumeric],[dnl + + + + + Sheet1 + Sheet2 + Sheet3 + + + + Sheet1 + 2 + 3 + + + Print_Area + #REF! + A1 + + + Sheet_Title + "Sheet1" + A1 + + + + + + + + + + + Name + x + y + Sheet One + 1 + 2 + foo + 3 + 4 + bar + 5 + 6 + + + + Sheet2 + 2 + 2 + + + Print_Area + #REF! + A1 + + + Sheet_Title + "Sheet2" + A1 + + + + + + + + + + + + Comment + DOB + wealth + Sheet Two + 24/5/1966 + 0.02 + wee + 37145 + 3000 + + + + Sheet3 + 2 + 2 + + + Print_Area + #REF! + A1 + + + Sheet_Title + "Sheet3" + A1 + + + + + + + + + + + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + + + + +]) + +AT_DATA([gnum.sps], [dnl +GET DATA + /TYPE=GNM + /FILE='minimal3.gnumeric' + /SHEET=index 3 + /READNAMES=off + . + +LIST. +]) + +AT_CHECK([pspp -O format=csv gnum.sps], [0], [dnl +Table: Data List +VAR001,VAR002,VAR003 +3 ,4.00,5.00 +6 ,7.00,8.00 +9 ,10.00,11.00 +]) + + +AT_CLEANUP + AT_BANNER([GET DATA Spreadsheet /TYPE=ODS]) CHECK_SPREADSHEET_READER([ODS])