]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
Update etc/bench.pl. Optimize push mode a little (the yyn change
[bison.git] / src / scan-skel.l
index e3a5eabd437d2c95158247b6d1dd5b18bb9b6eb5..4bba4ac4063d42b9d869d53d51f68f83a561e13d 100644 (file)
@@ -1,6 +1,7 @@
 /* Scan Bison Skeletons.                                       -*- C -*-
 
-   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+   Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 #undef skel_wrap
 #define skel_wrap() 1
 
-#include "system.h"
+#define FLEX_NO_OBSTACK
+#define FLEX_PREFIX(Id) skel_ ## Id
+#include "flex-scanner.h"
 
+#include <dirname.h>
 #include <error.h>
 #include <quotearg.h>
 
 #include "files.h"
 #include "scan-skel.h"
 
+int skel_lex (void);
+
 #define QPUTS(String) \
-   fputs (quotearg_style (c_quoting_style, (String)), yyout)
+   fputs (quotearg_style (c_quoting_style, String), yyout)
 
+static char *decode_at_digraphs (char *in);
 %}
 %%
 
 %}
 
 "@output ".*\n {
-  char const *file_name = yytext + sizeof "@output " - 1;
+  char *file_name = yytext + sizeof "@output " - 1;
   yytext[yyleng - 1] = '\0';
-
-  /* Decode special file names.  They include the directory part,
-     contrary to their "free" occurrences, used for issuing #includes,
-     which must not include the directory part.  */
-
-  if (*file_name == '@')
-    {
-      if (strcmp (file_name, "@output_header_name@") == 0)
-       file_name = spec_defines_file;
-      else if (strcmp (file_name, "@output_parser_name@") == 0)
-       file_name = parser_file_name;
-      else
-       fatal ("invalid token in skeleton: %s", yytext);
-    }
-
   if (outname)
     {
       free (outname);
       xfclose (yyout);
     }
-  outname = xstrdup (file_name);
+  outname = decode_at_digraphs (file_name);
+  output_file_name_check (outname);
   yyout = xfopen (outname, "w");
   lineno = 1;
 }
 "@oline@"  fprintf (yyout, "%d", lineno + 1);
 "@ofile@"  QPUTS (outname);
 "@dir_prefix@" QPUTS (dir_prefix);
-"@output_parser_name@" QPUTS (base_name (parser_file_name));
-"@output_header_name@" QPUTS (base_name (spec_defines_file));
+
+"@basename(".*"@)" {
+  char *file_name = yytext + sizeof "@basename " - 1;
+  yytext[yyleng - 2] = '\0';
+  file_name = decode_at_digraphs (file_name);
+  fputs (last_component (file_name), yyout);
+  free (file_name);
+}
 
   /* This pattern must not match more than the previous @ patterns. */
 @[^{}@\n]* fatal ("invalid @ in skeleton: %s", yytext);
@@ -113,5 +112,33 @@ scan_skel (FILE *in)
   skel__flex_debug = trace_flag & trace_skeleton;
   skel_lex ();
   /* Reclaim Flex's buffers.  */
-  yy_delete_buffer (YY_CURRENT_BUFFER);
+  yylex_destroy ();
+}
+
+static char *
+decode_at_digraphs (char *in)
+{
+  char *out_start = xnmalloc (strlen (in)+1, sizeof *out_start);
+  char *out;
+  for (out = out_start; *in != '\0'; ++in, ++out)
+    {
+      if (*in == '@')
+        {
+          switch (*++in)
+            {
+              case '@': *out = '@'; break;
+              case '{': *out = '['; break;
+              case '}': *out = ']'; break;
+              default:
+                if (*in != '\0')
+                  in[1] = '\0';
+                fatal ("invalid @ in skeleton: %s", in-1);
+                break;
+            }
+        }
+      else
+        *out = *in;
+    }
+  *out = '\0';
+  return out_start;
 }