X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Fdissect-sysfile.c;h=444c15cc88bbec3544c017422aecb11b7b700bb3;hb=cac0d191514553fede1858bf3dceee9073e60c1a;hp=4fc610a9972ba72a27fed40976d53958182ae65f;hpb=ed323d5c8d8bebb22b738f1057626607d6c53a59;p=pspp-builds.git diff --git a/tests/dissect-sysfile.c b/tests/dissect-sysfile.c index 4fc610a9..444c15cc 100644 --- a/tests/dissect-sysfile.c +++ b/tests/dissect-sysfile.c @@ -36,7 +36,7 @@ #include "gettext.h" #define _(msgid) gettext (msgid) -#define VAR_NAME_LEN 64 +#define ID_MAX_LEN 64 struct sfm_reader { @@ -102,6 +102,7 @@ static void sys_error (struct sfm_reader *, const char *, ...) NO_RETURN; static void read_bytes (struct sfm_reader *, void *, size_t); +static bool try_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 *); @@ -126,7 +127,7 @@ main (int argc, char *argv[]) r.file_name = argv[i]; r.file = fopen (r.file_name, "rb"); if (r.file == NULL) - error (EXIT_FAILURE, errno, "error opening \"%s\"", r.file_name); + error (EXIT_FAILURE, errno, "error opening `%s'", r.file_name); r.n_variable_records = 0; r.n_variables = 0; r.n_var_widths = 0; @@ -688,8 +689,8 @@ read_mrsets (struct sfm_reader *r, size_t size, size_t count) if (!text_match (text, ' ')) { - sys_warn (r, _("Missing space following 'E' at offset %zu " - "in MRSETS record"), text_pos (text)); + sys_warn (r, _("Missing space following `%c' at offset %zu " + "in MRSETS record"), 'E', text_pos (text)); break; } @@ -697,14 +698,14 @@ read_mrsets (struct sfm_reader *r, size_t size, size_t count) if (!strcmp (number, "11")) label_from_var_label = true; else if (strcmp (number, "1")) - sys_warn (r, _("Unexpected label source value \"%s\" " - "following 'E' at offset %zu in MRSETS record"), + sys_warn (r, _("Unexpected label source value `%s' " + "following `E' at offset %zu in MRSETS record"), number, text_pos (text)); } else { - sys_warn (r, "missing 'C', 'D', or 'E' at offset %zu " + sys_warn (r, "missing `C', `D', or `E' at offset %zu " "in mrsets record", text_pos (text)); break; } @@ -924,7 +925,7 @@ read_long_string_value_labels (struct sfm_reader *r, size_t size, size_t count) while (ftello (r->file) - start < size * count) { long long posn = ftello (r->file); - char var_name[VAR_NAME_LEN + 1]; + char var_name[ID_MAX_LEN + 1]; int var_name_len; int n_values; int width; @@ -932,10 +933,10 @@ read_long_string_value_labels (struct sfm_reader *r, size_t size, size_t count) /* Read variable name. */ var_name_len = read_int (r); - if (var_name_len > VAR_NAME_LEN) + 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, VAR_NAME_LEN); + var_name_len, ID_MAX_LEN); read_string (r, var_name, var_name_len + 1); /* Read width, number of values. */ @@ -1079,6 +1080,7 @@ read_compressed_data (struct sfm_reader *r) printf ("\n%08llx: compressed data:\n", (long long int) ftello (r->file)); opcode_idx = N_OPCODES; + opcode_ofs = 0; case_num = 0; for (case_num = 0; ; case_num++) { @@ -1093,7 +1095,13 @@ read_compressed_data (struct sfm_reader *r) if (opcode_idx >= N_OPCODES) { opcode_ofs = ftello (r->file); - read_bytes (r, opcodes, 8); + if (i == 0) + { + if (!try_read_bytes (r, opcodes, 8)) + return; + } + else + read_bytes (r, opcodes, 8); opcode_idx = 0; } opcode = opcodes[opcode_idx]; @@ -1360,6 +1368,16 @@ read_bytes (struct sfm_reader *r, void *buf, size_t byte_cnt) read_bytes_internal (r, false, buf, byte_cnt); } +/* Reads BYTE_CNT bytes into BUF. + Returns true if exactly BYTE_CNT bytes are successfully read. + 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) +{ + return read_bytes_internal (r, true, buf, byte_cnt); +} + /* Reads a 32-bit signed integer from R and returns its value in host format. */ static int