summaryrefslogtreecommitdiffstats
path: root/lib/libforms/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libforms/parser.c')
-rw-r--r--lib/libforms/parser.c1022
1 files changed, 1022 insertions, 0 deletions
diff --git a/lib/libforms/parser.c b/lib/libforms/parser.c
new file mode 100644
index 0000000..c5ca0aa
--- /dev/null
+++ b/lib/libforms/parser.c
@@ -0,0 +1,1022 @@
+#ifndef lint
+static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
+#endif
+#define YYBYACC 1
+#define YYMAJOR 1
+#define YYMINOR 9
+#define yyclearin (yychar=(-1))
+#define yyerrok (yyerrflag=0)
+#define YYRECOVERING (yyerrflag!=0)
+#define YYPREFIX "yy"
+#line 2 "parser.y"
+/*-
+ * Copyright (c) 1995
+ * Paul Richards. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer,
+ * verbatim and that no modifications are made prior to this
+ * point in the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Paul Richards.
+ * 4. The name Paul Richards may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <forms.h>
+#include <err.h>
+
+#include "internal.h"
+
+char *cpstr(char *);
+
+extern int yyleng;
+int lineno = 1;
+int charno = 1;
+int off;
+
+char *fieldname;
+char *defname;
+char *formname;
+char *startname;
+char *colortable;
+int formattr;
+char *text;
+char *label;
+char *function;
+char *up, *down, *left, *right, *next;
+int height, width;
+int y, x;
+int width;
+int limit;
+int attr;
+int selattr;
+int type;
+int lbl_flag;
+int selected, no_options=0;
+
+extern FILE *outf;
+
+struct MenuList {
+ char *option;
+ struct MenuList *next;
+};
+
+struct MenuList *cur_menu;
+struct MenuList *menu_list;
+struct MenuList *menu;
+
+struct pair_node {
+ char *foreground;
+ char *background;
+ struct pair_node *next;
+};
+struct pair_node *pair_list;
+struct pair_node *cur_pair;
+struct pair_node *pair;
+
+struct color_table {
+ char *tablename;
+ struct pair_node *pairs;
+ struct color_table *next;
+};
+
+struct color_table *color_table;
+struct color_table *cur_table;
+struct color_table *color_tables;
+
+struct Form *form;
+struct Field *field_inst_list;
+struct Field *field;
+struct Field *cur_field;
+#line 106 "parser.y"
+typedef union {
+ int ival;
+ char *sval;
+} YYSTYPE;
+#line 120 "y.tab.c"
+#define FORM 257
+#define COLORTABLE 258
+#define COLOR 259
+#define BLACK 260
+#define RED 261
+#define GREEN 262
+#define YELLOW 263
+#define BLUE 264
+#define MAGENTA 265
+#define CYAN 266
+#define WHITE 267
+#define PAIR 268
+#define NAME 269
+#define STRING 270
+#define AT 271
+#define AS 272
+#define HEIGHT 273
+#define EQUALS 274
+#define NUMBER 275
+#define WIDTH 276
+#define STARTFIELD 277
+#define COMMA 278
+#define LBRACE 279
+#define RBRACE 280
+#define TEXT 281
+#define ATTR 282
+#define SELATTR 283
+#define DEFAULT 284
+#define LABEL 285
+#define LIMIT 286
+#define SELECTED 287
+#define OPTIONS 288
+#define ACTION 289
+#define FUNC 290
+#define LINK 291
+#define UP 292
+#define DOWN 293
+#define LEFT 294
+#define RIGHT 295
+#define NEXT 296
+#define DEF 297
+#define YYERRCODE 256
+short yylhs[] = { -1,
+ 0, 0, 0, 0, 5, 4, 6, 6, 8, 7,
+ 1, 1, 1, 1, 1, 1, 1, 1, 9, 11,
+ 3, 12, 15, 15, 16, 16, 17, 17, 18, 18,
+ 21, 23, 19, 25, 2, 20, 26, 20, 20, 24,
+ 22, 22, 30, 30, 30, 30, 30, 29, 29, 29,
+ 29, 31, 32, 35, 35, 36, 36, 33, 37, 37,
+ 38, 34, 13, 13, 14, 14, 27, 27, 28, 28,
+ 10,
+};
+short yylen[] = { 2,
+ 0, 2, 2, 2, 0, 6, 0, 2, 0, 6,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+ 9, 6, 0, 3, 0, 3, 0, 3, 0, 2,
+ 0, 0, 7, 0, 3, 0, 0, 4, 1, 7,
+ 0, 3, 3, 3, 3, 3, 3, 1, 1, 1,
+ 1, 3, 1, 4, 4, 0, 3, 6, 1, 3,
+ 1, 6, 0, 3, 0, 3, 0, 3, 0, 3,
+ 3,
+};
+short yydefred[] = { 1,
+ 0, 0, 0, 34, 2, 3, 4, 19, 5, 0,
+ 0, 0, 0, 35, 0, 7, 0, 0, 0, 20,
+ 0, 0, 0, 0, 0, 0, 0, 6, 8, 64,
+ 0, 0, 0, 71, 0, 0, 66, 0, 0, 0,
+ 0, 0, 11, 12, 13, 14, 15, 16, 17, 18,
+ 9, 68, 0, 0, 0, 0, 0, 0, 0, 48,
+ 49, 50, 51, 53, 21, 0, 0, 70, 0, 0,
+ 0, 0, 0, 40, 0, 0, 0, 52, 0, 0,
+ 0, 0, 0, 0, 0, 10, 0, 55, 54, 0,
+ 0, 24, 0, 0, 29, 0, 0, 0, 26, 0,
+ 0, 57, 61, 0, 59, 62, 28, 31, 30, 0,
+ 0, 60, 0, 0, 39, 37, 0, 0, 32, 38,
+ 41, 0, 0, 0, 0, 0, 0, 0, 42, 0,
+ 0, 0, 0, 0, 43, 44, 45, 46, 47,
+};
+short yydgoto[] = { 1,
+ 51, 5, 6, 7, 12, 21, 29, 67, 11, 20,
+ 26, 41, 18, 24, 76, 85, 95, 101, 109, 114,
+ 111, 122, 121, 14, 10, 118, 33, 40, 59, 129,
+ 60, 61, 62, 63, 64, 88, 104, 105,
+};
+short yysindex[] = { 0,
+ -252, -261, -240, 0, 0, 0, 0, 0, 0, -248,
+ -234, -237, -225, 0, -236, 0, -219, -214, -212, 0,
+ -259, -216, -205, -196, -204, -192, -186, 0, 0, 0,
+ -185, -183, -194, 0, -225, -187, 0, -182, -180, -224,
+ -188, -214, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -179, -177, -176, -175, -174, -173, -178, 0,
+ 0, 0, 0, 0, 0, -172, -171, 0, -167, -166,
+ -164, -165, -162, 0, -163, -149, -187, 0, -191, -191,
+ -170, -169, -157, -161, -168, 0, -159, 0, 0, -158,
+ -155, 0, -152, -154, 0, -153, -147, -145, 0, -150,
+ -143, 0, 0, -151, 0, 0, 0, 0, 0, -147,
+ -148, 0, -263, -142, 0, 0, -236, -146, 0, 0,
+ 0, -141, -211, -144, -139, -138, -136, -135, 0, -137,
+ -129, -128, -127, -126, 0, 0, 0, 0, 0,
+};
+short yyrindex[] = { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -249, 0, 0, 0, 0, -238, 0, 0,
+ 0, 0, 0, -231, 0, 0, 0, 0, 0, 0,
+ 0, 0, -217, 0, -258, 0, 0, 0, 0, 0,
+ 0, -257, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -254, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -266, 0, 0, -134, -134,
+ 0, 0, 0, 0, -267, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -133, 0, 0, -132, 0, 0, 0, 0, 0, 0,
+ -122, 0, -249, 0, 0, 0, 0, 0, 0, 0,
+ 0, -239, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+short yygindex[] = { 0,
+ 51, 0, 0, 0, 0, 0, 0, 0, 0, 16,
+ 0, 0, 109, 103, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 71, 0, 42,
+};
+#define YYTABLESIZE 152
+short yytable[] = { 63,
+ 65, 27, 25, 23, 2, 116, 3, 8, 27, 17,
+ 63, 65, 27, 25, 23, 25, 4, 63, 63, 65,
+ 28, 63, 65, 63, 65, 23, 63, 23, 9, 33,
+ 13, 63, 63, 63, 63, 63, 15, 63, 19, 63,
+ 33, 16, 65, 65, 65, 65, 65, 17, 65, 67,
+ 65, 67, 67, 67, 22, 67, 54, 67, 30, 55,
+ 56, 23, 57, 69, 58, 25, 69, 69, 31, 69,
+ 34, 69, 43, 44, 45, 46, 47, 48, 49, 50,
+ 124, 125, 126, 127, 128, 32, 35, 36, 39, 37,
+ 38, 65, 52, 53, 87, 68, 69, 70, 71, 72,
+ 73, 74, 78, 79, 75, 80, 77, 82, 84, 81,
+ 83, 92, 93, 94, 96, 97, 99, 90, 98, 100,
+ 91, 102, 103, 106, 107, 108, 110, 86, 117, 130,
+ 113, 135, 119, 120, 131, 132, 123, 133, 134, 136,
+ 137, 138, 139, 42, 66, 56, 22, 58, 36, 115,
+ 89, 112,
+};
+short yycheck[] = { 258,
+ 258, 269, 269, 258, 257, 269, 259, 269, 268, 273,
+ 269, 269, 280, 280, 269, 282, 269, 276, 277, 277,
+ 280, 280, 280, 282, 282, 280, 276, 282, 269, 269,
+ 279, 281, 282, 283, 284, 285, 271, 287, 275, 289,
+ 280, 279, 281, 282, 283, 284, 285, 273, 287, 281,
+ 289, 283, 284, 285, 274, 287, 281, 289, 275, 284,
+ 285, 276, 287, 281, 289, 278, 284, 285, 274, 287,
+ 275, 289, 260, 261, 262, 263, 264, 265, 266, 267,
+ 292, 293, 294, 295, 296, 282, 279, 274, 283, 275,
+ 274, 280, 275, 274, 286, 275, 274, 274, 274, 274,
+ 274, 280, 270, 270, 277, 270, 278, 270, 258, 275,
+ 274, 269, 274, 282, 274, 274, 269, 288, 274, 274,
+ 290, 275, 270, 269, 275, 269, 278, 77, 271, 274,
+ 279, 269, 117, 280, 274, 274, 278, 274, 274, 269,
+ 269, 269, 269, 35, 42, 280, 280, 280, 271, 111,
+ 80, 110,
+};
+#define YYFINAL 1
+#ifndef YYDEBUG
+#define YYDEBUG 0
+#endif
+#define YYMAXTOKEN 297
+#if YYDEBUG
+char *yyname[] = {
+"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"FORM","COLORTABLE","COLOR",
+"BLACK","RED","GREEN","YELLOW","BLUE","MAGENTA","CYAN","WHITE","PAIR","NAME",
+"STRING","AT","AS","HEIGHT","EQUALS","NUMBER","WIDTH","STARTFIELD","COMMA",
+"LBRACE","RBRACE","TEXT","ATTR","SELATTR","DEFAULT","LABEL","LIMIT","SELECTED",
+"OPTIONS","ACTION","FUNC","LINK","UP","DOWN","LEFT","RIGHT","NEXT","DEF",
+};
+char *yyrule[] = {
+"$accept : spec",
+"spec :",
+"spec : spec fields",
+"spec : spec forms",
+"spec : spec colours",
+"$$1 :",
+"colours : COLOR NAME $$1 LBRACE color_pairs RBRACE",
+"color_pairs :",
+"color_pairs : color_pairs pair",
+"$$2 :",
+"pair : PAIR EQUALS a_color $$2 COMMA a_color",
+"a_color : BLACK",
+"a_color : RED",
+"a_color : GREEN",
+"a_color : YELLOW",
+"a_color : BLUE",
+"a_color : MAGENTA",
+"a_color : CYAN",
+"a_color : WHITE",
+"$$3 :",
+"$$4 :",
+"forms : FORM NAME $$3 AT coord $$4 LBRACE formspec RBRACE",
+"formspec : height width startfield colortable formattr fieldlocs",
+"startfield :",
+"startfield : STARTFIELD EQUALS NAME",
+"colortable :",
+"colortable : COLORTABLE EQUALS NAME",
+"formattr :",
+"formattr : ATTR EQUALS NUMBER",
+"fieldlocs :",
+"fieldlocs : fieldlocs field_at",
+"$$5 :",
+"$$6 :",
+"field_at : NAME $$5 field_def AT coord $$6 links",
+"$$7 :",
+"fields : NAME $$7 field_spec",
+"field_def :",
+"$$8 :",
+"field_def : LBRACE NAME $$8 RBRACE",
+"field_def : field_spec",
+"field_spec : LBRACE height width attr selattr type RBRACE",
+"links :",
+"links : links COMMA conns",
+"conns : UP EQUALS NAME",
+"conns : DOWN EQUALS NAME",
+"conns : LEFT EQUALS NAME",
+"conns : RIGHT EQUALS NAME",
+"conns : NEXT EQUALS NAME",
+"type : textfield",
+"type : inputfield",
+"type : menufield",
+"type : actionfield",
+"textfield : TEXT EQUALS STRING",
+"inputfield : inputspec",
+"inputspec : LABEL EQUALS STRING limit",
+"inputspec : DEFAULT EQUALS STRING limit",
+"limit :",
+"limit : LIMIT EQUALS NUMBER",
+"menufield : SELECTED EQUALS NUMBER OPTIONS EQUALS menuoptions",
+"menuoptions : menuoption",
+"menuoptions : menuoptions COMMA menuoption",
+"menuoption : STRING",
+"actionfield : ACTION EQUALS STRING FUNC EQUALS NAME",
+"height :",
+"height : HEIGHT EQUALS NUMBER",
+"width :",
+"width : WIDTH EQUALS NUMBER",
+"attr :",
+"attr : ATTR EQUALS NUMBER",
+"selattr :",
+"selattr : SELATTR EQUALS NUMBER",
+"coord : NUMBER COMMA NUMBER",
+};
+#endif
+#ifdef YYSTACKSIZE
+#undef YYMAXDEPTH
+#define YYMAXDEPTH YYSTACKSIZE
+#else
+#ifdef YYMAXDEPTH
+#define YYSTACKSIZE YYMAXDEPTH
+#else
+#define YYSTACKSIZE 500
+#define YYMAXDEPTH 500
+#endif
+#endif
+int yydebug;
+int yynerrs;
+int yyerrflag;
+int yychar;
+short *yyssp;
+YYSTYPE *yyvsp;
+YYSTYPE yyval;
+YYSTYPE yylval;
+short yyss[YYSTACKSIZE];
+YYSTYPE yyvs[YYSTACKSIZE];
+#define yystacksize YYSTACKSIZE
+#line 434 "parser.y"
+
+void
+yyerror (char *error)
+{
+ fprintf(stderr, "%s at line %d\n",error, lineno);
+ exit(1);
+}
+
+char *
+cpstr(char *ostr)
+{
+ char *nstr;
+
+ nstr = malloc(strlen(ostr)+1);
+ if (!nstr) {
+ fprintf(stderr, "Couldn't allocate memory for string\n");
+ exit(1);
+ }
+ strcpy(nstr, ostr);
+ return (nstr);
+}
+
+/* Calculate a default height for a field */
+
+void
+calc_field_height(struct Field *field, char *string)
+{
+
+ int len;
+
+ len = strlen(string);
+
+ if (!field->width) {
+ /*
+ * This is a failsafe, this routine shouldn't be called
+ * with a width of 0, the width should be determined
+ * first.
+ */
+ field->height = 1;
+ return;
+ }
+
+ if (len < field->width) {
+ field->height = 1;
+ return;
+ } else
+ field->height = len / field->width;
+
+ if ((field->height*field->width) < len)
+ field->height++;
+
+ return;
+}
+
+void
+define_field(char *defname)
+{
+ struct Field *field;
+ struct MenuList *menu_options;
+ int no_options;
+
+ field = malloc(sizeof (struct Field));
+ if (!field) {
+ fprintf(stderr,"Failed to allocate memory for form field\n");
+ exit(1);
+ }
+ field->defname = defname;
+ field->type = type;
+ field->height = height;
+ field->width = width;
+ field->attr = attr;
+ field->selattr = selattr;
+ switch (type) {
+ case FF_TEXT:
+ field->field.text = malloc(sizeof (struct TextField));
+ if (!field->field.text) {
+ fprintf(stderr,
+ "Failed to allocate memory for text field\n");
+ exit (1);
+ }
+ field->field.text->text = text;
+ break;
+ case FF_INPUT:
+ field->field.input = malloc(sizeof (struct InputField));
+ if (!field->field.input) {
+ fprintf(stderr,
+ "Failed to allocate memory for input field\n");
+ exit (1);
+ }
+ field->field.input->lbl_flag = lbl_flag;
+ field->field.input->label = label;
+ field->field.input->limit = limit;
+ break;
+ case FF_MENU:
+ printf("field type %s = %d\n", defname,field->type);
+ field->field.menu = malloc(sizeof (struct MenuField));
+ if (!field->field.menu) {
+ fprintf(stderr,
+ "Failed to allocate memory for menu field\n");
+ exit (1);
+ }
+ field->field.menu->selected = selected;
+ menu_options = menu_list;
+ field->field.menu->no_options = 0;
+ field->field.menu->options = 0;
+ for (; menu_options; menu_options = menu_options->next) {
+ no_options = add_menu_option(field->field.menu,
+ menu_options->option);
+ if (!no_options)
+ err(1, "Couldn't add menu option");
+ }
+ field->field.menu->no_options = no_options;
+ cur_menu = 0;
+ break;
+ case FF_ACTION:
+ field->field.action = malloc(sizeof (struct ActionField));
+ if (!field->field.action) {
+ fprintf(stderr,
+ "Failed to allocate memory for action field\n");
+ exit (1);
+ }
+ field->field.action->text = text;
+ field->field.action->fn = (void *) function;
+ break;
+ default:
+ break;
+ }
+ form_bind_tuple(defname, FT_FIELD_DEF, field);
+ width=0;
+ height = 0;
+ attr=0;
+ selattr=0;
+ limit=0;
+}
+#line 531 "y.tab.c"
+#define YYABORT goto yyabort
+#define YYREJECT goto yyabort
+#define YYACCEPT goto yyaccept
+#define YYERROR goto yyerrlab
+int
+yyparse()
+{
+ register int yym, yyn, yystate;
+#if YYDEBUG
+ register char *yys;
+ extern char *getenv();
+
+ if (yys = getenv("YYDEBUG"))
+ {
+ yyn = *yys;
+ if (yyn >= '0' && yyn <= '9')
+ yydebug = yyn - '0';
+ }
+#endif
+
+ yynerrs = 0;
+ yyerrflag = 0;
+ yychar = (-1);
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+ *yyssp = yystate = 0;
+
+yyloop:
+ if (yyn = yydefred[yystate]) goto yyreduce;
+ if (yychar < 0)
+ {
+ if ((yychar = yylex()) < 0) yychar = 0;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, reading %d (%s)\n",
+ YYPREFIX, yystate, yychar, yys);
+ }
+#endif
+ }
+ if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, shifting to state %d\n",
+ YYPREFIX, yystate, yytable[yyn]);
+#endif
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ goto yyoverflow;
+ }
+ *++yyssp = yystate = yytable[yyn];
+ *++yyvsp = yylval;
+ yychar = (-1);
+ if (yyerrflag > 0) --yyerrflag;
+ goto yyloop;
+ }
+ if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+ {
+ yyn = yytable[yyn];
+ goto yyreduce;
+ }
+ if (yyerrflag) goto yyinrecovery;
+#ifdef lint
+ goto yynewerror;
+#endif
+yynewerror:
+ yyerror("syntax error");
+#ifdef lint
+ goto yyerrlab;
+#endif
+yyerrlab:
+ ++yynerrs;
+yyinrecovery:
+ if (yyerrflag < 3)
+ {
+ yyerrflag = 3;
+ for (;;)
+ {
+ if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, error recovery shifting\
+ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
+#endif
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ goto yyoverflow;
+ }
+ *++yyssp = yystate = yytable[yyn];
+ *++yyvsp = yylval;
+ goto yyloop;
+ }
+ else
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: error recovery discarding state %d\n",
+ YYPREFIX, *yyssp);
+#endif
+ if (yyssp <= yyss) goto yyabort;
+ --yyssp;
+ --yyvsp;
+ }
+ }
+ }
+ else
+ {
+ if (yychar == 0) goto yyabort;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
+ YYPREFIX, yystate, yychar, yys);
+ }
+#endif
+ yychar = (-1);
+ goto yyloop;
+ }
+yyreduce:
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: state %d, reducing by rule %d (%s)\n",
+ YYPREFIX, yystate, yyn, yyrule[yyn]);
+#endif
+ yym = yylen[yyn];
+ yyval = yyvsp[1-yym];
+ switch (yyn)
+ {
+case 5:
+#line 166 "parser.y"
+{
+ color_table = malloc(sizeof (struct color_table));
+ if (!color_table) {
+ fprintf(stderr, "Couldn't allocate memory for a color table\n");
+ exit (1);
+ }
+ color_table->tablename = cpstr(yyvsp[0].sval);
+ }
+break;
+case 6:
+#line 175 "parser.y"
+{
+ color_table->pairs = pair_list;
+ cur_pair = 0;
+ form_bind_tuple(color_table->tablename, FT_COLTAB, color_table);
+ }
+break;
+case 9:
+#line 187 "parser.y"
+{
+ pair = malloc(sizeof (struct pair_node));
+ if (!pair) {
+ fprintf(stderr, "Couldn't allocate memory for a color pair\n");
+ exit(1);
+ }
+ pair->foreground = cpstr(yyvsp[0].sval);
+ }
+break;
+case 10:
+#line 196 "parser.y"
+{
+ pair->background = cpstr(yyvsp[0].sval);
+ if (!cur_pair) {
+ pair_list = pair;
+ cur_pair = pair;
+ } else {
+ cur_pair->next = pair;
+ cur_pair = pair;
+ }
+ }
+break;
+case 11:
+#line 209 "parser.y"
+{ yyval.sval = "COLOR_BLACK"; }
+break;
+case 12:
+#line 211 "parser.y"
+{ yyval.sval = "COLOR_RED"; }
+break;
+case 13:
+#line 213 "parser.y"
+{ yyval.sval = "COLOR_GREEN"; }
+break;
+case 14:
+#line 215 "parser.y"
+{ yyval.sval = "COLOR_YELLOW"; }
+break;
+case 15:
+#line 217 "parser.y"
+{ yyval.sval = "COLOR_BLUE"; }
+break;
+case 16:
+#line 219 "parser.y"
+{ yyval.sval = "COLOR_MAGENTA"; }
+break;
+case 17:
+#line 221 "parser.y"
+{ yyval.sval = "COLOR_CYAN"; }
+break;
+case 18:
+#line 223 "parser.y"
+{ yyval.sval = "COLOR_WHITE"; }
+break;
+case 19:
+#line 227 "parser.y"
+{ formname = cpstr(yyvsp[0].sval); }
+break;
+case 20:
+#line 229 "parser.y"
+{
+ form = malloc(sizeof (struct Form));
+ if (!form) {
+ fprintf(stderr,"Failed to allocate memory for form\n");
+ exit(1);
+ }
+ form->y = y;
+ form->x = x;
+ }
+break;
+case 21:
+#line 239 "parser.y"
+{
+ form->startfield = startname;
+ form->colortable = colortable;
+ form->height = height;
+ form->width = width;
+ form->attr = formattr;
+ form->fieldlist = field_inst_list;
+ field_inst_list = 0;
+ form_bind_tuple(formname, FT_FORM, form);
+ }
+break;
+case 23:
+#line 255 "parser.y"
+{ startname = 0;
+ printf("Warning: No start field specified for form %s\n", formname);
+ }
+break;
+case 24:
+#line 259 "parser.y"
+{ startname = cpstr(yyvsp[0].sval); }
+break;
+case 25:
+#line 263 "parser.y"
+{ colortable = 0; }
+break;
+case 26:
+#line 265 "parser.y"
+{ colortable = cpstr(yyvsp[0].sval); }
+break;
+case 27:
+#line 269 "parser.y"
+{ formattr = 0; }
+break;
+case 28:
+#line 271 "parser.y"
+{ formattr = yyvsp[0].ival; }
+break;
+case 31:
+#line 279 "parser.y"
+{ fieldname = cpstr(yyvsp[0].sval); }
+break;
+case 32:
+#line 281 "parser.y"
+{
+ field = malloc(sizeof (struct Field));
+ if (!field) {
+ fprintf(stderr,"Failed to allocate memory for form field\n");
+ exit(1);
+ }
+ if (!defname)
+ field->defname = fieldname;
+ else
+ field->defname = defname;
+ field->y = y;
+ field->x = x;
+ }
+break;
+case 33:
+#line 295 "parser.y"
+{
+ field->fup = up;
+ field->fdown = down;
+ field->fleft = left;
+ field->fright = right;
+ field->fnext = next;
+ if (!field_inst_list)
+ field_inst_list = field;
+ up = 0;
+ down = 0;
+ left = 0;
+ right = 0;
+ next = 0;
+ if (!cur_field)
+ cur_field = field;
+ else {
+ cur_field->next = field;
+ cur_field = field;
+ }
+ form_bind_tuple(fieldname, FT_FIELD_INST, field);
+ }
+break;
+case 34:
+#line 319 "parser.y"
+{ defname = cpstr(yyvsp[0].sval); }
+break;
+case 35:
+#line 321 "parser.y"
+{ define_field(defname); }
+break;
+case 36:
+#line 325 "parser.y"
+{ defname = 0; }
+break;
+case 37:
+#line 327 "parser.y"
+{ defname = cpstr(yyvsp[0].sval); }
+break;
+case 39:
+#line 330 "parser.y"
+{ defname = fieldname; define_field(defname); }
+break;
+case 43:
+#line 341 "parser.y"
+{ up = cpstr(yyvsp[0].sval); }
+break;
+case 44:
+#line 343 "parser.y"
+{ down = cpstr(yyvsp[0].sval); }
+break;
+case 45:
+#line 345 "parser.y"
+{ left = cpstr(yyvsp[0].sval); }
+break;
+case 46:
+#line 347 "parser.y"
+{ right = cpstr(yyvsp[0].sval); }
+break;
+case 47:
+#line 349 "parser.y"
+{ next = cpstr(yyvsp[0].sval); }
+break;
+case 52:
+#line 359 "parser.y"
+{ type = FF_TEXT; text = cpstr(yyvsp[0].sval); }
+break;
+case 53:
+#line 363 "parser.y"
+{ type = FF_INPUT; }
+break;
+case 54:
+#line 367 "parser.y"
+{ lbl_flag = 1; label = cpstr(yyvsp[-1].sval); }
+break;
+case 55:
+#line 369 "parser.y"
+{ lbl_flag = 0; label = cpstr(yyvsp[-1].sval); }
+break;
+case 57:
+#line 374 "parser.y"
+{ limit = yyvsp[0].ival; }
+break;
+case 58:
+#line 377 "parser.y"
+{ type = FF_MENU; selected = yyvsp[-3].ival; }
+break;
+case 61:
+#line 385 "parser.y"
+{
+ menu = malloc(sizeof(struct MenuList));
+ if (!menu) {
+ err(1, "Couldn't allocate memory for menu option\n");
+ }
+ menu->option = cpstr(yyvsp[0].sval);
+ if (!cur_menu) {
+ menu_list = menu;
+ cur_menu = menu;
+ } else {
+ cur_menu->next = menu;
+ cur_menu = menu;
+ }
+ }
+break;
+case 62:
+#line 402 "parser.y"
+{ type = FF_ACTION; text = cpstr(yyvsp[-3].sval); function = cpstr(yyvsp[0].sval); }
+break;
+case 63:
+#line 406 "parser.y"
+{ height = 0; }
+break;
+case 64:
+#line 408 "parser.y"
+{ height = yyvsp[0].ival; }
+break;
+case 65:
+#line 412 "parser.y"
+{ width = 0; }
+break;
+case 66:
+#line 414 "parser.y"
+{ width = yyvsp[0].ival; }
+break;
+case 67:
+#line 418 "parser.y"
+{ attr = 0; }
+break;
+case 68:
+#line 420 "parser.y"
+{ attr = yyvsp[0].ival; }
+break;
+case 69:
+#line 424 "parser.y"
+{ selattr = 0; }
+break;
+case 70:
+#line 426 "parser.y"
+{ selattr = yyvsp[0].ival; }
+break;
+case 71:
+#line 430 "parser.y"
+{ y = yyvsp[-2].ival; x = yyvsp[0].ival; }
+break;
+#line 967 "y.tab.c"
+ }
+ yyssp -= yym;
+ yystate = *yyssp;
+ yyvsp -= yym;
+ yym = yylhs[yyn];
+ if (yystate == 0 && yym == 0)
+ {
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: after reduction, shifting from state 0 to\
+ state %d\n", YYPREFIX, YYFINAL);
+#endif
+ yystate = YYFINAL;
+ *++yyssp = YYFINAL;
+ *++yyvsp = yyval;
+ if (yychar < 0)
+ {
+ if ((yychar = yylex()) < 0) yychar = 0;
+#if YYDEBUG
+ if (yydebug)
+ {
+ yys = 0;
+ if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+ if (!yys) yys = "illegal-symbol";
+ printf("%sdebug: state %d, reading %d (%s)\n",
+ YYPREFIX, YYFINAL, yychar, yys);
+ }
+#endif
+ }
+ if (yychar == 0) goto yyaccept;
+ goto yyloop;
+ }
+ if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
+ yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
+ yystate = yytable[yyn];
+ else
+ yystate = yydgoto[yym];
+#if YYDEBUG
+ if (yydebug)
+ printf("%sdebug: after reduction, shifting from state %d \
+to state %d\n", YYPREFIX, *yyssp, yystate);
+#endif
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ goto yyoverflow;
+ }
+ *++yyssp = yystate;
+ *++yyvsp = yyval;
+ goto yyloop;
+yyoverflow:
+ yyerror("yacc stack overflow");
+yyabort:
+ return (1);
+yyaccept:
+ return (0);
+}
OpenPOWER on IntegriCloud