X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Finpt-pgm.c;h=ccd53be04e4199913635d1568aa4af774459e36f;hb=3d9f94e464bd3b760898914304d16cc9c3990f11;hp=72d5a2e7b88e302df07e4ca54e59c206cbdebae5;hpb=9ade26c8349b4434008c46cf09bc7473ec743972;p=pspp diff --git a/src/language/data-io/inpt-pgm.c b/src/language/data-io/inpt-pgm.c index 72d5a2e7b8..ccd53be04e 100644 --- a/src/language/data-io/inpt-pgm.c +++ b/src/language/data-io/inpt-pgm.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 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 @@ -22,8 +22,8 @@ #include "data/case.h" #include "data/caseinit.h" #include "data/casereader-provider.h" +#include "data/dataset.h" #include "data/dictionary.h" -#include "data/procedure.h" #include "data/transformations.h" #include "data/variable.h" #include "language/command.h" @@ -92,7 +92,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds) struct input_program_pgm *inp; bool saw_END_CASE = false; - proc_discard_active_file (ds); + dataset_clear (ds); if (!lex_match (lexer, T_ENDCMD)) return lex_end_of_command (lexer); @@ -107,7 +107,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds) enum cmd_result result; result = cmd_parse_in_state (lexer, ds, CMD_STATE_INPUT_PROGRAM); - if (result == CMD_END_CASE) + if (result == (enum cmd_result) CMD_END_CASE) { emit_END_CASE (ds, inp); saw_END_CASE = true; @@ -117,7 +117,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds) if (result == CMD_EOF) msg (SE, _("Unexpected end-of-file within INPUT PROGRAM.")); inside_input_program = false; - proc_discard_active_file (ds); + dataset_clear (ds); destroy_input_program (inp); return result; } @@ -129,7 +129,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds) if (dict_get_next_value_idx (dataset_dict (ds)) == 0) { msg (SE, _("Input program did not create any variables.")); - proc_discard_active_file (ds); + dataset_clear (ds); destroy_input_program (inp); return CMD_FAILURE; } @@ -144,7 +144,7 @@ cmd_input_program (struct lexer *lexer, struct dataset *ds) caseinit_mark_for_init (inp->init, dataset_dict (ds)); inp->proto = caseproto_ref (dict_get_proto (dataset_dict (ds))); - proc_set_active_file_data ( + dataset_set_source ( ds, casereader_create_sequential (NULL, inp->proto, CASENUMBER_MAX, &input_program_casereader_class, inp)); @@ -266,6 +266,7 @@ cmd_reread (struct lexer *lexer, struct dataset *ds) struct file_handle *fh; /* File to be re-read. */ struct expression *e; /* Expression for column to set. */ struct reread_trns *t; /* Created transformation. */ + char *encoding = NULL; fh = fh_get_default_handle (); e = NULL; @@ -277,41 +278,53 @@ cmd_reread (struct lexer *lexer, struct dataset *ds) if (e) { - msg (SE, _("%s subcommand may be given at most once."), "COLUMN"); - expr_free (e); - return CMD_CASCADING_FAILURE; + lex_sbc_only_once ("COLUMN"); + goto error; } e = expr_parse (lexer, ds, EXPR_NUMBER); if (!e) - return CMD_CASCADING_FAILURE; + goto error; } else if (lex_match_id (lexer, "FILE")) { lex_match (lexer, T_EQUALS); fh_unref (fh); - fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE); + fh = fh_parse (lexer, FH_REF_FILE | FH_REF_INLINE, NULL); if (fh == NULL) - { - expr_free (e); - return CMD_CASCADING_FAILURE; - } + goto error; + } + else if (lex_match_id (lexer, "ENCODING")) + { + lex_match (lexer, T_EQUALS); + if (!lex_force_string (lexer)) + goto error; + + free (encoding); + encoding = ss_xstrdup (lex_tokss (lexer)); + + lex_get (lexer); } else { lex_error (lexer, NULL); - expr_free (e); - return CMD_CASCADING_FAILURE; + goto error; } } t = xmalloc (sizeof *t); - t->reader = dfm_open_reader (fh, lexer); + t->reader = dfm_open_reader (fh, lexer, encoding); t->column = e; add_transformation (ds, reread_trns_proc, reread_trns_free, t); fh_unref (fh); + free (encoding); return CMD_SUCCESS; + +error: + expr_free (e); + free (encoding); + return CMD_CASCADING_FAILURE; } /* Executes a REREAD transformation. */