X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fsys-file-reader.c;h=401e3e27451e1d9c42b15e4eca19433d541439ef;hb=522f263565607b97b83d26bff49b5fa44704df33;hp=47e5ddb4e8c5b1cbcc43dd3006baec9ca6cb205e;hpb=59d14e5581317e3d1e37c8b92b535ba197984776;p=pspp diff --git a/src/data/sys-file-reader.c b/src/data/sys-file-reader.c index 47e5ddb4e8..401e3e2745 100644 --- a/src/data/sys-file-reader.c +++ b/src/data/sys-file-reader.c @@ -76,6 +76,7 @@ struct sfm_reader int value_cnt; /* Number of 8-byte units per case. */ struct sfm_var *vars; /* Variables. */ size_t var_cnt; /* Number of variables. */ + bool has_long_var_names; /* File has a long variable name map */ bool has_vls; /* File has one or more very long strings? */ /* Decompression. */ @@ -192,6 +193,7 @@ sfm_open_reader (struct file_handle *fh, struct dictionary **dict, r->error = false; r->value_cnt = 0; r->has_vls = false; + r->has_long_var_names = false; r->opcode_idx = sizeof r->opcodes; if (setjmp (r->bail_out)) @@ -250,6 +252,31 @@ sfm_open_reader (struct file_handle *fh, struct dictionary **dict, rec_type = read_int32 (r); } + + if ( ! r->has_long_var_names ) + { + int i; + for (i = 0; i < dict_get_var_cnt (*dict); i++) + { + struct variable *var = dict_get_var (*dict, i); + char short_name [SHORT_NAME_LEN + 1]; + char long_name [SHORT_NAME_LEN + 1]; + + strcpy (short_name, var_get_name (var)); + + strcpy (long_name, short_name); + str_lowercase (long_name); + + /* Set long name. Renaming a variable may clear the short + name, but we want to retain it, so re-set it + explicitly. */ + dict_rename_var (*dict, var, long_name); + var_set_short_name (var, short_name); + } + + r->has_long_var_names = true; + } + /* Read record 999 data, which is just filler. */ read_int32 (r); @@ -644,9 +671,12 @@ read_documents (struct sfm_reader *r, struct dictionary *dict) sys_error (r, _("Number of document lines (%d) " "must be greater than 0."), line_cnt); - documents = pool_nmalloc (r->pool, line_cnt + 1, 80); - read_string (r, documents, 80 * line_cnt + 1); - dict_set_documents (dict, documents); + documents = pool_nmalloc (r->pool, line_cnt + 1, DOC_LINE_LENGTH); + read_string (r, documents, DOC_LINE_LENGTH * line_cnt + 1); + if (strlen (documents) == DOC_LINE_LENGTH * line_cnt) + dict_set_documents (dict, documents); + else + sys_error (r, _("Document line contains null byte.")); pool_free (r->pool, documents); } @@ -811,7 +841,11 @@ read_display_parameters (struct sfm_reader *r, size_t size, size_t count, int measure = read_int32 (r); int width = read_int32 (r); int align = read_int32 (r); - struct variable *v; + struct variable *v = dict_get_var (dict, i); + + /* spss v14 sometimes seems to set string variables' measure to zero */ + if ( 0 == measure && var_is_alpha (v) ) measure = 1; + if (measure < 1 || measure > 3 || align < 0 || align > 2) { @@ -822,7 +856,6 @@ read_display_parameters (struct sfm_reader *r, size_t size, size_t count, continue; } - v = dict_get_var (dict, i); var_set_measure (v, (measure == 1 ? MEASURE_NOMINAL : measure == 2 ? MEASURE_ORDINAL : MEASURE_SCALE)); @@ -877,6 +910,7 @@ read_long_var_name_map (struct sfm_reader *r, size_t size, size_t count, var_set_short_name (var, short_name); } close_variable_to_value_map (r, map); + r->has_long_var_names = true; } /* Reads record type 7, subtype 14, which gives the real length