===================================================================
RCS file: /cvs/cvs/blind/parse.y,v
retrieving revision 1.10
retrieving revision 1.17
diff -u -p -r1.10 -r1.17
--- blind/parse.y	2022/03/25 22:43:43	1.10
+++ blind/parse.y	2022/04/10 21:04:06	1.17
@@ -17,28 +17,19 @@
 %{
 #include <sys/queue.h>
 
-#include <stdio.h>
-#include <stdarg.h>
 #include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
 
 #include "blind.h"
 #include "config.h"
 #include "log.h"
 
-        //TAILQ_HEAD(files, file)		 files = TAILQ_HEAD_INITIALIZER(files);
-static struct file {
-        //	TAILQ_ENTRY(file)	 entry;
-      	FILE			*stream;
-	char			*name;
-	size_t			 ungetpos;
-	size_t			 ungetsize;
-	u_char			*ungetbuf;
-	int			 eof_reached;
-	int			 lineno;
-	int			 errors;
-} *file;
-//, *top;
+#define START_EXPAND	1
+#define DONE_EXPAND	2
 
+static struct file *f;
+
 int		lookup(char *);
 int		igetc(void);
 int		lgetc(int);
@@ -53,8 +44,12 @@ int		yyerror(const char *, ...)
 
 int		config_load(struct blind *);
 struct file    *config_push(const char *);
-int		config_pop(void);
+int		config_close(void);
 
+static int      expanding;
+static int      errors = 0;
+struct blind   *env = NULL;
+
 TAILQ_HEAD(symhead, sym)	 symhead = TAILQ_HEAD_INITIALIZER(symhead);
 struct sym {
 	TAILQ_ENTRY(sym)	 entry;
@@ -63,11 +58,9 @@ struct sym {
 	char			*nam;
 	char			*val;
 };
+
 char	       *symget(const char *);
 
-struct blind   *env = NULL;
-static int	errors = 0;
-
 typedef struct {
 	union {
 		int64_t	 number;
@@ -87,7 +80,7 @@ typedef struct {
 grammar	:
 	| grammar '\n'
         | grammar set '\n'
-        | grammar error '\n'	{ file->errors++; }
+        | grammar error '\n'	{ errors++; }
         ;
 
 set	: SET EXPIRE NUMBER {
@@ -114,12 +107,12 @@ yyerror(const char *fmt, ...)
 	va_list		 ap;
 	char		*msg;
 
-	file->errors++;
+	errors++;
 	va_start(ap, fmt);
 	if (vasprintf(&msg, fmt, ap) == -1)
 		log_fatal("yyerror vasprintf");
 	va_end(ap);
-        log_info("%s:%d: %s", file->name, yylval.lineno, msg);
+        log_info("%s:%d: %s", f->name, yylval.lineno, msg);
 	free(msg);
 	return (0);
 }
@@ -152,11 +145,6 @@ lookup(char *s)
 		return (STRING);
 }
 
-#define START_EXPAND	1
-#define DONE_EXPAND	2
-
-static int	expanding;
-
 char *
 symget(const char *nam)
 {
@@ -177,10 +165,10 @@ igetc(void)
 	int	c;
 
 	while (1) {
-		if (file->ungetpos > 0)
-			c = file->ungetbuf[--file->ungetpos];
+		if (f->unpos > 0)
+			c = f->unbuf[--f->unpos];
 		else
-			c = getc(file->stream);
+			c = getc(f->stream);
 
 		if (c == START_EXPAND)
 			expanding = 1;
@@ -201,8 +189,7 @@ lgetc(int quotec)
 		if ((c = igetc()) == EOF) {
 			yyerror("reached end of file while parsing "
 			    "quoted string");
-			// if (file == top || config_pop() == EOF)
-                        if (config_pop() == EOF)
+                        if (config_close() == EOF)
 				return (EOF);
 			return (quotec);
 		}
@@ -215,8 +202,8 @@ lgetc(int quotec)
 			c = next;
 			break;
 		}
-		yylval.lineno = file->lineno;
-		file->lineno++;
+		yylval.lineno = f->lineno;
+		f->lineno++;
 	}
 
 	if (c == EOF) {
@@ -225,13 +212,12 @@ lgetc(int quotec)
 		 * count right if last line in included file is syntactically
 		 * invalid and has no newline.
 		 */
-		if (file->eof_reached == 0) {
-			file->eof_reached = 1;
+		if (f->eof == 0) {
+			f->eof = 1;
 			return ('\n');
 		}
 		while (c == EOF) {
-			//if (file == top || config_pop() == EOF)
-                        if (config_pop() == EOF)
+                        if (config_close() == EOF)
 				return (EOF);
 			c = igetc();
 		}
@@ -245,14 +231,14 @@ lungetc(int c)
 	if (c == EOF)
 		return;
 
-	if (file->ungetpos >= file->ungetsize) {
-		void *p = reallocarray(file->ungetbuf, file->ungetsize, 2);
+	if (f->unpos >= f->unsize) {
+		void *p = reallocarray(f->unbuf, f->unsize, 2);
 		if (p == NULL)
 			log_fatal("cannot reallocate memory");
-		file->ungetbuf = p;
-		file->ungetsize *= 2;
+		f->unbuf = p;
+		f->unsize *= 2;
 	}
-	file->ungetbuf[file->ungetpos++] = c;
+	f->unbuf[f->unpos++] = c;
 }
 
 int
@@ -264,7 +250,7 @@ findeol(void)
 	while (1) {
 		c = lgetc(0);
 		if (c == '\n') {
-			file->lineno++;
+			f->lineno++;
 			break;
 		}
 		if (c == EOF)
@@ -286,7 +272,7 @@ top:
 	while ((c = lgetc(0)) == ' ' || c == '\t')
 		; /* nothing */
 
-	yylval.lineno = file->lineno;
+	yylval.lineno = f->lineno;
 	if (c == '#')
 		while ((c = lgetc(0)) != '\n' && c != EOF)
 			; /* nothing */
@@ -330,7 +316,7 @@ top:
 			if ((c = lgetc(quotec)) == EOF)
 				return (0);
 			if (c == '\n') {
-				file->lineno++;
+				f->lineno++;
 				continue;
 			} else if (c == '\\') {
 				if ((next = lgetc(quotec)) == EOF)
@@ -339,7 +325,7 @@ top:
 				    next == '\t')
 					c = next;
 				else if (next == '\n') {
-					file->lineno++;
+					f->lineno++;
 					continue;
 				} else
 					lungetc(next);
@@ -368,7 +354,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());
 			}
@@ -427,8 +413,8 @@ nodigits:
 		return (token);
 	}
 	if (c == '\n') {
-		yylval.lineno = file->lineno;
-		file->lineno++;
+		yylval.lineno = f->lineno;
+		f->lineno++;
 	}
 	if (c == EOF)
 		return (0);
@@ -438,85 +424,56 @@ nodigits:
 int
 config_load(struct blind *temp)
 {
-        env = temp;
-        errors = 0;
+	env = temp;
+	errors = 0;
 
-        if ((file = 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);
         }
-        //        top = file;
+	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
 
-        errors = file->errors;
-        config_pop();
+	if (errors)
+		return (-1);
 
-        // setup
-
-        if (errors) {
-                //	config_purge(PURGE_ALL);
-                return (-1);
-        }
-
-        return (0);
+	return (0);
 }
 
-struct file *
-config_push(const char *name)
-{
-        struct file *nfile;
-
-        if ((nfile = calloc(1, sizeof(struct file))) == NULL) {
-                log_debug("cannot allocate memory");
-                return (NULL);
-        }
-        if ((nfile->name = strdup(name)) == NULL) {
-                log_debug("cannot duplicate name");
-                free(nfile);
-                return (NULL);
-        }
-        if ((nfile->stream = fopen(nfile->name, "r")) == NULL) {
-                log_debug("cannot open config file");
-                free(nfile->name);
-                free(nfile);
-                return (NULL);
-        }
-        if (config_perm(fileno(nfile->stream), nfile->name)) {
-                fclose(nfile->stream);
-                free(nfile->name);
-                free(nfile);
-                return (NULL);
-        }
-        nfile->lineno = 1; // TAILQ_EMPTY(&files) ? 1 : 0;
-        nfile->ungetsize = 16;
-        nfile->ungetbuf = malloc(nfile->ungetsize);
-        if (nfile->ungetbuf == NULL) {
-                log_debug("cannot allocate buffer");
-                fclose(nfile->stream);
-                free(nfile->name);
-                free(nfile);
-                return (NULL);
-        }
-        //TAILQ_INSERT_TAIL(&files, nfile, entry);
-        return (nfile);
-}
-
 int
-config_pop(void)
+config_close(void)
 {
-        //        struct file *prv;
+	fclose(f->stream);
+	free(f->name);
+	free(f->unbuf);
+	free(f);
 
-        //if ((prv = TAILQ_PREV(file, files, entry)) != NULL)
-        //        prv->errors += file->errors;
-
-        // TAILQ_REMOVE(&files, file, entry);
-        fclose(file->stream);
-        free(file->name);
-        free(file->ungetbuf);
-        // free(file);
-        // file = prv;
-        
-        // return (file ? 0 : EOF);
-        return (EOF);
+	return (EOF);
 }