X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fgnumeric-reader.c;h=9772d82af576f36af9219c06ee15d2e196f93529;hb=0655c32db3a849462fbcebd73d8c659d814e794d;hp=00a07d2f8a2b4ff57fb51f01c569b41a1d33f7ba;hpb=dd5535725f86158e55b3fc263c17058005b0c0a5;p=pspp-builds.git diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index 00a07d2f..9772d82a 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 Free Software Foundation, Inc. + Copyright (C) 2007, 2009, 2010, 2011 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 @@ -19,6 +19,9 @@ #include #include +#include + +#include "minmax.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -37,26 +40,29 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) #else -#include +#include +#include #include -#include -#include -#include -#include + #include -#include #include #include -#include #include +#include +#include +#include +#include #include +#include +#include + #include "gnumeric-reader.h" -#include -#include +/* Default width of string variables. */ +#define GNUMERIC_DEFAULT_WIDTH 8 static void gnm_file_casereader_destroy (struct casereader *, void *); @@ -168,8 +174,7 @@ struct gnumeric_reader int stop_row; int stop_col; - - size_t value_cnt; + struct caseproto *proto; struct dictionary *dict; struct ccase *first_case; bool used_first_case; @@ -177,9 +182,9 @@ struct gnumeric_reader static void process_node (struct gnumeric_reader *r); -#define _xml(X) (const xmlChar *)(X) +#define _xml(X) (CHAR_CAST (const xmlChar *, X)) -#define _xmlchar_to_int(X) atoi((const char *)X) +#define _xmlchar_to_int(X) (atoi(CHAR_CAST (const char *, X))) static void gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) @@ -194,6 +199,8 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) if ( ! r->used_first_case ) case_unref (r->first_case); + caseproto_unref (r->proto); + free (r); } @@ -314,21 +321,17 @@ static void convert_xml_string_to_value (struct ccase *c, const struct variable *var, const xmlChar *xv) { - int n_bytes = 0; union value *v = case_data_rw (c, var); - const char *text = (const char *) xv; - - if ( text) - n_bytes = MIN (var_get_width (var), strlen (text)); - - if ( var_is_alpha (var)) - { - memcpy (v->s, text, n_bytes); - } + if (xv == NULL) + value_set_missing (v, var_get_width (var)); + else if ( var_is_alpha (var)) + value_copy_str_rpad (v, var_get_width (var), xv, ' '); else { + const char *text = CHAR_CAST (const char *, xv); char *endptr; + errno = 0; v->f = strtod (text, &endptr); if ( errno != 0 || endptr == text) @@ -359,7 +362,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) if ( NULL == gz) { - msg (ME, _("Error opening \"%s\" for reading as a gnumeric file: %s."), + msg (ME, _("Error opening `%s' for reading as a Gnumeric file: %s."), gri->file_name, strerror (errno)); goto error; @@ -379,7 +382,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) &r->start_col, &r->start_row, &r->stop_col, &r->stop_row)) { - msg (SE, _("Invalid cell range \"%s\""), + msg (SE, _("Invalid cell range `%s'"), gri->cell_range); goto error; } @@ -448,7 +451,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) if ( idx >= n_var_specs ) { n_var_specs = idx + 1 ; - var_spec = realloc (var_spec, sizeof (*var_spec) * n_var_specs); + var_spec = xrealloc (var_spec, sizeof (*var_spec) * n_var_specs); var_spec [idx].name = NULL; var_spec [idx].width = -1; var_spec [idx].first_value = NULL; @@ -457,13 +460,13 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) if ( r->node_type == XML_READER_TYPE_TEXT ) { xmlChar *value = xmlTextReaderValue (r->xtr); - const char *text = (const char *) value; + const char *text = CHAR_CAST (const char *, value); if ( r->row < r->start_row) { if ( gri->read_names ) { - var_spec [idx].name = strdup (text); + var_spec [idx].name = xstrdup (text); } } else @@ -472,7 +475,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) if (-1 == var_spec [idx].width ) var_spec [idx].width = (gri->asw == -1) ? - ROUND_UP (strlen(text), MAX_SHORT_STRING) : gri->asw; + ROUND_UP (strlen(text), GNUMERIC_DEFAULT_WIDTH) : gri->asw; } free (value); @@ -497,27 +500,20 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) /* Create the dictionary and populate it */ *dict = r->dict = dict_create (); - r->value_cnt = 0; + dict_set_encoding (r->dict, CHAR_CAST (const char *, xmlTextReaderConstEncoding (r->xtr))); for (i = 0 ; i < n_var_specs ; ++i ) { - char name[VAR_NAME_LEN + 1]; + char *name; /* Probably no data exists for this variable, so allocate a default width */ if ( var_spec[i].width == -1 ) - var_spec[i].width = MAX_SHORT_STRING; - - r->value_cnt += value_cnt_from_width (var_spec[i].width); - - if ( ! dict_make_unique_var_name (r->dict, var_spec[i].name, - &vstart, name)) - { - msg (ME, _("Cannot create variable name from %s"), var_spec[i].name); - goto error; - } + var_spec[i].width = GNUMERIC_DEFAULT_WIDTH; + name = dict_make_unique_var_name (r->dict, var_spec[i].name, &vstart); dict_create_var (r->dict, name, var_spec[i].width); + free (name); } /* Create the first case, and cache it */ @@ -525,14 +521,14 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) if ( n_var_specs == 0 ) { - msg (MW, _("Selected sheet or range of spreadsheet \"%s\" is empty."), + msg (MW, _("Selected sheet or range of spreadsheet `%s' is empty."), gri->file_name); goto error; } - r->first_case = case_create (r->value_cnt); - memset (case_data_rw_idx (r->first_case, 0)->s, - ' ', MAX_SHORT_STRING * r->value_cnt); + r->proto = caseproto_ref (dict_get_proto (r->dict)); + r->first_case = case_create (r->proto); + case_set_missing (r->first_case); for ( i = 0 ; i < n_var_specs ; ++i ) { @@ -552,7 +548,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict) return casereader_create_sequential (NULL, - r->value_cnt, + r->proto, n_cases, &gnm_file_casereader_class, r); @@ -590,9 +586,8 @@ gnm_file_casereader_read (struct casereader *reader UNUSED, void *r_) return r->first_case; } - c = case_create (r->value_cnt); - - memset (case_data_rw_idx (c, 0)->s, ' ', MAX_SHORT_STRING * r->value_cnt); + c = case_create (r->proto); + case_set_missing (c); while ((r->state == STATE_CELL || r->state == STATE_CELLS_START ) && r->row == current_row && (ret = xmlTextReaderRead (r->xtr))) @@ -603,7 +598,7 @@ gnm_file_casereader_read (struct casereader *reader UNUSED, void *r_) r->col > r->stop_col)) continue; - if ( r->col - r->start_col >= r->value_cnt) + if ( r->col - r->start_col >= caseproto_get_n_widths (r->proto)) continue; if ( r->stop_row != -1 && r->row > r->stop_row)