=================================================================== RCS file: /cvs/cvs/blind/parse.y,v retrieving revision 1.15 retrieving revision 1.18 diff -u -p -r1.15 -r1.18 --- blind/parse.y 2022/04/03 13:52:00 1.15 +++ blind/parse.y 2022/04/10 21:20:24 1.18 @@ -25,15 +25,8 @@ #include "config.h" #include "log.h" -static struct file { - FILE *stream; - char *name; - size_t ungetpos; - size_t ungetsize; - u_char *ungetbuf; - int eof_reached; - int lineno; -} *f; +#define EXPAND_ON 1 +#define EXPAND_OFF 2 int lookup(char *); int igetc(void); @@ -47,27 +40,29 @@ int yyerror(const char *, ...) __attribute__((__format__ (printf, 1, 2))) __attribute__((__nonnull__ (1))); +char *symget(const char *); + int config_load(struct blind *); -struct file *config_push(const char *); -int config_pop(void); +int config_close(void); -TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead); +static int expanding; +static int errors = 0; +struct blind *env = NULL; +static struct file *f = NULL; + +TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead); struct sym { - TAILQ_ENTRY(sym) entry; - int used; - int persist; - char *nam; - char *val; + TAILQ_ENTRY(sym) entry; + int used; + int persist; + char *nam; + char *val; }; -char *symget(const char *); -struct blind *env = NULL; -static int errors = 0; - typedef struct { union { - int64_t number; - char *string; + int64_t number; + char *string; } v; int lineno; } YYSTYPE; @@ -82,26 +77,26 @@ typedef struct { grammar : | grammar '\n' - | grammar set '\n' - | grammar error '\n' { errors++; } - ; + | grammar set '\n' + | grammar error '\n' { errors++; } + ; set : SET EXPIRE NUMBER { - env->bl_ttl = $3; + env->bl_ttl = $3; } | SET ACTION ENABLE { - env->bl_opt |= BL_OPT_ACTION; + env->bl_opt |= BL_OPT_ACTION; } | SET ACTION DISABLE { - env->bl_opt |= !BL_OPT_ACTION; + env->bl_opt |= !BL_OPT_ACTION; } ; %% struct keywords { - const char *k_name; - int k_val; + const char *k_name; + int k_val; }; int @@ -115,7 +110,7 @@ yyerror(const char *fmt, ...) if (vasprintf(&msg, fmt, ap) == -1) log_fatal("yyerror vasprintf"); va_end(ap); - log_info("%s:%d: %s", f->name, yylval.lineno, msg); + log_info("%s:%d: %s", f->name, yylval.lineno, msg); free(msg); return (0); } @@ -148,11 +143,6 @@ lookup(char *s) return (STRING); } -#define START_EXPAND 1 -#define DONE_EXPAND 2 - -static int expanding; - char * symget(const char *nam) { @@ -173,14 +163,14 @@ igetc(void) int c; while (1) { - if (f->ungetpos > 0) - c = f->ungetbuf[--f->ungetpos]; + if (f->unpos > 0) + c = f->unbuf[--f->unpos]; else c = getc(f->stream); - if (c == START_EXPAND) + if (c == EXPAND_ON) expanding = 1; - else if (c == DONE_EXPAND) + else if (c == EXPAND_OFF) expanding = 0; else break; @@ -197,7 +187,7 @@ lgetc(int quotec) if ((c = igetc()) == EOF) { yyerror("reached end of file while parsing " "quoted string"); - if (config_pop() == EOF) + if (config_close() == EOF) return (EOF); return (quotec); } @@ -220,12 +210,12 @@ lgetc(int quotec) * count right if last line in included file is syntactically * invalid and has no newline. */ - if (f->eof_reached == 0) { - f->eof_reached = 1; + if (f->eof == 0) { + f->eof = 1; return ('\n'); } while (c == EOF) { - if (config_pop() == EOF) + if (config_close() == EOF) return (EOF); c = igetc(); } @@ -239,14 +229,14 @@ lungetc(int c) if (c == EOF) return; - if (f->ungetpos >= f->ungetsize) { - void *p = reallocarray(f->ungetbuf, f->ungetsize, 2); + if (f->unpos >= f->unsize) { + void *p = reallocarray(f->unbuf, f->unsize, 2); if (p == NULL) log_fatal("cannot reallocate memory"); - f->ungetbuf = p; - f->ungetsize *= 2; + f->unbuf = p; + f->unsize *= 2; } - f->ungetbuf[f->ungetpos++] = c; + f->unbuf[f->unpos++] = c; } int @@ -307,12 +297,12 @@ top: return (findeol()); } p = val + strlen(val) - 1; - lungetc(DONE_EXPAND); + lungetc(EXPAND_OFF); while (p >= val) { lungetc((unsigned char)*p); p--; } - lungetc(START_EXPAND); + lungetc(EXPAND_ON); goto top; } @@ -362,7 +352,7 @@ top: if (c == '-' || isdigit(c)) { do { *p++ = c; - if ((size_t)(p-buf) >= sizeof(buf)) { + if ((size_t)(p-buf) >= sizeof(buf)) { yyerror("string too long"); return (findeol()); } @@ -432,73 +422,56 @@ nodigits: int config_load(struct blind *temp) { - env = temp; - errors = 0; + env = temp; + errors = 0; - if ((f = config_push(env->bl_conf)) == NULL) { - // config_purge(PURGE_ALL); - return (-1); + if ((f = calloc(1, sizeof(struct file))) == NULL) { + log_debug("cannot allocate memory"); + return (-1); + } + if ((f->name = strdup(env->bl_conf)) == NULL) { + log_debug("cannot duplicate name"); + free(f); + return (-1); } + if ((f->stream = fopen(f->name, "r")) == NULL) { + log_debug("cannot open config file"); + free(f->name); + free(f); + return (-1); + } + if (config_perm(fileno(f->stream), f->name)) { + fclose(f->stream); + free(f->name); + free(f); + return (-1); + } + f->lineno = 1; + f->unsize = 16; + if ((f->unbuf = malloc(f->unsize)) == NULL) { + log_debug("cannot allocate buffer"); + fclose(f->stream); + free(f->name); + free(f); + return (-1); + } - yyparse(); + yyparse(); + // setup - // setup + if (errors) + return (-1); - if (errors) { - // config_purge(PURGE_ALL); - return (-1); - } - - return (0); + return (0); } -struct file * -config_push(const char *name) -{ - struct file *nf; - - if ((nf = calloc(1, sizeof(struct file))) == NULL) { - log_debug("cannot allocate memory"); - return (NULL); - } - if ((nf->name = strdup(name)) == NULL) { - log_debug("cannot duplicate name"); - free(nf); - return (NULL); - } - if ((nf->stream = fopen(nf->name, "r")) == NULL) { - log_debug("cannot open config file"); - free(nf->name); - free(nf); - return (NULL); - } - if (config_perm(fileno(nf->stream), nf->name)) { - fclose(nf->stream); - free(nf->name); - free(nf); - return (NULL); - } - nf->lineno = 1; - nf->ungetsize = 16; - nf->ungetbuf = malloc(nf->ungetsize); - if (nf->ungetbuf == NULL) { - log_debug("cannot allocate buffer"); - fclose(nf->stream); - free(nf->name); - free(nf); - return (NULL); - } - - return (nf); -} - int -config_pop(void) +config_close(void) { - fclose(f->stream); - free(f->name); - free(f->ungetbuf); - free(f); - - return (EOF); + fclose(f->stream); + free(f->name); + free(f->unbuf); + free(f); + + return (EOF); }