X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fdata-list.c;h=4fea7a407038364aca731376c6c86d11d9e66caf;hb=d0371553a98cd169353bf6d211e375e5ffc3a3bd;hp=76adb00c1415639253b6831d267d4caf1de67f05;hpb=43b1296aafe7582e7dbe6c2b6a8b478d7d9b0fcf;p=pspp-builds.git diff --git a/src/language/data-io/data-list.c b/src/language/data-io/data-list.c index 76adb00c..4fea7a40 100644 --- a/src/language/data-io/data-list.c +++ b/src/language/data-io/data-list.c @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -39,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -49,8 +49,8 @@ #include #include -#include "size_max.h" #include "xsize.h" +#include "xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -120,7 +120,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) struct dictionary *dict; struct data_list_pgm *dls; int table = -1; /* Print table if nonzero, -1=undecided. */ - struct file_handle *fh = fh_inline_file (); + struct file_handle *fh = NULL; struct pool *tmp_pool; bool ok; @@ -143,6 +143,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) if (lex_match_id (lexer, "FILE")) { lex_match (lexer, '='); + fh_unref (fh); fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE); if (fh == NULL) goto error; @@ -244,11 +245,19 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) } } + if (fh == NULL) + fh = fh_inline_file (); fh_set_default_handle (fh); if (dls->type == -1) dls->type = DLS_FIXED; + if (dls->type != DLS_FIXED && dls->end != NULL) + { + msg (SE, _("The END keyword may be used only with DATA LIST FIXED.")); + goto error; + } + if (table == -1) table = dls->type != DLS_FREE; @@ -286,10 +295,12 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) } pool_destroy (tmp_pool); + fh_unref (fh); return CMD_SUCCESS; error: + fh_unref (fh); data_list_trns_free (dls); return CMD_CASCADING_FAILURE; } @@ -662,6 +673,7 @@ read_from_data_list (const struct data_list_pgm *dls, struct ccase *c) static bool read_from_data_list_fixed (const struct data_list_pgm *dls, struct ccase *c) { + enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (dls->reader); struct dls_var_spec *spec; int row; @@ -683,9 +695,16 @@ read_from_data_list_fixed (const struct data_list_pgm *dls, struct ccase *c) line = dfm_get_record (dls->reader); ll_for_each_continue (spec, struct dls_var_spec, ll, &dls->specs) - data_in (ss_substr (line, spec->first_column - 1, spec->input.w), - spec->input.type, spec->input.d, spec->first_column, - case_data_rw_idx (c, spec->fv), fmt_var_width (&spec->input)); + { + if (row < spec->record) + break; + + data_in (ss_substr (line, spec->first_column - 1, + spec->input.w), + encoding, spec->input.type, spec->input.d, + spec->first_column, case_data_rw_idx (c, spec->fv), + fmt_var_width (&spec->input)); + } dfm_forward_record (dls->reader); } @@ -699,6 +718,7 @@ read_from_data_list_fixed (const struct data_list_pgm *dls, struct ccase *c) static bool read_from_data_list_free (const struct data_list_pgm *dls, struct ccase *c) { + enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (dls->reader); struct dls_var_spec *spec; ll_for_each (spec, struct dls_var_spec, ll, &dls->specs) @@ -719,7 +739,7 @@ read_from_data_list_free (const struct data_list_pgm *dls, struct ccase *c) } } - data_in (field, spec->input.type, 0, + data_in (field, encoding, spec->input.type, 0, dfm_get_column (dls->reader, ss_data (field)), case_data_rw_idx (c, spec->fv), fmt_var_width (&spec->input)); } @@ -732,6 +752,7 @@ read_from_data_list_free (const struct data_list_pgm *dls, struct ccase *c) static bool read_from_data_list_list (const struct data_list_pgm *dls, struct ccase *c) { + enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (dls->reader); struct dls_var_spec *spec; if (dfm_eof (dls->reader)) @@ -759,7 +780,7 @@ read_from_data_list_list (const struct data_list_pgm *dls, struct ccase *c) break; } - data_in (field, spec->input.type, 0, + data_in (field, encoding, spec->input.type, 0, dfm_get_column (dls->reader, ss_data (field)), case_data_rw_idx (c, spec->fv), fmt_var_width (&spec->input)); } @@ -801,10 +822,10 @@ data_list_trns_proc (void *dls_, struct ccase *c, casenumber case_num UNUSED) if (dls->end != NULL) { double *end = &case_data_rw (c, dls->end)->f; - if (retval == TRNS_DROP_CASE) + if (retval == TRNS_END_FILE) { *end = 1.0; - retval = TRNS_END_FILE; + retval = TRNS_CONTINUE; } else *end = 0.0;