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