X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fdata-writer.c;h=55b6737b1351ac3fa4e6cbd01a1f96ced717f95b;hb=a5a1e8c05118edd5d9fd0dfd1a6f421632779292;hp=23220cd19d6f92ca07cbc1e293568d9110a6a3ce;hpb=c708736bdd0fea4b79f3ee4a10e00c3abb95d9e3;p=pspp-builds.git diff --git a/src/language/data-io/data-writer.c b/src/language/data-io/data-writer.c index 23220cd1..55b6737b 100644 --- a/src/language/data-io/data-writer.c +++ b/src/language/data-io/data-writer.c @@ -1,33 +1,36 @@ -/* PSPP - computes sample statistics. - Copyright (C) 1997-2004 Free Software Foundation, Inc. - Written by Ben Pfaff . +/* PSPP - a program for statistical analysis. + Copyright (C) 1997-2004, 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 + #include #include #include -#include -#include -#include + #include +#include +#include +#include #include +#include "minmax.h" +#include "xalloc.h" + #include "gettext.h" #define _(msgid) gettext (msgid) @@ -36,7 +39,6 @@ struct dfm_writer { struct file_handle *fh; /* File handle. */ FILE *file; /* Associated file. */ - char *bounce; /* Bounce buffer for fixed-size fields. */ }; /* Opens a file handle for writing as a data file. */ @@ -45,7 +47,7 @@ dfm_open_writer (struct file_handle *fh) { struct dfm_writer *w; void **aux; - + aux = fh_open (fh, FH_REF_FILE, "data file", "ws"); if (aux == NULL) return NULL; @@ -55,7 +57,6 @@ dfm_open_writer (struct file_handle *fh) w = *aux = xmalloc (sizeof *w); w->fh = fh; w->file = fn_open (fh_get_file_name (w->fh), "wb"); - w->bounce = NULL; if (w->file == NULL) { @@ -74,14 +75,15 @@ dfm_open_writer (struct file_handle *fh) /* Returns false if an I/O error occurred on WRITER, true otherwise. */ bool -dfm_write_error (const struct dfm_writer *writer) +dfm_write_error (const struct dfm_writer *writer) { return ferror (writer->file); } -/* Writes record REC having length LEN to the file corresponding to - HANDLE. REC is not null-terminated. Returns true on success, - false on failure. */ +/* Writes record REC (which need not be null-terminated) having + length LEN to the file corresponding to HANDLE. Adds any + needed formatting, such as a trailing new-line. Returns true + on success, false on failure. */ bool dfm_put_record (struct dfm_writer *w, const char *rec, size_t len) { @@ -89,20 +91,34 @@ dfm_put_record (struct dfm_writer *w, const char *rec, size_t len) if (dfm_write_error (w)) return false; - - if (fh_get_mode (w->fh) == FH_MODE_BINARY - && len < fh_get_record_width (w->fh)) + + switch (fh_get_mode (w->fh)) { - size_t rec_width = fh_get_record_width (w->fh); - if (w->bounce == NULL) - w->bounce = xmalloc (rec_width); - memcpy (w->bounce, rec, len); - memset (&w->bounce[len], 0, rec_width - len); - rec = w->bounce; - len = rec_width; + case FH_MODE_TEXT: + fwrite (rec, len, 1, w->file); + putc ('\n', w->file); + break; + + case FH_MODE_BINARY: + { + size_t record_width = fh_get_record_width (w->fh); + size_t write_bytes = MIN (len, record_width); + size_t pad_bytes = record_width - write_bytes; + fwrite (rec, write_bytes, 1, w->file); + while (pad_bytes > 0) + { + static const char spaces[32] = " "; + size_t chunk = MIN (pad_bytes, sizeof spaces); + fwrite (spaces, chunk, 1, w->file); + pad_bytes -= chunk; + } + } + break; + + default: + NOT_REACHED (); } - fwrite (rec, len, 1, w->file); return !dfm_write_error (w); } @@ -119,7 +135,7 @@ dfm_close_writer (struct dfm_writer *w) if (fh_close (w->fh, "data file", "ws")) { free (file_name); - return true; + return true; } ok = true; @@ -130,7 +146,6 @@ dfm_close_writer (struct dfm_writer *w) if (!ok) msg (ME, _("I/O error occurred writing data file \"%s\"."), file_name); } - free (w->bounce); free (w); free (file_name);