X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fdata-list.c;h=d43af347a701693224980ea18281eaf72d6c0e60;hb=a5097a183f00ab2d2dc538ba7094a4696e2fea04;hp=7a2a074b59e763eebe322780c96e86f057991ed6;hpb=1134f778a7d1e729190065ce58f02b228e3c0a21;p=pspp-builds.git diff --git a/src/language/data-io/data-list.c b/src/language/data-io/data-list.c index 7a2a074b..d43af347 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 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2007, 2009 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 @@ -75,8 +75,9 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) struct dictionary *dict; struct data_parser *parser; struct dfm_reader *reader; - struct variable *end; - struct file_handle *fh; + struct variable *end = NULL; + struct file_handle *fh = NULL; + struct string encoding = DS_EMPTY_INITIALIZER; int table; enum data_parser_type type; @@ -85,10 +86,8 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) bool ok; dict = in_input_program () ? dataset_dict (ds) : dict_create (); - parser = data_parser_create (); + parser = data_parser_create (dict); reader = NULL; - end = NULL; - fh = NULL; table = -1; /* Print table if nonzero, -1=undecided. */ has_type = false; @@ -103,6 +102,16 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) if (fh == NULL) goto error; } + else if (lex_match_id (lexer, "ENCODING")) + { + lex_match (lexer, '='); + if (!lex_force_string (lexer)) + goto error; + + ds_init_string (&encoding, lex_tokstr (lexer)); + + lex_get (lexer); + } else if (lex_match_id (lexer, "RECORDS")) { lex_match (lexer, '='); @@ -228,6 +237,14 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) } type = data_parser_get_type (parser); + if (! ds_is_empty (&encoding)) + { + if ( NULL == fh) + msg (MW, _("Encoding should not be specified for inline data. It will be ignored.")); + else + dict_set_encoding (dict, ds_cstr (&encoding)); + } + if (fh == NULL) fh = fh_inline_file (); fh_set_default_handle (fh); @@ -277,6 +294,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); return CMD_SUCCESS; @@ -285,6 +303,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) if (!in_input_program ()) dict_destroy (dict); fh_unref (fh); + ds_destroy (&encoding); return CMD_CASCADING_FAILURE; } @@ -463,14 +482,15 @@ data_list_trns_free (void *trns_) return true; } -/* Handle DATA LIST transformation TRNS, parsing data into C. */ +/* Handle DATA LIST transformation TRNS, parsing data into *C. */ static int -data_list_trns_proc (void *trns_, struct ccase *c, casenumber case_num UNUSED) +data_list_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { struct data_list_trns *trns = trns_; int retval; - if (data_parser_parse (trns->parser, trns->reader, c)) + *c = case_unshare (*c); + if (data_parser_parse (trns->parser, trns->reader, *c)) retval = TRNS_CONTINUE; else if (dfm_reader_error (trns->reader) || dfm_eof (trns->reader) > 1) { @@ -484,7 +504,7 @@ data_list_trns_proc (void *trns_, struct ccase *c, casenumber case_num UNUSED) /* If there was an END subcommand handle it. */ if (trns->end != NULL) { - double *end = &case_data_rw (c, trns->end)->f; + double *end = &case_data_rw (*c, trns->end)->f; if (retval == TRNS_END_FILE) { *end = 1.0;