X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpor-file-writer.c;h=672add4101cff3520bcd008ea0395a3805a41183;hb=ff7ae14592cbdbebc4e4322424db95663ea7e166;hp=c5f758a1e5db1a1a16545fdd7cd35cf86e2f322c;hpb=a258e53c63a08b0ec48aea8f03808eb651729424;p=pspp diff --git a/src/data/por-file-writer.c b/src/data/por-file-writer.c index c5f758a1e5..672add4101 100644 --- a/src/data/por-file-writer.c +++ b/src/data/por-file-writer.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013 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 @@ -15,7 +15,8 @@ along with this program. If not, see . */ #include -#include "por-file-writer.h" + +#include "data/por-file-writer.h" #include #include @@ -26,26 +27,24 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "minmax.h" -#include "xalloc.h" +#include "data/case.h" +#include "data/casewriter-provider.h" +#include "data/casewriter.h" +#include "data/dictionary.h" +#include "data/file-handle-def.h" +#include "data/format.h" +#include "data/make-file.h" +#include "data/missing-values.h" +#include "data/short-names.h" +#include "data/value-labels.h" +#include "data/variable.h" +#include "libpspp/message.h" +#include "libpspp/misc.h" +#include "libpspp/str.h" +#include "libpspp/version.h" + +#include "gl/minmax.h" +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -74,7 +73,7 @@ struct pfm_writer struct pfm_var { int width; /* 0=numeric, otherwise string var width. */ - int fv; /* Starting case index. */ + int case_index; /* Index in case. */ }; static const struct casewriter_class por_file_casewriter_class; @@ -131,7 +130,7 @@ pfm_open_writer (struct file_handle *fh, struct dictionary *dict, const struct variable *dv = dict_get_var (dict, i); struct pfm_var *pv = &w->vars[i]; pv->width = MIN (var_get_width (dv), MAX_POR_WIDTH); - pv->fv = var_get_case_index (dv); + pv->case_index = var_get_case_index (dv); } w->digits = opts.digits; @@ -153,8 +152,8 @@ pfm_open_writer (struct file_handle *fh, struct dictionary *dict, mode = 0444; if (opts.create_writeable) mode |= 0222; - w->rf = replace_file_start (fh_get_file_name (fh), "w", mode, - &w->file, NULL); + w->rf = replace_file_start (fh, "w", mode, + &w->file); if (w->rf == NULL) { msg (ME, _("Error opening `%s' for writing as a portable file: %s."), @@ -262,8 +261,6 @@ write_header (struct pfm_writer *w) static void write_version_data (struct pfm_writer *w) { - char date_str[9]; - char time_str[7]; time_t t; struct tm tm; struct tm *tmp; @@ -277,12 +274,15 @@ write_version_data (struct pfm_writer *w) else tmp = localtime (&t); - sprintf (date_str, "%04d%02d%02d", - tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday); - sprintf (time_str, "%02d%02d%02d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec); + char *date_str = xasprintf ("%04d%02d%02d", tmp->tm_year + 1900, + tmp->tm_mon + 1, tmp->tm_mday); + char *time_str = xasprintf ("%02d%02d%02d", + tmp->tm_hour, tmp->tm_min, tmp->tm_sec); buf_write (w, "A", 1); write_string (w, date_str); write_string (w, time_str); + free (date_str); + free (time_str); /* Product identification. */ buf_write (w, "1", 1); @@ -316,7 +316,7 @@ write_value (struct pfm_writer *w, const union value *v, int width) { width = MIN (width, MAX_POR_WIDTH); write_int (w, width); - buf_write (w, value_str (v, width), width); + buf_write (w, v->s, width); } } @@ -328,15 +328,17 @@ write_variables (struct pfm_writer *w, struct dictionary *dict) short_names_assign (dict); - if (dict_get_weight (dict) != NULL) + if (dict_get_weight (dict) != NULL) { buf_write (w, "6", 1); write_string (w, var_get_short_name (dict_get_weight (dict), 0)); } - + buf_write (w, "4", 1); write_int (w, dict_get_var_cnt (dict)); - write_int (w, 161); + + buf_write (w, "5", 1); + write_int (w, ceil (w->digits * (log (10) / log (30)))); for (i = 0; i < dict_get_var_cnt (dict); i++) { @@ -404,6 +406,7 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict) const struct val_labs *val_labs = var_get_value_labels (v); size_t n_labels = val_labs_count (val_labs); const struct val_lab **labels; + int j; if (n_labels == 0) continue; @@ -415,11 +418,11 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict) n_labels = val_labs_count (val_labs); labels = val_labs_sorted (val_labs); - for (i = 0; i < n_labels; i++) + for (j = 0; j < n_labels; j++) { - const struct val_lab *vl = labels[i]; + const struct val_lab *vl = labels[j]; write_value (w, val_lab_get_value (vl), var_get_width (v)); - write_string (w, val_lab_get_label (vl)); + write_string (w, val_lab_get_escaped_label (vl)); } free (labels); } @@ -436,10 +439,7 @@ write_documents (struct pfm_writer *w, const struct dictionary *dict) buf_write (w, "E", 1); write_int (w, line_cnt); for (i = 0; i < line_cnt; i++) - { - dict_get_document_line (dict, i, &line); - write_string (w, ds_cstr (&line)); - } + write_string (w, dict_get_document_line (dict, i)); ds_destroy (&line); } @@ -458,11 +458,11 @@ por_file_casewriter_write (struct casewriter *writer, void *w_, struct pfm_var *v = &w->vars[i]; if (v->width == 0) - write_float (w, case_num_idx (c, v->fv)); + write_float (w, case_num_idx (c, v->case_index)); else { write_int (w, v->width); - buf_write (w, case_str_idx (c, v->fv), v->width); + buf_write (w, case_str_idx (c, v->case_index), v->width); } } } @@ -812,7 +812,7 @@ format_trig_double (long double value, int base_10_precision, char output[]) value -= chunk; /* Append the chunk, in base 30, to trigs[]. */ - for (trigs_left = CHUNK_SIZE; chunk > 0 && trigs_left > 0; ) + for (trigs_left = CHUNK_SIZE; chunk > 0 && trigs_left > 0;) { trigs[trig_cnt + --trigs_left] = chunk % 30; chunk /= 30;