X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpor-file-writer.c;h=111043a8a1e83e2b321ae586e18242892565de42;hb=a0a06d76c05d0c76c9a88461d4ccf0a96eb67390;hp=be8aba96dc873a7dc079de3539a1669746e167c2;hpb=67ab74956960acef3c4e86886504b93253eb3e4e;p=pspp-builds.git diff --git a/src/data/por-file-writer.c b/src/data/por-file-writer.c index be8aba96..111043a8 100644 --- a/src/data/por-file-writer.c +++ b/src/data/por-file-writer.c @@ -19,34 +19,33 @@ #include #include -#include #include #include #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 "gettext.h" #define _(msgid) gettext (msgid) @@ -83,6 +82,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[]); @@ -107,30 +108,31 @@ pfm_open_writer (struct file_handle *fh, struct dictionary *dict, { struct pfm_writer *w = NULL; mode_t mode; - int fd; + FILE *file; size_t i; + /* Open file handle. */ + if (!fh_open (fh, FH_REF_FILE, "portable file", "we")) + return NULL; + /* Create file. */ mode = S_IRUSR | S_IRGRP | S_IROTH; if (opts.create_writeable) mode |= S_IWUSR | S_IWGRP | S_IWOTH; - fd = open (fh_get_file_name (fh), O_WRONLY | O_CREAT | O_TRUNC, mode); - if (fd < 0) - goto open_error; - - /* Open file handle. */ - if (!fh_open (fh, FH_REF_FILE, "portable file", "we")) - goto error; + file = create_stream (fh_get_file_name (fh), "w", mode); + if (file == NULL) + { + fh_close (fh, "portable file", "we"); + msg (ME, _("An error occurred while opening \"%s\" for writing " + "as a portable file: %s."), + fh_get_file_name (fh), strerror (errno)); + return NULL; + } /* Initialize data structures. */ w = xmalloc (sizeof *w); w->fh = fh; - w->file = fdopen (fd, "w"); - if (w->file == NULL) - { - close (fd); - goto open_error; - } + w->file = file; w->lc = 0; w->var_cnt = 0; @@ -159,20 +161,16 @@ 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); - - error: - close_writer (w); - return NULL; - - open_error: - msg (ME, _("An error occurred while opening \"%s\" for writing " - "as a portable file: %s."), - fh_get_file_name (fh), strerror (errno)); - goto error; + { + close_writer (w); + return NULL; + } + return casewriter_create (dict_get_next_value_idx (dict), + &por_file_casewriter_class, w); } /* Write NBYTES starting at BUF to the portable file represented by @@ -322,6 +320,12 @@ write_variables (struct pfm_writer *w, struct dictionary *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); @@ -408,7 +412,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)