X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcasefile.c;h=8b1ac82838f55ff49d587ec1a14f7d620cad4f62;hb=2766c2d47448010527d52dd304213d0bb563dd00;hp=63b0fcd3b692ba41e06dd1a0ad6086918c3e1f63;hpb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;p=pspp-builds.git diff --git a/src/data/casefile.c b/src/data/casefile.c index 63b0fcd3..8b1ac828 100644 --- a/src/data/casefile.c +++ b/src/data/casefile.c @@ -26,12 +26,13 @@ #include #include #include -#include "alloc.h" +#include #include "case.h" -#include "message.h" +#include +#include #include "full-read.h" #include "full-write.h" -#include "misc.h" +#include #include "make-file.h" #include "settings.h" #include "variable.h" @@ -110,6 +111,8 @@ casefile_destroy(). This function will also destroy any remaining casereaders. */ +/* FIXME: should we implement compression? */ + /* In-memory cases are arranged in an array of arrays. The top level is variable size and the size of each bottom level array is fixed at the number of cases defined here. */ @@ -134,7 +137,7 @@ struct casefile /* Disk storage. */ int fd; /* File descriptor, -1 if none. */ - char *filename; /* Filename. */ + char *file_name; /* File name. */ union value *buffer; /* I/O buffer, NULL if none. */ size_t buffer_used; /* Number of values used in buffer. */ size_t buffer_size; /* Buffer size in values. */ @@ -178,7 +181,7 @@ static bool fill_buffer (struct casereader *reader); static void io_error (struct casefile *, const char *, ...) PRINTF_FORMAT (2, 3); -static int safe_open (const char *filename, int flags); +static int safe_open (const char *file_name, int flags); static int safe_close (int fd); /* Creates and returns a casefile to store cases of VALUE_CNT @@ -202,7 +205,7 @@ casefile_create (size_t value_cnt) cf->ok = true; cf->cases = NULL; cf->fd = -1; - cf->filename = NULL; + cf->file_name = NULL; cf->buffer = NULL; cf->buffer_size = ROUND_UP (cf->value_cnt, IO_BUF_SIZE); if (cf->value_cnt > 0 && cf->buffer_size % cf->value_cnt > 64) @@ -251,10 +254,10 @@ casefile_destroy (struct casefile *cf) if (cf->fd != -1) safe_close (cf->fd); - if (cf->filename != NULL && remove (cf->filename) == -1) + if (cf->file_name != NULL && remove (cf->file_name) == -1) io_error (cf, _("%s: Removing temporary file: %s."), - cf->filename, strerror (errno)); - free (cf->filename); + cf->file_name, strerror (errno)); + free (cf->file_name); free (cf->buffer); @@ -441,11 +444,11 @@ casefile_to_disk (const struct casefile *cf_) { size_t idx, block_cnt; - assert (cf->filename == NULL); + assert (cf->file_name == NULL); assert (cf->fd == -1); assert (cf->buffer_used == 0); - if (!make_temp_file (&cf->fd, &cf->filename)) + if (!make_temp_file (&cf->fd, &cf->file_name)) { cf->ok = false; return false; @@ -565,10 +568,10 @@ reader_open_file (struct casereader *reader) } else { - reader->fd = safe_open (cf->filename, O_RDONLY); + reader->fd = safe_open (cf->file_name, O_RDONLY); if (reader->fd < 0) io_error (cf, _("%s: Opening temporary file: %s."), - cf->filename, strerror (errno)); + cf->file_name, strerror (errno)); } if (cf->buffer != NULL) @@ -594,7 +597,7 @@ reader_open_file (struct casereader *reader) file_ofs = 0; if (lseek (reader->fd, file_ofs, SEEK_SET) != file_ofs) io_error (cf, _("%s: Seeking temporary file: %s."), - cf->filename, strerror (errno)); + cf->file_name, strerror (errno)); if (cf->case_cnt > 0 && cf->value_cnt > 0) fill_buffer (reader); @@ -612,10 +615,10 @@ fill_buffer (struct casereader *reader) reader->cf->buffer_size * sizeof *reader->buffer); if (bytes < 0) io_error (reader->cf, _("%s: Reading temporary file: %s."), - reader->cf->filename, strerror (errno)); + reader->cf->file_name, strerror (errno)); else if (bytes != reader->cf->buffer_size * sizeof *reader->buffer) io_error (reader->cf, _("%s: Temporary file ended unexpectedly."), - reader->cf->filename); + reader->cf->file_name); } return reader->cf->ok; } @@ -732,31 +735,32 @@ io_error (struct casefile *cf, const char *format, ...) { if (cf->ok) { - struct error e; + struct msg m; va_list args; - e.class = ME; - e.where.filename = NULL; - e.where.line_number = -1; - e.title = NULL; - + m.category = MSG_GENERAL; + m.severity = MSG_ERROR; + m.where.file_name = NULL; + m.where.line_number = -1; va_start (args, format); - err_vmsg (&e, format, args); + m.text = xvasprintf (format, args); va_end (args); + + msg_emit (&m); } cf->ok = false; } -/* Calls open(), passing FILENAME and FLAGS, repeating as necessary +/* Calls open(), passing FILE_NAME and FLAGS, repeating as necessary to deal with interrupted calls. */ static int -safe_open (const char *filename, int flags) +safe_open (const char *file_name, int flags) { int fd; do { - fd = open (filename, flags); + fd = open (file_name, flags); } while (fd == -1 && errno == EINTR);