X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Flanguage%2Fdata-io%2Fdata-reader.c;h=988735dd91041d4b2b5e972f1b8e8a96dcc36dee;hb=3f2ed1c5fe6dc692ca00bb18a15e41617fa2d37d;hp=24b27b4048732b870d3ae15045537a5359bfcecf;hpb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;p=pspp diff --git a/src/language/data-io/data-reader.c b/src/language/data-io/data-reader.c index 24b27b4048..988735dd91 100644 --- a/src/language/data-io/data-reader.c +++ b/src/language/data-io/data-reader.c @@ -18,27 +18,25 @@ 02110-1301, USA. */ #include -#include "data-reader.h" +#include #include #include #include #include -#include "alloc.h" -#include "command.h" -#include "message.h" -#include "file-handle.h" -#include "file-handle-def.h" -#include "filename.h" -#include "line-buffer.h" -#include "lexer.h" -#include "str.h" -#include "procedure.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "gettext.h" #define _(msgid) gettext (msgid) -#include "debug-print.h" - /* Flags for DFM readers. */ enum dfm_reader_flags { @@ -56,7 +54,7 @@ struct dfm_reader struct string line; /* Current line. */ struct string scratch; /* Extra line buffer. */ enum dfm_reader_flags flags; /* Zero or more of DFM_*. */ - struct file_ext file; /* Associated file. */ + FILE *file; /* Associated file. */ size_t pos; /* Offset in line of current character. */ unsigned eof_cnt; /* # of attempts to advance past EOF. */ }; @@ -67,21 +65,22 @@ dfm_close_reader (struct dfm_reader *r) { int still_open; bool is_inline; + char *file_name; if (r == NULL) return; is_inline = r->fh == fh_inline_file (); + file_name = is_inline ? NULL : xstrdup (fh_get_file_name (r->fh)); still_open = fh_close (r->fh, "data file", "rs"); - if (still_open) - return; - - if (!is_inline) + if (still_open) { - fn_close_ext (&r->file); - free (r->file.filename); - r->file.filename = NULL; + free (file_name); + return; } + + if (!is_inline) + fn_close (file_name, r->file); else { /* Skip any remaining data on the inline file. */ @@ -96,6 +95,7 @@ dfm_close_reader (struct dfm_reader *r) ds_destroy (&r->line); ds_destroy (&r->scratch); free (r); + free (file_name); } /* Opens the file designated by file handle FH for reading as a @@ -123,20 +123,13 @@ dfm_open_reader (struct file_handle *fh) r->eof_cnt = 0; if (fh != fh_inline_file ()) { - r->where.filename = fh_get_filename (fh); + r->where.file_name = fh_get_file_name (fh); r->where.line_number = 0; - r->file.file = NULL; - r->file.filename = xstrdup (fh_get_filename (r->fh)); - r->file.mode = "rb"; - r->file.file = NULL; - r->file.sequence_no = NULL; - r->file.param = NULL; - r->file.postopen = NULL; - r->file.preclose = NULL; - if (!fn_open_ext (&r->file)) + r->file = fn_open (fh_get_file_name (fh), "rb"); + if (r->file == NULL) { msg (ME, _("Could not open \"%s\" for reading as a data file: %s."), - fh_get_filename (r->fh), strerror (errno)); + fh_get_file_name (r->fh), strerror (errno)); fh_close (fh,"data file", "rs"); free (r); return NULL; @@ -151,7 +144,7 @@ dfm_open_reader (struct file_handle *fh) bool dfm_reader_error (const struct dfm_reader *r) { - return fh_get_referent (r->fh) == FH_REF_FILE && ferror (r->file.file); + return fh_get_referent (r->fh) == FH_REF_FILE && ferror (r->file); } /* Reads a record from the inline file into R. @@ -187,7 +180,7 @@ read_inline_record (struct dfm_reader *r) return false; } - ds_replace (&r->line, ds_c_str (&getl_buf)); + ds_assign_string (&r->line, &getl_buf); return true; } @@ -200,9 +193,9 @@ read_file_record (struct dfm_reader *r) if (fh_get_mode (r->fh) == FH_MODE_TEXT) { ds_clear (&r->line); - if (!ds_gets (&r->line, r->file.file)) + if (!ds_gets (&r->line, r->file)) { - if (ferror (r->file.file)) + if (ferror (r->file)) msg (ME, _("Error reading file %s: %s."), fh_get_name (r->fh), strerror (errno)); return false; @@ -216,11 +209,10 @@ read_file_record (struct dfm_reader *r) if (ds_length (&r->line) < record_width) ds_rpad (&r->line, record_width, 0); - amt = fread (ds_c_str (&r->line), 1, record_width, - r->file.file); + amt = fread (ds_c_str (&r->line), 1, record_width, r->file); if (record_width != amt) { - if (ferror (r->file.file)) + if (ferror (r->file)) msg (ME, _("Error reading file %s: %s."), fh_get_name (r->fh), strerror (errno)); else if (amt != 0) @@ -395,7 +387,7 @@ dfm_column_start (struct dfm_reader *r) return r->pos + 1; } -/* Pushes the filename and line number on the fn/ln stack. */ +/* Pushes the file name and line number on the fn/ln stack. */ void dfm_push (struct dfm_reader *r) { @@ -403,7 +395,7 @@ dfm_push (struct dfm_reader *r) err_push_file_locator (&r->where); } -/* Pops the filename and line number from the fn/ln stack. */ +/* Pops the file name and line number from the fn/ln stack. */ void dfm_pop (struct dfm_reader *r) {