/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-2004, 2006, 2010, 2011, 2012 Free Software Foundation, Inc.
+ Copyright (C) 1997-2004, 2006, 2010, 2011, 2012, 2016 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 <stdint.h>
#include <stdio.h>
#include <stdlib.h>
-#include <sys/stat.h>
#include "data/casereader.h"
#include "data/dataset.h"
struct string scratch; /* Extra line buffer. */
enum dfm_reader_flags flags; /* Zero or more of DFM_*. */
FILE *file; /* Associated file. */
- off_t file_size; /* File size, or -1 if unavailable. */
size_t pos; /* Offset in line of current character. */
unsigned eof_cnt; /* # of attempts to advance past EOF. */
struct lexer *lexer; /* The lexer reading the file */
/* This was the last client, so close the underlying file. */
if (fh_get_referent (r->fh) != FH_REF_INLINE)
- fn_close (fh_get_file_name (r->fh), r->file);
+ fn_close (r->fh, r->file);
else
{
/* Skip any remaining data on the inline file. */
r->block_left = 0;
if (fh_get_referent (fh) != FH_REF_INLINE)
{
- struct stat s;
r->line_number = 0;
- r->file = fn_open (fh_get_file_name (fh), "rb");
+ r->file = fn_open (fh, "rb");
if (r->file == NULL)
{
msg (ME, _("Could not open `%s' for reading as a data file: %s."),
fh_get_file_name (r->fh), strerror (errno));
goto error;
}
- r->file_size = fstat (fileno (r->file), &s) == 0 ? s.st_size : -1;
}
- else
- r->file_size = -1;
fh_lock_set_aux (lock, r);
if (encoding == NULL)
{
if (!lex_match_id (r->lexer, "END") || !lex_match_id (r->lexer, "DATA"))
{
- msg (SE, _("Missing END DATA while reading inline data. "
+ msg (SE, _("Missing %s while reading inline data. "
"This probably indicates a missing or incorrectly "
- "formatted END DATA command. END DATA must appear "
+ "formatted %s command. %s must appear "
"by itself on a single line with exactly one space "
- "between words."));
+ "between words."), "END DATA", "END DATA", "END DATA");
lex_discard_rest_of_command (r->lexer);
}
return false;
{
r->flags &= ~DFM_ADVANCE;
- if (r->eof_cnt == 0 && read_record (r) )
+ if (r->eof_cnt == 0 && read_record (r))
{
r->pos = 0;
return 0;
msg (ME, _("Attempt to read beyond end-of-file on file %s."),
fh_get_name (r->fh));
else
- msg (ME, _("Attempt to read beyond END DATA."));
+ msg (ME, _("Attempt to read beyond %s."), "END DATA");
}
}
return reader->encoding;
}
-/* Returns a number between 0 and 100 that approximates the
- percentage of the data in READER that has already been read,
- or -1 if this value cannot be estimated.
-
- ftello is slow in glibc (it flushes the read buffer), so don't
- call this function unless you need to. */
-int
-dfm_get_percent_read (const struct dfm_reader *reader)
-{
- if (reader->file_size >= 0)
- {
- off_t position;
-
- position = (reader->line_reader != NULL
- ? line_reader_tell (reader->line_reader)
- : ftello (reader->file));
- if (position >= 0)
- {
- double p = 100.0 * position / reader->file_size;
- return p < 0 ? 0 : p > 100 ? 100 : p;
- }
- }
- return -1;
-}
-
/* Causes dfm_get_record() or dfm_get_whole_record() to read in
the next record the next time it is executed on file
HANDLE. */