#include "gettext.h"
#define _(msgid) gettext (msgid)
-#define VAR_NAME_LEN 64
+#define ID_MAX_LEN 64
struct sfm_reader
{
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 *);
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;
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;
}
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;
}
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;
/* 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. */
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++)
{
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];
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