chiark / gitweb /
Patch from Peter Benie.
[userv.git] / parser.c
index 3f40ffb71ed99b8eec4cb7c83861f1637306897c..4565e3288233975bfa90cf9f4d6d88dbdc719cf7 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -6,7 +6,7 @@
  * about m4 quoting &c., but we have to #include it so that the C
  * objects from the lexer are available.
  *
- * Copyright (C)1996-1999,2001 Ian Jackson
+ * Copyright (C)1996-1999,2001,2006,2012 Ian Jackson
  *
  * This is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by
@@ -148,7 +148,7 @@ static int dequote(char *inplace) {
   int v;
 
   p=q=inplace;
-  assert(*p++ = '"');
+  assert(*p=='"');  p++;
   while (*p && *p != '"') {
     if (*p != '\\') { *q++= *p++; continue; }
     switch (*++p) {
@@ -183,7 +183,7 @@ static int dequote(char *inplace) {
       }
     }
   }
-  assert(*p); assert(!*++p);
+  assert(*p); p++; assert(!*p);
   *q++= 0;
   return tokv_quotedstring;
 }
@@ -205,6 +205,8 @@ const char *printtoken(int token) {
     return buf;
   } else if (token & tokt_number) {
     snyprintf(buf,sizeof(buf),"number %d",lr_min); return buf;
+  } else if (token & tokt_fdrange && token & tokr_word) {
+    snyprintf(buf,sizeof(buf),"fd %s",buf); return buf;
   } else if (token & tokt_fdrange && lr_max==-1) {
     snyprintf(buf,sizeof(buf),"fdrange %d-",lr_min); return buf;
   } else if (token & tokt_fdrange) {
@@ -422,7 +424,7 @@ static int skip(int allowce) {
 
   for (;;) { /* loop over lines */
     cstate->reportlineno= cstate->lineno;
-    do { token= yylex(); } while (token == tokv_lwsp);
+    do { token= yylex(); } while (token == tokv_lwsp || token == tokv_newline);
     if (token & tokt_exception) {
       return token;
     } else if (token & tokt_controlend) {
@@ -589,9 +591,7 @@ int pcf_range(int ctoken, char *const *pv, int *rtrue) {
   char *ep;
   unsigned long v;
 
-  r= pa_mwsp(); if (r) return r;
   mintoken= pa_numberdollar(&min); if (mintoken == tokv_error) return mintoken;
-  r= pa_mwsp(); if (r) return r;
   maxtoken= pa_numberdollar(&max); if (maxtoken == tokv_error) return maxtoken;
   r= pa_mnl(); if (r) return r;
   for (pp= pv; *pp; pp++) {
@@ -995,7 +995,7 @@ int df_includedirectory(int dtoken) {
     return parseerrprint("unable to open directory `%s': %s",cpget,strerror(errno));
   cp= xstrsave(cpget);
   cpl= strlen(cp);
-  while ((de= readdir(d))) {
+  while ((errno=0, de= readdir(d))) {
     tel= strlen(de->d_name);
     if (!tel) continue;
     p= de->d_name;
@@ -1014,6 +1014,12 @@ int df_includedirectory(int dtoken) {
       goto x_err;
     }
   }
+  if (errno) {
+    parseerrprint("error reading directory `%s': %s",cp,strerror(errno));
+    closedir(d);
+    free(cp);
+    return tokv_error;
+  }
   if (closedir(d)) {
     parseerrprint("error closing directory `%s': %s",cp,strerror(errno));
     free(cp);
@@ -1028,6 +1034,15 @@ x_err:
   return r;
 }
 
+static int oldquote = 0;
+
+int dfg_lookupquotemode(int dtoken) {
+  int r;
+  r= pa_mnl(); if (r) return r;
+  oldquote = dtoken == tokv_word_includelookupquoteold;
+  return r;
+}
+
 int df_includelookup(int dtoken) {
   static char *buildbuf=0;
   int buildbuflen=0;
@@ -1079,9 +1094,11 @@ int df_includelookup(int dtoken) {
          if (c=='/') {
            *q++= ':';
            c= '-';
-         } else if (!((c >= '0' && c <= '9') ||
+         } else if (oldquote ?
+                    !((c >= '0' && c <= '9') ||
                       (c >= 'a' && c <= 'z') ||
-                      c == '-' || c == '_')) {
+                      c == '-' || c == '_') :
+                    (c==':')) {
            *q++= ':';
          }
          *q++= c;