/* PSPP - a program for statistical analysis.
- Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2007, 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
#include <libpspp/assertion.h>
#include <libpspp/taint.h>
-#include <libpspp/tmpfile.h>
+#include <libpspp/temp-file.h>
#include "error.h"
#include "xalloc.h"
struct caseproto *proto; /* Format of cases in the tmpfile. */
size_t case_size; /* Number of bytes per case. */
size_t *offsets; /* Offset to each value. */
- struct tmpfile *tmpfile; /* Temporary file. */
+ struct temp_file *temp_file; /* Temporary file. */
};
/* Returns the number of bytes needed to store a value with the
ctf = xmalloc (sizeof *ctf);
ctf->taint = taint_create ();
- ctf->tmpfile = tmpfile_create ();
+ ctf->temp_file = temp_file_create ();
ctf->proto = caseproto_ref (proto);
ctf->case_size = 0;
n_values = caseproto_get_n_widths (proto);
if (ctf != NULL)
{
struct taint *taint = ctf->taint;
- tmpfile_destroy (ctf->tmpfile);
+ temp_file_destroy (ctf->temp_file);
caseproto_unref (ctf->proto);
free (ctf->offsets);
free (ctf);
{
int width = caseproto_get_width (ctf->proto, i);
if (width != -1
- && !tmpfile_read (ctf->tmpfile, case_offset + ctf->offsets[i],
- width_to_n_bytes (width),
- value_to_data (&values[i], width)))
+ && !temp_file_read (ctf->temp_file, case_offset + ctf->offsets[i],
+ width_to_n_bytes (width),
+ value_to_data (&values[i], width)))
return false;
}
return true;
{
int width = caseproto_get_width (ctf->proto, i);
if (width != -1
- && !tmpfile_write (ctf->tmpfile, case_offset + ctf->offsets[i],
- width_to_n_bytes (width),
- value_to_data (values++, width)))
+ && !temp_file_write (ctf->temp_file, case_offset + ctf->offsets[i],
+ width_to_n_bytes (width),
+ value_to_data (values++, width)))
return false;
}
return true;
src/libpspp/str.h \
src/libpspp/taint.c \
src/libpspp/taint.h \
- src/libpspp/tmpfile.c \
- src/libpspp/tmpfile.h \
+ src/libpspp/temp-file.c \
+ src/libpspp/temp-file.h \
src/libpspp/tower.c \
src/libpspp/tower.h \
src/libpspp/version.h \
/* PSPP - a program for statistical analysis.
- Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2007, 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
#include <libpspp/misc.h>
#include <libpspp/range-set.h>
#include <libpspp/sparse-array.h>
-#include <libpspp/tmpfile.h>
+#include <libpspp/temp-file.h>
#include "md4.h"
#include "minmax.h"
uint8_t *default_row; /* Defaults for unwritten rows. */
unsigned long int max_memory_rows; /* Max rows before dumping to disk. */
struct sparse_array *memory; /* Backing, if stored in memory. */
- struct tmpfile *disk; /* Backing, if stored on disk. */
+ struct temp_file *disk; /* Backing, if stored on disk. */
struct range_set *disk_rows; /* Allocated rows, if on disk. */
};
const struct range_set_node *node;
void *tmp = xmalloc (old->n_bytes);
- new->disk = tmpfile_create ();
+ new->disk = temp_file_create ();
new->disk_rows = range_set_clone (old->disk_rows, NULL);
for (node = range_set_first (old->disk_rows); node != NULL;
node = range_set_next (old->disk_rows, node))
for (idx = start; idx < end; idx++)
{
off_t offset = (off_t) idx * old->n_bytes;
- if (!tmpfile_read (old->disk, offset, old->n_bytes, tmp)
- || !tmpfile_write (new->disk, offset, old->n_bytes, tmp))
+ if (!temp_file_read (old->disk, offset, old->n_bytes, tmp)
+ || !temp_file_write (new->disk, offset, old->n_bytes, tmp))
{
free (tmp);
sparse_xarray_destroy (new);
free (*row);
sparse_array_destroy (sx->memory);
}
- tmpfile_destroy (sx->disk);
+ temp_file_destroy (sx->disk);
range_set_destroy (sx->disk_rows);
free (sx);
}
assert (sx->memory != NULL);
assert (sx->disk == NULL);
- sx->disk = tmpfile_create ();
+ sx->disk = temp_file_create ();
sx->disk_rows = range_set_create ();
for (row = sparse_array_first (sx->memory, &idx); row != NULL;
row = sparse_array_next (sx->memory, idx, &idx))
{
- if (!tmpfile_write (sx->disk, (off_t) idx * sx->n_bytes, sx->n_bytes,
+ if (!temp_file_write (sx->disk, (off_t) idx * sx->n_bytes, sx->n_bytes,
*row))
{
- tmpfile_destroy (sx->disk);
+ temp_file_destroy (sx->disk);
sx->disk = NULL;
range_set_destroy (sx->disk_rows);
sx->disk_rows = NULL;
else
{
if (range_set_contains (sx->disk_rows, row))
- return tmpfile_read (sx->disk, (off_t) row * sx->n_bytes + start,
- n, data);
+ return temp_file_read (sx->disk, (off_t) row * sx->n_bytes + start,
+ n, data);
}
memcpy (data, sx->default_row + start, n);
{
off_t ofs = (off_t) row * sx->n_bytes;
if (range_set_contains (sx->disk_rows, row))
- return tmpfile_write (sx->disk, ofs + start, n, data);
+ return temp_file_write (sx->disk, ofs + start, n, data);
else
{
range_set_insert (sx->disk_rows, row, 1);
- return (tmpfile_write (sx->disk, ofs, start, sx->default_row)
- && tmpfile_write (sx->disk, ofs + start, n, data)
- && tmpfile_write (sx->disk, ofs + start + n,
- sx->n_bytes - start - n,
- sx->default_row + start + n));
+ return (temp_file_write (sx->disk, ofs, start, sx->default_row)
+ && temp_file_write (sx->disk, ofs + start, n, data)
+ && temp_file_write (sx->disk, ofs + start + n,
+ sx->n_bytes - start - n,
+ sx->default_row + start + n));
}
}
for (row = start_row; row < end_row; row++)
{
off_t offset = (off_t) row * sx->n_bytes;
- if (!tmpfile_write (sx->disk, offset + start, n, data))
+ if (!temp_file_write (sx->disk, offset + start, n, data))
break;
}
}
- if (tmpfile_error (sx->disk))
+ if (temp_file_error (sx->disk))
return false;
}
return true;
uint8_t **p = sparse_array_get (sx->memory, idx);
return *p;
}
- else if (tmpfile_read (sx->disk, (off_t) idx * sx->n_bytes,
- sx->n_bytes, buffer))
+ else if (temp_file_read (sx->disk, (off_t) idx * sx->n_bytes,
+ sx->n_bytes, buffer))
return buffer;
else
return NULL;
for (row = start; row < end; row++)
{
off_t offset = (off_t) row * sx->n_bytes;
- success = (tmpfile_read (sx->disk, offset, sx->n_bytes, tmp)
+ success = (temp_file_read (sx->disk, offset, sx->n_bytes,
+ tmp)
&& cb (tmp, tmp, aux)
- && tmpfile_write (dx->disk, offset,
- dx->n_bytes, tmp));
+ && temp_file_write (dx->disk, offset,
+ dx->n_bytes, tmp));
if (!success)
break;
}
for (idx = start; idx < end; idx++)
{
off_t offset = (off_t) idx * sx->n_bytes;
- if (!tmpfile_read (sx->disk, offset, sx->n_bytes, tmp))
+ if (!temp_file_read (sx->disk, offset, sx->n_bytes, tmp))
NOT_REACHED ();
md4_process_bytes (&idx, sizeof idx, &ctx);
md4_process_bytes (tmp, sx->n_bytes, &ctx);
--- /dev/null
+/* PSPP - a program for statistical analysis.
+ Copyright (C) 2007, 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
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* A interface to allow a temporary file to be treated as an
+ array of data. */
+
+#include <config.h>
+
+#include <libpspp/temp-file.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <libpspp/assertion.h>
+#include <libpspp/cast.h>
+
+#include "error.h"
+#include "xalloc.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+struct temp_file
+ {
+ FILE *file; /* Underlying file. */
+
+ /* Current byte offset in file. We track this manually,
+ instead of using ftello, because in glibc ftello flushes
+ the stream buffer, making the common case of sequential
+ access to cases unreasonably slow. */
+ off_t position;
+ };
+
+/* Creates and returns a new temporary file. The temporary file
+ will be automatically deleted when the process exits. */
+struct temp_file *
+temp_file_create (void)
+{
+ struct temp_file *tf = xmalloc (sizeof *tf);
+ tf->file = tmpfile ();
+ if (tf->file == NULL)
+ error (0, errno, _("failed to create temporary file"));
+ tf->position = 0;
+ return tf;
+}
+
+/* Closes and destroys temporary file TF. Returns true if I/O on
+ TF always succeeded, false if an I/O error occurred at some
+ point. */
+bool
+temp_file_destroy (struct temp_file *tf)
+{
+ bool ok = true;
+ if (tf != NULL)
+ {
+ ok = !temp_file_error (tf);
+ if (tf->file != NULL)
+ fclose (tf->file);
+ free (tf);
+ }
+ return ok;
+}
+
+/* Seeks TF's underlying file to the start of `union value'
+ VALUE_IDX within case CASE_IDX.
+ Returns true if the seek is successful and TF is not
+ otherwise tainted, false otherwise. */
+static bool
+do_seek (const struct temp_file *tf_, off_t offset)
+{
+ struct temp_file *tf = CONST_CAST (struct temp_file *, tf_);
+
+ if (!temp_file_error (tf))
+ {
+ if (tf->position == offset)
+ return true;
+ else if (fseeko (tf->file, offset, SEEK_SET) == 0)
+ {
+ tf->position = offset;
+ return true;
+ }
+ else
+ error (0, errno, _("seeking in temporary file"));
+ }
+
+ return false;
+}
+
+/* Reads BYTES bytes from TF's underlying file into BUFFER.
+ TF must not be tainted upon entry into this function.
+ Returns true if successful, false upon an I/O error (in which
+ case TF is marked tainted). */
+static bool
+do_read (const struct temp_file *tf_, void *buffer, size_t bytes)
+{
+ struct temp_file *tf = CONST_CAST (struct temp_file *, tf_);
+
+ assert (!temp_file_error (tf));
+ if (bytes > 0 && fread (buffer, bytes, 1, tf->file) != 1)
+ {
+ if (ferror (tf->file))
+ error (0, errno, _("reading temporary file"));
+ else if (feof (tf->file))
+ error (0, 0, _("unexpected end of file reading temporary file"));
+ else
+ NOT_REACHED ();
+ return false;
+ }
+ tf->position += bytes;
+ return true;
+}
+
+/* Writes BYTES bytes from BUFFER into TF's underlying file.
+ TF must not be tainted upon entry into this function.
+ Returns true if successful, false upon an I/O error (in which
+ case TF is marked tainted). */
+static bool
+do_write (struct temp_file *tf, const void *buffer, size_t bytes)
+{
+ assert (!temp_file_error (tf));
+ if (bytes > 0 && fwrite (buffer, bytes, 1, tf->file) != 1)
+ {
+ error (0, errno, _("writing to temporary file"));
+ return false;
+ }
+ tf->position += bytes;
+ return true;
+}
+
+/* Reads N bytes from TF at byte offset OFFSET into DATA.
+ Returns true if successful, false on failure. */
+bool
+temp_file_read (const struct temp_file *tf, off_t offset, size_t n, void *data)
+{
+ return do_seek (tf, offset) && do_read (tf, data, n);
+}
+
+/* Writes the N bytes in DATA to TF at byte offset OFFSET.
+ Returns true if successful, false on failure. */
+bool
+temp_file_write (struct temp_file *tf, off_t offset, size_t n,
+ const void *data)
+{
+ return do_seek (tf, offset) && do_write (tf, data, n);
+}
+
+/* Returns true if an error has occurred in I/O on TF,
+ false if no error has been detected. */
+bool
+temp_file_error (const struct temp_file *tf)
+{
+ return tf->file == NULL || ferror (tf->file) || feof (tf->file);
+}
--- /dev/null
+/* PSPP - a program for statistical analysis.
+ Copyright (C) 2007, 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
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* A interface to allow a temporary file to be treated as an
+ array of data. */
+
+#ifndef LIBPSPP_TEMP_FILE_H
+#define LIBPSPP_TEMP_FILE_H 1
+
+#include <stdbool.h>
+#include <sys/types.h>
+
+struct temp_file *temp_file_create (void);
+bool temp_file_destroy (struct temp_file *);
+bool temp_file_read (const struct temp_file *, off_t offset, size_t n, void *);
+bool temp_file_write (struct temp_file *, off_t offset, size_t n,
+ const void *);
+bool temp_file_error (const struct temp_file *);
+
+#endif /* libpspp/temp-file.h */
+++ /dev/null
-/* PSPP - a program for statistical analysis.
- Copyright (C) 2007, 2009 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 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-/* A interface to allow a temporary file to be treated as an
- array of data. */
-
-#include <config.h>
-
-#include <libpspp/tmpfile.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <libpspp/assertion.h>
-#include <libpspp/cast.h>
-
-#include "error.h"
-#include "xalloc.h"
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-
-struct tmpfile
- {
- FILE *file; /* Underlying file. */
-
- /* Current byte offset in file. We track this manually,
- instead of using ftello, because in glibc ftello flushes
- the stream buffer, making the common case of sequential
- access to cases unreasonably slow. */
- off_t position;
- };
-
-/* Creates and returns a new temporary file. The temporary file
- will be automatically deleted when the process exits. */
-struct tmpfile *
-tmpfile_create (void)
-{
- struct tmpfile *tf = xmalloc (sizeof *tf);
- tf->file = tmpfile ();
- if (tf->file == NULL)
- error (0, errno, _("failed to create temporary file"));
- tf->position = 0;
- return tf;
-}
-
-/* Closes and destroys temporary file TF. Returns true if I/O on
- TF always succeeded, false if an I/O error occurred at some
- point. */
-bool
-tmpfile_destroy (struct tmpfile *tf)
-{
- bool ok = true;
- if (tf != NULL)
- {
- ok = !tmpfile_error (tf);
- if (tf->file != NULL)
- fclose (tf->file);
- free (tf);
- }
- return ok;
-}
-
-/* Seeks TF's underlying file to the start of `union value'
- VALUE_IDX within case CASE_IDX.
- Returns true if the seek is successful and TF is not
- otherwise tainted, false otherwise. */
-static bool
-do_seek (const struct tmpfile *tf_, off_t offset)
-{
- struct tmpfile *tf = CONST_CAST (struct tmpfile *, tf_);
-
- if (!tmpfile_error (tf))
- {
- if (tf->position == offset)
- return true;
- else if (fseeko (tf->file, offset, SEEK_SET) == 0)
- {
- tf->position = offset;
- return true;
- }
- else
- error (0, errno, _("seeking in temporary file"));
- }
-
- return false;
-}
-
-/* Reads BYTES bytes from TF's underlying file into BUFFER.
- TF must not be tainted upon entry into this function.
- Returns true if successful, false upon an I/O error (in which
- case TF is marked tainted). */
-static bool
-do_read (const struct tmpfile *tf_, void *buffer, size_t bytes)
-{
- struct tmpfile *tf = CONST_CAST (struct tmpfile *, tf_);
-
- assert (!tmpfile_error (tf));
- if (bytes > 0 && fread (buffer, bytes, 1, tf->file) != 1)
- {
- if (ferror (tf->file))
- error (0, errno, _("reading temporary file"));
- else if (feof (tf->file))
- error (0, 0, _("unexpected end of file reading temporary file"));
- else
- NOT_REACHED ();
- return false;
- }
- tf->position += bytes;
- return true;
-}
-
-/* Writes BYTES bytes from BUFFER into TF's underlying file.
- TF must not be tainted upon entry into this function.
- Returns true if successful, false upon an I/O error (in which
- case TF is marked tainted). */
-static bool
-do_write (struct tmpfile *tf, const void *buffer, size_t bytes)
-{
- assert (!tmpfile_error (tf));
- if (bytes > 0 && fwrite (buffer, bytes, 1, tf->file) != 1)
- {
- error (0, errno, _("writing to temporary file"));
- return false;
- }
- tf->position += bytes;
- return true;
-}
-
-/* Reads N bytes from TF at byte offset OFFSET into DATA.
- Returns true if successful, false on failure. */
-bool
-tmpfile_read (const struct tmpfile *tf, off_t offset, size_t n, void *data)
-{
- return do_seek (tf, offset) && do_read (tf, data, n);
-}
-
-/* Writes the N bytes in DATA to TF at byte offset OFFSET.
- Returns true if successful, false on failure. */
-bool
-tmpfile_write (struct tmpfile *tf, off_t offset, size_t n, const void *data)
-{
- return do_seek (tf, offset) && do_write (tf, data, n);
-}
-
-/* Returns true if an error has occurred in I/O on TF,
- false if no error has been detected. */
-bool
-tmpfile_error (const struct tmpfile *tf)
-{
- return tf->file == NULL || ferror (tf->file) || feof (tf->file);
-}
+++ /dev/null
-/* PSPP - a program for statistical analysis.
- Copyright (C) 2007, 2009 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 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.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-/* A interface to allow a temporary file to be treated as an
- array of data. */
-
-#ifndef LIBPSPP_TMPFILE_H
-#define LIBPSPP_TMPFILE_H 1
-
-#include <stdbool.h>
-#include <sys/types.h>
-
-struct tmpfile *tmpfile_create (void);
-bool tmpfile_destroy (struct tmpfile *);
-bool tmpfile_read (const struct tmpfile *, off_t offset, size_t n, void *);
-bool tmpfile_write (struct tmpfile *, off_t offset, size_t n, const void *);
-bool tmpfile_error (const struct tmpfile *);
-
-#endif /* libpspp/tmpfile.h */
src/libpspp/sparse-xarray.c \
src/libpspp/str.c \
src/libpspp/pool.c \
- src/libpspp/tmpfile.c \
+ src/libpspp/temp-file.c \
tests/libpspp/sparse-xarray-test.c
tests_libpspp_sparse_xarray_test_LDADD = gl/libgl.la $(LIBINTL)
tests_libpspp_sparse_xarray_test_CPPFLAGS = $(AM_CPPFLAGS) -DASSERT_LEVEL=10