X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fpspp-dump-sav.c;h=307add8db3b56b339afe79f3d0e7d732c6c21236;hb=41f83a8f1c88489e4fc458fb7661430ff91d8a61;hp=98cb6f3b22ed7ae6673081365fce531c52984069;hpb=c1708f027dfb623031bcccf2cee84aa4511fb824;p=pspp diff --git a/utilities/pspp-dump-sav.c b/utilities/pspp-dump-sav.c index 98cb6f3b22..307add8db3 100644 --- a/utilities/pspp-dump-sav.c +++ b/utilities/pspp-dump-sav.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 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 @@ -65,6 +65,8 @@ static void read_machine_integer_info (struct sfm_reader *, size_t size, size_t count); 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_mrsets (struct sfm_reader *, size_t size, size_t count); static void read_display_parameters (struct sfm_reader *, size_t size, size_t count); @@ -94,6 +96,7 @@ static char *text_tokenize (struct text_record *, int delimiter); static bool text_match (struct text_record *text, int c); static const char *text_parse_counted_string (struct text_record *); static size_t text_pos (const struct text_record *); +static const char *text_get_all (const struct text_record *); static void usage (void); static void sys_warn (struct sfm_reader *, const char *, ...) @@ -111,6 +114,8 @@ static void read_string (struct sfm_reader *, char *, size_t); static void skip_bytes (struct sfm_reader *, size_t); static void trim_spaces (char *); +static void print_string (const char *s, size_t len); + int main (int argc, char *argv[]) { @@ -574,6 +579,10 @@ read_extension_record (struct sfm_reader *r) read_mrsets (r, size, count); return; + case 10: + read_extra_product_info (r, size, count); + return; + case 11: read_display_parameters (r, size, count); return; @@ -663,20 +672,34 @@ read_machine_float_info (struct sfm_reader *r, size_t size, size_t count) sys_error (r, "Bad size (%zu) or count (%zu) on extension 4.", size, count); - printf ("\tsysmis: %g\n", sysmis); + printf ("\tsysmis: %g (%a)\n", sysmis, sysmis); if (sysmis != SYSMIS) - sys_warn (r, "File specifies unexpected value %g as %s.", - sysmis, "SYSMIS"); + sys_warn (r, "File specifies unexpected value %g (%a) as %s.", + sysmis, sysmis, "SYSMIS"); - printf ("\thighest: %g\n", highest); + printf ("\thighest: %g (%a)\n", highest, highest); if (highest != HIGHEST) - sys_warn (r, "File specifies unexpected value %g as %s.", - highest, "HIGHEST"); + sys_warn (r, "File specifies unexpected value %g (%a) as %s.", + highest, highest, "HIGHEST"); - printf ("\tlowest: %g\n", lowest); - if (lowest != LOWEST) - sys_warn (r, "File specifies unexpected value %g as %s.", - lowest, "LOWEST"); + printf ("\tlowest: %g (%a)\n", lowest, lowest); + if (lowest != LOWEST && lowest != SYSMIS) + sys_warn (r, "File specifies unexpected value %g (%a) as %s.", + lowest, lowest, "LOWEST"); +} + +static void +read_extra_product_info (struct sfm_reader *r, + size_t size, size_t count) +{ + struct text_record *text; + const char *s; + + printf ("%08llx: extra product info\n", (long long int) ftello (r->file)); + text = open_text_record (r, size * count); + s = text_get_all (text); + print_string (s, strlen (s)); + close_text_record (text); } /* Read record type 7, subtype 7. */ @@ -1069,23 +1092,7 @@ read_unknown_extension (struct sfm_reader *r, size_t size, size_t count) { 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); - } - putchar ('\n'); - } - else - hex_dump (0, buffer, count); + print_string (CHAR_CAST (char *, buffer), count); free (buffer); } } @@ -1333,6 +1340,12 @@ text_pos (const struct text_record *text) { return text->pos; } + +static const char * +text_get_all (const struct text_record *text) +{ + return text->buffer; +} static void usage (void) @@ -1485,3 +1498,27 @@ trim_spaces (char *s) end--; *end = '\0'; } + +static void +print_string (const char *s, size_t len) +{ + if (memchr (s, 0, len) == 0) + { + size_t i; + + for (i = 0; i < len; i++) + { + unsigned char c = s[i]; + + if (c == '\\') + printf ("\\\\"); + else if (c == '\n' || isprint (c)) + putchar (c); + else + printf ("\\%02x", c); + } + putchar ('\n'); + } + else + hex_dump (0, s, len); +}