X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Flanguage%2Fdata-io%2Fdata-list.c;h=bc295a9aed7aa7939eb6f2f8141d82a4604d2053;hb=f5a7058281a9bb3954b1324c82a6e997b614ce35;hp=9beaea9c4cc831571c27e2a5ddb47dd2f0cdb546;hpb=fe8dc2171009e90d2335f159d05f7e6660e24780;p=pspp diff --git a/src/language/data-io/data-list.c b/src/language/data-io/data-list.c index 9beaea9c4c..bc295a9aed 100644 --- a/src/language/data-io/data-list.c +++ b/src/language/data-io/data-list.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012 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 @@ -78,7 +78,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) struct dfm_reader *reader; struct variable *end = NULL; struct file_handle *fh = NULL; - struct string encoding = DS_EMPTY_INITIALIZER; + char *encoding = NULL; int table; enum data_parser_type type; @@ -111,7 +111,8 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) if (!lex_force_string (lexer)) goto error; - ds_init_substring (&encoding, lex_tokss (lexer)); + free (encoding); + encoding = ss_xstrdup (lex_tokss (lexer)); lex_get (lexer); } @@ -241,7 +242,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) } type = data_parser_get_type (parser); - if (! ds_is_empty (&encoding) && NULL == fh) + if (encoding && NULL == fh) msg (MW, _("Encoding should not be specified for inline data. It will be " "ignored.")); @@ -278,7 +279,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) if (table) data_parser_output_description (parser, fh); - reader = dfm_open_reader (fh, lexer); + reader = dfm_open_reader (fh, lexer, encoding); if (reader == NULL) goto error; @@ -294,7 +295,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) data_parser_make_active_file (parser, ds, reader, dict); fh_unref (fh); - ds_destroy (&encoding); + free (encoding); return CMD_SUCCESS; @@ -303,7 +304,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) if (!in_input_program ()) dict_destroy (dict); fh_unref (fh); - ds_destroy (&encoding); + free (encoding); return CMD_CASCADING_FAILURE; } @@ -332,7 +333,7 @@ parse_fixed (struct lexer *lexer, struct dictionary *dict, if (!parse_record_placement (lexer, &record, &column) || !parse_DATA_LIST_vars_pool (lexer, dict, tmp_pool, &names, &name_cnt, PV_NONE) - || !parse_var_placements (lexer, tmp_pool, name_cnt, true, + || !parse_var_placements (lexer, tmp_pool, name_cnt, FMT_FOR_INPUT, &formats, &format_cnt)) return false; @@ -428,9 +429,28 @@ parse_free (struct lexer *lexer, struct dictionary *dict, if (lex_match (lexer, T_LPAREN)) { - if (!parse_format_specifier (lexer, &input) - || !fmt_check_input (&input) - || !lex_force_match (lexer, T_RPAREN)) + char type[FMT_TYPE_LEN_MAX + 1]; + + if (!parse_abstract_format_specifier (lexer, type, &input.w, + &input.d)) + return NULL; + if (!fmt_from_name (type, &input.type)) + { + msg (SE, _("Unknown format type `%s'."), type); + return NULL; + } + + /* If no width was included, use the minimum width for the type. + This isn't quite right, because DATETIME by itself seems to become + DATETIME20 (see bug #30690), whereas this will become + DATETIME17. The correct behavior is not documented. */ + if (input.w == 0) + { + input.w = fmt_min_input_width (input.type); + input.d = 0; + } + + if (!fmt_check_input (&input) || !lex_force_match (lexer, T_RPAREN)) return NULL; /* As a special case, N format is treated as F format