X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fgnumeric-reader.c;h=0ef8e4e14e431ce3b049d6a823b02d32ac0394f5;hb=f15768f0d46bae8b5e06d84558a0f2397d6fdfd7;hp=a0a4766652d2c07f029f0e1cb163bc6f0bf70894;hpb=e2bba9cb07cce1652090b1931393d5739a3a9868;p=pspp diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index a0a4766652..0ef8e4e14e 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. + Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013, 2016 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 @@ -28,16 +28,42 @@ #include "spreadsheet-reader.h" -#if !GNM_SUPPORT +#if !GNM_READ_SUPPORT -struct casereader * -gnumeric_open_reader (const struct spreadsheet_read_options *opts, struct dictionary **dict) +struct spreadsheet * +gnumeric_probe (const char *filename, bool report_errors) { - msg (ME, _("Support for %s files was not compiled into this installation of PSPP"), "Gnumeric"); + if (report_errors) + msg (ME, _("Support for %s files was not compiled into this installation of PSPP"), "Gnumeric"); return NULL; } +const char * +gnumeric_get_sheet_name (struct spreadsheet *s, int n) +{ + return NULL; +} + +char * +gnumeric_get_sheet_range (struct spreadsheet *s, int n) +{ + return NULL; +} + +struct casereader * +gnumeric_make_reader (struct spreadsheet *spreadsheet, + const struct spreadsheet_read_options *opts) +{ + return NULL; +} + +void +gnumeric_unref (struct spreadsheet *r) +{ +} + + #else #include "data/gnumeric-reader.h" @@ -121,7 +147,7 @@ struct sheet_detail int maxrow; }; -struct state_data +struct state_data { /* The libxml reader for this instance */ xmlTextReaderPtr xtr; @@ -149,7 +175,6 @@ state_data_destroy (struct state_data *sd) struct gnumeric_reader { struct spreadsheet spreadsheet; - int ref_cnt; struct state_data rsd; struct state_data msd; @@ -158,7 +183,7 @@ struct gnumeric_reader int stop_col; int start_row; int stop_row; - + struct sheet_detail *sheets; const xmlChar *target_sheet; @@ -174,11 +199,11 @@ struct gnumeric_reader void -gnumeric_destroy (struct spreadsheet *s) +gnumeric_unref (struct spreadsheet *s) { struct gnumeric_reader *r = (struct gnumeric_reader *) s; - if (0 == --r->ref_cnt) + if (0 == --s->ref_cnt) { int i; @@ -186,10 +211,15 @@ gnumeric_destroy (struct spreadsheet *s) { xmlFree (r->sheets[i].name); } - + + free (r->sheets); state_data_destroy (&r->msd); + dict_destroy (r->dict); + + free (s->file_name); + free (r); } } @@ -201,7 +231,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; } @@ -214,12 +244,12 @@ gnumeric_get_sheet_range (struct spreadsheet *s, int n) { int ret; struct gnumeric_reader *gr = (struct gnumeric_reader *) s; - + assert (n < s->n_sheets); - while ( + while ( (gr->sheets[n].stop_col == -1) - && + && (1 == (ret = xmlTextReaderRead (gr->msd.xtr))) ) { @@ -247,10 +277,10 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) if (r->first_case && ! r->used_first_case ) case_unref (r->first_case); - if (r->proto) + if (r->proto) caseproto_unref (r->proto); - gnumeric_destroy (&r->spreadsheet); + gnumeric_unref (&r->spreadsheet); } @@ -481,13 +511,13 @@ convert_xml_string_to_value (struct ccase *c, const struct variable *var, v, var_get_width (var), "UTF-8"); - + if (m) { char buf [FMT_STRING_LEN_MAX + 1]; char *cell = create_cell_ref (col, row); - - msg (MW, _("Cannot convert the value in the spreadsheet cell %s to format (%s): %s"), + + msg (MW, _("Cannot convert the value in the spreadsheet cell %s to format (%s): %s"), cell, fmt_to_string (fmt, buf), m); free (cell); } @@ -509,7 +539,7 @@ gnumeric_error_handler (void *ctx, const char *mesg, UNUSED xmlParserSeverities sev, xmlTextReaderLocatorPtr loc) { struct gnumeric_reader *r = ctx; - + msg (MW, _("There was a problem whilst reading the %s file `%s' (near line %d): `%s'"), "Gnumeric", r->spreadsheet.file_name, @@ -519,7 +549,7 @@ gnumeric_error_handler (void *ctx, const char *mesg, static struct gnumeric_reader * gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_errors) -{ +{ int ret = -1; struct state_data *sd; @@ -556,15 +586,15 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro { r = xzalloc (sizeof *r); r->spreadsheet.n_sheets = -1; - r->spreadsheet.file_name = filename; + r->spreadsheet.file_name = strdup (filename); sd = &r->msd; } else { sd = &r->rsd; } - - if (show_errors) + + if (show_errors) xmlTextReaderSetErrorHandler (xtr, gnumeric_error_handler, r); r->target_sheet = NULL; @@ -573,7 +603,8 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro sd->row = sd->col = -1; sd->state = STATE_PRE_INIT; sd->xtr = xtr; - r->ref_cnt++; + r->spreadsheet.ref_cnt++; + /* Advance to the start of the workbook. This gives us some confidence that we are actually dealing with a gnumeric @@ -589,8 +620,7 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro if ( ret != 1) { /* Does not seem to be a gnumeric file */ - xmlFreeTextReader (sd->xtr); - free (r); + gnumeric_unref (&r->spreadsheet); return NULL; } @@ -603,7 +633,7 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro if ( XML_CHAR_ENCODING_UTF8 != xce) { - /* I have been told that ALL gnumeric files are UTF8 encoded. If that is correct, this + /* I have been told that ALL gnumeric files are UTF8 encoded. If that is correct, this can never happen. */ msg (MW, _("The gnumeric file `%s' is encoded as %s instead of the usual UTF-8 encoding. " "Any non-ascii characters will be incorrectly imported."), @@ -629,6 +659,7 @@ struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_options *opts) { + int type = 0; int x = 0; struct gnumeric_reader *r = NULL; unsigned long int vstart = 0; @@ -696,7 +727,7 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, n_cases --; } - int type = 0; + /* Read in the first row of cells, including the headers if read_names was set */ while ( @@ -718,13 +749,13 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, process_node (r, &r->rsd); - if ( r->rsd.row > r->start_row ) + if ( r->rsd.row > r->start_row ) { xmlChar *attr = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("ValueType")); - + r->vtype = _xmlchar_to_int (attr); - + xmlFree (attr); break; } @@ -782,7 +813,7 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, xmlChar *attr = xmlTextReaderGetAttribute (r->rsd.xtr, _xml ("ValueType")); - if ( NULL == attr || 60 != _xmlchar_to_int (attr)) + if ( NULL == attr || VALUE_STRING != _xmlchar_to_int (attr)) var_spec [idx].width = 0; free (attr); @@ -838,9 +869,9 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, continue; var = dict_get_var (r->dict, x++); - + convert_xml_string_to_value (r->first_case, var, - var_spec[i].first_value, + var_spec[i].first_value, var_spec[i].first_type, r->rsd.col + i - 1, r->rsd.row - 1); @@ -853,7 +884,7 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, } free (var_spec); - + return casereader_create_sequential (NULL, @@ -870,8 +901,6 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, } free (var_spec); - dict_destroy (spreadsheet->dict); - spreadsheet->dict = NULL; gnm_file_casereader_destroy (NULL, r); @@ -935,7 +964,7 @@ gnm_file_casereader_read (struct casereader *reader UNUSED, void *r_) const int idx = r->rsd.col - r->start_col; const struct variable *var = dict_get_var (r->dict, idx); - convert_xml_string_to_value (c, var, value, r->vtype, + convert_xml_string_to_value (c, var, value, r->vtype, r->rsd.col, r->rsd.row); xmlFree (value); @@ -952,4 +981,4 @@ gnm_file_casereader_read (struct casereader *reader UNUSED, void *r_) } -#endif /* GNM_SUPPORT */ +#endif /* GNM_READ_SUPPORT */