#include <config.h>
#include <libpspp/message.h>
+#include <libpspp/misc.h>
+
+#include "minmax.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
#include <data/identifier.h>
#include <assert.h>
+/* Default width of string variables. */
+#define GNUMERIC_DEFAULT_WIDTH 8
static void gnm_file_casereader_destroy (struct casereader *, void *);
int stop_row;
int stop_col;
-
- size_t value_cnt;
+ struct caseproto *proto;
struct dictionary *dict;
struct ccase *first_case;
bool used_first_case;
if ( ! r->used_first_case )
case_unref (r->first_case);
+ caseproto_unref (r->proto);
+
free (r);
}
if ( var_is_alpha (var))
{
- memcpy (v->s, text, n_bytes);
+ memcpy (value_str_rw (v, var_get_width (var)), text, n_bytes);
}
else
{
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;
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;
{
if ( gri->read_names )
{
- var_spec [idx].name = strdup (text);
+ var_spec [idx].name = xstrdup (text);
}
}
else
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);
/* Create the dictionary and populate it */
*dict = r->dict = dict_create ();
- r->value_cnt = 0;
+ dict_set_encoding (r->dict, (const char *) xmlTextReaderConstEncoding (r->xtr));
for (i = 0 ; i < n_var_specs ; ++i )
{
/* 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);
+ var_spec[i].width = GNUMERIC_DEFAULT_WIDTH;
if ( ! dict_make_unique_var_name (r->dict, var_spec[i].name,
&vstart, 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 )
{
return casereader_create_sequential
(NULL,
- r->value_cnt,
+ r->proto,
n_cases,
&gnm_file_casereader_class, 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)))
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)