X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpor-file-writer.c;h=c5f758a1e5db1a1a16545fdd7cd35cf86e2f322c;hb=173d1687aea88e0e5e1b1d8615ed68ebefb15d08;hp=9ccc8fd713cd032774b8189e959b0e4725d0a7b8;hpb=5c3291dc396b795696e94f47780308fd7ace6fc4;p=pspp diff --git a/src/data/por-file-writer.c b/src/data/por-file-writer.c index 9ccc8fd713..c5f758a1e5 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 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010 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 @@ -39,7 +39,6 @@ #include #include -#include #include #include #include @@ -151,14 +150,14 @@ pfm_open_writer (struct file_handle *fh, struct dictionary *dict, goto error; /* Create file. */ - mode = S_IRUSR | S_IRGRP | S_IROTH; + mode = 0444; if (opts.create_writeable) - mode |= S_IWUSR | S_IWGRP | S_IWOTH; + mode |= 0222; w->rf = replace_file_start (fh_get_file_name (fh), "w", mode, &w->file, NULL); if (w->rf == NULL) { - msg (ME, _("Error opening \"%s\" for writing as a portable file: %s."), + msg (ME, _("Error opening `%s' for writing as a portable file: %s."), fh_get_file_name (fh), strerror (errno)); goto error; } @@ -307,15 +306,15 @@ write_format (struct pfm_writer *w, struct fmt_spec f, int width) write_int (w, f.d); } -/* Write value V for variable VV to file H. */ +/* Write value V with width WIDTH to file H. */ static void -write_value (struct pfm_writer *w, const union value *v, struct variable *vv) +write_value (struct pfm_writer *w, const union value *v, int width) { - if (var_is_numeric (vv)) + if (width == 0) write_float (w, v->f); else { - int width = MIN (var_get_width (vv), MAX_POR_WIDTH); + width = MIN (width, MAX_POR_WIDTH); write_int (w, width); buf_write (w, value_str (v, width), width); } @@ -344,6 +343,7 @@ write_variables (struct pfm_writer *w, struct dictionary *dict) struct variable *v = dict_get_var (dict, i); struct missing_values mv; int width = MIN (var_get_width (v), MAX_POR_WIDTH); + int j; buf_write (w, "7", 1); write_int (w, width); @@ -353,10 +353,12 @@ write_variables (struct pfm_writer *w, struct dictionary *dict) /* Write missing values. */ mv_copy (&mv, var_get_missing_values (v)); - while (mv_has_range (&mv)) + if (var_get_width (v) > 8) + mv_resize (&mv, 8); + if (mv_has_range (&mv)) { double x, y; - mv_pop_range (&mv, &x, &y); + mv_get_range (&mv, &x, &y); if (x == LOWEST) { buf_write (w, "9", 1); @@ -374,13 +376,12 @@ write_variables (struct pfm_writer *w, struct dictionary *dict) write_float (w, y); } } - while (mv_has_value (&mv)) + for (j = 0; j < mv_n_values (&mv); j++) { - union value value; - mv_pop_value (&mv, &value); buf_write (w, "8", 1); - write_value (w, &value, v); + write_value (w, mv_get_value (&mv, j), mv_get_width (&mv)); } + mv_destroy (&mv); /* Write variable label. */ if (var_get_label (v) != NULL) @@ -417,7 +418,7 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict) for (i = 0; i < n_labels; i++) { const struct val_lab *vl = labels[i]; - write_value (w, val_lab_get_value (vl), v); + write_value (w, val_lab_get_value (vl), var_get_width (v)); write_string (w, val_lab_get_label (vl)); } free (labels); @@ -501,7 +502,7 @@ close_writer (struct pfm_writer *w) ok = false; if (!ok) - msg (ME, _("An I/O error occurred writing portable file \"%s\"."), + msg (ME, _("An I/O error occurred writing portable file `%s'."), fh_get_file_name (w->fh)); if (ok ? !replace_file_commit (w->rf) : !replace_file_abort (w->rf))