syntax-file: Open syntax files immediately, instead of delaying.
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 29 Sep 2010 04:19:59 +0000 (21:19 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 29 Sep 2010 04:19:59 +0000 (21:19 -0700)
Until now, syntax files have been opened only when the first line needs to
be read.  This commit changes behavior to open syntax files as soon as the
syntax file source is created.

This fixes the behavior INSERT CD=YES when a relative file path is
specified.  Without this commit, INSERT checks that the file exists, then
it creates the syntax file source, then it chdirs into the syntax file's
directory, and then the syntax file source tries to open the file, which
fails because the relative path is no longer correct.  With this commit,
the file gets opened before the chdir, so it succeeds.

The following commit will add a test to prevent regression.

src/language/syntax-file.c

index 5521972477f270a1a046b9a99f5b0b3e5a117f69..83bd07b351b9cb2ee9f270ce3eed1534b6ad5982 100644 (file)
@@ -85,17 +85,8 @@ read_syntax_file (struct getl_interface *s,
   struct syntax_file_source *sfs = UP_CAST (s, struct syntax_file_source,
                                             parent);
 
-  /* Open file, if not yet opened. */
   if (sfs->syntax_file == NULL)
-    {
-      sfs->syntax_file = fn_open (sfs->fn, "r");
-
-      if (sfs->syntax_file == NULL)
-        {
-          msg (ME, _("Opening `%s': %s."), sfs->fn, strerror (errno));
-          return false;
-        }
-    }
+    return false;
 
   /* Read line from file and remove new-line.
      Skip initial "#! /usr/bin/pspp" line. */
@@ -142,6 +133,9 @@ create_syntax_file_source (const char *fn)
   struct syntax_file_source *ss = xzalloc (sizeof (*ss));
 
   ss->fn = xstrdup (fn);
+  ss->syntax_file = fn_open (ss->fn, "r");
+  if (ss->syntax_file == NULL)
+    msg (ME, _("Opening `%s': %s."), ss->fn, strerror (errno));
 
   ss->parent.interactive = always_false;
   ss->parent.read = read_syntax_file ;