X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=parser.c;h=4565e3288233975bfa90cf9f4d6d88dbdc719cf7;hb=5c38f6a9b5774073832e2b483b0c01b4f3261cb5;hp=b2c2b03896c41bb3c3450cf8d12d08d1b8f6128e;hpb=5723a49791587f497380fee82d9c481faff2099c;p=userv.git diff --git a/parser.c b/parser.c index b2c2b03..4565e32 100644 --- 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 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) { @@ -167,15 +167,15 @@ static int dequote(char *inplace) { *q++= v; continue; default: - if (isalpha(*p)) + if (ISCHAR(isalpha,*p)) return parseerrprint("unknown \\ sequence \\%c in quoted string",*p); - if (isdigit(*p)) { + if (ISCHAR(isdigit,*p)) { if (!((buf[0]= *p++) && (buf[1]= *p++) && (buf[2]= *p++))) abort(); buf[3]= 0; v= strtoul(buf,&bep,8); if (bep != buf+3 || (v & ~0xff)) return parseerrprint("invalid \\ sequence \\%s in quoted string",buf); *q++= v; continue; - } else if (ispunct(*p)) { + } else if (ISCHAR(ispunct,*p)) { *q++= *p++; continue; } else { while (*p==' ' || *p=='\t') 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) { @@ -223,8 +225,8 @@ const char *printtoken(int token) { l= strlen(buf); i= sizeof(buf)-l-2; p= yytext; q= buf+l; while ((c= *p++)) { if (i-- <= 0) { q--; strcpy(q-3,"..."); break; } - if (isspace(c)) c= ' '; - else if (!isprint(c) || iscntrl(c)) c= '?'; + if (ISCHAR(isspace,c)) c= ' '; + else if (!ISCHAR(isprint,c) || ISCHAR(iscntrl,c)) c= '?'; else *q++= c; } strcpy(q,"'"); @@ -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++) { @@ -619,11 +619,11 @@ int pcf_grep(int ctoken, char *const *pv, int *rtrue) { buf= xmalloc(maxlen+2); actrue= 0; c= 0; while (!actrue && c!=EOF) { c= getc(file); if (c==EOF) break; - if (isspace(c)) continue; + if (ISCHAR(isspace,c)) continue; l= maxlen+1; p= buf; while (l>0 && c!='\n' && c!=EOF) { *p++= c; l--; c= getc(file); } - if (c=='\n' || c==EOF || isspace(c)) { - while (p>buf && isspace(p[-1])) --p; + if (c=='\n' || c==EOF || ISCHAR(isspace,c)) { + while (p>buf && ISCHAR(isspace,p[-1])) --p; *p= 0; posstrue= 0; for (pp= pv; !posstrue && *pp; pp++) if (!strcmp(*pp,buf)) posstrue= 1; @@ -634,7 +634,7 @@ int pcf_grep(int ctoken, char *const *pv, int *rtrue) { for (;;) { c= getc(file); if (c==EOF || c=='\n') break; - if (!isspace(c)) posstrue= 0; + if (!ISCHAR(isspace,c)) posstrue= 0; } } if (posstrue) actrue= 1; @@ -751,7 +751,7 @@ int df_executefromdirectory(int dtoken) { r= paa_pathargs(&rv,&newargs); if (r) return r; p= strrchr(service,'/'); if (p) p++; else p= service; - if (!*p || !isalnum(*p)) { + if (!*p || !ISCHAR(isalnum,*p)) { parseerrprint("execute-from-directory requires initial char of service " "portion to be alphanumeric (service portion was `%s')", p); @@ -759,7 +759,7 @@ int df_executefromdirectory(int dtoken) { return tokv_error; } for (q=p+1; *q; q++) { - if (!isalnum(*q) && *q != '-') { + if (!ISCHAR(isalnum,*q) && *q != '-') { parseerrprint("execute-from-directory requires service portion to " "contain only alphanumerics and hyphens (was `%s')", p); @@ -995,12 +995,12 @@ 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; - if (!*p || !isalnum(*p)) continue; - while ((c= *++p)) if (!(isalnum(c) || c=='-')) break; + if (!*p || !ISCHAR(isalnum,*p)) continue; + while ((c= *++p)) if (!(ISCHAR(isalnum,c) || c=='-')) break; if (c) continue; if (makeroom(&buildbuf,&buildbuflen,cpl+1+tel+1)) { stringoverflow("pathname in directory"); @@ -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;