chiark / gitweb /
Cope with moved changelogs.
[userv.git] / lexer.l.m4
index 2f360606017eb44ba2695832c90e79015f3d2f3e..0b7e705f8f521ea57f2d3c84a7c65c27bcdbaad0 100644 (file)
@@ -33,8 +33,10 @@ include(language.i4)
 #include <fnmatch.h>
 #include <limits.h>
 #include <dirent.h>
+#include <sys/types.h>
 #include <sys/stat.h>
 #include <time.h>
+#include <errno.h>
 
 #include "config.h"
 #include "common.h"
@@ -57,14 +59,17 @@ static directive_fnt dfi_includeuserrcfile, dfi_includeclientconfig;
 /* directive functions return:
  *  0 for success having scanned up to and including end of line but not beyond,
  *  or tokv_error or tokv_quit.
+ * They expect to parse the whitespace before their parameters (if any).
  */
 
-typedef int parmcondition_fnt(int ctoken, char **parmvalues, int *rtrue);
+typedef int parmcondition_fnt(int ctoken, char *const *parmvalues, int *rtrue);
 static parmcondition_fnt pcf_glob, pcf_range, pcf_grep;
 /* all conditional functions return tokv_error for failure or 0 for success
  *  at parsing and testing, in which case *rtrue is set to 0 or 1.
  *  On success they have scanned up to and including the condition's
- *  terminating newline.
+ *  terminating newline; the pcf_... functions expect to parse the whitespace
+ *  between the parameter name and the condition's arguments.
+ * Otherwise they return tokv_error.
  * The parameter-based conditionals take a list of parameter values
  * as obtained from the parameter functions and pa_parameter,
  * and do _not_ free it.
@@ -108,6 +113,7 @@ static int lr_fdwant_readwrite; /* -1=never, 0=opt, 1=always */
 struct parser_state {
   int lineno, reportlineno, notedreferer, isinternal;
   const char *filename;
+  struct stat filestab;
   YY_BUFFER_STATE ybuf;
   struct parser_state *upstate;
 };
@@ -116,7 +122,8 @@ static struct parser_state *cstate;
 
 struct error_handling {
   int handling; /* One of the error handling modes tokt_ehandlemode */
-  int logfacility, loglevel, filekeep;
+  int logfacility, loglevel;
+  int filekeep; /* File is in use by higher-level errors-push, leave it open */
   FILE *file;
   char *filename;
 };
@@ -125,8 +132,12 @@ static struct error_handling eh = { tokv_word_errorstostderr, 0,0,0,0,0 };
 
 static int dequote(char *inplace);
 
+#define YY_NO_UNPUT
+
 %}
+
 %option noyywrap
+
 %%
 
 dnl simple words
@@ -141,10 +152,10 @@ changequote({*,*})
                        }
 [0-9]{1,8}-[0-9]{1,8}  {
                          char *ep;
-                         lr_min=(int)strtoul(yytext,&ep,10);
+                         lr_min= (int)strtoul(yytext,&ep,10);
                          assert(*ep == HYPHEN);
                          assert(*++ep);
-                         lr_max=(int)strtoul(ep,&ep,10);
+                         lr_max= (int)strtoul(ep,&ep,10);
                          assert(!*ep);
                          if (lr_max < lr_min) {
                            parseerrprint("fd range has min > max");
@@ -184,4 +195,3 @@ changequote(`,')
 '
 divert(-1)
 undivert
-