chiark / gitweb /
Update some copyright notices.
[userv.git] / parser.c
index e063bf9b3a983a50d8a7a31c83bf404c02aed399..1bdf56d3441188e25a958b715100685fcfd6a860 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
@@ -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);