X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fsys-file-reader.c;h=a1193de767dc4618d4a8a1bdf1b0e6f6d5e33341;hb=c57d9a2ac4278ebc2d06032cbee286fb20ca7326;hp=caab3d9b156ea812edff675fb440038785abc5a1;hpb=0df9cdd3df66caf4353128feff3008289cda8115;p=pspp diff --git a/src/data/sys-file-reader.c b/src/data/sys-file-reader.c index caab3d9b15..a1193de767 100644 --- a/src/data/sys-file-reader.c +++ b/src/data/sys-file-reader.c @@ -1,5 +1,5 @@ /* 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-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 @@ -366,10 +366,10 @@ static void parse_variable_attributes (struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); static void assign_variable_roles (struct sfm_reader *, struct dictionary *); -static bool parse_long_string_value_labels (struct sfm_reader *, +static void parse_long_string_value_labels (struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); -static bool parse_long_string_missing_values ( +static void parse_long_string_missing_values ( struct sfm_reader *, const struct sfm_extension_record *, struct dictionary *); @@ -408,7 +408,7 @@ sfm_open (struct file_handle *fh) if (r->lock == NULL) goto error; - 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 a system file: %s."), @@ -507,21 +507,21 @@ read_record (struct sfm_reader *r, int type, || subtype >= sizeof r->extensions / sizeof *r->extensions) { sys_warn (r, r->pos, - _("Unrecognized record type 7, subtype %d. Please " - "send a copy of this file, and the syntax which " - "created it to %s."), - subtype, PACKAGE_BUGREPORT); + _("Unrecognized record type 7, subtype %d. For help, " + "please send this file to %s and mention that you were " + "using %s."), + subtype, PACKAGE_BUGREPORT, PACKAGE_STRING); return skip_extension_record (r, subtype); } else if (r->extensions[subtype] != NULL) { sys_warn (r, r->pos, _("Record type 7, subtype %d found here has the same " - "type as the record found near offset 0x%llx. " - "Please send a copy of this file, and the syntax " - "which created it to %s."), + "type as the record found near offset 0x%llx. For " + "help, please send this file to %s and mention that " + "you were using %s."), subtype, (long long int) r->extensions[subtype]->pos, - PACKAGE_BUGREPORT); + PACKAGE_BUGREPORT, PACKAGE_STRING); return skip_extension_record (r, subtype); } else @@ -537,7 +537,7 @@ read_record (struct sfm_reader *r, int type, /* Returns the character encoding obtained from R, or a null pointer if R doesn't have an indication of its character encoding. */ -const char * +static const char * sfm_get_encoding (const struct sfm_reader *r) { /* The EXT_ENCODING record is the best way to determine dictionary @@ -838,14 +838,11 @@ sfm_decode (struct any_reader *r_, const char *encoding, assign_variable_roles (r, dict); } - if (r->extensions[EXT_LONG_LABELS] != NULL - && !parse_long_string_value_labels (r, r->extensions[EXT_LONG_LABELS], - dict)) - goto error; - if (r->extensions[EXT_LONG_MISSING] != NULL - && !parse_long_string_missing_values (r, r->extensions[EXT_LONG_MISSING], - dict)) - goto error; + if (r->extensions[EXT_LONG_LABELS] != NULL) + parse_long_string_value_labels (r, r->extensions[EXT_LONG_LABELS], dict); + if (r->extensions[EXT_LONG_MISSING] != NULL) + parse_long_string_missing_values (r, r->extensions[EXT_LONG_MISSING], + dict); /* Warn if the actual amount of data per case differs from the amount that the header claims. SPSS version 13 gets this @@ -897,7 +894,7 @@ sfm_close (struct any_reader *r_) 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)); @@ -924,9 +921,8 @@ sys_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) 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) { @@ -935,7 +931,7 @@ 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) @@ -1349,9 +1345,9 @@ read_extension_record (struct sfm_reader *r, int subtype, } sys_warn (r, record->pos, - _("Unrecognized record type 7, subtype %d. Please send a " - "copy of this file, and the syntax which created it to %s."), - subtype, PACKAGE_BUGREPORT); + _("Unrecognized record type 7, subtype %d. For help, please " + "send this file to %s and mention that you were using %s."), + subtype, PACKAGE_BUGREPORT, PACKAGE_STRING); skip: return skip_bytes (r, n_bytes); @@ -2419,15 +2415,15 @@ check_overflow (struct sfm_reader *r, size_t end = record->size * record->count; if (length >= end || ofs + length > end) { - sys_error (r, record->pos + end, - _("Extension record subtype %d ends unexpectedly."), - record->subtype); + sys_warn (r, record->pos + end, + _("Extension record subtype %d ends unexpectedly."), + record->subtype); return false; } return true; } -static bool +static void parse_long_string_value_labels (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) @@ -2447,13 +2443,13 @@ parse_long_string_value_labels (struct sfm_reader *r, /* Parse variable name length. */ if (!check_overflow (r, record, ofs, 4)) - return false; + return; var_name_len = parse_int (r, record->data, ofs); ofs += 4; /* Parse variable name, width, and number of labels. */ if (!check_overflow (r, record, ofs, var_name_len + 8)) - return false; + return; var_name = recode_string_pool ("UTF-8", dict_encoding, (const char *) record->data + ofs, var_name_len, r->pool); @@ -2493,13 +2489,13 @@ parse_long_string_value_labels (struct sfm_reader *r, /* Parse value length. */ if (!check_overflow (r, record, ofs, 4)) - return false; + return; value_length = parse_int (r, record->data, ofs); ofs += 4; /* Parse value. */ if (!check_overflow (r, record, ofs, value_length)) - return false; + return; if (!skip) { if (value_length == width) @@ -2519,13 +2515,13 @@ parse_long_string_value_labels (struct sfm_reader *r, /* Parse label length. */ if (!check_overflow (r, record, ofs, 4)) - return false; + return; label_length = parse_int (r, record->data, ofs); ofs += 4; /* Parse label. */ if (!check_overflow (r, record, ofs, label_length)) - return false; + return; if (!skip) { char *label; @@ -2543,11 +2539,9 @@ parse_long_string_value_labels (struct sfm_reader *r, ofs += label_length; } } - - return true; } -static bool +static void parse_long_string_missing_values (struct sfm_reader *r, const struct sfm_extension_record *record, struct dictionary *dict) @@ -2567,13 +2561,13 @@ parse_long_string_missing_values (struct sfm_reader *r, /* Parse variable name length. */ if (!check_overflow (r, record, ofs, 4)) - return false; + return; var_name_len = parse_int (r, record->data, ofs); ofs += 4; /* Parse variable name. */ if (!check_overflow (r, record, ofs, var_name_len + 1)) - return false; + return; var_name = recode_string_pool ("UTF-8", dict_encoding, (const char *) record->data + ofs, var_name_len, r->pool); @@ -2611,13 +2605,13 @@ parse_long_string_missing_values (struct sfm_reader *r, /* Parse value length. */ if (!check_overflow (r, record, ofs, 4)) - return false; + return; value_length = parse_int (r, record->data, ofs); ofs += 4; /* Parse value. */ if (!check_overflow (r, record, ofs, value_length)) - return false; + return; if (var != NULL && i < 3 && !mv_add_str (&mv, (const uint8_t *) record->data + ofs, @@ -2632,8 +2626,6 @@ parse_long_string_missing_values (struct sfm_reader *r, if (var != NULL) var_set_missing_values (var, &mv); } - - return true; } /* Case reader. */ @@ -2660,7 +2652,7 @@ sys_file_casereader_read (struct casereader *reader, void *r_) int retval; int i; - if (r->error) + if (r->error || !r->sfm_var_cnt) return NULL; c = case_create (r->proto);