2 * Much of the design is taken from doas (parse.y rev 1.29)
4 * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
5 * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org>
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 #include "telescope.h"
40 #define YYSTYPE yystype
42 static char *current_style;
43 static const char *path;
49 static void yyerror(const char *, ...);
50 static int yylex(void);
51 static void setprfx(int, const char *);
56 %token TSTYLE TPRFX TCONT TBG TFG TATTR TBOLD TUNDERLINE
71 | style { free(current_style); current_style = NULL; }
76 set : TSET TSTRING '=' TSTRING { printf("set %s = \"%s\"\n", $2, $4); }
77 | TSET TSTRING '=' TNUMBER { printf("set %s = %d\n", $2, $4); }
80 style : TSTYLE TSTRING { current_style = $2; } styleopt
81 | TSTYLE TSTRING { current_style = $2; } '{' styleopts '}'
84 styleopts : /* empty */
86 | styleopts styleopt '\n'
89 styleopt : TPRFX TSTRING { setprfx(0, $2); }
90 | TCONT TSTRING { setprfx(1, $2); }
91 | TBG TSTRING { printf("style background setted to \"%s\"\n", $2); }
92 | TFG TSTRING { printf("style foreground setted to \"%s\"\n", $2); }
93 | TATTR TBOLD { printf("style attr setted to bold\n"); }
94 | TATTR TUNDERLINE { printf("style attr setted to underline\n"); }
97 bind : TBIND TSTRING TSTRING TSTRING { printf("TODO: bind %s %s %s\n", $2, $3, $4); }
100 unbind : TUNBIND TSTRING TSTRING { printf("TODO: unbind %s %s\n", $2, $3); }
106 yyerror(const char *fmt, ...)
110 fprintf(stderr, "%s:%d ", path, yylval.lineno+1);
112 vfprintf(stderr, fmt, va);
114 fprintf(stderr, "\n");
118 static struct keyword {
126 { "background", TBG },
127 { "foreground", TFG },
130 { "underline", TUNDERLINE },
132 { "unbind", TUNBIND },
138 char buf[1024], *ebuf, *p, *str;
140 int c, quotes = 0, escape = 0, qpos = -1, nonkw = 0;
144 ebuf = buf + sizeof(buf);
147 /* skip whitespace first */
148 for (c = getc(yyfp); c == ' ' || c == '\t' || c == '\f'; c = getc(yyfp))
151 /* check for special one-character constructions */
162 /* skip comments; NUL is allowed; no continuation */
163 while ((c = getc(yyfp)) != '\n')
173 /* parsing next word */
174 for (;; c = getc(yyfp), yylval.colno++) {
177 yyerror("unallowed character NULL in column %d",
188 yyerror("unterminated quotes in column %d",
199 yyerror("unterminated escape in column %d",
202 yyerror("unterminated quotes in column %d",
211 if (!escape && !quotes)
226 yyerror("line too long");
238 * There could be a number of reason for empty buffer,
239 * and we handle all of them here, to avoid cluttering
244 else if (qpos == -1) /* accept, e.g., empty args: cmd foo args "" */
248 for (i = 0; i < sizeof(keywords) / sizeof(keywords[0]); i++) {
249 if (strcmp(buf, keywords[i].word) == 0)
250 return keywords[i].token;
254 if (!nonkw && (c == '-' || isdigit(c))) {
255 yylval.num = strtonum(buf, INT_MIN, INT_MAX, &errstr);
257 yyerror("number is %s: %s", errstr, buf);
260 if ((str = strdup(buf)) == NULL)
261 err(1, "%s", __func__);
267 yyerror("input error reading config");
272 setprfx(int cont, const char *name)
274 if (current_style == NULL) {
275 warnx("current_style = NULL!");
279 if (!config_setprfx(current_style, cont, name))
280 yyerror("invalid style %s", name);
284 parseconfig(const char *filename, int fonf)
286 if ((yyfp = fopen(filename, "r")) == NULL) {
288 err(1, "%s", filename);