CLOSE FILE HANDLE: Fix bugs and add test.
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 7 Mar 2023 20:37:39 +0000 (12:37 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 7 Mar 2023 20:42:09 +0000 (12:42 -0800)
In addition to the particular bug that was reported, there was a memory
leak.  This commit fixes both.

Reported by knassen@chartermi.net.

src/data/file-handle-def.c
src/language/commands/file-handle.c
tests/language/commands/file-handle.at

index 04f773452f89fe1ad7b2be248876aa26b230fbf7..e6bedcca8711fec4377bbfbff36376fdf247a517 100644 (file)
@@ -191,6 +191,8 @@ void
 fh_unname (struct file_handle *handle)
 {
   assert (handle->ref_cnt > 1);
+  if (fh_get_default_handle () == handle)
+    fh_set_default_handle (NULL);
   if (handle != fh_inline_file () && handle->id != NULL)
     unname_handle (handle);
 }
index de797b3c92541980b2f0123b75bfa9744ce85595..3c2494ca381538230ba9fecaa2d832a01128c0ca 100644 (file)
@@ -289,9 +289,15 @@ cmd_close_file_handle (struct lexer *lexer, struct dataset *ds UNUSED)
     return CMD_CASCADING_FAILURE;
   handle = fh_from_id (lex_tokcstr (lexer));
   if (handle == NULL)
-    return CMD_CASCADING_FAILURE;
+    {
+      lex_next_error (lexer, 0, 0, _("No file handle named %s."),
+                      lex_tokcstr (lexer));
+      return CMD_CASCADING_FAILURE;
+    }
+  lex_get (lexer);
 
   fh_unname (handle);
+  fh_unref (handle);
   return CMD_SUCCESS;
 }
 
index 74989ba490e6cc7b4b95ccd5ee26c52dc0427d83..5088a3fb7f4aee8c6f2863dc69aa50fb21ebfd08 100644 (file)
@@ -145,4 +145,75 @@ AT_CHECK([pspp --testing-mode -O format=csv insert.sps], [1], [dnl
    20 | FILE HANDLE y/NAME='x.txt'/MODE=FIXED.
       |                                 ^~~~~"
 ])
-AT_CLEANUP
\ No newline at end of file
+AT_CLEANUP
+
+AT_SETUP([CLOSE FILE HANDLE])
+AT_DATA([wiggle.txt], [dnl
+1
+2
+5
+109
+])
+AT_DATA([wobble.txt], [dnl
+7
+8
+9
+])
+AT_DATA([file-handle.sps], [dnl
+FILE HANDLE myhandle /NAME='wiggle.txt'.
+DATA LIST LIST FILE=myhandle /x *.
+LIST.
+
+CLOSE FILE HANDLE myhandle.
+
+FILE HANDLE myhandle /NAME='wobble.txt'.
+DATA LIST LIST FILE=myhandle /x *.
+LIST.
+])
+AT_CHECK([pspp -O format=csv file-handle.sps], [0], [dnl
+Table: Reading free-form data from myhandle.
+Variable,Format
+x,F8.0
+
+Table: Data List
+x
+1.00
+2.00
+5.00
+109.00
+
+Table: Reading free-form data from myhandle.
+Variable,Format
+x,F8.0
+
+Table: Data List
+x
+7.00
+8.00
+9.00
+])
+AT_CLEANUP
+
+AT_SETUP([CLOSE FILE HANDLE syntax errors])
+AT_DATA([wiggle.txt], [dnl
+1
+2
+5
+109
+])
+AT_DATA([file-handle.sps], [dnl
+FILE HANDLE myhandle /NAME='wiggle.txt'.
+CLOSE FILE HANDLE myhandle **.
+CLOSE FILE HANDLE myhandle.
+CLOSE FILE HANDLE myhandle.
+CLOSE FILE HANDLE **.
+])
+AT_DATA([insert.sps], [dnl
+INSERT FILE='file-handle.sps' ERROR=IGNORE.
+])
+AT_CHECK([pspp -O format=csv insert.sps], [1], [dnl
+"insert.sps:1.37-1.42: error: INSERT: Syntax error expecting CONTINUE or STOP.
+    1 | INSERT FILE='file-handle.sps' ERROR=IGNORE.
+      |                                     ^~~~~~"
+])
+AT_CLEANUP