1264790Sbapt/* original parser id follows */
2264790Sbapt/* yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93" */
3264790Sbapt/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
4264790Sbapt
5264790Sbapt#define YYBYACC 1
6264790Sbapt#define YYMAJOR 1
7264790Sbapt#define YYMINOR 9
8264790Sbapt#define YYCHECK "yyyymmdd"
9264790Sbapt
10264790Sbapt#define YYEMPTY        (-1)
11264790Sbapt#define yyclearin      (yychar = YYEMPTY)
12264790Sbapt#define yyerrok        (yyerrflag = 0)
13264790Sbapt#define YYRECOVERING() (yyerrflag != 0)
14264790Sbapt#define YYENOMEM       (-2)
15264790Sbapt#define YYEOF          0
16264790Sbapt#ident "check variant syntax features"
17264790Sbapt
18264790Sbapt#ifndef yyparse
19264790Sbapt#define yyparse    varsyntax_calc1_parse
20264790Sbapt#endif /* yyparse */
21264790Sbapt
22264790Sbapt#ifndef yylex
23264790Sbapt#define yylex      varsyntax_calc1_lex
24264790Sbapt#endif /* yylex */
25264790Sbapt
26264790Sbapt#ifndef yyerror
27264790Sbapt#define yyerror    varsyntax_calc1_error
28264790Sbapt#endif /* yyerror */
29264790Sbapt
30264790Sbapt#ifndef yychar
31264790Sbapt#define yychar     varsyntax_calc1_char
32264790Sbapt#endif /* yychar */
33264790Sbapt
34264790Sbapt#ifndef yyval
35264790Sbapt#define yyval      varsyntax_calc1_val
36264790Sbapt#endif /* yyval */
37264790Sbapt
38264790Sbapt#ifndef yylval
39264790Sbapt#define yylval     varsyntax_calc1_lval
40264790Sbapt#endif /* yylval */
41264790Sbapt
42264790Sbapt#ifndef yydebug
43264790Sbapt#define yydebug    varsyntax_calc1_debug
44264790Sbapt#endif /* yydebug */
45264790Sbapt
46264790Sbapt#ifndef yynerrs
47264790Sbapt#define yynerrs    varsyntax_calc1_nerrs
48264790Sbapt#endif /* yynerrs */
49264790Sbapt
50264790Sbapt#ifndef yyerrflag
51264790Sbapt#define yyerrflag  varsyntax_calc1_errflag
52264790Sbapt#endif /* yyerrflag */
53264790Sbapt
54264790Sbapt#ifndef yylhs
55264790Sbapt#define yylhs      varsyntax_calc1_lhs
56264790Sbapt#endif /* yylhs */
57264790Sbapt
58264790Sbapt#ifndef yylen
59264790Sbapt#define yylen      varsyntax_calc1_len
60264790Sbapt#endif /* yylen */
61264790Sbapt
62264790Sbapt#ifndef yydefred
63264790Sbapt#define yydefred   varsyntax_calc1_defred
64264790Sbapt#endif /* yydefred */
65264790Sbapt
66264790Sbapt#ifndef yydgoto
67264790Sbapt#define yydgoto    varsyntax_calc1_dgoto
68264790Sbapt#endif /* yydgoto */
69264790Sbapt
70264790Sbapt#ifndef yysindex
71264790Sbapt#define yysindex   varsyntax_calc1_sindex
72264790Sbapt#endif /* yysindex */
73264790Sbapt
74264790Sbapt#ifndef yyrindex
75264790Sbapt#define yyrindex   varsyntax_calc1_rindex
76264790Sbapt#endif /* yyrindex */
77264790Sbapt
78264790Sbapt#ifndef yygindex
79264790Sbapt#define yygindex   varsyntax_calc1_gindex
80264790Sbapt#endif /* yygindex */
81264790Sbapt
82264790Sbapt#ifndef yytable
83264790Sbapt#define yytable    varsyntax_calc1_table
84264790Sbapt#endif /* yytable */
85264790Sbapt
86264790Sbapt#ifndef yycheck
87264790Sbapt#define yycheck    varsyntax_calc1_check
88264790Sbapt#endif /* yycheck */
89264790Sbapt
90264790Sbapt#ifndef yyname
91264790Sbapt#define yyname     varsyntax_calc1_name
92264790Sbapt#endif /* yyname */
93264790Sbapt
94264790Sbapt#ifndef yyrule
95264790Sbapt#define yyrule     varsyntax_calc1_rule
96264790Sbapt#endif /* yyrule */
97264790Sbapt#define YYPREFIX "varsyntax_calc1_"
98264790Sbapt
99264790Sbapt#define YYPURE 0
100264790Sbapt
101264790Sbapt#line 3 "varsyntax_calc1.y"
102264790Sbapt
103264790Sbapt/* http://dinosaur.compilertools.net/yacc/index.html * /*/
104264790Sbapt
105264790Sbapt#include <stdlib.h>
106264790Sbapt#include <stdio.h>
107264790Sbapt#include <ctype.h>
108264790Sbapt#include <math.h>
109264790Sbapt
110264790Sbapttypedef struct interval
111264790Sbapt{
112264790Sbapt    double lo, hi;
113264790Sbapt}
114264790SbaptINTERVAL;
115264790Sbapt
116264790SbaptINTERVAL vmul(double, double, INTERVAL);
117264790SbaptINTERVAL vdiv(double, double, INTERVAL);
118264790Sbapt
119264790Sbaptextern int yylex(void);
120264790Sbaptstatic void yyerror(const char *s);
121264790Sbapt
122264790Sbaptint dcheck(INTERVAL);
123264790Sbapt
124264790Sbaptdouble dreg[26];
125264790SbaptINTERVAL vreg[26];
126264790Sbapt
127264790Sbapt#ifdef YYSTYPE
128264790Sbapt#undef  YYSTYPE_IS_DECLARED
129264790Sbapt#define YYSTYPE_IS_DECLARED 1
130264790Sbapt#endif
131264790Sbapt#ifndef YYSTYPE_IS_DECLARED
132264790Sbapt#define YYSTYPE_IS_DECLARED 1
133319297Sdelphij#line 32 "varsyntax_calc1.y"
134264790Sbapttypedef union
135264790Sbapt{
136264790Sbapt	int ival;	/* dreg & vreg array index values*/
137264790Sbapt	double dval;	/* floating point values*/
138264790Sbapt	INTERVAL vval;	/* interval values*/
139264790Sbapt} YYSTYPE;
140264790Sbapt#endif /* !YYSTYPE_IS_DECLARED */
141264790Sbapt#line 142 "varsyntax_calc1.tab.c"
142264790Sbapt
143264790Sbapt/* compatibility with bison */
144264790Sbapt#ifdef YYPARSE_PARAM
145264790Sbapt/* compatibility with FreeBSD */
146264790Sbapt# ifdef YYPARSE_PARAM_TYPE
147264790Sbapt#  define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
148264790Sbapt# else
149264790Sbapt#  define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
150264790Sbapt# endif
151264790Sbapt#else
152264790Sbapt# define YYPARSE_DECL() yyparse(void)
153264790Sbapt#endif
154264790Sbapt
155264790Sbapt/* Parameters sent to lex. */
156264790Sbapt#ifdef YYLEX_PARAM
157264790Sbapt# define YYLEX_DECL() yylex(void *YYLEX_PARAM)
158264790Sbapt# define YYLEX yylex(YYLEX_PARAM)
159264790Sbapt#else
160264790Sbapt# define YYLEX_DECL() yylex(void)
161264790Sbapt# define YYLEX yylex()
162264790Sbapt#endif
163264790Sbapt
164264790Sbapt/* Parameters sent to yyerror. */
165264790Sbapt#ifndef YYERROR_DECL
166264790Sbapt#define YYERROR_DECL() yyerror(const char *s)
167264790Sbapt#endif
168264790Sbapt#ifndef YYERROR_CALL
169264790Sbapt#define YYERROR_CALL(msg) yyerror(msg)
170264790Sbapt#endif
171264790Sbapt
172264790Sbaptextern int YYPARSE_DECL();
173264790Sbapt
174264790Sbapt#define DREG 257
175264790Sbapt#define VREG 258
176264790Sbapt#define CONST 259
177264790Sbapt#define UMINUS 260
178264790Sbapt#define YYERRCODE 256
179274475Sjkimtypedef int YYINT;
180264790Sbaptstatic const YYINT varsyntax_calc1_lhs[] = {             -1,
181264790Sbapt    3,    3,    0,    0,    0,    0,    0,    1,    1,    1,
182264790Sbapt    1,    1,    1,    1,    1,    2,    2,    2,    2,    2,
183264790Sbapt    2,    2,    2,    2,    2,    2,    2,    2,
184264790Sbapt};
185264790Sbaptstatic const YYINT varsyntax_calc1_len[] = {              2,
186264790Sbapt    0,    2,    2,    2,    4,    4,    2,    1,    1,    3,
187264790Sbapt    3,    3,    3,    2,    3,    1,    5,    1,    3,    3,
188264790Sbapt    3,    3,    3,    3,    3,    3,    2,    3,
189264790Sbapt};
190264790Sbaptstatic const YYINT varsyntax_calc1_defred[] = {           0,
191264790Sbapt    0,    0,    0,    8,    0,    0,    0,    0,    0,    7,
192264790Sbapt    0,    0,    9,   18,   14,   27,    0,    0,    0,    0,
193264790Sbapt    0,    0,    3,    0,    0,    0,    0,    4,    0,    0,
194264790Sbapt    0,    0,    0,   15,    0,   28,    0,    0,    0,    0,
195264790Sbapt   12,   24,   13,   26,    0,    0,   23,   25,   14,    0,
196264790Sbapt    0,    0,    0,    0,    5,    6,    0,    0,    0,   12,
197264790Sbapt   13,   17,
198264790Sbapt};
199264790Sbaptstatic const YYINT varsyntax_calc1_dgoto[] = {            7,
200264790Sbapt   32,    9,    0,
201264790Sbapt};
202264790Sbaptstatic const YYINT varsyntax_calc1_sindex[] = {         -40,
203264790Sbapt   -8,  -48,  -47,    0,  -37,  -37,    0,    2,   17,    0,
204264790Sbapt  -34,  -37,    0,    0,    0,    0,  -25,   90,  -37,  -37,
205264790Sbapt  -37,  -37,    0,  -37,  -37,  -37,  -37,    0,  -34,  -34,
206264790Sbapt   25,  125,   31,    0,  -34,    0,  -11,   37,  -11,   37,
207264790Sbapt    0,    0,    0,    0,   37,   37,    0,    0,    0,  111,
208264790Sbapt  -34,  -34,  -34,  -34,    0,    0,  118,   69,   69,    0,
209264790Sbapt    0,    0,
210264790Sbapt};
211264790Sbaptstatic const YYINT varsyntax_calc1_rindex[] = {           0,
212264790Sbapt    0,   38,   44,    0,    0,    0,    0,    0,    0,    0,
213264790Sbapt    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
214264790Sbapt    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
215264790Sbapt    0,   -9,    0,    0,    0,    0,   51,   -3,   56,   61,
216264790Sbapt    0,    0,    0,    0,   67,   72,    0,    0,    0,    0,
217264790Sbapt    0,    0,    0,    0,    0,    0,    0,   78,   83,    0,
218264790Sbapt    0,    0,
219264790Sbapt};
220264790Sbaptstatic const YYINT varsyntax_calc1_gindex[] = {           0,
221264790Sbapt    4,  124,    0,
222264790Sbapt};
223264790Sbapt#define YYTABLESIZE 225
224264790Sbaptstatic const YYINT varsyntax_calc1_table[] = {            6,
225264790Sbapt   16,   10,    6,    8,    5,   30,   20,    5,   15,   17,
226264790Sbapt   29,   23,   11,   12,   31,   34,   21,   19,   35,   20,
227264790Sbapt    0,   22,   37,   39,   41,   43,   28,    0,    0,    0,
228264790Sbapt   21,   16,   49,   50,   55,   22,    0,   20,   57,   20,
229264790Sbapt   56,   20,    0,   21,   19,    0,   20,    9,   22,    0,
230264790Sbapt    0,    0,    0,   18,   58,   59,   60,   61,   26,   24,
231264790Sbapt   10,   25,    0,   27,    0,   11,   53,   51,    0,   52,
232264790Sbapt   22,   54,   26,   24,    0,   25,   19,   27,   26,    9,
233264790Sbapt    9,   21,    9,   27,    9,   18,   18,   10,   18,    0,
234264790Sbapt   18,   10,   11,   10,   10,   10,   11,    0,   11,   11,
235264790Sbapt   11,   22,    0,   22,    0,   22,    0,   19,    0,   19,
236264790Sbapt   53,   19,   21,    0,   21,   54,   21,    0,   10,    0,
237264790Sbapt   10,    0,   10,   11,    0,   11,    0,   11,   16,   18,
238264790Sbapt   36,   26,   24,    0,   25,   33,   27,    0,    0,    0,
239264790Sbapt    0,    0,   38,   40,   42,   44,    0,   45,   46,   47,
240264790Sbapt   48,   34,   53,   51,    0,   52,    0,   54,   62,   53,
241264790Sbapt   51,    0,   52,    0,   54,    0,   21,   19,    0,   20,
242264790Sbapt    0,   22,    0,    0,    0,    0,    0,    0,    0,    0,
243264790Sbapt    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
244264790Sbapt    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
245264790Sbapt    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
246264790Sbapt    0,    0,    0,    0,    0,    1,    2,    3,    4,   13,
247264790Sbapt   14,    4,   13,    0,    4,
248264790Sbapt};
249264790Sbaptstatic const YYINT varsyntax_calc1_check[] = {           40,
250264790Sbapt   10,   10,   40,    0,   45,   40,   10,   45,    5,    6,
251264790Sbapt   45,   10,   61,   61,   11,   41,   42,   43,   44,   45,
252264790Sbapt   -1,   47,   19,   20,   21,   22,   10,   -1,   -1,   -1,
253264790Sbapt   42,   41,   29,   30,   10,   47,   -1,   41,   35,   43,
254264790Sbapt   10,   45,   -1,   42,   43,   -1,   45,   10,   47,   -1,
255264790Sbapt   -1,   -1,   -1,   10,   51,   52,   53,   54,   42,   43,
256264790Sbapt   10,   45,   -1,   47,   -1,   10,   42,   43,   -1,   45,
257264790Sbapt   10,   47,   42,   43,   -1,   45,   10,   47,   42,   42,
258264790Sbapt   43,   10,   45,   47,   47,   42,   43,   10,   45,   -1,
259264790Sbapt   47,   41,   10,   43,   44,   45,   41,   -1,   43,   44,
260264790Sbapt   45,   41,   -1,   43,   -1,   45,   -1,   41,   -1,   43,
261264790Sbapt   42,   45,   41,   -1,   43,   47,   45,   -1,   41,   -1,
262264790Sbapt   43,   -1,   45,   41,   -1,   43,   -1,   45,    5,    6,
263264790Sbapt   41,   42,   43,   -1,   45,   12,   47,   -1,   -1,   -1,
264264790Sbapt   -1,   -1,   19,   20,   21,   22,   -1,   24,   25,   26,
265264790Sbapt   27,   41,   42,   43,   -1,   45,   -1,   47,   41,   42,
266264790Sbapt   43,   -1,   45,   -1,   47,   -1,   42,   43,   -1,   45,
267264790Sbapt   -1,   47,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
268264790Sbapt   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
269264790Sbapt   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
270264790Sbapt   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
271264790Sbapt   -1,   -1,   -1,   -1,   -1,  256,  257,  258,  259,  257,
272264790Sbapt  258,  259,  257,   -1,  259,
273264790Sbapt};
274264790Sbapt#define YYFINAL 7
275264790Sbapt#ifndef YYDEBUG
276264790Sbapt#define YYDEBUG 0
277264790Sbapt#endif
278264790Sbapt#define YYMAXTOKEN 260
279264790Sbapt#define YYUNDFTOKEN 266
280264790Sbapt#define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
281264790Sbapt#if YYDEBUG
282264790Sbaptstatic const char *const varsyntax_calc1_name[] = {
283264790Sbapt
284264790Sbapt"end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
285264790Sbapt0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0,
286264790Sbapt0,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,
287264790Sbapt0,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,
288264790Sbapt0,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,
289264790Sbapt0,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,
290264790Sbapt0,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,
291264790Sbapt0,0,"DREG","VREG","CONST","UMINUS",0,0,0,0,0,"illegal-symbol",
292264790Sbapt};
293264790Sbaptstatic const char *const varsyntax_calc1_rule[] = {
294264790Sbapt"$accept : line",
295264790Sbapt"lines :",
296264790Sbapt"lines : lines line",
297264790Sbapt"line : dexp '\\n'",
298264790Sbapt"line : vexp '\\n'",
299264790Sbapt"line : DREG '=' dexp '\\n'",
300264790Sbapt"line : VREG '=' vexp '\\n'",
301264790Sbapt"line : error '\\n'",
302264790Sbapt"dexp : CONST",
303264790Sbapt"dexp : DREG",
304264790Sbapt"dexp : dexp '+' dexp",
305264790Sbapt"dexp : dexp '-' dexp",
306264790Sbapt"dexp : dexp '*' dexp",
307264790Sbapt"dexp : dexp '/' dexp",
308264790Sbapt"dexp : '-' dexp",
309264790Sbapt"dexp : '(' dexp ')'",
310264790Sbapt"vexp : dexp",
311264790Sbapt"vexp : '(' dexp ',' dexp ')'",
312264790Sbapt"vexp : VREG",
313264790Sbapt"vexp : vexp '+' vexp",
314264790Sbapt"vexp : dexp '+' vexp",
315264790Sbapt"vexp : vexp '-' vexp",
316264790Sbapt"vexp : dexp '-' vexp",
317264790Sbapt"vexp : vexp '*' vexp",
318264790Sbapt"vexp : dexp '*' vexp",
319264790Sbapt"vexp : vexp '/' vexp",
320264790Sbapt"vexp : dexp '/' vexp",
321264790Sbapt"vexp : '-' vexp",
322264790Sbapt"vexp : '(' vexp ')'",
323264790Sbapt
324264790Sbapt};
325264790Sbapt#endif
326264790Sbapt
327264790Sbaptint      yydebug;
328264790Sbaptint      yynerrs;
329264790Sbapt
330264790Sbaptint      yyerrflag;
331264790Sbaptint      yychar;
332264790SbaptYYSTYPE  yyval;
333264790SbaptYYSTYPE  yylval;
334264790Sbapt
335264790Sbapt/* define the initial stack-sizes */
336264790Sbapt#ifdef YYSTACKSIZE
337264790Sbapt#undef YYMAXDEPTH
338264790Sbapt#define YYMAXDEPTH  YYSTACKSIZE
339264790Sbapt#else
340264790Sbapt#ifdef YYMAXDEPTH
341264790Sbapt#define YYSTACKSIZE YYMAXDEPTH
342264790Sbapt#else
343264790Sbapt#define YYSTACKSIZE 10000
344264790Sbapt#define YYMAXDEPTH  10000
345264790Sbapt#endif
346264790Sbapt#endif
347264790Sbapt
348264790Sbapt#define YYINITSTACKSIZE 200
349264790Sbapt
350264790Sbapttypedef struct {
351264790Sbapt    unsigned stacksize;
352264790Sbapt    YYINT    *s_base;
353264790Sbapt    YYINT    *s_mark;
354264790Sbapt    YYINT    *s_last;
355264790Sbapt    YYSTYPE  *l_base;
356264790Sbapt    YYSTYPE  *l_mark;
357264790Sbapt} YYSTACKDATA;
358264790Sbapt/* variables for the parser stack */
359264790Sbaptstatic YYSTACKDATA yystack;
360264790Sbapt#line 178 "varsyntax_calc1.y"
361264790Sbapt	/* beginning of subroutines section */
362264790Sbapt
363264790Sbapt#define BSZ 50			/* buffer size for floating point numbers */
364264790Sbapt
365264790Sbapt	/* lexical analysis */
366264790Sbapt
367264790Sbaptstatic void
368264790Sbaptyyerror(const char *s)
369264790Sbapt{
370264790Sbapt    fprintf(stderr, "%s\n", s);
371264790Sbapt}
372264790Sbapt
373264790Sbaptint
374264790Sbaptyylex(void)
375264790Sbapt{
376264790Sbapt    int c;
377264790Sbapt
378264790Sbapt    while ((c = getchar()) == ' ')
379264790Sbapt    {				/* skip over blanks */
380264790Sbapt    }
381264790Sbapt
382264790Sbapt    if (isupper(c))
383264790Sbapt    {
384264790Sbapt	yylval.ival = c - 'A';
385264790Sbapt	return (VREG);
386264790Sbapt    }
387264790Sbapt    if (islower(c))
388264790Sbapt    {
389264790Sbapt	yylval.ival = c - 'a';
390264790Sbapt	return (DREG);
391264790Sbapt    }
392264790Sbapt
393264790Sbapt    if (isdigit(c) || c == '.')
394264790Sbapt    {
395264790Sbapt	/* gobble up digits, points, exponents */
396264790Sbapt	char buf[BSZ + 1], *cp = buf;
397264790Sbapt	int dot = 0, expr = 0;
398264790Sbapt
399264790Sbapt	for (; (cp - buf) < BSZ; ++cp, c = getchar())
400264790Sbapt	{
401264790Sbapt
402264790Sbapt	    *cp = (char) c;
403264790Sbapt	    if (isdigit(c))
404264790Sbapt		continue;
405264790Sbapt	    if (c == '.')
406264790Sbapt	    {
407264790Sbapt		if (dot++ || expr)
408264790Sbapt		    return ('.');	/* will cause syntax error */
409264790Sbapt		continue;
410264790Sbapt	    }
411264790Sbapt
412264790Sbapt	    if (c == 'e')
413264790Sbapt	    {
414264790Sbapt		if (expr++)
415264790Sbapt		    return ('e');	/*  will  cause  syntax  error  */
416264790Sbapt		continue;
417264790Sbapt	    }
418264790Sbapt
419264790Sbapt	    /*  end  of  number  */
420264790Sbapt	    break;
421264790Sbapt	}
422264790Sbapt	*cp = '\0';
423264790Sbapt
424264790Sbapt	if ((cp - buf) >= BSZ)
425264790Sbapt	    printf("constant  too  long:  truncated\n");
426264790Sbapt	else
427264790Sbapt	    ungetc(c, stdin);	/*  push  back  last  char  read  */
428264790Sbapt	yylval.dval = atof(buf);
429264790Sbapt	return (CONST);
430264790Sbapt    }
431264790Sbapt    return (c);
432264790Sbapt}
433264790Sbapt
434264790Sbaptstatic INTERVAL
435264790Sbapthilo(double a, double b, double c, double d)
436264790Sbapt{
437264790Sbapt    /*  returns  the  smallest  interval  containing  a,  b,  c,  and  d  */
438264790Sbapt    /*  used  by  *,  /  routines  */
439264790Sbapt    INTERVAL v;
440264790Sbapt
441264790Sbapt    if (a > b)
442264790Sbapt    {
443264790Sbapt	v.hi = a;
444264790Sbapt	v.lo = b;
445264790Sbapt    }
446264790Sbapt    else
447264790Sbapt    {
448264790Sbapt	v.hi = b;
449264790Sbapt	v.lo = a;
450264790Sbapt    }
451264790Sbapt
452264790Sbapt    if (c > d)
453264790Sbapt    {
454264790Sbapt	if (c > v.hi)
455264790Sbapt	    v.hi = c;
456264790Sbapt	if (d < v.lo)
457264790Sbapt	    v.lo = d;
458264790Sbapt    }
459264790Sbapt    else
460264790Sbapt    {
461264790Sbapt	if (d > v.hi)
462264790Sbapt	    v.hi = d;
463264790Sbapt	if (c < v.lo)
464264790Sbapt	    v.lo = c;
465264790Sbapt    }
466264790Sbapt    return (v);
467264790Sbapt}
468264790Sbapt
469264790SbaptINTERVAL
470264790Sbaptvmul(double a, double b, INTERVAL v)
471264790Sbapt{
472264790Sbapt    return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
473264790Sbapt}
474264790Sbapt
475264790Sbaptint
476264790Sbaptdcheck(INTERVAL v)
477264790Sbapt{
478264790Sbapt    if (v.hi >= 0. && v.lo <= 0.)
479264790Sbapt    {
480264790Sbapt	printf("divisor  interval  contains  0.\n");
481264790Sbapt	return (1);
482264790Sbapt    }
483264790Sbapt    return (0);
484264790Sbapt}
485264790Sbapt
486264790SbaptINTERVAL
487264790Sbaptvdiv(double a, double b, INTERVAL v)
488264790Sbapt{
489264790Sbapt    return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
490264790Sbapt}
491264790Sbapt#line 492 "varsyntax_calc1.tab.c"
492264790Sbapt
493264790Sbapt#if YYDEBUG
494319297Sdelphij#include <stdio.h>	/* needed for printf */
495264790Sbapt#endif
496264790Sbapt
497264790Sbapt#include <stdlib.h>	/* needed for malloc, etc */
498264790Sbapt#include <string.h>	/* needed for memset */
499264790Sbapt
500264790Sbapt/* allocate initial stack or double stack size, up to YYMAXDEPTH */
501264790Sbaptstatic int yygrowstack(YYSTACKDATA *data)
502264790Sbapt{
503264790Sbapt    int i;
504264790Sbapt    unsigned newsize;
505264790Sbapt    YYINT *newss;
506264790Sbapt    YYSTYPE *newvs;
507264790Sbapt
508264790Sbapt    if ((newsize = data->stacksize) == 0)
509264790Sbapt        newsize = YYINITSTACKSIZE;
510264790Sbapt    else if (newsize >= YYMAXDEPTH)
511264790Sbapt        return YYENOMEM;
512264790Sbapt    else if ((newsize *= 2) > YYMAXDEPTH)
513264790Sbapt        newsize = YYMAXDEPTH;
514264790Sbapt
515264790Sbapt    i = (int) (data->s_mark - data->s_base);
516264790Sbapt    newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
517264790Sbapt    if (newss == 0)
518264790Sbapt        return YYENOMEM;
519264790Sbapt
520264790Sbapt    data->s_base = newss;
521264790Sbapt    data->s_mark = newss + i;
522264790Sbapt
523264790Sbapt    newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
524264790Sbapt    if (newvs == 0)
525264790Sbapt        return YYENOMEM;
526264790Sbapt
527264790Sbapt    data->l_base = newvs;
528264790Sbapt    data->l_mark = newvs + i;
529264790Sbapt
530264790Sbapt    data->stacksize = newsize;
531264790Sbapt    data->s_last = data->s_base + newsize - 1;
532264790Sbapt    return 0;
533264790Sbapt}
534264790Sbapt
535264790Sbapt#if YYPURE || defined(YY_NO_LEAKS)
536264790Sbaptstatic void yyfreestack(YYSTACKDATA *data)
537264790Sbapt{
538264790Sbapt    free(data->s_base);
539264790Sbapt    free(data->l_base);
540264790Sbapt    memset(data, 0, sizeof(*data));
541264790Sbapt}
542264790Sbapt#else
543264790Sbapt#define yyfreestack(data) /* nothing */
544264790Sbapt#endif
545264790Sbapt
546264790Sbapt#define YYABORT  goto yyabort
547264790Sbapt#define YYREJECT goto yyabort
548264790Sbapt#define YYACCEPT goto yyaccept
549264790Sbapt#define YYERROR  goto yyerrlab
550264790Sbapt
551264790Sbaptint
552264790SbaptYYPARSE_DECL()
553264790Sbapt{
554264790Sbapt    int yym, yyn, yystate;
555264790Sbapt#if YYDEBUG
556264790Sbapt    const char *yys;
557264790Sbapt
558264790Sbapt    if ((yys = getenv("YYDEBUG")) != 0)
559264790Sbapt    {
560264790Sbapt        yyn = *yys;
561264790Sbapt        if (yyn >= '0' && yyn <= '9')
562264790Sbapt            yydebug = yyn - '0';
563264790Sbapt    }
564264790Sbapt#endif
565264790Sbapt
566319297Sdelphij    yym = 0;
567319297Sdelphij    yyn = 0;
568264790Sbapt    yynerrs = 0;
569264790Sbapt    yyerrflag = 0;
570264790Sbapt    yychar = YYEMPTY;
571264790Sbapt    yystate = 0;
572264790Sbapt
573264790Sbapt#if YYPURE
574264790Sbapt    memset(&yystack, 0, sizeof(yystack));
575264790Sbapt#endif
576264790Sbapt
577264790Sbapt    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
578264790Sbapt    yystack.s_mark = yystack.s_base;
579264790Sbapt    yystack.l_mark = yystack.l_base;
580264790Sbapt    yystate = 0;
581264790Sbapt    *yystack.s_mark = 0;
582264790Sbapt
583264790Sbaptyyloop:
584264790Sbapt    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
585264790Sbapt    if (yychar < 0)
586264790Sbapt    {
587319297Sdelphij        yychar = YYLEX;
588319297Sdelphij        if (yychar < 0) yychar = YYEOF;
589264790Sbapt#if YYDEBUG
590264790Sbapt        if (yydebug)
591264790Sbapt        {
592319297Sdelphij            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
593264790Sbapt            printf("%sdebug: state %d, reading %d (%s)\n",
594264790Sbapt                    YYPREFIX, yystate, yychar, yys);
595264790Sbapt        }
596264790Sbapt#endif
597264790Sbapt    }
598319297Sdelphij    if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
599319297Sdelphij            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
600264790Sbapt    {
601264790Sbapt#if YYDEBUG
602264790Sbapt        if (yydebug)
603264790Sbapt            printf("%sdebug: state %d, shifting to state %d\n",
604264790Sbapt                    YYPREFIX, yystate, yytable[yyn]);
605264790Sbapt#endif
606319297Sdelphij        if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
607264790Sbapt        yystate = yytable[yyn];
608264790Sbapt        *++yystack.s_mark = yytable[yyn];
609264790Sbapt        *++yystack.l_mark = yylval;
610264790Sbapt        yychar = YYEMPTY;
611264790Sbapt        if (yyerrflag > 0)  --yyerrflag;
612264790Sbapt        goto yyloop;
613264790Sbapt    }
614319297Sdelphij    if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
615319297Sdelphij            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
616264790Sbapt    {
617264790Sbapt        yyn = yytable[yyn];
618264790Sbapt        goto yyreduce;
619264790Sbapt    }
620319297Sdelphij    if (yyerrflag != 0) goto yyinrecovery;
621264790Sbapt
622264790Sbapt    YYERROR_CALL("syntax error");
623264790Sbapt
624319297Sdelphij    goto yyerrlab; /* redundant goto avoids 'unused label' warning */
625264790Sbaptyyerrlab:
626264790Sbapt    ++yynerrs;
627264790Sbapt
628264790Sbaptyyinrecovery:
629264790Sbapt    if (yyerrflag < 3)
630264790Sbapt    {
631264790Sbapt        yyerrflag = 3;
632264790Sbapt        for (;;)
633264790Sbapt        {
634319297Sdelphij            if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
635319297Sdelphij                    yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
636264790Sbapt            {
637264790Sbapt#if YYDEBUG
638264790Sbapt                if (yydebug)
639264790Sbapt                    printf("%sdebug: state %d, error recovery shifting\
640264790Sbapt to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
641264790Sbapt#endif
642319297Sdelphij                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
643264790Sbapt                yystate = yytable[yyn];
644264790Sbapt                *++yystack.s_mark = yytable[yyn];
645264790Sbapt                *++yystack.l_mark = yylval;
646264790Sbapt                goto yyloop;
647264790Sbapt            }
648264790Sbapt            else
649264790Sbapt            {
650264790Sbapt#if YYDEBUG
651264790Sbapt                if (yydebug)
652264790Sbapt                    printf("%sdebug: error recovery discarding state %d\n",
653264790Sbapt                            YYPREFIX, *yystack.s_mark);
654264790Sbapt#endif
655264790Sbapt                if (yystack.s_mark <= yystack.s_base) goto yyabort;
656264790Sbapt                --yystack.s_mark;
657264790Sbapt                --yystack.l_mark;
658264790Sbapt            }
659264790Sbapt        }
660264790Sbapt    }
661264790Sbapt    else
662264790Sbapt    {
663264790Sbapt        if (yychar == YYEOF) goto yyabort;
664264790Sbapt#if YYDEBUG
665264790Sbapt        if (yydebug)
666264790Sbapt        {
667319297Sdelphij            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
668264790Sbapt            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
669264790Sbapt                    YYPREFIX, yystate, yychar, yys);
670264790Sbapt        }
671264790Sbapt#endif
672264790Sbapt        yychar = YYEMPTY;
673264790Sbapt        goto yyloop;
674264790Sbapt    }
675264790Sbapt
676264790Sbaptyyreduce:
677264790Sbapt#if YYDEBUG
678264790Sbapt    if (yydebug)
679264790Sbapt        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
680264790Sbapt                YYPREFIX, yystate, yyn, yyrule[yyn]);
681264790Sbapt#endif
682264790Sbapt    yym = yylen[yyn];
683319297Sdelphij    if (yym > 0)
684264790Sbapt        yyval = yystack.l_mark[1-yym];
685264790Sbapt    else
686264790Sbapt        memset(&yyval, 0, sizeof yyval);
687319297Sdelphij
688264790Sbapt    switch (yyn)
689264790Sbapt    {
690264790Sbaptcase 3:
691264790Sbapt#line 59 "varsyntax_calc1.y"
692264790Sbapt	{
693264790Sbapt		(void) printf("%15.8f\n", yystack.l_mark[-1].dval);
694264790Sbapt	}
695264790Sbaptbreak;
696264790Sbaptcase 4:
697264790Sbapt#line 63 "varsyntax_calc1.y"
698264790Sbapt	{
699264790Sbapt		(void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
700264790Sbapt	}
701264790Sbaptbreak;
702264790Sbaptcase 5:
703264790Sbapt#line 67 "varsyntax_calc1.y"
704264790Sbapt	{
705264790Sbapt		dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
706264790Sbapt	}
707264790Sbaptbreak;
708264790Sbaptcase 6:
709264790Sbapt#line 71 "varsyntax_calc1.y"
710264790Sbapt	{
711264790Sbapt		vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
712264790Sbapt	}
713264790Sbaptbreak;
714264790Sbaptcase 7:
715264790Sbapt#line 75 "varsyntax_calc1.y"
716264790Sbapt	{
717264790Sbapt		yyerrok;
718264790Sbapt	}
719264790Sbaptbreak;
720264790Sbaptcase 9:
721264790Sbapt#line 82 "varsyntax_calc1.y"
722264790Sbapt	{
723264790Sbapt		yyval.dval = dreg[yystack.l_mark[0].ival]; /* $$ & $1 are sufficient here*/
724264790Sbapt	}
725264790Sbaptbreak;
726264790Sbaptcase 10:
727264790Sbapt#line 86 "varsyntax_calc1.y"
728264790Sbapt	{
729264790Sbapt		yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
730264790Sbapt	}
731264790Sbaptbreak;
732264790Sbaptcase 11:
733264790Sbapt#line 90 "varsyntax_calc1.y"
734264790Sbapt	{
735264790Sbapt		yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
736264790Sbapt	}
737264790Sbaptbreak;
738264790Sbaptcase 12:
739264790Sbapt#line 94 "varsyntax_calc1.y"
740264790Sbapt	{
741264790Sbapt		yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
742264790Sbapt	}
743264790Sbaptbreak;
744264790Sbaptcase 13:
745264790Sbapt#line 98 "varsyntax_calc1.y"
746264790Sbapt	{
747264790Sbapt		yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
748264790Sbapt	}
749264790Sbaptbreak;
750264790Sbaptcase 14:
751264790Sbapt#line 102 "varsyntax_calc1.y"
752264790Sbapt	{
753264790Sbapt		yyval.dval = -yystack.l_mark[0].dval;
754264790Sbapt	}
755264790Sbaptbreak;
756264790Sbaptcase 15:
757264790Sbapt#line 106 "varsyntax_calc1.y"
758264790Sbapt	{
759264790Sbapt		yyval.dval = yystack.l_mark[-1].dval;
760264790Sbapt	}
761264790Sbaptbreak;
762264790Sbaptcase 16:
763264790Sbapt#line 112 "varsyntax_calc1.y"
764264790Sbapt	{
765264790Sbapt		yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
766264790Sbapt	}
767264790Sbaptbreak;
768264790Sbaptcase 17:
769264790Sbapt#line 116 "varsyntax_calc1.y"
770264790Sbapt	{
771264790Sbapt		yyval.vval.lo = yystack.l_mark[-3].dval;
772264790Sbapt		yyval.vval.hi = yystack.l_mark[-1].dval;
773264790Sbapt		if ( yyval.vval.lo > yyval.vval.hi )
774264790Sbapt		{
775264790Sbapt			(void) printf("interval out of order\n");
776264790Sbapt			YYERROR;
777264790Sbapt		}
778264790Sbapt	}
779264790Sbaptbreak;
780264790Sbaptcase 18:
781264790Sbapt#line 126 "varsyntax_calc1.y"
782264790Sbapt	{
783264790Sbapt		yyval.vval = vreg[yystack.l_mark[0].ival];
784264790Sbapt	}
785264790Sbaptbreak;
786264790Sbaptcase 19:
787264790Sbapt#line 130 "varsyntax_calc1.y"
788264790Sbapt	{
789264790Sbapt		yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
790264790Sbapt		yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
791264790Sbapt	}
792264790Sbaptbreak;
793264790Sbaptcase 20:
794264790Sbapt#line 135 "varsyntax_calc1.y"
795264790Sbapt	{
796264790Sbapt		yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
797264790Sbapt		yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
798264790Sbapt	}
799264790Sbaptbreak;
800264790Sbaptcase 21:
801264790Sbapt#line 140 "varsyntax_calc1.y"
802264790Sbapt	{
803264790Sbapt		yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
804264790Sbapt		yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
805264790Sbapt	}
806264790Sbaptbreak;
807264790Sbaptcase 22:
808264790Sbapt#line 145 "varsyntax_calc1.y"
809264790Sbapt	{
810264790Sbapt		yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
811264790Sbapt		yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
812264790Sbapt	}
813264790Sbaptbreak;
814264790Sbaptcase 23:
815264790Sbapt#line 150 "varsyntax_calc1.y"
816264790Sbapt	{
817264790Sbapt		yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
818264790Sbapt	}
819264790Sbaptbreak;
820264790Sbaptcase 24:
821264790Sbapt#line 154 "varsyntax_calc1.y"
822264790Sbapt	{
823264790Sbapt		yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
824264790Sbapt	}
825264790Sbaptbreak;
826264790Sbaptcase 25:
827264790Sbapt#line 158 "varsyntax_calc1.y"
828264790Sbapt	{
829264790Sbapt		if (dcheck(yystack.l_mark[0].vval)) YYERROR;
830264790Sbapt		yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
831264790Sbapt	}
832264790Sbaptbreak;
833264790Sbaptcase 26:
834264790Sbapt#line 163 "varsyntax_calc1.y"
835264790Sbapt	{
836264790Sbapt		if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
837264790Sbapt		yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
838264790Sbapt	}
839264790Sbaptbreak;
840264790Sbaptcase 27:
841264790Sbapt#line 168 "varsyntax_calc1.y"
842264790Sbapt	{
843264790Sbapt		yyval.vval.hi = -yystack.l_mark[0].vval.lo;
844264790Sbapt		yyval.vval.lo = -yystack.l_mark[0].vval.hi;
845264790Sbapt	}
846264790Sbaptbreak;
847264790Sbaptcase 28:
848264790Sbapt#line 173 "varsyntax_calc1.y"
849264790Sbapt	{
850264790Sbapt		yyval.vval = yystack.l_mark[-1].vval;
851264790Sbapt	}
852264790Sbaptbreak;
853319297Sdelphij#line 854 "varsyntax_calc1.tab.c"
854264790Sbapt    }
855264790Sbapt    yystack.s_mark -= yym;
856264790Sbapt    yystate = *yystack.s_mark;
857264790Sbapt    yystack.l_mark -= yym;
858264790Sbapt    yym = yylhs[yyn];
859264790Sbapt    if (yystate == 0 && yym == 0)
860264790Sbapt    {
861264790Sbapt#if YYDEBUG
862264790Sbapt        if (yydebug)
863264790Sbapt            printf("%sdebug: after reduction, shifting from state 0 to\
864264790Sbapt state %d\n", YYPREFIX, YYFINAL);
865264790Sbapt#endif
866264790Sbapt        yystate = YYFINAL;
867264790Sbapt        *++yystack.s_mark = YYFINAL;
868264790Sbapt        *++yystack.l_mark = yyval;
869264790Sbapt        if (yychar < 0)
870264790Sbapt        {
871319297Sdelphij            yychar = YYLEX;
872319297Sdelphij            if (yychar < 0) yychar = YYEOF;
873264790Sbapt#if YYDEBUG
874264790Sbapt            if (yydebug)
875264790Sbapt            {
876319297Sdelphij                if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
877264790Sbapt                printf("%sdebug: state %d, reading %d (%s)\n",
878264790Sbapt                        YYPREFIX, YYFINAL, yychar, yys);
879264790Sbapt            }
880264790Sbapt#endif
881264790Sbapt        }
882264790Sbapt        if (yychar == YYEOF) goto yyaccept;
883264790Sbapt        goto yyloop;
884264790Sbapt    }
885319297Sdelphij    if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
886319297Sdelphij            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
887264790Sbapt        yystate = yytable[yyn];
888264790Sbapt    else
889264790Sbapt        yystate = yydgoto[yym];
890264790Sbapt#if YYDEBUG
891264790Sbapt    if (yydebug)
892264790Sbapt        printf("%sdebug: after reduction, shifting from state %d \
893264790Sbaptto state %d\n", YYPREFIX, *yystack.s_mark, yystate);
894264790Sbapt#endif
895319297Sdelphij    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
896264790Sbapt    *++yystack.s_mark = (YYINT) yystate;
897264790Sbapt    *++yystack.l_mark = yyval;
898264790Sbapt    goto yyloop;
899264790Sbapt
900264790Sbaptyyoverflow:
901264790Sbapt    YYERROR_CALL("yacc stack overflow");
902264790Sbapt
903264790Sbaptyyabort:
904264790Sbapt    yyfreestack(&yystack);
905264790Sbapt    return (1);
906264790Sbapt
907264790Sbaptyyaccept:
908264790Sbapt    yyfreestack(&yystack);
909264790Sbapt    return (0);
910264790Sbapt}
911