/* PSPP - a program for statistical analysis.
- Copyright (C) 2006, 2010, 2012, 2014 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2010, 2012, 2014, 2015 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
struct any_reader_class
{
+ /* The name of this kind of data file, e.g. "SPSS System File". */
const char *name;
- int (*detect) (FILE *);
+ /* Detects whether FILE contains this type of file. Returns 1 if so, 0 if
+ not, and a negative errno value if there is an error reading FILE. */
+ int (*detect) (FILE *file);
struct any_reader *(*open) (struct file_handle *);
bool (*close) (struct any_reader *);
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2015 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
return c;
}
-/* Returns true if FILE is an SPSS portable file,
- false otherwise. */
+/* Detects whether FILE is an SPSS portable file. Returns 1 if so, 0 if not,
+ and a negative errno value if there is an error reading FILE. */
int
pfm_detect (FILE *file)
{
{
int c = getc (file);
if (c == EOF || raw_cnt++ > 512)
- return 0;
+ return ferror (file) ? -errno : 0;
else if (c == '\n')
{
while (line_len < 80 && cooked_cnt < sizeof header)
sfm_close (&r->any_reader);
}
-/* Returns 1 if FILE is an SPSS system file,
- 0 if it is not,
- otherwise a negative errno value. */
+/* Detects whether FILE is an SPSS system file. Returns 1 if so, 0 if not, and
+ a negative errno value if there is an error reading FILE. */
static int
sfm_detect (FILE *file)
{
if (fseek (file, 0, SEEK_SET) != 0)
return -errno;
if (fread (magic, 4, 1, file) != 1)
- return feof (file) ? 0 : -errno;
+ return ferror (file) ? -errno : 0;
magic[4] = '\0';
return (!strcmp (ASCII_MAGIC, magic)