X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fpspp-dump-sav.c;h=7c261a93bace3d6048c8b89ac0d163aa3f2c38de;hb=refs%2Fheads%2Fvariable-sets;hp=70687ebc803bb23a6f610b79f69a76476b0050fa;hpb=be42ce976006feed2a7ba7599ee417c28887af52;p=pspp diff --git a/utilities/pspp-dump-sav.c b/utilities/pspp-dump-sav.c index 70687ebc80..7c261a93ba 100644 --- a/utilities/pspp-dump-sav.c +++ b/utilities/pspp-dump-sav.c @@ -76,6 +76,7 @@ static void read_machine_float_info (struct sfm_reader *, size_t size, size_t count); static void read_extra_product_info (struct sfm_reader *, size_t size, size_t count); +static void read_variable_sets (struct sfm_reader *, size_t size, size_t count); static void read_mrsets (struct sfm_reader *, size_t size, size_t count); static void read_display_parameters (struct sfm_reader *, size_t size, size_t count); @@ -236,6 +237,8 @@ main (int argc, char *argv[]) else if (r.compression == COMP_ZLIB) read_zlib_compressed_data (&r); + free (r.var_widths); + fclose (r.file); } @@ -517,14 +520,14 @@ print_untyped_value (struct sfm_reader *r, char raw_value[8]) static void read_value_label_record (struct sfm_reader *r) { - int label_cnt, var_cnt; + int n_labels, n_vars; int i; printf ("%08llx: value labels record\n", (long long int) ftello (r->file)); /* Read number of labels. */ - label_cnt = read_int (r); - for (i = 0; i < label_cnt; i++) + n_labels = read_int (r); + for (i = 0; i < n_labels; i++) { char raw_value[8]; unsigned char label_len; @@ -557,8 +560,8 @@ read_value_label_record (struct sfm_reader *r) /* Read number of variables associated with value label from type 4 record. */ printf ("\t%08llx: apply to variables", (long long int) ftello (r->file)); - var_cnt = read_int (r); - for (i = 0; i < var_cnt; i++) + n_vars = read_int (r); + for (i = 0; i < n_vars; i++) printf (" #%d", read_int (r)); putchar ('\n'); } @@ -605,6 +608,10 @@ read_extension_record (struct sfm_reader *r) read_machine_float_info (r, size, count); return; + case 5: + read_variable_sets (r, size, count); + return; + case 6: /* DATE variable information. We don't use it yet, but we should. */ @@ -728,6 +735,38 @@ read_machine_float_info (struct sfm_reader *r, size_t size, size_t count) DBL_DIG + 1, lowest, lowest, "LOWEST"); } +/* Read record type 7, subtype 5. */ +static void +read_variable_sets (struct sfm_reader *r, size_t size, size_t count) +{ + printf ("%08llx: variable sets\n", (long long int) ftello (r->file)); + struct text_record *text = open_text_record (r, size, count); + for (;;) + { + while (text_match (text, '\n')) + continue; + + const char *set = text_tokenize (text, '='); + if (!set) + break; + + /* Always present even for an empty set. */ + text_match (text, ' '); + + char *variables = text_tokenize (text, '\n'); + if (!variables) + printf ("\tset \"%s\" is empty\n", set); + else + { + size_t length = strlen (variables); + if (variables[length - 1] == '\r') + variables[length - 1] = '\0'; + printf ("\tset \"%s\" contains \"%s\"\n", set, variables); + } + } + close_text_record (text); +} + static void read_extra_product_info (struct sfm_reader *r, size_t size, size_t count) @@ -1018,6 +1057,8 @@ read_character_encoding (struct sfm_reader *r, size_t size, size_t count) read_string (r, encoding, count + 1); printf ("%08llx: Character Encoding: %s\n", posn, encoding); + + free (encoding); } static void @@ -1090,36 +1131,33 @@ read_long_string_missing_values (struct sfm_reader *r, while (ftello (r->file) - start < size * count) { long long posn = ftello (r->file); - char var_name[ID_MAX_LEN + 1]; - uint8_t n_missing_values; - int var_name_len; - int i; /* Read variable name. */ - var_name_len = read_int (r); + int var_name_len = read_int (r); if (var_name_len > ID_MAX_LEN) sys_error (r, "Variable name length in long string value label " "record (%d) exceeds %d-byte limit.", var_name_len, ID_MAX_LEN); + char var_name[ID_MAX_LEN + 1]; read_string (r, var_name, var_name_len + 1); /* Read number of values. */ + uint8_t n_missing_values; read_bytes (r, &n_missing_values, 1); - printf ("\t%08llx: %s, %d missing values:", - posn, var_name, n_missing_values); + /* Read value length. */ + int value_length = read_int (r); + + printf ("\t%08llx: %s, %d missing values, each %d bytes:", + posn, var_name, n_missing_values, value_length); /* Read values. */ - for (i = 0; i < n_missing_values; i++) + for (int i = 0; i < n_missing_values; i++) { - char *value; - int value_length; - posn = ftello (r->file); /* Read value. */ - value_length = read_int (r); - value = xmalloc (value_length + 1); + char *value = xmalloc (value_length + 1); read_string (r, value, value_length + 1); printf (" \"%s\"", value); @@ -1227,7 +1265,7 @@ read_simple_compressed_data (struct sfm_reader *r, int max_cases) { printf ("%08llx: case %d's uncompressible data begins\n", (long long int) ftello (r->file), case_num); - for (i = 0; i < r->n_var_widths; ) + for (i = 0; i < r->n_var_widths;) { int width = r->var_widths[i]; char raw_value[8]; @@ -1586,10 +1624,10 @@ sys_error (struct sfm_reader *r, const char *format, ...) too. */ static inline bool read_bytes_internal (struct sfm_reader *r, bool eof_is_ok, - void *buf, size_t byte_cnt) + void *buf, size_t n_bytes) { - size_t bytes_read = fread (buf, 1, byte_cnt, r->file); - if (bytes_read == byte_cnt) + size_t bytes_read = fread (buf, 1, n_bytes, r->file); + if (bytes_read == n_bytes) return true; else if (ferror (r->file)) sys_error (r, "System error: %s.", strerror (errno)); @@ -1602,9 +1640,9 @@ read_bytes_internal (struct sfm_reader *r, bool eof_is_ok, /* Reads BYTE_CNT into BUF. Aborts upon I/O error or if end-of-file is encountered. */ static void -read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) +read_bytes (struct sfm_reader *r, void *buf, size_t n_bytes) { - read_bytes_internal (r, false, buf, byte_cnt); + read_bytes_internal (r, false, buf, n_bytes); } /* Reads BYTE_CNT bytes into BUF. @@ -1612,9 +1650,9 @@ read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) Returns false if an immediate end-of-file is encountered. Aborts if an I/O error or a partial read occurs. */ static bool -try_read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) +try_read_bytes (struct sfm_reader *r, void *buf, size_t n_bytes) { - return read_bytes_internal (r, true, buf, byte_cnt); + return read_bytes_internal (r, true, buf, n_bytes); } /* Reads a 32-bit signed integer from R and returns its value in