/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-2000, 2006-2007, 2009-2014 Free Software Foundation, Inc.
+ Copyright (C) 1997-2000, 2006-2007, 2009-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
goto error;
/* Open file. */
- r->file = fn_open (fh_get_file_name (fh), "rb");
+ r->file = fn_open (fh, "rb");
if (r->file == NULL)
{
msg (ME, _("Error opening `%s' for reading as an SPSS/PC+ "
if (r->file)
{
- if (fn_close (fh_get_file_name (r->fh), r->file) == EOF)
+ if (fn_close (r->fh, r->file) == EOF)
{
msg (ME, _("Error closing system file `%s': %s."),
fh_get_file_name (r->fh), strerror (errno));
pcp_close (&r->any_reader);
}
-/* Returns true if FILE is an SPSS/PC+ system file,
- false otherwise. */
+/* Detects whether FILE is an SPSS/PC+ system file. Returns 1 if so, 0 if
+ not, and a negative errno value if there is an error reading FILE. */
static int
pcp_detect (FILE *file)
{
static const char signature[4] = "SPSS";
char buf[sizeof signature];
- if (fseek (file, 0x104, SEEK_SET)
- || (fread (buf, sizeof buf, 1, file) != 1 && !feof (file)))
+ if (fseek (file, 0x104, SEEK_SET))
return -errno;
+ if (fread (buf, sizeof buf, 1, file) != 1)
+ return ferror (file) ? -errno : 0;
+
return !memcmp (buf, signature, sizeof buf);
}
\f
uint8_t len;
if (var->n_val_labs >= allocated_val_labs)
- var->val_labs = x2nrealloc (var->val_labs, &allocated_val_labs,
- sizeof *var->val_labs);
+ var->val_labs = pool_2nrealloc (r->pool, var->val_labs,
+ &allocated_val_labs,
+ sizeof *var->val_labs);
vl = &var->val_labs[var->n_val_labs];
if (!read_bytes (r, vl->value, sizeof vl->value)