X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fdata-parser.c;h=020f8e4c7e5a20a0caabc4add9f228f98937d1b6;hb=b5c82cc9aabe7e641011130240ae1b2e84348e23;hp=e7e92bf6d37395f239f2906912e7f835524898d7;hpb=2cf38ce51a9f34961d68a75e0b312a591b5c9abf;p=pspp-builds.git diff --git a/src/language/data-io/data-parser.c b/src/language/data-io/data-parser.c index e7e92bf6..020f8e4c 100644 --- a/src/language/data-io/data-parser.c +++ b/src/language/data-io/data-parser.c @@ -41,6 +41,7 @@ /* Data parser for textual data like that read by DATA LIST. */ struct data_parser { + const struct dictionary *dict; /*Dictionary of destination */ enum data_parser_type type; /* Type of data to parse. */ int skip_records; /* Records to skip before first real data. */ casenumber max_cases; /* Max number of cases to read. */ @@ -79,7 +80,7 @@ static void set_any_sep (struct data_parser *parser); /* Creates and returns a new data parser. */ struct data_parser * -data_parser_create (void) +data_parser_create (const struct dictionary *dict) { struct data_parser *parser = xmalloc (sizeof *parser); @@ -91,6 +92,7 @@ data_parser_create (void) parser->fields = NULL; parser->field_cnt = 0; parser->field_allocated = 0; + parser->dict = dict; parser->span = true; parser->empty_line_has_field = false; @@ -483,7 +485,8 @@ cut_field (const struct data_parser *parser, struct dfm_reader *reader, /* Regular field. */ ss_get_chars (&p, ss_cspan (p, ds_ss (&parser->any_sep)), field); *last_column = dfm_column_start (reader); - if (!ss_ltrim (&p, parser->soft_seps) || ss_is_empty (p)) + if (!ss_ltrim (&p, parser->soft_seps) || ss_is_empty (p) + || ss_find_char (parser->hard_seps, p.string[0]) != SIZE_MAX) { /* Advance past a trailing hard separator, regardless of whether one actually existed. If @@ -505,7 +508,7 @@ static bool parse_fixed (const struct data_parser *parser, struct dfm_reader *reader, struct ccase *c) { - enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader); + const char *encoding = dfm_reader_get_legacy_encoding (reader); struct field *f; int row; @@ -531,6 +534,7 @@ parse_fixed (const struct data_parser *parser, struct dfm_reader *reader, f->format.w), encoding, f->format.type, f->format.d, f->first_column, f->first_column + f->format.w, + parser->dict, case_data_rw_idx (c, f->case_idx), fmt_var_width (&f->format)); @@ -547,7 +551,7 @@ static bool parse_delimited_span (const struct data_parser *parser, struct dfm_reader *reader, struct ccase *c) { - enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader); + const char *encoding = dfm_reader_get_legacy_encoding (reader); struct string tmp = DS_EMPTY_INITIALIZER; struct field *f; @@ -574,6 +578,7 @@ parse_delimited_span (const struct data_parser *parser, data_in (s, encoding, f->format.type, 0, first_column, last_column, + parser->dict, case_data_rw_idx (c, f->case_idx), fmt_var_width (&f->format)); } @@ -588,7 +593,7 @@ static bool parse_delimited_no_span (const struct data_parser *parser, struct dfm_reader *reader, struct ccase *c) { - enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader); + const char *encoding = dfm_reader_get_legacy_encoding (reader); struct string tmp = DS_EMPTY_INITIALIZER; struct substring s; struct field *f; @@ -614,6 +619,7 @@ parse_delimited_no_span (const struct data_parser *parser, data_in (s, encoding, f->format.type, 0, first_column, last_column, + parser->dict, case_data_rw_idx (c, f->case_idx), fmt_var_width (&f->format)); }