struct dictionary **dictp, struct sfm_read_info *infop)
{
struct sfm_reader *volatile r = NULL;
- struct sfm_read_info info;
+ struct sfm_read_info *volatile info;
struct sfm_header_record header;
r->opcode_idx = sizeof r->opcodes;
r->corruption_warning = false;
- memset (&info, 0, sizeof info);
+ info = infop ? infop : xmalloc (sizeof *info);
+ memset (info, 0, sizeof *info);
/* TRANSLATORS: this fragment will be interpolated into
messages in fh_lock() that identify types of files. */
goto error;
/* Read header. */
- read_header (r, &info, &header);
+ read_header (r, info, &header);
vars = NULL;
n_vars = allocated_vars = 0;
parse_document (dict, document);
if (extensions[EXT_INTEGER] != NULL)
- parse_machine_integer_info (r, extensions[EXT_INTEGER], &info);
+ parse_machine_integer_info (r, extensions[EXT_INTEGER], info);
if (extensions[EXT_FLOAT] != NULL)
parse_machine_float_info (r, extensions[EXT_FLOAT]);
if (extensions[EXT_FILE_ATTRS] != NULL)
parse_data_file_attributes (r, extensions[EXT_FILE_ATTRS], dict);
- parse_header (r, &header, &info, dict);
+ parse_header (r, &header, info, dict);
/* Parse the variable records, the basis of almost everything else. */
parse_variable_records (r, dict, vars, n_vars);
wrong when very long strings are involved, so don't warn in
that case. */
if (header.nominal_case_size != -1 && header.nominal_case_size != n_vars
- && info.version_major != 13)
+ && info->version_major != 13)
sys_warn (r, -1, _("File header claims %d variable positions but "
"%zu were read from file."),
header.nominal_case_size, n_vars);
r->proto = caseproto_ref_pool (dict_get_proto (dict), r->pool);
*dictp = dict;
- if (infop)
- *infop = info;
- else
- sfm_read_info_destroy (&info);
+ if (infop != info)
+ sfm_read_info_destroy (info);
return casereader_create_sequential
(NULL, r->proto,
&sys_file_casereader_class, r);
error:
- sfm_read_info_destroy (&info);
+ sfm_read_info_destroy (info);
close_reader (r);
dict_destroy (dict);
*dictp = NULL;