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 const char *path;
48 static void yyerror(const char *, ...);
49 static int yylex(void);
54 %token TSTYLE TPRFX TCONT TBG TFG TATTR TBOLD TUNDERLINE
68 rule : set | style | bind | unbind ;
70 set : TSET TSTRING '=' TSTRING { printf("set %s = \"%s\"\n", $2, $4); }
71 | TSET TSTRING '=' TNUMBER { printf("set %s = %d\n", $2, $4); }
74 style : TSTYLE TSTRING { printf("(%s) ", $2); } styleopt
75 | TSTYLE TSTRING { printf("[%s]\n", $2); } '{' styleopts '}'
78 styleopts : /* empty */
80 | styleopts styleopt '\n'
83 styleopt : TPRFX TSTRING { printf("style prefix setted to \"%s\"\n", $2); }
84 | TCONT TSTRING { printf("style cont setted to \"%s\"\n", $2); }
85 | TBG TSTRING { printf("style background setted to \"%s\"\n", $2); }
86 | TFG TSTRING { printf("style foreground setted to \"%s\"\n", $2); }
87 | TATTR TBOLD { printf("style attr setted to bold\n"); }
88 | TATTR TUNDERLINE { printf("style attr setted to underline\n"); }
91 bind : TBIND TSTRING TSTRING TSTRING { printf("TODO: bind %s %s %s\n", $2, $3, $4); }
94 unbind : TUNBIND TSTRING TSTRING { printf("TODO: unbind %s %s\n", $2, $3); }
100 yyerror(const char *fmt, ...)
104 fprintf(stderr, "%s:%d ", path, yylval.lineno+1);
106 vfprintf(stderr, fmt, va);
108 fprintf(stderr, "\n");
112 static struct keyword {
120 { "background", TBG },
121 { "foreground", TFG },
124 { "underline", TUNDERLINE },
126 { "unbind", TUNBIND },
132 char buf[1024], *ebuf, *p, *str;
134 int c, quotes = 0, escape = 0, qpos = -1, nonkw = 0;
138 ebuf = buf + sizeof(buf);
141 /* skip whitespace first */
142 for (c = getc(yyfp); c == ' ' || c == '\t' || c == '\f'; c = getc(yyfp))
145 /* check for special one-character constructions */
156 /* skip comments; NUL is allowed; no continuation */
157 while ((c = getc(yyfp)) != '\n')
167 /* parsing next word */
168 for (;; c = getc(yyfp), yylval.colno++) {
171 yyerror("unallowed character NULL in column %d",
182 yyerror("unterminated quotes in column %d",
193 yyerror("unterminated escape in column %d",
196 yyerror("unterminated quotes in column %d",
205 if (!escape && !quotes)
220 yyerror("line too long");
232 * There could be a number of reason for empty buffer,
233 * and we handle all of them here, to avoid cluttering
238 else if (qpos == -1) /* accept, e.g., empty args: cmd foo args "" */
242 for (i = 0; i < sizeof(keywords) / sizeof(keywords[0]); i++) {
243 if (strcmp(buf, keywords[i].word) == 0)
244 return keywords[i].token;
248 if (!nonkw && (c == '-' || isdigit(c))) {
249 yylval.num = strtonum(buf, INT_MIN, INT_MAX, &errstr);
251 yyerror("number is %s: %s", errstr, buf);
254 if ((str = strdup(buf)) == NULL)
255 err(1, "%s", __func__);
261 yyerror("input error reading config");
266 parseconfig(const char *filename, int fonf)
268 if ((yyfp = fopen(filename, "r")) == NULL) {
270 err(1, "%s", filename);