]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
(EXTRA_DIST): Avoid +=, a GNU make extension.
[bison.git] / src / scan-skel.l
index b624cdfbebf1110e96af66496657c7efbdde5ba0..114407fc06764fc30b7d663fc8106c55e9355d41 100644 (file)
@@ -23,6 +23,8 @@
 
 %{
 #include "system.h"
+#include "error.h"
+#include "getargs.h"
 #include "files.h"
 int skel_lex PARAMS ((void));
 static int yylineno = 1;
@@ -38,8 +40,8 @@ static char *yyoutname = NULL;
      yylineno = 1;
    }
 
-"@<:@" fputc ('[', yyout);
-"@:>@" fputc (']', yyout);
+"@<:@"           fputc ('[', yyout);
+"@:>@"           fputc (']', yyout);
 
 "__oline__"      fprintf (yyout, "%d", yylineno+1);
 "__ofile__"      fprintf (yyout, "%s", yyoutname);
@@ -47,4 +49,52 @@ static char *yyoutname = NULL;
 \n+              yylineno += yyleng; ECHO;
 .                ECHO;
 
+<<EOF>>          xfclose (yyout); free (yyoutname); return EOF;
 %%
+
+/* From lib/readpipe.c.  */
+FILE *readpipe PARAMS ((const char *, ...));
+
+/*----------------------.
+| Run our backend, M4.  |
+`----------------------*/
+
+void m4_invoke PARAMS ((const char *definitions));
+
+void
+m4_invoke (const char *definitions)
+{
+  /* Invoke m4 on the definition of the muscles, and the skeleton. */
+  const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
+  const char *m4 = getenv ("M4");
+  int pkg_data_len;
+  char *full_skeleton;
+
+  if (!m4)
+    m4 = M4;
+  if (!bison_pkgdatadir)
+    bison_pkgdatadir = PKGDATADIR;
+  pkg_data_len = strlen (bison_pkgdatadir);
+  full_skeleton = XMALLOC (char, pkg_data_len + strlen (skeleton) + 2);
+  if (bison_pkgdatadir[pkg_data_len-1] == '/')
+    sprintf (full_skeleton, "%s%s", bison_pkgdatadir, skeleton);
+  else
+    sprintf (full_skeleton, "%s/%s", bison_pkgdatadir, skeleton);
+  if (trace_flag & trace_tools)
+    fprintf (stderr,
+            "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
+            m4, bison_pkgdatadir, definitions, full_skeleton);
+  skel_in = readpipe (m4,
+                     "-I", bison_pkgdatadir,
+                     "m4sugar/m4sugar.m4",
+                     definitions,
+                     full_skeleton,
+                     NULL);
+  XFREE (full_skeleton);
+  if (!skel_in)
+    error (EXIT_FAILURE, errno, "cannot run m4");
+  skel_lex ();
+
+  /* Reclaim Flex's buffers.  */
+  yy_delete_buffer (YY_CURRENT_BUFFER);
+}