X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Fdissect-sysfile.c;h=17eaf97612211804a8b81a0a02578fc51160e39f;hb=e2583dfdd29bc30e30ec1f0b38cb261ba6d87e37;hp=8bab745f3ab23a52ca566b4e75b2c8001d194e30;hpb=3bbb4370239deb29ebbf813d258aef6249e2a431;p=pspp diff --git a/tests/dissect-sysfile.c b/tests/dissect-sysfile.c index 8bab745f3a..17eaf97612 100644 --- a/tests/dissect-sysfile.c +++ b/tests/dissect-sysfile.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2007, 2008, 2009, 2010 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 @@ -74,10 +74,13 @@ static void read_datafile_attributes (struct sfm_reader *r, size_t size, size_t count); static void read_variable_attributes (struct sfm_reader *r, size_t size, size_t count); +static void read_ncases64 (struct sfm_reader *, size_t size, size_t count); static void read_character_encoding (struct sfm_reader *r, size_t size, size_t count); static void read_long_string_value_labels (struct sfm_reader *r, size_t size, size_t count); +static void read_unknown_extension (struct sfm_reader *, + size_t size, size_t count); static void read_compressed_data (struct sfm_reader *); static struct text_record *open_text_record ( @@ -97,6 +100,7 @@ static void sys_error (struct sfm_reader *, const char *, ...) static void read_bytes (struct sfm_reader *, void *, size_t); static int read_int (struct sfm_reader *); +static int64_t read_int64 (struct sfm_reader *); static double read_float (struct sfm_reader *); static void read_string (struct sfm_reader *, char *, size_t); static void skip_bytes (struct sfm_reader *, size_t); @@ -535,8 +539,8 @@ read_extension_record (struct sfm_reader *r) return; case 16: - /* New in SPSS v14? Unknown purpose. */ - break; + read_ncases64 (r, size, count); + return; case 17: read_datafile_attributes (r, size, count); @@ -556,7 +560,8 @@ read_extension_record (struct sfm_reader *r) default: sys_warn (r, _("Unrecognized record type 7, subtype %d."), subtype); - break; + read_unknown_extension (r, size, count); + return; } skip_bytes (r, bytes); @@ -750,6 +755,31 @@ read_attributes (struct sfm_reader *r, struct text_record *text, } } +/* Read extended number of cases record. */ +static void +read_ncases64 (struct sfm_reader *r, size_t size, size_t count) +{ + int64_t unknown, ncases64; + + if (size != 8) + { + sys_warn (r, _("Bad size %zu for extended number of cases."), size); + skip_bytes (r, size * count); + return; + } + if (count != 2) + { + sys_warn (r, _("Bad count %zu for extended number of cases."), size); + skip_bytes (r, size * count); + return; + } + unknown = read_int64 (r); + ncases64 = read_int64 (r); + printf ("%08lx: extended number of cases: " + "unknown=%"PRId64", ncases64=%"PRId64"\n", + ftell (r->file), unknown, ncases64); +} + static void read_datafile_attributes (struct sfm_reader *r, size_t size, size_t count) { @@ -831,6 +861,80 @@ read_long_string_value_labels (struct sfm_reader *r, size_t size, size_t count) } } +static void +hex_dump (size_t offset, const void *buffer_, size_t buffer_size) +{ + const uint8_t *buffer = buffer_; + + while (buffer_size > 0) + { + size_t n = MIN (buffer_size, 16); + size_t i; + + printf ("%04zx", offset); + for (i = 0; i < 16; i++) + { + if (i < n) + printf ("%c%02x", i == 8 ? '-' : ' ', buffer[i]); + else + printf (" "); + } + + printf (" |"); + for (i = 0; i < 16; i++) + { + unsigned char c = i < n ? buffer[i] : ' '; + putchar (isprint (c) ? c : '.'); + } + printf ("|\n"); + + offset += n; + buffer += n; + buffer_size -= n; + } +} + +/* Reads and prints any type 7 record that we don't understand. */ +static void +read_unknown_extension (struct sfm_reader *r, size_t size, size_t count) +{ + unsigned char *buffer; + size_t i; + + if (size == 0 || count > 65536 / size) + skip_bytes (r, size * count); + else if (size != 1) + { + buffer = xmalloc (size); + for (i = 0; i < count; i++) + { + read_bytes (r, buffer, size); + hex_dump (i * size, buffer, size); + } + free (buffer); + } + else + { + buffer = xmalloc (count); + read_bytes (r, buffer, count); + if (memchr (buffer, 0, count) == 0) + for (i = 0; i < count; i++) + { + unsigned char c = buffer[i]; + + if (c == '\\') + printf ("\\\\"); + else if (c == '\n' || isprint (c)) + putchar (c); + else + printf ("\\%02x", c); + } + else + hex_dump (0, buffer, count); + free (buffer); + } +} + static void read_variable_attributes (struct sfm_reader *r, size_t size, size_t count) { @@ -1087,6 +1191,16 @@ read_int (struct sfm_reader *r) return integer_get (r->integer_format, integer, sizeof integer); } +/* Reads a 64-bit signed integer from R and returns its value in + host format. */ +static int64_t +read_int64 (struct sfm_reader *r) +{ + uint8_t integer[8]; + read_bytes (r, integer, sizeof integer); + return integer_get (r->integer_format, integer, sizeof integer); +} + /* Reads a 64-bit floating-point number from R and returns its value in host format. */ static double