X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Ffile-handle.q;h=e847e00f40367fdea283bd482ebeb73441677e7e;hb=81579d9e9f994fb2908f50af41c3eb033d216e58;hp=af5fa3321fdfa2b25972cf0691bb3539bce2b689;hpb=a9acce47d67e0ab35ce1690e4f1b1ac0121c2d78;p=pspp-builds.git diff --git a/src/language/data-io/file-handle.q b/src/language/data-io/file-handle.q index af5fa332..e847e00f 100644 --- a/src/language/data-io/file-handle.q +++ b/src/language/data-io/file-handle.q @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2010, 2011 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 @@ -15,20 +15,22 @@ along with this program. If not, see . */ #include -#include -#include + +#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include "xalloc.h" +#include "data/file-name.h" +#include "language/command.h" +#include "language/data-io/file-handle.h" +#include "language/lexer/lexer.h" +#include "libpspp/assertion.h" +#include "libpspp/message.h" +#include "libpspp/str.h" +#include "data/variable.h" +#include "data/file-handle-def.h" + +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -50,13 +52,13 @@ int cmd_file_handle (struct lexer *lexer, struct dataset *ds) { - char handle_name[VAR_NAME_LEN + 1]; struct cmd_file_handle cmd; struct file_handle *handle; + char *handle_name; if (!lex_force_id (lexer)) - return CMD_CASCADING_FAILURE; - str_copy_trunc (handle_name, sizeof handle_name, lex_tokid (lexer)); + goto error; + handle_name = xstrdup (lex_tokcstr (lexer)); handle = fh_from_id (handle_name); if (handle != NULL) @@ -64,18 +66,18 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds) msg (SE, _("File handle %s is already defined. " "Use CLOSE FILE HANDLE before redefining a file handle."), handle_name); - return CMD_CASCADING_FAILURE; + goto error; } lex_get (lexer); - if (!lex_force_match (lexer, '/')) - return CMD_CASCADING_FAILURE; + if (!lex_force_match (lexer, T_SLASH)) + goto error_free_handle_name; if (!parse_file_handle (lexer, ds, &cmd, NULL)) - return CMD_CASCADING_FAILURE; + goto error_free_handle_name; if (lex_end_of_command (lexer) != CMD_SUCCESS) - goto lossage; + goto error_free_cmd; if (cmd.mode != FH_SCRATCH) { @@ -84,7 +86,7 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds) if (cmd.s_name == NULL) { lex_sbc_missing (lexer, "NAME"); - goto lossage; + goto error_free_cmd; } switch (cmd.mode) @@ -101,7 +103,7 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds) properties.mode = FH_MODE_VARIABLE; break; case FH_360: - properties.encoding = LEGACY_EBCDIC; + properties.encoding = "EBCDIC-US"; if (cmd.recform == FH_FIXED || cmd.recform == FH_F) properties.mode = FH_MODE_FIXED; else if (cmd.recform == FH_VARIABLE || cmd.recform == FH_V) @@ -117,7 +119,7 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds) else { msg (SE, _("RECFORM must be specified with MODE=360.")); - goto lossage; + goto error_free_cmd; } break; default: @@ -128,7 +130,7 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds) { if (cmd.n_lrecl[0] == LONG_MIN) msg (SE, _("The specified file mode requires LRECL. " - "Assuming %d-character records."), + "Assuming %zu-character records."), properties.record_width); else if (cmd.n_lrecl[0] < 1 || cmd.n_lrecl[0] >= (1UL << 31)) msg (SE, _("Record length (%ld) must be between 1 and %lu bytes. " @@ -146,8 +148,11 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds) free_file_handle (&cmd); return CMD_SUCCESS; - lossage: +error_free_cmd: free_file_handle (&cmd); +error_free_handle_name: + free (handle_name); +error: return CMD_CASCADING_FAILURE; } @@ -158,7 +163,7 @@ cmd_close_file_handle (struct lexer *lexer, struct dataset *ds UNUSED) if (!lex_force_id (lexer)) return CMD_CASCADING_FAILURE; - handle = fh_from_id (lex_tokid (lexer)); + handle = fh_from_id (lex_tokcstr (lexer)); if (handle == NULL) return CMD_CASCADING_FAILURE; @@ -199,7 +204,7 @@ fh_parse (struct lexer *lexer, enum fh_referent referent_mask) handle = fh_inline_file (); else { - if (lex_token (lexer) != T_ID && lex_token (lexer) != T_STRING) + if (lex_token (lexer) != T_ID && !lex_is_string (lexer)) { lex_error (lexer, _("expecting a file name or handle name")); return NULL; @@ -207,14 +212,15 @@ 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)); + handle = fh_from_id (lex_tokcstr (lexer)); if (handle == NULL) { - if (lex_token (lexer) != T_ID || lex_tokid (lexer)[0] != '#' || get_syntax () != ENHANCED) - handle = fh_create_file (NULL, ds_cstr (lex_tokstr (lexer)), + if (lex_token (lexer) != T_ID || lex_tokcstr (lexer)[0] != '#' + || settings_get_syntax () != ENHANCED) + handle = fh_create_file (NULL, lex_tokcstr (lexer), fh_default_properties ()); else - handle = fh_create_scratch (lex_tokid (lexer)); + handle = fh_create_scratch (lex_tokcstr (lexer)); } lex_get (lexer); }