/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011 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 "libpspp/array.h"
#include "libpspp/assertion.h"
#include "libpspp/compiler.h"
-#include "libpspp/hash.h"
#include "libpspp/i18n.h"
#include "libpspp/message.h"
#include "libpspp/misc.h"
static char *text_get_token (struct text_record *,
struct substring delimiters, char *delimiter);
static bool text_match (struct text_record *, char c);
+static bool text_read_variable_name (struct sfm_reader *, struct dictionary *,
+ struct text_record *,
+ struct substring delimiters,
+ struct variable **);
static bool text_read_short_name (struct sfm_reader *, struct dictionary *,
struct text_record *,
struct substring delimiters,
r->file = fn_open (fh_get_file_name (fh), "rb");
if (r->file == NULL)
{
- msg (ME, _("Error opening \"%s\" for reading as a system file: %s."),
+ msg (ME, _("Error opening `%s' for reading as a system file: %s."),
fh_get_file_name (r->fh), strerror (errno));
goto error;
}
{
if (fn_close (fh_get_file_name (r->fh), r->file) == EOF)
{
- msg (ME, _("Error closing system file \"%s\": %s."),
+ msg (ME, _("Error closing system file `%s': %s."),
fh_get_file_name (r->fh), strerror (errno));
r->error = true;
}
if ( r->case_cnt > INT_MAX / 2)
r->case_cnt = -1;
-
/* Identify floating-point format and obtain compression bias. */
read_bytes (r, raw_bias, sizeof raw_bias);
if (float_identify (100.0, raw_bias, sizeof raw_bias, &r->float_format) == 0)
/* Check variable name. */
if (name[0] == '$' || name[0] == '#')
- sys_error (r, "Variable name begins with invalid character `%c'.",
+ sys_error (r, _("Variable name begins with invalid character `%c'."),
name[0]);
if (!var_is_plausible_name (name, false))
sys_error (r, _("Invalid variable name `%s'."), name);
sys_error (r, _("Bad width %d for variable %s."), width, name);
var = dict_create_var (dict, name, width);
if (var == NULL)
- sys_error (r,
- _("Duplicate variable name `%s' within system file."),
- name);
+ sys_error (r, _("Duplicate variable name `%s'."), name);
/* Set the short name the same as the long name. */
var_set_short_name (var, 0, var_get_name (var));
else
var_set_write_format (v, &f);
}
- else if (*++format_warning_cnt <= max_format_warnings)
+ else if (++*format_warning_cnt <= max_format_warnings)
{
char fmt_string[FMT_STRING_LEN_MAX + 1];
sys_warn (r, _("%s variable %s has invalid %s format %s."),
if (var_is_numeric (weight_var))
dict_set_weight (dict, weight_var);
else
- sys_error (r, _("Weighting variable must be numeric."));
+ sys_error (r, _("Weighting variable must be numeric "
+ "(not string variable `%s')."),
+ var_get_name (weight_var));
}
}
return;
default:
- sys_warn (r, _("Unrecognized record type 7, subtype %d. Please send a copy of this file, and the syntax which created it to %s"),
+ sys_warn (r, _("Unrecognized record type 7, subtype %d. Please send "
+ "a copy of this file, and the syntax which created it "
+ "to %s."),
subtype, PACKAGE_BUGREPORT);
break;
}
if (float_representation != expected_float_format)
sys_error (r, _("Floating-point representation indicated by "
"system file (%d) differs from expected (%d)."),
- r->float_format, expected_float_format);
+ float_representation, expected_float_format);
/* Check integer format. */
if (r->integer_format == INTEGER_MSB_FIRST)
else
NOT_REACHED ();
if (integer_representation != expected_integer_format)
- {
- static const char *const endian[] = {N_("Little Endian"), N_("Big Endian")};
- sys_warn (r, _("Integer format indicated by system file (%s) "
- "differs from expected (%s)."),
- gettext (endian[integer_representation == 1]),
- gettext (endian[expected_integer_format == 1]));
- }
-
+ sys_warn (r, _("Integer format indicated by system file (%d) "
+ "differs from expected (%d)."),
+ integer_representation, expected_integer_format);
/*
Record 7 (20) provides a much more reliable way of
break;
mrset->name = xstrdup (name);
+ if (mrset->name[0] != '$')
+ {
+ sys_warn (r, _("`%s' does not begin with `$' at offset %zu "
+ "in MRSETS record."), mrset->name, text_pos (text));
+ break;
+ }
+
if (text_match (text, 'C'))
{
mrset->type = MRSET_MC;
if (!text_match (text, ' '))
{
- sys_warn (r, _("Missing space following 'C' at offset %zu "
- "in MRSETS record"), text_pos (text));
+ sys_warn (r, _("Missing space following `%c' at offset %zu "
+ "in MRSETS record."), 'C', text_pos (text));
break;
}
}
mrset->cat_source = MRSET_COUNTEDVALUES;
if (!text_match (text, ' '))
{
- sys_warn (r, _("Missing space following 'E' at offset %zu "
- "in MRSETS record"), text_pos (text));
+ sys_warn (r, _("Missing space following `%c' at offset %zu "
+ "in MRSETS record."), 'E', text_pos (text));
break;
}
if (!strcmp (number, "11"))
mrset->label_from_var_label = true;
else if (strcmp (number, "1"))
- sys_warn (r, _("Unexpected label source value \"%s\" "
- "following 'E' at offset %zu in MRSETS record"),
+ sys_warn (r, _("Unexpected label source value `%s' "
+ "following `E' at offset %zu in MRSETS record."),
number, text_pos (text));
}
else
{
- sys_warn (r, _("Missing 'C', 'D', or 'E' at offset %zu "
+ sys_warn (r, _("Missing `C', `D', or `E' at offset %zu "
"in MRSETS record."),
text_pos (text));
break;
dict_add_mrset (dict, mrset);
mrset = NULL;
+ stringi_set_destroy (&var_names);
}
mrset_destroy (mrset);
close_text_record (r, text);
if (strcasecmp (var_get_short_name (var, 0), long_name)
&& dict_lookup_var (dict, long_name) != NULL)
{
- sys_warn (r, _("Duplicate long variable name `%s' "
- "within system file."), long_name);
+ sys_warn (r, _("Duplicate long variable name `%s'."), long_name);
continue;
}
if (length < 1 || length > MAX_STRING)
{
sys_warn (r, _("%s listed as string of invalid length %s "
- "in very length string record."),
+ "in very long string record."),
var_get_name (var), length_s);
continue;
}
var_set_short_name (var, i, var_get_short_name (seg, 0));
if (ROUND_UP (width, 8) != ROUND_UP (alloc_width, 8))
sys_error (r, _("Very long string with width %ld has segment %d "
- "of width %d (expected %d)"),
+ "of width %d (expected %d)."),
length, i, width, alloc_width);
}
dict_delete_consecutive_vars (dict, idx + 1, segment_cnt - 1);
label_cnt = read_int (r);
if (size_overflow_p (xtimes (label_cnt, sizeof *labels)))
- {
- sys_warn (r, _("Invalid number of labels: %d. Ignoring labels."),
- label_cnt);
- label_cnt = 0;
- }
+ sys_error (r, _("Invalid number of labels %d."), label_cnt);
/* Read each value/label tuple into labels[]. */
labels = pool_nalloc (subpool, label_cnt, sizeof *labels);
sys_warn (r, _("Duplicate value label for %g on %s."),
label->value.f, var_get_name (v));
else
- sys_warn (r, _("Duplicate value label for \"%.*s\" on %s."),
+ sys_warn (r, _("Duplicate value label for `%.*s' on %s."),
max_width, value_str (&label->value, max_width),
var_get_name (v));
}
value = text_get_token (text, ss_cstr ("\n"), NULL);
if (value == NULL)
{
- text_warn (r, text, _("Error parsing attribute value %s[%d]"),
+ text_warn (r, text, _("Error parsing attribute value %s[%d]."),
key, index);
break;
}
else
{
text_warn (r, text,
- _("Attribute value %s[%d] is not quoted: %s"),
+ _("Attribute value %s[%d] is not quoted: %s."),
key, index, value);
attribute_add_value (attr, value);
}
{
sys_warn (r, _("Ignoring long string value record for variable %s "
"because the record's width (%d) does not match the "
- "variable's width (%d)"),
+ "variable's width (%d)."),
var_name, width, var_get_width (v));
skip_long_string_value_labels (r, n_labels);
continue;
first 255 bytes. The maximum documented length
of a label is 120 bytes so this is more than
generous. */
- skip_bytes (r, sizeof label - (label_length + 1));
+ skip_bytes (r, (label_length + 1) - sizeof label);
}
if (!skip && !var_add_value_label (v, &value, label))
- sys_warn (r, _("Duplicate value label for \"%.*s\" on %s."),
+ sys_warn (r, _("Duplicate value label for `%.*s' on %s."),
width, value_str (&value, width), var_get_name (v));
}
}
for (;;)
{
struct variable *var;
- if (!text_read_short_name (r, dict, text, ss_cstr (":"), &var))
+ if (!text_read_variable_name (r, dict, text, ss_cstr (":"), &var))
break;
read_attributes (r, text, var != NULL ? var_get_attributes (var) : NULL);
}
return c;
eof:
- case_unref (c);
if (i != 0)
partial_record (r);
if (r->case_cnt != -1)
read_error (reader, r);
+ case_unref (c);
return NULL;
}
{
r->corruption_warning = true;
sys_warn (r, _("Possible compressed data corruption: "
- "string contains compressed integer (opcode %d)"),
+ "string contains compressed integer (opcode %d)."),
opcode);
}
}
}
}
+static bool
+text_read_variable_name (struct sfm_reader *r, struct dictionary *dict,
+ struct text_record *text, struct substring delimiters,
+ struct variable **var)
+{
+ char *name;
+
+ name = text_get_token (text, delimiters, NULL);
+ if (name == NULL)
+ return false;
+
+ *var = dict_lookup_var (dict, name);
+ if (*var != NULL)
+ return true;
+
+ text_warn (r, text, _("Dictionary record refers to unknown variable %s."),
+ name);
+ return false;
+}
+
+
static bool
text_read_short_name (struct sfm_reader *r, struct dictionary *dict,
struct text_record *text, struct substring delimiters,
struct string text;
ds_init_empty (&text);
- ds_put_format (&text, "\"%s\" near offset 0x%llx: ",
+ ds_put_format (&text, "`%s' near offset 0x%llx: ",
fh_get_file_name (r->fh), (long long int) ftello (r->file));
ds_put_vformat (&text, format, args);
m.severity = msg_class_to_severity (class);
m.where.file_name = NULL;
m.where.line_number = 0;
+ m.where.first_column = 0;
+ m.where.last_column = 0;
m.text = ds_cstr (&text);
msg_emit (&m);