X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Fdata%2Fpor-file-writer.c;h=3c475d30b58d83b9e0217e88d8d22d05afe4383b;hb=dc29c57e7908b0bdc6ab84f8aa4b7cb8a780026c;hp=773969302ebcb9ddc3b06fea93aa1da6c66c313c;hpb=deb4fd96c0c171fc8eb64f7f1e7f5c2af4931416;p=pspp
diff --git a/src/data/por-file-writer.c b/src/data/por-file-writer.c
index 773969302e..3c475d30b5 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, 2011 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,25 @@
#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/casewriter-provider.h"
+#include "data/casewriter.h"
+#include "data/dictionary.h"
+#include "data/file-handle-def.h"
+#include "data/file-name.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)
@@ -150,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;
}
@@ -172,7 +172,7 @@ pfm_open_writer (struct file_handle *fh, struct dictionary *dict,
buf_write (w, "F", 1);
if (ferror (w->file))
goto error;
- return casewriter_create (dict_get_next_value_idx (dict),
+ return casewriter_create (dict_get_proto (dict),
&por_file_casewriter_class, w);
error:
@@ -215,7 +215,8 @@ write_float (struct pfm_writer *w, double d)
char buffer[64];
format_trig_double (d, floor (d) == d ? DBL_DIG : w->digits, buffer);
buf_write (w, buffer, strlen (buffer));
- buf_write (w, "/", 1);
+ if (d != SYSMIS)
+ buf_write (w, "/", 1);
}
/* Write N to the portable file as an integer field. */
@@ -305,17 +306,17 @@ 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, 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, v->s, width);
+ buf_write (w, value_str (v, width), width);
}
}
@@ -342,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);
@@ -351,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);
@@ -372,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)
@@ -397,12 +400,12 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict)
for (i = 0; i < dict_get_var_cnt (dict); i++)
{
- struct val_labs_iterator *j;
struct variable *v = dict_get_var (dict, i);
const struct val_labs *val_labs = var_get_value_labels (v);
- struct val_lab *vl;
+ size_t n_labels = val_labs_count (val_labs);
+ const struct val_lab **labels;
- if (val_labs == NULL)
+ if (n_labels == 0)
continue;
buf_write (w, "D", 1);
@@ -410,12 +413,15 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict)
write_string (w, var_get_short_name (v, 0));
write_int (w, val_labs_count (val_labs));
- for (vl = val_labs_first_sorted (val_labs, &j); vl != NULL;
- vl = val_labs_next (val_labs, &j))
+ n_labels = val_labs_count (val_labs);
+ labels = val_labs_sorted (val_labs);
+ for (i = 0; i < n_labels; i++)
{
- write_value (w, &vl->value, v);
- write_string (w, vl->label);
+ const struct val_lab *vl = labels[i];
+ write_value (w, val_lab_get_value (vl), var_get_width (v));
+ write_string (w, val_lab_get_escaped_label (vl));
}
+ free (labels);
}
}
@@ -430,10 +436,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);
}
@@ -496,7 +499,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))