#include "case.h"
#include "dictionary.h"
#include "file-handle-def.h"
-#include "filename.h"
+#include "file-name.h"
#include "format.h"
#include "value-labels.h"
#include "variable.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
-#include <libpspp/debug-print.h>
-
/* System file reader. */
struct sfm_reader
{
/* Reverse the byte order of 32-bit integer *X. */
static inline void
-bswap_int32 (int32 *x_)
+bswap_int32 (int32_t *x_)
{
char *x = (char *) x_;
bswap (x + 0, x + 3);
{
struct error e;
va_list args;
+ struct string text;
- e.class = class;
- e.where.filename = NULL;
- e.where.line_number = 0;
- e.title = _("corrupt system file: ");
-
+ ds_create (&text, _("corrupt system file: "));
va_start (args, format);
- err_vmsg (&e, format, args);
+ ds_vprintf (&text, format, args);
va_end (args);
+
+ e.category = msg_class_to_category (class);
+ e.severity = msg_class_to_severity (class);
+ e.where.file_name = NULL;
+ e.where.line_number = 0;
+ e.text = ds_c_str (&text);
+
+ err_msg (&e);
}
/* Closes a system file after we're done with it. */
if (r->file)
{
- if (fn_close (fh_get_filename (r->fh), r->file) == EOF)
+ if (fn_close (fh_get_file_name (r->fh), r->file) == EOF)
msg (ME, _("%s: Closing system file: %s."),
- fh_get_filename (r->fh), strerror (errno));
+ fh_get_file_name (r->fh), strerror (errno));
r->file = NULL;
}
static int read_header (struct sfm_reader *,
struct dictionary *, struct sfm_read_info *);
-static int parse_format_spec (struct sfm_reader *, int32,
+static int parse_format_spec (struct sfm_reader *, int32_t,
struct fmt_spec *, const struct variable *);
static int read_value_labels (struct sfm_reader *, struct dictionary *,
struct variable **var_by_idx);
/* Create and initialize reader. */
r = xmalloc (sizeof *r);
r->fh = fh;
- r->file = fn_open (fh_get_filename (fh), "rb");
+ r->file = fn_open (fh_get_file_name (fh), "rb");
r->reverse_endian = 0;
r->fix_specials = 0;
{
msg (ME, _("An error occurred while opening \"%s\" for reading "
"as a system file: %s."),
- fh_get_filename (r->fh), strerror (errno));
+ fh_get_file_name (r->fh), strerror (errno));
goto error;
}
if (r->weight_idx < 0 || r->weight_idx >= r->value_cnt)
lose ((ME, _("%s: Index of weighting variable (%d) is not between 0 "
"and number of elements per case (%d)."),
- fh_get_filename (r->fh), r->weight_idx, r->value_cnt));
+ fh_get_file_name (r->fh), r->weight_idx, r->value_cnt));
weight_var = var_by_idx[r->weight_idx];
if (weight_var == NULL)
lose ((ME,
_("%s: Weighting variable may not be a continuation of "
- "a long string variable."), fh_get_filename (fh)));
+ "a long string variable."), fh_get_file_name (fh)));
else if (weight_var->type == ALPHA)
lose ((ME, _("%s: Weighting variable may not be a string variable."),
- fh_get_filename (fh)));
+ fh_get_file_name (fh)));
dict_set_weight (*dict, weight_var);
}
/* Read records of types 3, 4, 6, and 7. */
for (;;)
{
- int32 rec_type;
+ int32_t rec_type;
assertive_buf_read (r, &rec_type, sizeof rec_type, 0);
if (r->reverse_endian)
lose ((ME, _("%s: Orphaned variable index record (type 4). Type 4 "
"records must always immediately follow type 3 "
"records."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
case 6:
if (!read_documents (r, *dict))
{
struct
{
- int32 subtype P;
- int32 size P;
- int32 count P;
+ int32_t subtype P;
+ int32_t size P;
+ int32_t count P;
}
data;
unsigned long bytes;
bytes = data.size * data.count;
if (bytes < data.size || bytes < data.count)
lose ((ME, "%s: Record type %d subtype %d too large.",
- fh_get_filename (r->fh), rec_type, data.subtype));
+ fh_get_file_name (r->fh), rec_type, data.subtype));
switch (data.subtype)
{
{
msg (MW, _("%s: Invalid subrecord length. "
"Record: 7; Subrecord: 11"),
- fh_get_filename (r->fh));
+ fh_get_file_name (r->fh));
skip = 1;
}
{
struct
{
- int32 measure P;
- int32 width P;
- int32 align P;
+ int32_t measure P;
+ int32_t width P;
+ int32_t align P;
}
params;
{
msg (MW, _("%s: Trailing garbage in long variable "
"name map."),
- fh_get_filename (r->fh));
+ fh_get_file_name (r->fh));
break;
}
if (!var_is_valid_name (long_name, false))
{
msg (MW, _("%s: Long variable mapping to invalid "
"variable name `%s'."),
- fh_get_filename (r->fh), long_name);
+ fh_get_file_name (r->fh), long_name);
break;
}
{
msg (MW, _("%s: Long variable mapping for "
"nonexistent variable %s."),
- fh_get_filename (r->fh), short_name);
+ fh_get_file_name (r->fh), short_name);
break;
}
NULL != dict_lookup_var (*dict, long_name))
lose ((ME, _("%s: Duplicate long variable name `%s' "
"within system file."),
- fh_get_filename (r->fh), long_name));
+ fh_get_file_name (r->fh), long_name));
/* Set long name.
default:
msg (MW, _("%s: Unrecognized record type 7, subtype %d "
"encountered in system file."),
- fh_get_filename (r->fh), data.subtype);
+ fh_get_file_name (r->fh), data.subtype);
skip = 1;
}
case 999:
{
- int32 filler;
+ int32_t filler;
assertive_buf_read (r, &filler, sizeof filler, 0);
goto success;
default:
corrupt_msg(MW, _("%s: Unrecognized record type %d."),
- fh_get_filename (r->fh), rec_type);
+ fh_get_file_name (r->fh), rec_type);
}
}
static int
read_machine_int32_info (struct sfm_reader *r, int size, int count)
{
- int32 data[8];
+ int32_t data[8];
int file_bigendian;
int i;
- if (size != sizeof (int32) || count != 8)
+ if (size != sizeof (int32_t) || count != 8)
lose ((ME, _("%s: Bad size (%d) or count (%d) field on record type 7, "
"subtype 3. Expected size %d, count 8."),
- fh_get_filename (r->fh), size, count, sizeof (int32)));
+ fh_get_file_name (r->fh), size, count, sizeof (int32_t)));
assertive_buf_read (r, data, sizeof data, 0);
if (r->reverse_endian)
lose ((ME, _("%s: Floating-point representation in system file is not "
"IEEE-754. PSPP cannot convert between floating-point "
"formats."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
#else
#error Add support for your floating-point format.
#endif
if (file_bigendian ^ (data[6] == 1))
lose ((ME, _("%s: File-indicated endianness (%s) does not match "
"endianness intuited from file header (%s)."),
- fh_get_filename (r->fh),
+ fh_get_file_name (r->fh),
file_bigendian ? _("big-endian") : _("little-endian"),
data[6] == 1 ? _("big-endian") : (data[6] == 2 ? _("little-endian")
: _("unknown"))));
if (data[7] != 2 && data[7] != 3)
lose ((ME, _("%s: File-indicated character representation code (%s) is "
"not ASCII."),
- fh_get_filename (r->fh),
+ fh_get_file_name (r->fh),
(data[7] == 1 ? "EBCDIC"
: (data[7] == 4 ? _("DEC Kanji") : _("Unknown")))));
if (size != sizeof (flt64) || count != 3)
lose ((ME, _("%s: Bad size (%d) or count (%d) field on record type 7, "
"subtype 4. Expected size %d, count 8."),
- fh_get_filename (r->fh), size, count, sizeof (flt64)));
+ fh_get_file_name (r->fh), size, count, sizeof (flt64)));
assertive_buf_read (r, data, sizeof data, 0);
if (r->reverse_endian)
"for at least one of the three system values. SYSMIS: "
"indicated %g, expected %g; HIGHEST: %g, %g; LOWEST: "
"%g, %g."),
- fh_get_filename (r->fh), (double) data[0], (double) SYSMIS,
+ fh_get_file_name (r->fh), (double) data[0], (double) SYSMIS,
(double) data[1], (double) FLT64_MAX,
(double) data[2], (double) second_lowest_flt64);
}
if (strncmp ("$FL2", hdr.rec_type, 4) != 0)
lose ((ME, _("%s: Bad magic. Proper system files begin with "
"the four characters `$FL2'. This file will not be read."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
/* Check eye-category.her string. */
memcpy (prod_name, hdr.prod_name, sizeof hdr.prod_name);
if (hdr.layout_code != 2)
lose ((ME, _("%s: File layout code has unexpected value %d. Value "
"should be 2, in big-endian or little-endian format."),
- fh_get_filename (r->fh), hdr.layout_code));
+ fh_get_file_name (r->fh), hdr.layout_code));
r->reverse_endian = 1;
bswap_int32 (&hdr.case_size);
if (r->case_cnt < -1 || r->case_cnt > INT_MAX / 2)
lose ((ME,
_("%s: Number of cases in file (%ld) is not between -1 and %d."),
- fh_get_filename (r->fh), (long) r->case_cnt, INT_MAX / 2));
+ fh_get_file_name (r->fh), (long) r->case_cnt, INT_MAX / 2));
r->bias = hdr.bias;
if (r->bias != 100.0)
corrupt_msg (MW, _("%s: Compression bias (%g) is not the usual "
"value of 100."),
- fh_get_filename (r->fh), r->bias);
+ fh_get_file_name (r->fh), r->bias);
/* Make a file label only on the condition that the given label is
not all spaces or nulls. */
if (sv.type != -1)
lose ((ME, _("%s: position %d: String variable does not have "
"proper number of continuation records."),
- fh_get_filename (r->fh), i));
+ fh_get_file_name (r->fh), i));
r->vars[i].width = -1;
else if (sv.type == -1)
lose ((ME, _("%s: position %d: Superfluous long string continuation "
"record."),
- fh_get_filename (r->fh), i));
+ fh_get_file_name (r->fh), i));
/* Check fields for validity. */
if (sv.type < 0 || sv.type > 255)
lose ((ME, _("%s: position %d: Bad variable type code %d."),
- fh_get_filename (r->fh), i, sv.type));
+ fh_get_file_name (r->fh), i, sv.type));
if (sv.has_var_label != 0 && sv.has_var_label != 1)
lose ((ME, _("%s: position %d: Variable label indicator field is not "
- "0 or 1."), fh_get_filename (r->fh), i));
+ "0 or 1."), fh_get_file_name (r->fh), i));
if (sv.n_missing_values < -3 || sv.n_missing_values > 3
|| sv.n_missing_values == -1)
lose ((ME, _("%s: position %d: Missing value indicator field is not "
- "-3, -2, 0, 1, 2, or 3."), fh_get_filename (r->fh), i));
+ "-3, -2, 0, 1, 2, or 3."), fh_get_file_name (r->fh), i));
/* Copy first character of variable name. */
if (sv.name[0] == '@' || sv.name[0] == '#')
lose ((ME, _("%s: position %d: Variable name begins with invalid "
"character."),
- fh_get_filename (r->fh), i));
+ fh_get_file_name (r->fh), i));
name[0] = sv.name[0];
if ( ! var_is_plausible_name(name, false) )
lose ((ME, _("%s: Invalid variable name `%s' within system file."),
- fh_get_filename (r->fh), name));
+ fh_get_file_name (r->fh), name));
/* Create variable. */
vv = (*var_by_idx)[i] = dict_create_var (dict, name, sv.type);
if (vv == NULL)
lose ((ME, _("%s: Duplicate variable name `%s' within system file."),
- fh_get_filename (r->fh), name));
+ fh_get_file_name (r->fh), name));
var_set_short_name (vv, vv->name);
if (sv.has_var_label == 1)
{
/* Disk buffer. */
- int32 len;
+ int32_t len;
/* Read length of label. */
assertive_buf_read (r, &len, sizeof len, 0);
if (len < 0 || len > 255)
lose ((ME, _("%s: Variable %s indicates variable label of invalid "
"length %d."),
- fh_get_filename (r->fh), vv->name, len));
+ fh_get_file_name (r->fh), vv->name, len));
if ( len != 0 )
{
/* Read label into variable structure. */
- vv->label = buf_read (r, NULL, ROUND_UP (len, sizeof (int32)), len + 1);
+ vv->label = buf_read (r, NULL, ROUND_UP (len, sizeof (int32_t)), len + 1);
if (vv->label == NULL)
goto error;
vv->label[len] = '\0';
if (vv->width > MAX_SHORT_STRING)
lose ((ME, _("%s: Long string variable %s may not have missing "
"values."),
- fh_get_filename (r->fh), vv->name));
+ fh_get_file_name (r->fh), vv->name));
assertive_buf_read (r, mv, sizeof *mv * mv_cnt, 0);
if (vv->type == ALPHA)
lose ((ME, _("%s: String variable %s may not have missing "
"values specified as a range."),
- fh_get_filename (r->fh), vv->name));
+ fh_get_file_name (r->fh), vv->name));
if (mv[0] == r->lowest)
mv_add_num_range (&vv->miss, LOWEST, mv[1]);
if (long_string_count != 0)
lose ((ME, _("%s: Long string continuation records omitted at end of "
"dictionary."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
if (next_value != r->value_cnt)
corrupt_msg(MW, _("%s: System file header indicates %d variable positions but "
"%d were read from file."),
- fh_get_filename (r->fh), r->value_cnt, next_value);
+ fh_get_file_name (r->fh), r->value_cnt, next_value);
return 1;
/* Translates the format spec from sysfile format to internal
format. */
static int
-parse_format_spec (struct sfm_reader *r, int32 s,
+parse_format_spec (struct sfm_reader *r, int32_t s,
struct fmt_spec *f, const struct variable *v)
{
f->type = translate_fmt ((s >> 16) & 0xff);
if (f->type == -1)
lose ((ME, _("%s: Bad format specifier byte (%d)."),
- fh_get_filename (r->fh), (s >> 16) & 0xff));
+ fh_get_file_name (r->fh), (s >> 16) & 0xff));
f->w = (s >> 8) & 0xff;
f->d = s & 0xff;
if ((v->type == ALPHA) ^ ((formats[f->type].cat & FCAT_STRING) != 0))
lose ((ME, _("%s: %s variable %s has %s format specifier %s."),
- fh_get_filename (r->fh),
+ fh_get_file_name (r->fh),
v->type == ALPHA ? _("String") : _("Numeric"),
v->name,
formats[f->type].cat & FCAT_STRING ? _("string") : _("numeric"),
};
struct label *labels = NULL;
- int32 n_labels; /* Number of labels. */
+ int32_t n_labels; /* Number of labels. */
struct variable **var = NULL; /* Associated variables. */
- int32 n_vars; /* Number of associated variables. */
+ int32_t n_vars; /* Number of associated variables. */
int i;
if (r->reverse_endian)
bswap_int32 (&n_labels);
- if ( n_labels >= ((int32) ~0) / sizeof *labels)
+ if ( n_labels >= ((int32_t) ~0) / sizeof *labels)
{
corrupt_msg(MW, _("%s: Invalid number of labels: %d. Ignoring labels."),
- fh_get_filename (r->fh), n_labels);
+ fh_get_file_name (r->fh), n_labels);
n_labels = 0;
}
/* Read record type of type 4 record. */
{
- int32 rec_type;
+ int32_t rec_type;
assertive_buf_read (r, &rec_type, sizeof rec_type, 0);
if (r->reverse_endian)
if (rec_type != 4)
lose ((ME, _("%s: Variable index record (type 4) does not immediately "
"follow value label record (type 3) as it should."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
}
/* Read number of variables associated with value label from type 4
if (n_vars < 1 || n_vars > dict_get_var_cnt (dict))
lose ((ME, _("%s: Number of variables associated with a value label (%d) "
"is not between 1 and the number of variables (%d)."),
- fh_get_filename (r->fh), n_vars, dict_get_var_cnt (dict)));
+ fh_get_file_name (r->fh), n_vars, dict_get_var_cnt (dict)));
/* Read the list of variables. */
var = xnmalloc (n_vars, sizeof *var);
for (i = 0; i < n_vars; i++)
{
- int32 var_idx;
+ int32_t var_idx;
struct variable *v;
/* Read variable index, check range. */
if (var_idx < 1 || var_idx > r->value_cnt)
lose ((ME, _("%s: Variable index associated with value label (%d) is "
"not between 1 and the number of values (%d)."),
- fh_get_filename (r->fh), var_idx, r->value_cnt));
+ fh_get_file_name (r->fh), var_idx, r->value_cnt));
/* Make sure it's a real variable. */
v = var_by_idx[var_idx - 1];
lose ((ME, _("%s: Variable index associated with value label (%d) "
"refers to a continuation of a string variable, not to "
"an actual variable."),
- fh_get_filename (r->fh), var_idx));
+ fh_get_file_name (r->fh), var_idx));
if (v->type == ALPHA && v->width > MAX_SHORT_STRING)
lose ((ME, _("%s: Value labels are not allowed on long string "
"variables (%s)."),
- fh_get_filename (r->fh), v->name));
+ fh_get_file_name (r->fh), v->name));
/* Add it to the list of variables. */
var[i] = v;
lose ((ME, _("%s: Variables associated with value label are not all of "
"identical type. Variable %s has %s type, but variable "
"%s has %s type."),
- fh_get_filename (r->fh),
+ fh_get_file_name (r->fh),
var[0]->name, var[0]->type == ALPHA ? _("string") : _("numeric"),
var[i]->name, var[i]->type == ALPHA ? _("string") : _("numeric")));
if (var[0]->type == NUMERIC)
msg (MW, _("%s: File contains duplicate label for value %g for "
"variable %s."),
- fh_get_filename (r->fh), label->value.f, v->name);
+ fh_get_file_name (r->fh), label->value.f, v->name);
else
msg (MW, _("%s: File contains duplicate label for value `%.*s' "
"for variable %s."),
- fh_get_filename (r->fh), v->width, label->value.s, v->name);
+ fh_get_file_name (r->fh), v->width, label->value.s, v->name);
}
}
{
if (ferror (r->file))
msg (ME, _("%s: Reading system file: %s."),
- fh_get_filename (r->fh), strerror (errno));
+ fh_get_file_name (r->fh), strerror (errno));
else
corrupt_msg (ME, _("%s: Unexpected end of file."),
- fh_get_filename (r->fh));
+ fh_get_file_name (r->fh));
r->ok = false;
return NULL;
}
if ( 0 != fseek(r->file, -byte_cnt, SEEK_CUR))
{
msg (ME, _("%s: Seeking system file: %s."),
- fh_get_filename (r->fh), strerror (errno));
+ fh_get_file_name (r->fh), strerror (errno));
}
}
static int
read_documents (struct sfm_reader *r, struct dictionary *dict)
{
- int32 line_cnt;
+ int32_t line_cnt;
char *documents;
if (dict_get_documents (dict) != NULL)
lose ((ME, _("%s: System file contains multiple "
"type 6 (document) records."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
assertive_buf_read (r, &line_cnt, sizeof line_cnt, 0);
if (line_cnt <= 0)
lose ((ME, _("%s: Number of document lines (%ld) "
"must be greater than 0."),
- fh_get_filename (r->fh), (long) line_cnt));
+ fh_get_file_name (r->fh), (long) line_cnt));
documents = buf_read (r, NULL, 80 * line_cnt, line_cnt * 80 + 1);
/* FIXME? Run through asciify. */
if (ferror (r->file))
{
msg (ME, _("%s: Error reading file: %s."),
- fh_get_filename (r->fh), strerror (errno));
+ fh_get_file_name (r->fh), strerror (errno));
r->ok = false;
return 0;
}
return 0;
lose ((ME, _("%s: Compressed data is corrupted. Data ends "
"in partial case."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
case 253:
/* Code 253 indicates that the value is stored explicitly
following the instruction bytes. */
if (r->ptr == NULL || r->ptr >= r->end)
if (!buffer_input (r))
lose ((ME, _("%s: Unexpected end of file."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
memcpy (buf++, r->ptr++, sizeof *buf);
if (buf >= buf_end)
goto success;
{
if (buf_beg != buf)
lose ((ME, _("%s: Unexpected end of file."),
- fh_get_filename (r->fh)));
+ fh_get_file_name (r->fh)));
else
return 0;
}
if (ferror (r->file))
{
msg (ME, _("%s: Reading system file: %s."),
- fh_get_filename (r->fh), strerror (errno));
+ fh_get_file_name (r->fh), strerror (errno));
r->ok = false;
}
else if (read_bytes != 0)
{
msg (ME, _("%s: Partial record at end of system file."),
- fh_get_filename (r->fh));
+ fh_get_file_name (r->fh));
r->ok = false;
}
return 0;