X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fprint.c;h=cffa3bd49fdd29f480798c311ba796ae791ff1da;hb=55418b678b801a77c7e43eec3dcf2d6c890c80d1;hp=a07ca2d8c54baa3f65b54aa9eeb60c005a7e6f01;hpb=bc19562deb692e6db3271eb0402e9f9c99e4cbcb;p=pspp diff --git a/src/language/data-io/print.c b/src/language/data-io/print.c index a07ca2d8c5..cffa3bd49f 100644 --- a/src/language/data-io/print.c +++ b/src/language/data-io/print.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 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 @@ -18,30 +18,30 @@ #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "xalloc.h" +#include "data/case.h" +#include "data/dataset.h" +#include "data/data-out.h" +#include "data/format.h" +#include "data/transformations.h" +#include "data/variable.h" +#include "language/command.h" +#include "language/data-io/data-writer.h" +#include "language/data-io/file-handle.h" +#include "language/data-io/placement-parser.h" +#include "language/lexer/format-parser.h" +#include "language/lexer/lexer.h" +#include "language/lexer/variable-parser.h" +#include "libpspp/assertion.h" +#include "libpspp/compiler.h" +#include "libpspp/i18n.h" +#include "libpspp/ll.h" +#include "libpspp/message.h" +#include "libpspp/misc.h" +#include "libpspp/pool.h" +#include "output/tab.h" +#include "output/text-item.h" + +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -136,6 +136,7 @@ internal_cmd_print (struct lexer *lexer, struct dataset *ds, bool print_table = 0; struct print_trns *trns; struct file_handle *fh = NULL; + char *encoding = NULL; struct pool *tmp_pool; /* Fill in prt to facilitate error-handling. */ @@ -156,10 +157,21 @@ internal_cmd_print (struct lexer *lexer, struct dataset *ds, { lex_match (lexer, T_EQUALS); - fh = fh_parse (lexer, FH_REF_FILE); + fh = fh_parse (lexer, FH_REF_FILE, NULL); if (fh == NULL) 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 if (lex_match_id (lexer, "RECORDS")) { lex_match (lexer, T_EQUALS); @@ -194,10 +206,10 @@ internal_cmd_print (struct lexer *lexer, struct dataset *ds, if (fh != NULL) { - trns->writer = dfm_open_writer (fh); + trns->writer = dfm_open_writer (fh, encoding); if (trns->writer == NULL) goto error; - trns->encoding = dfm_writer_get_legacy_encoding (trns->writer); + trns->encoding = dfm_writer_get_encoding (trns->writer); } else trns->encoding = UTF8; @@ -325,7 +337,7 @@ parse_variable_argument (struct lexer *lexer, const struct dictionary *dict, if (lex_is_number (lexer) || lex_token (lexer) == T_LPAREN) { - if (!parse_var_placements (lexer, tmp_pool, var_cnt, false, + if (!parse_var_placements (lexer, tmp_pool, var_cnt, FMT_FOR_OUTPUT, &formats, &format_cnt)) return false; add_space = false; @@ -468,11 +480,11 @@ print_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) if (spec->type == PRT_VAR) { const union value *input = case_data (*c, spec->var); - char *output = ds_put_uninit (&trns->line, spec->format.w); if (!spec->sysmis_as_spaces || input->f != SYSMIS) - data_out_legacy (input, trns->encoding, &spec->format, output); + data_out_recode (input, var_get_encoding (spec->var), + &spec->format, &trns->line, trns->encoding); else - memset (output, encoded_space, spec->format.w); + ds_put_byte_multiple (&trns->line, encoded_space, spec->format.w); if (spec->add_space) ds_put_byte (&trns->line, encoded_space); }