X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Ffile-handle.q;h=a3ff4102360616d89cc89cdc13174ce8bfba881b;hb=f9d0b49f59af300be5600141a0096b26c96abce9;hp=33aa1d168a5c4efce423688b3d8998193b8c7abc;hpb=7665da99ed70c1a5ffee47e99e1672244b444ed4;p=pspp diff --git a/src/language/data-io/file-handle.q b/src/language/data-io/file-handle.q index 33aa1d168a..a3ff410236 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,13 +15,13 @@ along with this program. If not, see . */ #include + #include -#include -#include #include #include #include #include +#include #include #include #include @@ -51,13 +51,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) @@ -65,18 +65,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) { @@ -85,7 +85,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) @@ -118,7 +118,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: @@ -147,8 +147,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; } @@ -159,7 +162,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; @@ -200,7 +203,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; @@ -208,14 +211,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] != '#' || settings_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); }