X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpor-file-writer.c;h=27f7c5c4f57ef15879a6cd2d8e1b5de273593db8;hb=2c7d1b0285e21571b1e50def87e33095f095ce4e;hp=f17ae5c8f09fee6e7632b6f0cdeb5183ca4d1392;hpb=f5c108becd49d78f4898cab11352291f5689d24e;p=pspp
diff --git a/src/data/por-file-writer.c b/src/data/por-file-writer.c
index f17ae5c8f0..27f7c5c4f5 100644
--- a/src/data/por-file-writer.c
+++ b/src/data/por-file-writer.c
@@ -1,20 +1,18 @@
-/* PSPP - computes sample statistics.
+/* PSPP - a program for statistical analysis.
Copyright (C) 1997-9, 2000, 2006 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 the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
+ 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
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- 02110-1301, USA. */
+ along with this program. If not, see . */
#include
#include "por-file-writer.h"
@@ -37,6 +35,7 @@
#include
#include
#include
+#include
#include
#include
@@ -51,6 +50,9 @@
#include "gettext.h"
#define _(msgid) gettext (msgid)
+/* Maximum width of a variable in a portable file. */
+#define MAX_POR_WIDTH 255
+
/* Portable file writer. */
struct pfm_writer
{
@@ -81,6 +83,8 @@ static void write_version_data (struct pfm_writer *);
static void write_variables (struct pfm_writer *, struct dictionary *);
static void write_value_labels (struct pfm_writer *,
const struct dictionary *);
+static void write_documents (struct pfm_writer *,
+ const struct dictionary *);
static void format_trig_double (long double, int base_10_precision, char[]);
static char *format_trig_int (int, bool force_sign, char[]);
@@ -140,7 +144,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 = var_get_width (dv);
+ pv->width = MIN (var_get_width (dv), MAX_POR_WIDTH);
pv->fv = var_get_case_index (dv);
}
@@ -157,10 +161,13 @@ pfm_open_writer (struct file_handle *fh, struct dictionary *dict,
write_version_data (w);
write_variables (w, dict);
write_value_labels (w, dict);
+ if (dict_get_document_line_cnt (dict) > 0)
+ write_documents (w, dict);
buf_write (w, "F", 1);
if (ferror (w->file))
goto error;
- return casewriter_create (&por_file_casewriter_class, w);
+ return casewriter_create (dict_get_next_value_idx (dict),
+ &por_file_casewriter_class, w);
error:
close_writer (w);
@@ -285,13 +292,17 @@ write_version_data (struct pfm_writer *w)
write_string (w, host_system);
}
-/* Write format F to file H. */
+/* Write format F to file H. The format is first resized to fit
+ a value of the given WIDTH, which is handy in case F
+ represents a string longer than 255 bytes and thus WIDTH is
+ truncated to 255 bytes. */
static void
-write_format (struct pfm_writer *w, const struct fmt_spec *f)
+write_format (struct pfm_writer *w, struct fmt_spec f, int width)
{
- write_int (w, fmt_to_io (f->type));
- write_int (w, f->w);
- write_int (w, f->d);
+ fmt_resize (&f, width);
+ write_int (w, fmt_to_io (f.type));
+ write_int (w, f.w);
+ write_int (w, f.d);
}
/* Write value V for variable VV to file H. */
@@ -302,8 +313,9 @@ write_value (struct pfm_writer *w, union value *v, struct variable *vv)
write_float (w, v->f);
else
{
- write_int (w, var_get_width (vv));
- buf_write (w, v->s, var_get_width (vv));
+ int width = MIN (var_get_width (vv), MAX_POR_WIDTH);
+ write_int (w, width);
+ buf_write (w, v->s, width);
}
}
@@ -313,8 +325,14 @@ write_variables (struct pfm_writer *w, struct dictionary *dict)
{
int i;
- dict_assign_short_names (dict);
+ short_names_assign (dict);
+ 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);
@@ -323,12 +341,13 @@ 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);
buf_write (w, "7", 1);
- write_int (w, var_get_width (v));
- write_string (w, var_get_short_name (v));
- write_format (w, var_get_print_format (v));
- write_format (w, var_get_write_format (v));
+ write_int (w, width);
+ write_string (w, var_get_short_name (v, 0));
+ write_format (w, *var_get_print_format (v), width);
+ write_format (w, *var_get_write_format (v), width);
/* Write missing values. */
mv_copy (&mv, var_get_missing_values (v));
@@ -388,7 +407,7 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict)
buf_write (w, "D", 1);
write_int (w, 1);
- write_string (w, var_get_short_name (v));
+ 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;
@@ -400,7 +419,25 @@ write_value_labels (struct pfm_writer *w, const struct dictionary *dict)
}
}
-/* Writes case C to the portable file represented by H. */
+/* Write documents in DICT to portable file W. */
+static void
+write_documents (struct pfm_writer *w, const struct dictionary *dict)
+{
+ size_t line_cnt = dict_get_document_line_cnt (dict);
+ struct string line = DS_EMPTY_INITIALIZER;
+ int i;
+
+ 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));
+ }
+ ds_destroy (&line);
+}
+
+/* Writes case C to the portable file represented by WRITER. */
static void
por_file_casewriter_write (struct casewriter *writer, void *w_,
struct ccase *c)