X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fget-data.c;h=13eebe6c3aaabe840a155c4e405fa797e99af295;hb=b8a262a5ea1c5011eeb42d72365620f53ee1a7bc;hp=995be8e7ce896212cd9775af4789c1aa1441360a;hpb=958e78555714e9f1847513f9cc576fa2cd7a6769;p=pspp diff --git a/src/language/data-io/get-data.c b/src/language/data-io/get-data.c index 995be8e7ce..13eebe6c3a 100644 --- a/src/language/data-io/get-data.c +++ b/src/language/data-io/get-data.c @@ -52,9 +52,6 @@ static const bool odf_read_support = true; #else static const bool odf_read_support = false; struct spreadsheet *ods_probe (const char *filename, bool report_errors){} -struct casereader * ods_make_reader (struct spreadsheet *spreadsheet, - const struct spreadsheet_read_options *opts){} -void ods_unref (struct spreadsheet *r){} #endif #ifdef GNM_READ_SUPPORT @@ -62,10 +59,6 @@ static const bool gnm_read_support = true; #else static const bool gnm_read_support = false; struct spreadsheet *gnumeric_probe (const char *filename, bool report_errors){} -struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet, - const struct spreadsheet_read_options *opts){} -void gnumeric_unref (struct spreadsheet *r){} - #endif static bool parse_spreadsheet (struct lexer *lexer, char **filename, @@ -88,14 +81,20 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) opts.read_names = false; opts.asw = -1; - lex_force_match (lexer, T_SLASH); + if (! lex_force_match (lexer, T_SLASH)) + goto error; if (!lex_force_match_id (lexer, "TYPE")) goto error; - lex_force_match (lexer, T_EQUALS); + if (!lex_force_match (lexer, T_EQUALS)) + goto error; - tok = strdup (lex_tokcstr (lexer)); + const char *s = lex_tokcstr (lexer); + + if (s) + tok = strdup (s); + if (lex_match_id (lexer, "TXT")) { free (tok); @@ -155,12 +154,14 @@ parse_get_psql (struct lexer *lexer, struct dataset *ds) psql.bsize = -1; ds_init_empty (&psql.sql); - lex_force_match (lexer, T_SLASH); + if (! lex_force_match (lexer, T_SLASH)) + goto error; if (!lex_force_match_id (lexer, "CONNECT")) goto error; - lex_force_match (lexer, T_EQUALS); + if (! lex_force_match (lexer, T_EQUALS)) + goto error; if (!lex_force_string (lexer)) goto error; @@ -174,14 +175,20 @@ parse_get_psql (struct lexer *lexer, struct dataset *ds) if ( lex_match_id (lexer, "ASSUMEDSTRWIDTH")) { lex_match (lexer, T_EQUALS); - psql.str_width = lex_integer (lexer); - lex_get (lexer); + if (lex_force_int (lexer)) + { + psql.str_width = lex_integer (lexer); + lex_get (lexer); + } } else if ( lex_match_id (lexer, "BSIZE")) { lex_match (lexer, T_EQUALS); - psql.bsize = lex_integer (lexer); - lex_get (lexer); + if (lex_force_int (lexer)) + { + psql.bsize = lex_integer (lexer); + lex_get (lexer); + } } else if ( lex_match_id (lexer, "UNENCRYPTED")) { @@ -231,12 +238,14 @@ parse_spreadsheet (struct lexer *lexer, char **filename, opts->read_names = true; opts->asw = -1; - lex_force_match (lexer, T_SLASH); + if (! lex_force_match (lexer, T_SLASH)) + goto error; if (!lex_force_match_id (lexer, "FILE")) goto error; - lex_force_match (lexer, T_EQUALS); + if (! lex_force_match (lexer, T_EQUALS)) + goto error; if (!lex_force_string (lexer)) goto error; @@ -250,8 +259,11 @@ parse_spreadsheet (struct lexer *lexer, char **filename, if ( lex_match_id (lexer, "ASSUMEDSTRWIDTH")) { lex_match (lexer, T_EQUALS); - opts->asw = lex_integer (lexer); - lex_get (lexer); + if (lex_force_int (lexer)) + { + opts->asw = lex_integer (lexer); + lex_get (lexer); + } } else if (lex_match_id (lexer, "SHEET")) { @@ -268,6 +280,9 @@ parse_spreadsheet (struct lexer *lexer, char **filename, } else if (lex_match_id (lexer, "INDEX")) { + if (!lex_force_int (lexer)) + goto error; + opts->sheet_index = lex_integer (lexer); if (opts->sheet_index <= 0) { @@ -374,11 +389,13 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds) enum data_parser_type type; bool has_type; - lex_force_match (lexer, T_SLASH); + if (! lex_force_match (lexer, T_SLASH)) + goto error; if (!lex_force_match_id (lexer, "FILE")) goto error; - lex_force_match (lexer, T_EQUALS); + if (! lex_force_match (lexer, T_EQUALS)) + goto error; fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL); if (fh == NULL) goto error; @@ -593,18 +610,20 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds) lex_get (lexer); } - if (!lex_force_id (lexer) - || !dict_id_is_valid (dict, lex_tokcstr (lexer), true)) - goto error; name = xstrdup (lex_tokcstr (lexer)); + if (!lex_force_id (lexer) + || !dict_id_is_valid (dict, name, true)) + { + goto error; + } lex_get (lexer); - if (type == DP_DELIMITED) { if (!parse_format_specifier (lexer, &input) - || !fmt_check_input (&input)) - goto error; - + || !fmt_check_input (&input)) + { + goto error; + } output = fmt_for_output_from_input (&input); } else @@ -624,14 +643,12 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds) msg (SE, _("Unknown format type `%s'."), fmt_type_name); goto error; } - /* Compose input format. */ input.type = fmt_type; input.w = lc - fc + 1; input.d = 0; if (!fmt_check_input (&input)) goto error; - /* Compose output format. */ if (w != 0) { @@ -644,7 +661,6 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds) else output = fmt_for_output_from_input (&input); } - v = dict_create_var (dict, name, fmt_var_width (&input)); if (v == NULL) { @@ -652,7 +668,6 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds) goto error; } var_set_both_formats (v, &output); - if (type == DP_DELIMITED) data_parser_add_delimited_field (parser, &input, var_get_case_index (v),