#include <libpspp/message.h>
#include <errno.h>
#include <stdlib.h>
-#include <libpspp/alloc.h>
#include <data/file-name.h>
#include <language/command.h>
#include <language/lexer/lexer.h>
#include <libpspp/assertion.h>
#include <libpspp/message.h>
-#include <libpspp/magic.h>
#include <libpspp/str.h>
#include <data/variable.h>
#include <data/file-handle-def.h>
+#include "xalloc.h"
+
#include "gettext.h"
#define _(msgid) gettext (msgid)
break;
case FH_IMAGE:
properties.mode = FH_MODE_BINARY;
- if (cmd.n_lrecl[0] == NOT_LONG)
+ if (cmd.n_lrecl[0] == LONG_MIN)
msg (SE, _("Fixed-length records were specified on /RECFORM, but "
"record length was not specified on /LRECL. "
- "Assuming %u-character records."),
- (unsigned int) properties.record_width);
+ "Assuming %zu-character records."),
+ properties.record_width);
else if (cmd.n_lrecl[0] < 1)
msg (SE, _("Record length (%ld) must be at least one byte. "
- "Assuming %u-character records."),
- cmd.n_lrecl[0], (unsigned int) properties.record_width);
+ "Assuming %zu-character records."),
+ cmd.n_lrecl[0], properties.record_width);
else
properties.record_width = cmd.n_lrecl[0];
break;
if (handle == NULL)
return CMD_CASCADING_FAILURE;
- fh_free (handle);
-
+ fh_unname (handle);
return CMD_SUCCESS;
}
/* Parses a file handle name, which may be a file name as a string
or a file handle name as an identifier. The allowed types of
file handle are restricted to those in REFERENT_MASK. Returns
- the file handle when successful, a null pointer on failure. */
+ the file handle when successful, a null pointer on failure.
+
+ The caller is responsible for fh_unref()'ing the returned
+ file handle when it is no longer needed. */
struct file_handle *
fh_parse (struct lexer *lexer, enum fh_referent referent_mask)
{
handle = NULL;
if (lex_token (lexer) == T_ID)
handle = fh_from_id (lex_tokid (lexer));
- if (handle == NULL)
- handle = fh_from_file_name (ds_cstr (lex_tokstr (lexer)));
if (handle == NULL)
{
if (lex_token (lexer) != T_ID || lex_tokid (lexer)[0] != '#' || get_syntax () != ENHANCED)
{
msg (SE, _("Handle for %s not allowed here."),
referent_name (fh_get_referent (handle)));
+ fh_unref (handle);
return NULL;
}