5e9c6f15f7e10101c0f37272c910010602b347f7
[asterisk/asterisk.git] / main / ast_expr2.c
1 /* A Bison parser, made by GNU Bison 2.3.  */
2
3 /* Skeleton implementation for Bison's Yacc-like parsers in C
4
5    Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
6    Free Software Foundation, Inc.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor,
21    Boston, MA 02110-1301, USA.  */
22
23 /* As a special exception, you may create a larger work that contains
24    part or all of the Bison parser skeleton and distribute that work
25    under terms of your choice, so long as that work isn't itself a
26    parser generator using the skeleton or a modified version thereof
27    as a parser skeleton.  Alternatively, if you modify or redistribute
28    the parser skeleton itself, you may (at your option) remove this
29    special exception, which will cause the skeleton and the resulting
30    Bison output files to be licensed under the GNU General Public
31    License without this special exception.
32
33    This special exception was added by the Free Software Foundation in
34    version 2.2 of Bison.  */
35
36 /* C LALR(1) parser skeleton written by Richard Stallman, by
37    simplifying the original so-called "semantic" parser.  */
38
39 /* All symbols defined below should begin with yy or YY, to avoid
40    infringing on user name space.  This should be done even for local
41    variables, as they might otherwise be expanded by user macros.
42    There are some unavoidable exceptions within include files to
43    define necessary library symbols; they are noted "INFRINGES ON
44    USER NAME SPACE" below.  */
45
46 /* Identify Bison output.  */
47 #define YYBISON 1
48
49 /* Bison version.  */
50 #define YYBISON_VERSION "2.3"
51
52 /* Skeleton name.  */
53 #define YYSKELETON_NAME "yacc.c"
54
55 /* Pure parsers.  */
56 #define YYPURE 1
57
58 /* Using locations.  */
59 #define YYLSP_NEEDED 1
60
61 /* Substitute the variable and function names.  */
62 #define yyparse ast_yyparse
63 #define yylex   ast_yylex
64 #define yyerror ast_yyerror
65 #define yylval  ast_yylval
66 #define yychar  ast_yychar
67 #define yydebug ast_yydebug
68 #define yynerrs ast_yynerrs
69 #define yylloc ast_yylloc
70
71 /* Tokens.  */
72 #ifndef YYTOKENTYPE
73 # define YYTOKENTYPE
74    /* Put the tokens into the symbol table, so that GDB and other debuggers
75       know about them.  */
76    enum yytokentype {
77      TOK_COMMA = 258,
78      TOK_COLONCOLON = 259,
79      TOK_COND = 260,
80      TOK_OR = 261,
81      TOK_AND = 262,
82      TOK_NE = 263,
83      TOK_LE = 264,
84      TOK_GE = 265,
85      TOK_LT = 266,
86      TOK_GT = 267,
87      TOK_EQ = 268,
88      TOK_MINUS = 269,
89      TOK_PLUS = 270,
90      TOK_MOD = 271,
91      TOK_DIV = 272,
92      TOK_MULT = 273,
93      TOK_COMPL = 274,
94      TOK_TILDETILDE = 275,
95      TOK_EQTILDE = 276,
96      TOK_COLON = 277,
97      TOK_LP = 278,
98      TOK_RP = 279,
99      TOKEN = 280
100    };
101 #endif
102 /* Tokens.  */
103 #define TOK_COMMA 258
104 #define TOK_COLONCOLON 259
105 #define TOK_COND 260
106 #define TOK_OR 261
107 #define TOK_AND 262
108 #define TOK_NE 263
109 #define TOK_LE 264
110 #define TOK_GE 265
111 #define TOK_LT 266
112 #define TOK_GT 267
113 #define TOK_EQ 268
114 #define TOK_MINUS 269
115 #define TOK_PLUS 270
116 #define TOK_MOD 271
117 #define TOK_DIV 272
118 #define TOK_MULT 273
119 #define TOK_COMPL 274
120 #define TOK_TILDETILDE 275
121 #define TOK_EQTILDE 276
122 #define TOK_COLON 277
123 #define TOK_LP 278
124 #define TOK_RP 279
125 #define TOKEN 280
126
127
128
129
130 /* Copy the first part of user declarations.  */
131 #line 1 "ast_expr2.y"
132
133 /* Written by Pace Willisson (pace@blitz.com) 
134  * and placed in the public domain.
135  *
136  * Largely rewritten by J.T. Conklin (jtc@wimsey.com)
137  *
138  * And then overhauled twice by Steve Murphy (murf@digium.com)
139  * to add double-quoted strings, allow mult. spaces, improve
140  * error messages, and then to fold in a flex scanner for the 
141  * yylex operation.
142  *
143  * $FreeBSD: src/bin/expr/expr.y,v 1.16 2000/07/22 10:59:36 se Exp $
144  */
145
146 #include "asterisk.h"
147
148 #include <sys/types.h>
149 #include <stdio.h>
150
151 #if !defined(STANDALONE)
152 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
153 #else
154 #ifndef __USE_ISOC99
155 #define __USE_ISOC99 1
156 #endif
157 #endif
158
159 #ifdef __USE_ISOC99
160 #define FP___PRINTF "%.18Lg"
161 #define FP___TYPE    long double
162 #else
163 #define FP___PRINTF "%.16g"
164 #define FP___TYPE    double
165 #endif
166
167 #ifdef HAVE_COSL
168 #define FUNC_COS   cosl
169 #elif defined(HAVE_COS)
170 #define FUNC_COS        (long double)cos
171 #endif
172
173 #ifdef HAVE_SINL
174 #define FUNC_SIN   sinl
175 #elif defined(HAVE_SIN)
176 #define FUNC_SIN        (long double)sin
177 #endif
178
179 #ifdef HAVE_TANL
180 #define FUNC_TAN   tanl
181 #elif defined(HAVE_TAN)
182 #define FUNC_TAN        (long double)tan
183 #endif
184
185 #ifdef HAVE_ACOSL
186 #define FUNC_ACOS   acosl
187 #elif defined(HAVE_ACOS)
188 #define FUNC_ACOS       (long double)acos
189 #endif
190
191 #ifdef HAVE_ASINL
192 #define FUNC_ASIN   asinl
193 #elif defined(HAVE_ASIN)
194 #define FUNC_ASIN       (long double)asin
195 #endif
196
197 #ifdef HAVE_ATANL
198 #define FUNC_ATAN   atanl
199 #elif defined(HAVE_ATAN)
200 #define FUNC_ATAN       (long double)atan
201 #endif
202
203 #ifdef HAVE_ATAN2L
204 #define FUNC_ATAN2   atan2l
205 #elif defined(HAVE_ATAN2)
206 #define FUNC_ATAN2      (long double)atan2
207 #endif
208
209 #ifdef HAVE_POWL
210 #define FUNC_POW   powl
211 #elif defined(HAVE_POW)
212 #define FUNC_POW        (long double)pow
213 #endif
214
215 #ifdef HAVE_SQRTL
216 #define FUNC_SQRT   sqrtl
217 #elif defined(HAVE_SQRT)
218 #define FUNC_SQRT       (long double)sqrt
219 #endif
220
221 #ifdef HAVE_RINTL
222 #define FUNC_RINT   rintl
223 #elif defined(HAVE_RINT)
224 #define FUNC_RINT       (long double)rint
225 #endif
226
227 #ifdef HAVE_EXPL
228 #define FUNC_EXP   expl
229 #elif defined(HAVE_EXP)
230 #define FUNC_EXP        (long double)exp
231 #endif
232
233 #ifdef HAVE_LOGL
234 #define FUNC_LOG   logl
235 #elif defined(HAVE_LOG)
236 #define FUNC_LOG        (long double)log
237 #endif
238
239 #ifdef HAVE_REMINDERL
240 #define FUNC_REMINDER   reminderl
241 #elif defined(HAVE_REMINDER)
242 #define FUNC_REMINDER   (long double)reminder
243 #endif
244
245 #ifdef HAVE_FMODL
246 #define FUNC_FMOD   fmodl
247 #elif defined(HAVE_FMOD)
248 #define FUNC_FMOD       (long double)fmod
249 #endif
250
251 #ifdef HAVE_STRTOLD
252 #define FUNC_STRTOD  strtold
253 #elif defined(HAVE_STRTOD)
254 #define FUNC_STRTOD  (long double)strtod
255 #endif
256
257 #ifdef HAVE_FLOORL
258 #define FUNC_FLOOR      floorl
259 #elif defined(HAVE_FLOOR)
260 #define FUNC_FLOOR      (long double)floor
261 #endif
262
263 #ifdef HAVE_CEILL
264 #define FUNC_CEIL      ceill
265 #elif defined(HAVE_CEIL)
266 #define FUNC_CEIL       (long double)ceil
267 #endif
268
269 #ifdef HAVE_ROUNDL
270 #define FUNC_ROUND     roundl
271 #elif defined(HAVE_ROUND)
272 #define FUNC_ROUND     (long double)round
273 #endif
274
275 #ifdef HAVE_TRUNCL
276 #define FUNC_TRUNC     truncl
277 #elif defined(HAVE_TRUNC)
278 #define FUNC_TRUNC     (long double)trunc
279 #endif
280
281 /*! \note
282  * Oddly enough, some platforms have some ISO C99 functions, but not others, so
283  * we define the missing functions in terms of their mathematical identities.
284  */
285 #ifdef HAVE_EXP2L
286 #define FUNC_EXP2       exp2l
287 #elif (defined(HAVE_EXPL) && defined(HAVE_LOGL))
288 #define FUNC_EXP2(x)    expl((x) * logl(2.0))
289 #elif (defined(HAVE_EXP) && defined(HAVE_LOG))
290 #define FUNC_EXP2(x)    (long double)exp((x) * log(2.0))
291 #endif
292
293 #ifdef HAVE_EXP10L
294 #define FUNC_EXP10       exp10l
295 #elif (defined(HAVE_EXPL) && defined(HAVE_LOGL))
296 #define FUNC_EXP10(x)   expl((x) * logl(10.0))
297 #elif (defined(HAVE_EXP) && defined(HAVE_LOG))
298 #define FUNC_EXP10(x)   (long double)exp((x) * log(10.0))
299 #endif
300
301 #ifdef HAVE_LOG2L
302 #define FUNC_LOG2       log2l
303 #elif defined(HAVE_LOGL)
304 #define FUNC_LOG2(x)    (logl(x) / logl(2.0))
305 #elif defined(HAVE_LOG10L)
306 #define FUNC_LOG2(x)    (log10l(x) / log10l(2.0))
307 #elif defined(HAVE_LOG2)
308 #define FUNC_LOG2       (long double)log2
309 #elif defined(HAVE_LOG)
310 #define FUNC_LOG2(x)    ((long double)log(x) / log(2.0))
311 #endif
312
313 #ifdef HAVE_LOG10L
314 #define FUNC_LOG10       log10l
315 #elif defined(HAVE_LOGL)
316 #define FUNC_LOG10(x)   (logl(x) / logl(10.0))
317 #elif defined(HAVE_LOG2L)
318 #define FUNC_LOG10(x)   (log2l(x) / log2l(10.0))
319 #elif defined(HAVE_LOG10)
320 #define FUNC_LOG10(x)   (long double)log10(x)
321 #elif defined(HAVE_LOG)
322 #define FUNC_LOG10(x)   ((long double)log(x) / log(10.0))
323 #endif
324
325
326 #include <stdlib.h>
327 #ifndef _GNU_SOURCE
328 #define _GNU_SOURCE
329 #endif
330 #include <string.h>
331 #include <math.h>
332 #include <locale.h>
333 #include <unistd.h>
334 #include <ctype.h>
335 #if !defined(SOLARIS) && !defined(__CYGWIN__)
336         /* #include <err.h> */
337 #else
338 #define quad_t int64_t
339 #endif
340 #include <errno.h>
341 #include <regex.h>
342 #include <limits.h>
343
344 #include "asterisk/ast_expr.h"
345 #include "asterisk/logger.h"
346 #ifndef STANDALONE
347 #include "asterisk/pbx.h"
348 #endif
349
350 #if defined(LONG_LONG_MIN) && !defined(QUAD_MIN)
351 #define QUAD_MIN LONG_LONG_MIN
352 #endif
353 #if defined(LONG_LONG_MAX) && !defined(QUAD_MAX)
354 #define QUAD_MAX LONG_LONG_MAX
355 #endif
356
357 #  if ! defined(QUAD_MIN)
358 #   define QUAD_MIN     (-0x7fffffffffffffffLL-1)
359 #  endif
360 #  if ! defined(QUAD_MAX)
361 #   define QUAD_MAX     (0x7fffffffffffffffLL)
362 #  endif
363 #define YYENABLE_NLS 0
364 #define YYPARSE_PARAM parseio
365 #define YYLEX_PARAM ((struct parse_io *)parseio)->scanner
366 #define YYERROR_VERBOSE 1
367 extern char extra_error_message[4095];
368 extern int extra_error_message_supplied;
369
370 enum valtype {
371         AST_EXPR_number, AST_EXPR_numeric_string, AST_EXPR_string
372 } ;
373
374 #ifdef STANDALONE
375 void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) __attribute__ ((format (printf,5,6)));
376 #endif
377
378 struct val {
379         enum valtype type;
380         union {
381                 char *s;
382                 FP___TYPE i; /* either long double, or just double, on a bad day */
383         } u;
384 } ;
385
386 enum node_type {
387         AST_EXPR_NODE_COMMA, AST_EXPR_NODE_STRING, AST_EXPR_NODE_VAL
388 } ;
389
390 struct expr_node 
391 {
392         enum node_type type;
393         struct val *val;
394         struct expr_node *left;
395         struct expr_node *right;
396 };
397
398
399 typedef void *yyscan_t;
400
401 struct parse_io
402 {
403         char *string;
404         struct val *val;
405         yyscan_t scanner;
406         struct ast_channel *chan;
407 };
408  
409 static int              chk_div __P((FP___TYPE, FP___TYPE));
410 static int              chk_minus __P((FP___TYPE, FP___TYPE, FP___TYPE));
411 static int              chk_plus __P((FP___TYPE, FP___TYPE, FP___TYPE));
412 static int              chk_times __P((FP___TYPE, FP___TYPE, FP___TYPE));
413 static void             free_value __P((struct val *));
414 static int              is_zero_or_null __P((struct val *));
415 static int              isstring __P((struct val *));
416 static struct val       *make_number __P((FP___TYPE));
417 static struct val       *make_str __P((const char *));
418 static struct val       *op_and __P((struct val *, struct val *));
419 static struct val       *op_colon __P((struct val *, struct val *));
420 static struct val       *op_eqtilde __P((struct val *, struct val *));
421 static struct val       *op_tildetilde __P((struct val *, struct val *));
422 static struct val       *op_div __P((struct val *, struct val *));
423 static struct val       *op_eq __P((struct val *, struct val *));
424 static struct val       *op_ge __P((struct val *, struct val *));
425 static struct val       *op_gt __P((struct val *, struct val *));
426 static struct val       *op_le __P((struct val *, struct val *));
427 static struct val       *op_lt __P((struct val *, struct val *));
428 static struct val       *op_cond __P((struct val *, struct val *, struct val *));
429 static struct val       *op_minus __P((struct val *, struct val *));
430 static struct val       *op_negate __P((struct val *));
431 static struct val       *op_compl __P((struct val *));
432 static struct val       *op_ne __P((struct val *, struct val *));
433 static struct val       *op_or __P((struct val *, struct val *));
434 static struct val       *op_plus __P((struct val *, struct val *));
435 static struct val       *op_rem __P((struct val *, struct val *));
436 static struct val       *op_times __P((struct val *, struct val *));
437 static struct val   *op_func(struct val *funcname, struct expr_node *arglist, struct ast_channel *chan);
438 static int              to_number __P((struct val *));
439 static void             to_string __P((struct val *));
440 static struct expr_node *alloc_expr_node(enum node_type);
441 static void destroy_arglist(struct expr_node *arglist);
442
443 /* uh, if I want to predeclare yylex with a YYLTYPE, I have to predeclare the yyltype... sigh */
444 typedef struct yyltype
445 {
446   int first_line;
447   int first_column;
448
449   int last_line;
450   int last_column;
451 } yyltype;
452
453 # define YYLTYPE yyltype
454 # define YYLTYPE_IS_TRIVIAL 1
455
456 /* we will get warning about no prototype for yylex! But we can't
457    define it here, we have no definition yet for YYSTYPE. */
458
459 int             ast_yyerror(const char *,YYLTYPE *, struct parse_io *);
460  
461 /* I wanted to add args to the yyerror routine, so I could print out
462    some useful info about the error. Not as easy as it looks, but it
463    is possible. */
464 #define ast_yyerror(x) ast_yyerror(x,&yyloc,parseio)
465 #define DESTROY(x) {if((x)->type == AST_EXPR_numeric_string || (x)->type == AST_EXPR_string) free((x)->u.s); (x)->u.s = 0; free(x);}
466
467
468 /* Enabling traces.  */
469 #ifndef YYDEBUG
470 # define YYDEBUG 0
471 #endif
472
473 /* Enabling verbose error messages.  */
474 #ifdef YYERROR_VERBOSE
475 # undef YYERROR_VERBOSE
476 # define YYERROR_VERBOSE 1
477 #else
478 # define YYERROR_VERBOSE 0
479 #endif
480
481 /* Enabling the token table.  */
482 #ifndef YYTOKEN_TABLE
483 # define YYTOKEN_TABLE 0
484 #endif
485
486 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
487 typedef union YYSTYPE
488 #line 344 "ast_expr2.y"
489 {
490         struct val *val;
491         struct expr_node *arglist;
492 }
493 /* Line 187 of yacc.c.  */
494 #line 495 "ast_expr2.c"
495         YYSTYPE;
496 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
497 # define YYSTYPE_IS_DECLARED 1
498 # define YYSTYPE_IS_TRIVIAL 1
499 #endif
500
501 #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
502 typedef struct YYLTYPE
503 {
504   int first_line;
505   int first_column;
506   int last_line;
507   int last_column;
508 } YYLTYPE;
509 # define yyltype YYLTYPE /* obsolescent; will be withdrawn */
510 # define YYLTYPE_IS_DECLARED 1
511 # define YYLTYPE_IS_TRIVIAL 1
512 #endif
513
514
515 /* Copy the second part of user declarations.  */
516 #line 349 "ast_expr2.y"
517
518 extern int              ast_yylex __P((YYSTYPE *, YYLTYPE *, yyscan_t));
519
520
521 /* Line 216 of yacc.c.  */
522 #line 523 "ast_expr2.c"
523
524 #ifdef short
525 # undef short
526 #endif
527
528 #ifdef YYTYPE_UINT8
529 typedef YYTYPE_UINT8 yytype_uint8;
530 #else
531 typedef unsigned char yytype_uint8;
532 #endif
533
534 #ifdef YYTYPE_INT8
535 typedef YYTYPE_INT8 yytype_int8;
536 #elif (defined __STDC__ || defined __C99__FUNC__ \
537      || defined __cplusplus || defined _MSC_VER)
538 typedef signed char yytype_int8;
539 #else
540 typedef short int yytype_int8;
541 #endif
542
543 #ifdef YYTYPE_UINT16
544 typedef YYTYPE_UINT16 yytype_uint16;
545 #else
546 typedef unsigned short int yytype_uint16;
547 #endif
548
549 #ifdef YYTYPE_INT16
550 typedef YYTYPE_INT16 yytype_int16;
551 #else
552 typedef short int yytype_int16;
553 #endif
554
555 #ifndef YYSIZE_T
556 # ifdef __SIZE_TYPE__
557 #  define YYSIZE_T __SIZE_TYPE__
558 # elif defined size_t
559 #  define YYSIZE_T size_t
560 # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
561      || defined __cplusplus || defined _MSC_VER)
562 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
563 #  define YYSIZE_T size_t
564 # else
565 #  define YYSIZE_T unsigned int
566 # endif
567 #endif
568
569 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
570
571 #ifndef YY_
572 # if YYENABLE_NLS
573 #  if ENABLE_NLS
574 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
575 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
576 #  endif
577 # endif
578 # ifndef YY_
579 #  define YY_(msgid) msgid
580 # endif
581 #endif
582
583 /* Suppress unused-variable warnings by "using" E.  */
584 #if ! defined lint || defined __GNUC__
585 # define YYUSE(e) ((void) (e))
586 #else
587 # define YYUSE(e) /* empty */
588 #endif
589
590 /* Identity function, used to suppress warnings about constant conditions.  */
591 #ifndef lint
592 # define YYID(n) (n)
593 #else
594 #if (defined __STDC__ || defined __C99__FUNC__ \
595      || defined __cplusplus || defined _MSC_VER)
596 static int
597 YYID (int i)
598 #else
599 static int
600 YYID (i)
601     int i;
602 #endif
603 {
604   return i;
605 }
606 #endif
607
608 #if ! defined yyoverflow || YYERROR_VERBOSE
609
610 /* The parser invokes alloca or malloc; define the necessary symbols.  */
611
612 # ifdef YYSTACK_USE_ALLOCA
613 #  if YYSTACK_USE_ALLOCA
614 #   ifdef __GNUC__
615 #    define YYSTACK_ALLOC __builtin_alloca
616 #   elif defined __BUILTIN_VA_ARG_INCR
617 #    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
618 #   elif defined _AIX
619 #    define YYSTACK_ALLOC __alloca
620 #   elif defined _MSC_VER
621 #    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
622 #    define alloca _alloca
623 #   else
624 #    define YYSTACK_ALLOC alloca
625 #    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
626      || defined __cplusplus || defined _MSC_VER)
627 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
628 #     ifndef _STDLIB_H
629 #      define _STDLIB_H 1
630 #     endif
631 #    endif
632 #   endif
633 #  endif
634 # endif
635
636 # ifdef YYSTACK_ALLOC
637    /* Pacify GCC's `empty if-body' warning.  */
638 #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
639 #  ifndef YYSTACK_ALLOC_MAXIMUM
640     /* The OS might guarantee only one guard page at the bottom of the stack,
641        and a page size can be as small as 4096 bytes.  So we cannot safely
642        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
643        to allow for a few compiler-allocated temporary stack slots.  */
644 #   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
645 #  endif
646 # else
647 #  define YYSTACK_ALLOC YYMALLOC
648 #  define YYSTACK_FREE YYFREE
649 #  ifndef YYSTACK_ALLOC_MAXIMUM
650 #   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
651 #  endif
652 #  if (defined __cplusplus && ! defined _STDLIB_H \
653        && ! ((defined YYMALLOC || defined malloc) \
654              && (defined YYFREE || defined free)))
655 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
656 #   ifndef _STDLIB_H
657 #    define _STDLIB_H 1
658 #   endif
659 #  endif
660 #  ifndef YYMALLOC
661 #   define YYMALLOC malloc
662 #   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
663      || defined __cplusplus || defined _MSC_VER)
664 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
665 #   endif
666 #  endif
667 #  ifndef YYFREE
668 #   define YYFREE free
669 #   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
670      || defined __cplusplus || defined _MSC_VER)
671 void free (void *); /* INFRINGES ON USER NAME SPACE */
672 #   endif
673 #  endif
674 # endif
675 #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
676
677
678 #if (! defined yyoverflow \
679      && (! defined __cplusplus \
680          || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
681              && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
682
683 /* A type that is properly aligned for any stack member.  */
684 union yyalloc
685 {
686   yytype_int16 yyss;
687   YYSTYPE yyvs;
688     YYLTYPE yyls;
689 };
690
691 /* The size of the maximum gap between one aligned stack and the next.  */
692 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
693
694 /* The size of an array large to enough to hold all stacks, each with
695    N elements.  */
696 # define YYSTACK_BYTES(N) \
697      ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
698       + 2 * YYSTACK_GAP_MAXIMUM)
699
700 /* Copy COUNT objects from FROM to TO.  The source and destination do
701    not overlap.  */
702 # ifndef YYCOPY
703 #  if defined __GNUC__ && 1 < __GNUC__
704 #   define YYCOPY(To, From, Count) \
705       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
706 #  else
707 #   define YYCOPY(To, From, Count)              \
708       do                                        \
709         {                                       \
710           YYSIZE_T yyi;                         \
711           for (yyi = 0; yyi < (Count); yyi++)   \
712             (To)[yyi] = (From)[yyi];            \
713         }                                       \
714       while (YYID (0))
715 #  endif
716 # endif
717
718 /* Relocate STACK from its old location to the new one.  The
719    local variables YYSIZE and YYSTACKSIZE give the old and new number of
720    elements in the stack, and YYPTR gives the new location of the
721    stack.  Advance YYPTR to a properly aligned location for the next
722    stack.  */
723 # define YYSTACK_RELOCATE(Stack)                                        \
724     do                                                                  \
725       {                                                                 \
726         YYSIZE_T yynewbytes;                                            \
727         YYCOPY (&yyptr->Stack, Stack, yysize);                          \
728         Stack = &yyptr->Stack;                                          \
729         yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
730         yyptr += yynewbytes / sizeof (*yyptr);                          \
731       }                                                                 \
732     while (YYID (0))
733
734 #endif
735
736 /* YYFINAL -- State number of the termination state.  */
737 #define YYFINAL  11
738 /* YYLAST -- Last index in YYTABLE.  */
739 #define YYLAST   159
740
741 /* YYNTOKENS -- Number of terminals.  */
742 #define YYNTOKENS  26
743 /* YYNNTS -- Number of nonterminals.  */
744 #define YYNNTS  4
745 /* YYNRULES -- Number of rules.  */
746 #define YYNRULES  28
747 /* YYNRULES -- Number of states.  */
748 #define YYNSTATES  54
749
750 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
751 #define YYUNDEFTOK  2
752 #define YYMAXUTOK   280
753
754 #define YYTRANSLATE(YYX)                                                \
755   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
756
757 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
758 static const yytype_uint8 yytranslate[] =
759 {
760        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
761        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
762        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
763        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
764        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
765        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
766        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
767        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
768        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
769        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
770        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
771        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
772        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
773        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
774        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
775        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
776        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
777        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
778        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
779        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
780        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
781        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
782        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
783        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
784        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
785        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
786        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
787       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
788       25
789 };
790
791 #if YYDEBUG
792 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
793    YYRHS.  */
794 static const yytype_uint8 yyprhs[] =
795 {
796        0,     0,     3,     5,     6,     8,    12,    15,    20,    22,
797       26,    30,    34,    38,    42,    46,    50,    54,    58,    62,
798       66,    69,    72,    76,    80,    84,    88,    92,    98
799 };
800
801 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
802 static const yytype_int8 yyrhs[] =
803 {
804       27,     0,    -1,    29,    -1,    -1,    29,    -1,    28,     3,
805       29,    -1,    28,     3,    -1,    25,    23,    28,    24,    -1,
806       25,    -1,    23,    29,    24,    -1,    29,     6,    29,    -1,
807       29,     7,    29,    -1,    29,    13,    29,    -1,    29,    12,
808       29,    -1,    29,    11,    29,    -1,    29,    10,    29,    -1,
809       29,     9,    29,    -1,    29,     8,    29,    -1,    29,    15,
810       29,    -1,    29,    14,    29,    -1,    14,    29,    -1,    19,
811       29,    -1,    29,    18,    29,    -1,    29,    17,    29,    -1,
812       29,    16,    29,    -1,    29,    22,    29,    -1,    29,    21,
813       29,    -1,    29,     5,    29,     4,    29,    -1,    29,    20,
814       29,    -1
815 };
816
817 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
818 static const yytype_uint16 yyrline[] =
819 {
820        0,   373,   373,   381,   388,   389,   395,   404,   410,   411,
821      415,   419,   423,   427,   431,   435,   439,   443,   447,   451,
822      455,   459,   463,   467,   471,   475,   479,   483,   488
823 };
824 #endif
825
826 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
827 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
828    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
829 static const char *const yytname[] =
830 {
831   "$end", "error", "$undefined", "TOK_COMMA", "TOK_COLONCOLON",
832   "TOK_COND", "TOK_OR", "TOK_AND", "TOK_NE", "TOK_LE", "TOK_GE", "TOK_LT",
833   "TOK_GT", "TOK_EQ", "TOK_MINUS", "TOK_PLUS", "TOK_MOD", "TOK_DIV",
834   "TOK_MULT", "TOK_COMPL", "TOK_TILDETILDE", "TOK_EQTILDE", "TOK_COLON",
835   "TOK_LP", "TOK_RP", "TOKEN", "$accept", "start", "arglist", "expr", 0
836 };
837 #endif
838
839 # ifdef YYPRINT
840 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
841    token YYLEX-NUM.  */
842 static const yytype_uint16 yytoknum[] =
843 {
844        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
845      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
846      275,   276,   277,   278,   279,   280
847 };
848 # endif
849
850 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
851 static const yytype_uint8 yyr1[] =
852 {
853        0,    26,    27,    27,    28,    28,    28,    29,    29,    29,
854       29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
855       29,    29,    29,    29,    29,    29,    29,    29,    29
856 };
857
858 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
859 static const yytype_uint8 yyr2[] =
860 {
861        0,     2,     1,     0,     1,     3,     2,     4,     1,     3,
862        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
863        2,     2,     3,     3,     3,     3,     3,     5,     3
864 };
865
866 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
867    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
868    means the default is an error.  */
869 static const yytype_uint8 yydefact[] =
870 {
871        3,     0,     0,     0,     8,     0,     2,    20,    21,     0,
872        0,     1,     0,     0,     0,     0,     0,     0,     0,     0,
873        0,     0,     0,     0,     0,     0,     0,     0,     0,     9,
874        0,     4,     0,    10,    11,    17,    16,    15,    14,    13,
875       12,    19,    18,    24,    23,    22,    28,    26,    25,     6,
876        7,     0,     5,    27
877 };
878
879 /* YYDEFGOTO[NTERM-NUM].  */
880 static const yytype_int8 yydefgoto[] =
881 {
882       -1,     5,    30,     6
883 };
884
885 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
886    STATE-NUM.  */
887 #define YYPACT_NINF -18
888 static const yytype_int16 yypact[] =
889 {
890      118,   118,   118,   118,   -15,     6,    65,   -17,   -17,    25,
891      118,   -18,   118,   118,   118,   118,   118,   118,   118,   118,
892      118,   118,   118,   118,   118,   118,   118,   118,   118,   -18,
893        4,    65,    47,    98,   113,   130,   130,   130,   130,   130,
894      130,   137,   137,   -17,   -17,   -17,   -18,   -18,   -18,   118,
895      -18,   118,    65,    82
896 };
897
898 /* YYPGOTO[NTERM-NUM].  */
899 static const yytype_int8 yypgoto[] =
900 {
901      -18,   -18,   -18,    -1
902 };
903
904 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
905    positive, shift that token.  If negative, reduce the rule which
906    number is the opposite.  If zero, do what YYDEFACT says.
907    If YYTABLE_NINF, syntax error.  */
908 #define YYTABLE_NINF -1
909 static const yytype_uint8 yytable[] =
910 {
911        7,     8,     9,    26,    27,    28,    11,    49,    10,    31,
912        0,    32,    33,    34,    35,    36,    37,    38,    39,    40,
913       41,    42,    43,    44,    45,    46,    47,    48,    50,     0,
914       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
915       22,    23,    24,    25,     0,    26,    27,    28,    52,    29,
916       53,    51,    12,    13,    14,    15,    16,    17,    18,    19,
917       20,    21,    22,    23,    24,    25,     0,    26,    27,    28,
918       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
919       22,    23,    24,    25,     0,    26,    27,    28,    13,    14,
920       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
921       25,     0,    26,    27,    28,    14,    15,    16,    17,    18,
922       19,    20,    21,    22,    23,    24,    25,     0,    26,    27,
923       28,    15,    16,    17,    18,    19,    20,    21,    22,    23,
924       24,    25,     1,    26,    27,    28,     0,     2,     0,     0,
925        0,     3,     0,     4,    21,    22,    23,    24,    25,     0,
926       26,    27,    28,    23,    24,    25,     0,    26,    27,    28
927 };
928
929 static const yytype_int8 yycheck[] =
930 {
931        1,     2,     3,    20,    21,    22,     0,     3,    23,    10,
932       -1,    12,    13,    14,    15,    16,    17,    18,    19,    20,
933       21,    22,    23,    24,    25,    26,    27,    28,    24,    -1,
934        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
935       15,    16,    17,    18,    -1,    20,    21,    22,    49,    24,
936       51,     4,     5,     6,     7,     8,     9,    10,    11,    12,
937       13,    14,    15,    16,    17,    18,    -1,    20,    21,    22,
938        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
939       15,    16,    17,    18,    -1,    20,    21,    22,     6,     7,
940        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
941       18,    -1,    20,    21,    22,     7,     8,     9,    10,    11,
942       12,    13,    14,    15,    16,    17,    18,    -1,    20,    21,
943       22,     8,     9,    10,    11,    12,    13,    14,    15,    16,
944       17,    18,    14,    20,    21,    22,    -1,    19,    -1,    -1,
945       -1,    23,    -1,    25,    14,    15,    16,    17,    18,    -1,
946       20,    21,    22,    16,    17,    18,    -1,    20,    21,    22
947 };
948
949 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
950    symbol of state STATE-NUM.  */
951 static const yytype_uint8 yystos[] =
952 {
953        0,    14,    19,    23,    25,    27,    29,    29,    29,    29,
954       23,     0,     5,     6,     7,     8,     9,    10,    11,    12,
955       13,    14,    15,    16,    17,    18,    20,    21,    22,    24,
956       28,    29,    29,    29,    29,    29,    29,    29,    29,    29,
957       29,    29,    29,    29,    29,    29,    29,    29,    29,     3,
958       24,     4,    29,    29
959 };
960
961 #define yyerrok         (yyerrstatus = 0)
962 #define yyclearin       (yychar = YYEMPTY)
963 #define YYEMPTY         (-2)
964 #define YYEOF           0
965
966 #define YYACCEPT        goto yyacceptlab
967 #define YYABORT         goto yyabortlab
968 #define YYERROR         goto yyerrorlab
969
970
971 /* Like YYERROR except do call yyerror.  This remains here temporarily
972    to ease the transition to the new meaning of YYERROR, for GCC.
973    Once GCC version 2 has supplanted version 1, this can go.  */
974
975 #define YYFAIL          goto yyerrlab
976
977 #define YYRECOVERING()  (!!yyerrstatus)
978
979 #define YYBACKUP(Token, Value)                                  \
980 do                                                              \
981   if (yychar == YYEMPTY && yylen == 1)                          \
982     {                                                           \
983       yychar = (Token);                                         \
984       yylval = (Value);                                         \
985       yytoken = YYTRANSLATE (yychar);                           \
986       YYPOPSTACK (1);                                           \
987       goto yybackup;                                            \
988     }                                                           \
989   else                                                          \
990     {                                                           \
991       yyerror (YY_("syntax error: cannot back up")); \
992       YYERROR;                                                  \
993     }                                                           \
994 while (YYID (0))
995
996
997 #define YYTERROR        1
998 #define YYERRCODE       256
999
1000
1001 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
1002    If N is 0, then set CURRENT to the empty location which ends
1003    the previous symbol: RHS[0] (always defined).  */
1004
1005 #define YYRHSLOC(Rhs, K) ((Rhs)[K])
1006 #ifndef YYLLOC_DEFAULT
1007 # define YYLLOC_DEFAULT(Current, Rhs, N)                                \
1008     do                                                                  \
1009       if (YYID (N))                                                    \
1010         {                                                               \
1011           (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
1012           (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
1013           (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
1014           (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
1015         }                                                               \
1016       else                                                              \
1017         {                                                               \
1018           (Current).first_line   = (Current).last_line   =              \
1019             YYRHSLOC (Rhs, 0).last_line;                                \
1020           (Current).first_column = (Current).last_column =              \
1021             YYRHSLOC (Rhs, 0).last_column;                              \
1022         }                                                               \
1023     while (YYID (0))
1024 #endif
1025
1026
1027 /* YY_LOCATION_PRINT -- Print the location on the stream.
1028    This macro was not mandated originally: define only if we know
1029    we won't break user code: when these are the locations we know.  */
1030
1031 #ifndef YY_LOCATION_PRINT
1032 # if YYLTYPE_IS_TRIVIAL
1033 #  define YY_LOCATION_PRINT(File, Loc)                  \
1034      fprintf (File, "%d.%d-%d.%d",                      \
1035               (Loc).first_line, (Loc).first_column,     \
1036               (Loc).last_line,  (Loc).last_column)
1037 # else
1038 #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
1039 # endif
1040 #endif
1041
1042
1043 /* YYLEX -- calling `yylex' with the right arguments.  */
1044
1045 #ifdef YYLEX_PARAM
1046 # define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
1047 #else
1048 # define YYLEX yylex (&yylval, &yylloc)
1049 #endif
1050
1051 /* Enable debugging if requested.  */
1052 #if YYDEBUG
1053
1054 # ifndef YYFPRINTF
1055 #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
1056 #  define YYFPRINTF fprintf
1057 # endif
1058
1059 # define YYDPRINTF(Args)                        \
1060 do {                                            \
1061   if (yydebug)                                  \
1062     YYFPRINTF Args;                             \
1063 } while (YYID (0))
1064
1065 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
1066 do {                                                                      \
1067   if (yydebug)                                                            \
1068     {                                                                     \
1069       YYFPRINTF (stderr, "%s ", Title);                                   \
1070       yy_symbol_print (stderr,                                            \
1071                   Type, Value, Location); \
1072       YYFPRINTF (stderr, "\n");                                           \
1073     }                                                                     \
1074 } while (YYID (0))
1075
1076
1077 /*--------------------------------.
1078 | Print this symbol on YYOUTPUT.  |
1079 `--------------------------------*/
1080
1081 /*ARGSUSED*/
1082 #if (defined __STDC__ || defined __C99__FUNC__ \
1083      || defined __cplusplus || defined _MSC_VER)
1084 static void
1085 yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
1086 #else
1087 static void
1088 yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
1089     FILE *yyoutput;
1090     int yytype;
1091     YYSTYPE const * const yyvaluep;
1092     YYLTYPE const * const yylocationp;
1093 #endif
1094 {
1095   if (!yyvaluep)
1096     return;
1097   YYUSE (yylocationp);
1098 # ifdef YYPRINT
1099   if (yytype < YYNTOKENS)
1100     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
1101 # else
1102   YYUSE (yyoutput);
1103 # endif
1104   switch (yytype)
1105     {
1106       default:
1107         break;
1108     }
1109 }
1110
1111
1112 /*--------------------------------.
1113 | Print this symbol on YYOUTPUT.  |
1114 `--------------------------------*/
1115
1116 #if (defined __STDC__ || defined __C99__FUNC__ \
1117      || defined __cplusplus || defined _MSC_VER)
1118 static void
1119 yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
1120 #else
1121 static void
1122 yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
1123     FILE *yyoutput;
1124     int yytype;
1125     YYSTYPE const * const yyvaluep;
1126     YYLTYPE const * const yylocationp;
1127 #endif
1128 {
1129   if (yytype < YYNTOKENS)
1130     YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
1131   else
1132     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
1133
1134   YY_LOCATION_PRINT (yyoutput, *yylocationp);
1135   YYFPRINTF (yyoutput, ": ");
1136   yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
1137   YYFPRINTF (yyoutput, ")");
1138 }
1139
1140 /*------------------------------------------------------------------.
1141 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
1142 | TOP (included).                                                   |
1143 `------------------------------------------------------------------*/
1144
1145 #if (defined __STDC__ || defined __C99__FUNC__ \
1146      || defined __cplusplus || defined _MSC_VER)
1147 static void
1148 yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
1149 #else
1150 static void
1151 yy_stack_print (bottom, top)
1152     yytype_int16 *bottom;
1153     yytype_int16 *top;
1154 #endif
1155 {
1156   YYFPRINTF (stderr, "Stack now");
1157   for (; bottom <= top; ++bottom)
1158     YYFPRINTF (stderr, " %d", *bottom);
1159   YYFPRINTF (stderr, "\n");
1160 }
1161
1162 # define YY_STACK_PRINT(Bottom, Top)                            \
1163 do {                                                            \
1164   if (yydebug)                                                  \
1165     yy_stack_print ((Bottom), (Top));                           \
1166 } while (YYID (0))
1167
1168
1169 /*------------------------------------------------.
1170 | Report that the YYRULE is going to be reduced.  |
1171 `------------------------------------------------*/
1172
1173 #if (defined __STDC__ || defined __C99__FUNC__ \
1174      || defined __cplusplus || defined _MSC_VER)
1175 static void
1176 yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
1177 #else
1178 static void
1179 yy_reduce_print (yyvsp, yylsp, yyrule)
1180     YYSTYPE *yyvsp;
1181     YYLTYPE *yylsp;
1182     int yyrule;
1183 #endif
1184 {
1185   int yynrhs = yyr2[yyrule];
1186   int yyi;
1187   unsigned long int yylno = yyrline[yyrule];
1188   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
1189              yyrule - 1, yylno);
1190   /* The symbols being reduced.  */
1191   for (yyi = 0; yyi < yynrhs; yyi++)
1192     {
1193       fprintf (stderr, "   $%d = ", yyi + 1);
1194       yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
1195                        &(yyvsp[(yyi + 1) - (yynrhs)])
1196                        , &(yylsp[(yyi + 1) - (yynrhs)])                );
1197       fprintf (stderr, "\n");
1198     }
1199 }
1200
1201 # define YY_REDUCE_PRINT(Rule)          \
1202 do {                                    \
1203   if (yydebug)                          \
1204     yy_reduce_print (yyvsp, yylsp, Rule); \
1205 } while (YYID (0))
1206
1207 /* Nonzero means print parse trace.  It is left uninitialized so that
1208    multiple parsers can coexist.  */
1209 int yydebug;
1210 #else /* !YYDEBUG */
1211 # define YYDPRINTF(Args)
1212 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
1213 # define YY_STACK_PRINT(Bottom, Top)
1214 # define YY_REDUCE_PRINT(Rule)
1215 #endif /* !YYDEBUG */
1216
1217
1218 /* YYINITDEPTH -- initial size of the parser's stacks.  */
1219 #ifndef YYINITDEPTH
1220 # define YYINITDEPTH 200
1221 #endif
1222
1223 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
1224    if the built-in stack extension method is used).
1225
1226    Do not make this value too large; the results are undefined if
1227    YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
1228    evaluated with infinite-precision integer arithmetic.  */
1229
1230 #ifndef YYMAXDEPTH
1231 # define YYMAXDEPTH 10000
1232 #endif
1233
1234 \f
1235
1236 #if YYERROR_VERBOSE
1237
1238 # ifndef yystrlen
1239 #  if defined __GLIBC__ && defined _STRING_H
1240 #   define yystrlen strlen
1241 #  else
1242 /* Return the length of YYSTR.  */
1243 #if (defined __STDC__ || defined __C99__FUNC__ \
1244      || defined __cplusplus || defined _MSC_VER)
1245 static YYSIZE_T
1246 yystrlen (const char *yystr)
1247 #else
1248 static YYSIZE_T
1249 yystrlen (yystr)
1250     const char *yystr;
1251 #endif
1252 {
1253   YYSIZE_T yylen;
1254   for (yylen = 0; yystr[yylen]; yylen++)
1255     continue;
1256   return yylen;
1257 }
1258 #  endif
1259 # endif
1260
1261 # ifndef yystpcpy
1262 #  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
1263 #   define yystpcpy stpcpy
1264 #  else
1265 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
1266    YYDEST.  */
1267 #if (defined __STDC__ || defined __C99__FUNC__ \
1268      || defined __cplusplus || defined _MSC_VER)
1269 static char *
1270 yystpcpy (char *yydest, const char *yysrc)
1271 #else
1272 static char *
1273 yystpcpy (yydest, yysrc)
1274     char *yydest;
1275     const char *yysrc;
1276 #endif
1277 {
1278   char *yyd = yydest;
1279   const char *yys = yysrc;
1280
1281   while ((*yyd++ = *yys++) != '\0')
1282     continue;
1283
1284   return yyd - 1;
1285 }
1286 #  endif
1287 # endif
1288
1289 # ifndef yytnamerr
1290 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
1291    quotes and backslashes, so that it's suitable for yyerror.  The
1292    heuristic is that double-quoting is unnecessary unless the string
1293    contains an apostrophe, a comma, or backslash (other than
1294    backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
1295    null, do not copy; instead, return the length of what the result
1296    would have been.  */
1297 static YYSIZE_T
1298 yytnamerr (char *yyres, const char *yystr)
1299 {
1300   if (*yystr == '"')
1301     {
1302       YYSIZE_T yyn = 0;
1303       char const *yyp = yystr;
1304
1305       for (;;)
1306         switch (*++yyp)
1307           {
1308           case '\'':
1309           case ',':
1310             goto do_not_strip_quotes;
1311
1312           case '\\':
1313             if (*++yyp != '\\')
1314               goto do_not_strip_quotes;
1315             /* Fall through.  */
1316           default:
1317             if (yyres)
1318               yyres[yyn] = *yyp;
1319             yyn++;
1320             break;
1321
1322           case '"':
1323             if (yyres)
1324               yyres[yyn] = '\0';
1325             return yyn;
1326           }
1327     do_not_strip_quotes: ;
1328     }
1329
1330   if (! yyres)
1331     return yystrlen (yystr);
1332
1333   return yystpcpy (yyres, yystr) - yyres;
1334 }
1335 # endif
1336
1337 /* Copy into YYRESULT an error message about the unexpected token
1338    YYCHAR while in state YYSTATE.  Return the number of bytes copied,
1339    including the terminating null byte.  If YYRESULT is null, do not
1340    copy anything; just return the number of bytes that would be
1341    copied.  As a special case, return 0 if an ordinary "syntax error"
1342    message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
1343    size calculation.  */
1344 static YYSIZE_T
1345 yysyntax_error (char *yyresult, int yystate, int yychar)
1346 {
1347   int yyn = yypact[yystate];
1348
1349   if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
1350     return 0;
1351   else
1352     {
1353       int yytype = YYTRANSLATE (yychar);
1354       YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
1355       YYSIZE_T yysize = yysize0;
1356       YYSIZE_T yysize1;
1357       int yysize_overflow = 0;
1358       enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1359       char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1360       int yyx;
1361
1362 # if 0
1363       /* This is so xgettext sees the translatable formats that are
1364          constructed on the fly.  */
1365       YY_("syntax error, unexpected %s");
1366       YY_("syntax error, unexpected %s, expecting %s");
1367       YY_("syntax error, unexpected %s, expecting %s or %s");
1368       YY_("syntax error, unexpected %s, expecting %s or %s or %s");
1369       YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
1370 # endif
1371       char *yyfmt;
1372       char const *yyf;
1373       static char const yyunexpected[] = "syntax error, unexpected %s";
1374       static char const yyexpecting[] = ", expecting %s";
1375       static char const yyor[] = " or %s";
1376       char yyformat[sizeof yyunexpected
1377                     + sizeof yyexpecting - 1
1378                     + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
1379                        * (sizeof yyor - 1))];
1380       char const *yyprefix = yyexpecting;
1381
1382       /* Start YYX at -YYN if negative to avoid negative indexes in
1383          YYCHECK.  */
1384       int yyxbegin = yyn < 0 ? -yyn : 0;
1385
1386       /* Stay within bounds of both yycheck and yytname.  */
1387       int yychecklim = YYLAST - yyn + 1;
1388       int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1389       int yycount = 1;
1390
1391       yyarg[0] = yytname[yytype];
1392       yyfmt = yystpcpy (yyformat, yyunexpected);
1393
1394       for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1395         if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1396           {
1397             if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1398               {
1399                 yycount = 1;
1400                 yysize = yysize0;
1401                 yyformat[sizeof yyunexpected - 1] = '\0';
1402                 break;
1403               }
1404             yyarg[yycount++] = yytname[yyx];
1405             yysize1 = yysize + yytnamerr (0, yytname[yyx]);
1406             yysize_overflow |= (yysize1 < yysize);
1407             yysize = yysize1;
1408             yyfmt = yystpcpy (yyfmt, yyprefix);
1409             yyprefix = yyor;
1410           }
1411
1412       yyf = YY_(yyformat);
1413       yysize1 = yysize + yystrlen (yyf);
1414       yysize_overflow |= (yysize1 < yysize);
1415       yysize = yysize1;
1416
1417       if (yysize_overflow)
1418         return YYSIZE_MAXIMUM;
1419
1420       if (yyresult)
1421         {
1422           /* Avoid sprintf, as that infringes on the user's name space.
1423              Don't have undefined behavior even if the translation
1424              produced a string with the wrong number of "%s"s.  */
1425           char *yyp = yyresult;
1426           int yyi = 0;
1427           while ((*yyp = *yyf) != '\0')
1428             {
1429               if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
1430                 {
1431                   yyp += yytnamerr (yyp, yyarg[yyi++]);
1432                   yyf += 2;
1433                 }
1434               else
1435                 {
1436                   yyp++;
1437                   yyf++;
1438                 }
1439             }
1440         }
1441       return yysize;
1442     }
1443 }
1444 #endif /* YYERROR_VERBOSE */
1445 \f
1446
1447 /*-----------------------------------------------.
1448 | Release the memory associated to this symbol.  |
1449 `-----------------------------------------------*/
1450
1451 /*ARGSUSED*/
1452 #if (defined __STDC__ || defined __C99__FUNC__ \
1453      || defined __cplusplus || defined _MSC_VER)
1454 static void
1455 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
1456 #else
1457 static void
1458 yydestruct (yymsg, yytype, yyvaluep, yylocationp)
1459     const char *yymsg;
1460     int yytype;
1461     YYSTYPE *yyvaluep;
1462     YYLTYPE *yylocationp;
1463 #endif
1464 {
1465   YYUSE (yyvaluep);
1466   YYUSE (yylocationp);
1467
1468   if (!yymsg)
1469     yymsg = "Deleting";
1470   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1471
1472   switch (yytype)
1473     {
1474       case 4: /* "TOK_COLONCOLON" */
1475 #line 367 "ast_expr2.y"
1476         {  free_value((yyvaluep->val)); };
1477 #line 1478 "ast_expr2.c"
1478         break;
1479       case 5: /* "TOK_COND" */
1480 #line 367 "ast_expr2.y"
1481         {  free_value((yyvaluep->val)); };
1482 #line 1483 "ast_expr2.c"
1483         break;
1484       case 6: /* "TOK_OR" */
1485 #line 367 "ast_expr2.y"
1486         {  free_value((yyvaluep->val)); };
1487 #line 1488 "ast_expr2.c"
1488         break;
1489       case 7: /* "TOK_AND" */
1490 #line 367 "ast_expr2.y"
1491         {  free_value((yyvaluep->val)); };
1492 #line 1493 "ast_expr2.c"
1493         break;
1494       case 8: /* "TOK_NE" */
1495 #line 367 "ast_expr2.y"
1496         {  free_value((yyvaluep->val)); };
1497 #line 1498 "ast_expr2.c"
1498         break;
1499       case 9: /* "TOK_LE" */
1500 #line 367 "ast_expr2.y"
1501         {  free_value((yyvaluep->val)); };
1502 #line 1503 "ast_expr2.c"
1503         break;
1504       case 10: /* "TOK_GE" */
1505 #line 367 "ast_expr2.y"
1506         {  free_value((yyvaluep->val)); };
1507 #line 1508 "ast_expr2.c"
1508         break;
1509       case 11: /* "TOK_LT" */
1510 #line 367 "ast_expr2.y"
1511         {  free_value((yyvaluep->val)); };
1512 #line 1513 "ast_expr2.c"
1513         break;
1514       case 12: /* "TOK_GT" */
1515 #line 367 "ast_expr2.y"
1516         {  free_value((yyvaluep->val)); };
1517 #line 1518 "ast_expr2.c"
1518         break;
1519       case 13: /* "TOK_EQ" */
1520 #line 367 "ast_expr2.y"
1521         {  free_value((yyvaluep->val)); };
1522 #line 1523 "ast_expr2.c"
1523         break;
1524       case 14: /* "TOK_MINUS" */
1525 #line 367 "ast_expr2.y"
1526         {  free_value((yyvaluep->val)); };
1527 #line 1528 "ast_expr2.c"
1528         break;
1529       case 15: /* "TOK_PLUS" */
1530 #line 367 "ast_expr2.y"
1531         {  free_value((yyvaluep->val)); };
1532 #line 1533 "ast_expr2.c"
1533         break;
1534       case 16: /* "TOK_MOD" */
1535 #line 367 "ast_expr2.y"
1536         {  free_value((yyvaluep->val)); };
1537 #line 1538 "ast_expr2.c"
1538         break;
1539       case 17: /* "TOK_DIV" */
1540 #line 367 "ast_expr2.y"
1541         {  free_value((yyvaluep->val)); };
1542 #line 1543 "ast_expr2.c"
1543         break;
1544       case 18: /* "TOK_MULT" */
1545 #line 367 "ast_expr2.y"
1546         {  free_value((yyvaluep->val)); };
1547 #line 1548 "ast_expr2.c"
1548         break;
1549       case 19: /* "TOK_COMPL" */
1550 #line 367 "ast_expr2.y"
1551         {  free_value((yyvaluep->val)); };
1552 #line 1553 "ast_expr2.c"
1553         break;
1554       case 20: /* "TOK_TILDETILDE" */
1555 #line 367 "ast_expr2.y"
1556         {  free_value((yyvaluep->val)); };
1557 #line 1558 "ast_expr2.c"
1558         break;
1559       case 21: /* "TOK_EQTILDE" */
1560 #line 367 "ast_expr2.y"
1561         {  free_value((yyvaluep->val)); };
1562 #line 1563 "ast_expr2.c"
1563         break;
1564       case 22: /* "TOK_COLON" */
1565 #line 367 "ast_expr2.y"
1566         {  free_value((yyvaluep->val)); };
1567 #line 1568 "ast_expr2.c"
1568         break;
1569       case 23: /* "TOK_LP" */
1570 #line 367 "ast_expr2.y"
1571         {  free_value((yyvaluep->val)); };
1572 #line 1573 "ast_expr2.c"
1573         break;
1574       case 24: /* "TOK_RP" */
1575 #line 367 "ast_expr2.y"
1576         {  free_value((yyvaluep->val)); };
1577 #line 1578 "ast_expr2.c"
1578         break;
1579       case 25: /* "TOKEN" */
1580 #line 367 "ast_expr2.y"
1581         {  free_value((yyvaluep->val)); };
1582 #line 1583 "ast_expr2.c"
1583         break;
1584       case 29: /* "expr" */
1585 #line 367 "ast_expr2.y"
1586         {  free_value((yyvaluep->val)); };
1587 #line 1588 "ast_expr2.c"
1588         break;
1589
1590       default:
1591         break;
1592     }
1593 }
1594 \f
1595
1596 /* Prevent warnings from -Wmissing-prototypes.  */
1597
1598 #ifdef YYPARSE_PARAM
1599 #if defined __STDC__ || defined __cplusplus
1600 int yyparse (void *YYPARSE_PARAM);
1601 #else
1602 int yyparse ();
1603 #endif
1604 #else /* ! YYPARSE_PARAM */
1605 #if defined __STDC__ || defined __cplusplus
1606 int yyparse (void);
1607 #else
1608 int yyparse ();
1609 #endif
1610 #endif /* ! YYPARSE_PARAM */
1611
1612
1613
1614
1615
1616
1617 /*----------.
1618 | yyparse.  |
1619 `----------*/
1620
1621 #ifdef YYPARSE_PARAM
1622 #if (defined __STDC__ || defined __C99__FUNC__ \
1623      || defined __cplusplus || defined _MSC_VER)
1624 int
1625 yyparse (void *YYPARSE_PARAM)
1626 #else
1627 int
1628 yyparse (YYPARSE_PARAM)
1629     void *YYPARSE_PARAM;
1630 #endif
1631 #else /* ! YYPARSE_PARAM */
1632 #if (defined __STDC__ || defined __C99__FUNC__ \
1633      || defined __cplusplus || defined _MSC_VER)
1634 int
1635 yyparse (void)
1636 #else
1637 int
1638 yyparse ()
1639
1640 #endif
1641 #endif
1642 {
1643   /* The look-ahead symbol.  */
1644 int yychar;
1645
1646 /* The semantic value of the look-ahead symbol.  */
1647 YYSTYPE yylval;
1648
1649 /* Number of syntax errors so far.  */
1650 int yynerrs;
1651 /* Location data for the look-ahead symbol.  */
1652 YYLTYPE yylloc;
1653
1654   int yystate;
1655   int yyn;
1656   int yyresult;
1657   /* Number of tokens to shift before error messages enabled.  */
1658   int yyerrstatus;
1659   /* Look-ahead token as an internal (translated) token number.  */
1660   int yytoken = 0;
1661 #if YYERROR_VERBOSE
1662   /* Buffer for error messages, and its allocated size.  */
1663   char yymsgbuf[128];
1664   char *yymsg = yymsgbuf;
1665   YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1666 #endif
1667
1668   /* Three stacks and their tools:
1669      `yyss': related to states,
1670      `yyvs': related to semantic values,
1671      `yyls': related to locations.
1672
1673      Refer to the stacks thru separate pointers, to allow yyoverflow
1674      to reallocate them elsewhere.  */
1675
1676   /* The state stack.  */
1677   yytype_int16 yyssa[YYINITDEPTH];
1678   yytype_int16 *yyss = yyssa;
1679   yytype_int16 *yyssp;
1680
1681   /* The semantic value stack.  */
1682   YYSTYPE yyvsa[YYINITDEPTH];
1683   YYSTYPE *yyvs = yyvsa;
1684   YYSTYPE *yyvsp;
1685
1686   /* The location stack.  */
1687   YYLTYPE yylsa[YYINITDEPTH];
1688   YYLTYPE *yyls = yylsa;
1689   YYLTYPE *yylsp;
1690   /* The locations where the error started and ended.  */
1691   YYLTYPE yyerror_range[2];
1692
1693 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
1694
1695   YYSIZE_T yystacksize = YYINITDEPTH;
1696
1697   /* The variables used to return semantic value and location from the
1698      action routines.  */
1699   YYSTYPE yyval;
1700   YYLTYPE yyloc;
1701
1702   /* The number of symbols on the RHS of the reduced rule.
1703      Keep to zero when no symbol should be popped.  */
1704   int yylen = 0;
1705
1706   YYDPRINTF ((stderr, "Starting parse\n"));
1707
1708   yystate = 0;
1709   yyerrstatus = 0;
1710   yynerrs = 0;
1711   yychar = YYEMPTY;             /* Cause a token to be read.  */
1712
1713   /* Initialize stack pointers.
1714      Waste one element of value and location stack
1715      so that they stay on the same level as the state stack.
1716      The wasted elements are never initialized.  */
1717
1718   yyssp = yyss;
1719   yyvsp = yyvs;
1720   yylsp = yyls;
1721 #if YYLTYPE_IS_TRIVIAL
1722   /* Initialize the default location before parsing starts.  */
1723   yylloc.first_line   = yylloc.last_line   = 1;
1724   yylloc.first_column = yylloc.last_column = 0;
1725 #endif
1726
1727   goto yysetstate;
1728
1729 /*------------------------------------------------------------.
1730 | yynewstate -- Push a new state, which is found in yystate.  |
1731 `------------------------------------------------------------*/
1732  yynewstate:
1733   /* In all cases, when you get here, the value and location stacks
1734      have just been pushed.  So pushing a state here evens the stacks.  */
1735   yyssp++;
1736
1737  yysetstate:
1738   *yyssp = yystate;
1739
1740   if (yyss + yystacksize - 1 <= yyssp)
1741     {
1742       /* Get the current used size of the three stacks, in elements.  */
1743       YYSIZE_T yysize = yyssp - yyss + 1;
1744
1745 #ifdef yyoverflow
1746       {
1747         /* Give user a chance to reallocate the stack.  Use copies of
1748            these so that the &'s don't force the real ones into
1749            memory.  */
1750         YYSTYPE *yyvs1 = yyvs;
1751         yytype_int16 *yyss1 = yyss;
1752         YYLTYPE *yyls1 = yyls;
1753
1754         /* Each stack pointer address is followed by the size of the
1755            data in use in that stack, in bytes.  This used to be a
1756            conditional around just the two extra args, but that might
1757            be undefined if yyoverflow is a macro.  */
1758         yyoverflow (YY_("memory exhausted"),
1759                     &yyss1, yysize * sizeof (*yyssp),
1760                     &yyvs1, yysize * sizeof (*yyvsp),
1761                     &yyls1, yysize * sizeof (*yylsp),
1762                     &yystacksize);
1763         yyls = yyls1;
1764         yyss = yyss1;
1765         yyvs = yyvs1;
1766       }
1767 #else /* no yyoverflow */
1768 # ifndef YYSTACK_RELOCATE
1769       goto yyexhaustedlab;
1770 # else
1771       /* Extend the stack our own way.  */
1772       if (YYMAXDEPTH <= yystacksize)
1773         goto yyexhaustedlab;
1774       yystacksize *= 2;
1775       if (YYMAXDEPTH < yystacksize)
1776         yystacksize = YYMAXDEPTH;
1777
1778       {
1779         yytype_int16 *yyss1 = yyss;
1780         union yyalloc *yyptr =
1781           (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1782         if (! yyptr)
1783           goto yyexhaustedlab;
1784         YYSTACK_RELOCATE (yyss);
1785         YYSTACK_RELOCATE (yyvs);
1786         YYSTACK_RELOCATE (yyls);
1787 #  undef YYSTACK_RELOCATE
1788         if (yyss1 != yyssa)
1789           YYSTACK_FREE (yyss1);
1790       }
1791 # endif
1792 #endif /* no yyoverflow */
1793
1794       yyssp = yyss + yysize - 1;
1795       yyvsp = yyvs + yysize - 1;
1796       yylsp = yyls + yysize - 1;
1797
1798       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1799                   (unsigned long int) yystacksize));
1800
1801       if (yyss + yystacksize - 1 <= yyssp)
1802         YYABORT;
1803     }
1804
1805   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1806
1807   goto yybackup;
1808
1809 /*-----------.
1810 | yybackup.  |
1811 `-----------*/
1812 yybackup:
1813
1814   /* Do appropriate processing given the current state.  Read a
1815      look-ahead token if we need one and don't already have one.  */
1816
1817   /* First try to decide what to do without reference to look-ahead token.  */
1818   yyn = yypact[yystate];
1819   if (yyn == YYPACT_NINF)
1820     goto yydefault;
1821
1822   /* Not known => get a look-ahead token if don't already have one.  */
1823
1824   /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
1825   if (yychar == YYEMPTY)
1826     {
1827       YYDPRINTF ((stderr, "Reading a token: "));
1828       yychar = YYLEX;
1829     }
1830
1831   if (yychar <= YYEOF)
1832     {
1833       yychar = yytoken = YYEOF;
1834       YYDPRINTF ((stderr, "Now at end of input.\n"));
1835     }
1836   else
1837     {
1838       yytoken = YYTRANSLATE (yychar);
1839       YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1840     }
1841
1842   /* If the proper action on seeing token YYTOKEN is to reduce or to
1843      detect an error, take that action.  */
1844   yyn += yytoken;
1845   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1846     goto yydefault;
1847   yyn = yytable[yyn];
1848   if (yyn <= 0)
1849     {
1850       if (yyn == 0 || yyn == YYTABLE_NINF)
1851         goto yyerrlab;
1852       yyn = -yyn;
1853       goto yyreduce;
1854     }
1855
1856   if (yyn == YYFINAL)
1857     YYACCEPT;
1858
1859   /* Count tokens shifted since error; after three, turn off error
1860      status.  */
1861   if (yyerrstatus)
1862     yyerrstatus--;
1863
1864   /* Shift the look-ahead token.  */
1865   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1866
1867   /* Discard the shifted token unless it is eof.  */
1868   if (yychar != YYEOF)
1869     yychar = YYEMPTY;
1870
1871   yystate = yyn;
1872   *++yyvsp = yylval;
1873   *++yylsp = yylloc;
1874   goto yynewstate;
1875
1876
1877 /*-----------------------------------------------------------.
1878 | yydefault -- do the default action for the current state.  |
1879 `-----------------------------------------------------------*/
1880 yydefault:
1881   yyn = yydefact[yystate];
1882   if (yyn == 0)
1883     goto yyerrlab;
1884   goto yyreduce;
1885
1886
1887 /*-----------------------------.
1888 | yyreduce -- Do a reduction.  |
1889 `-----------------------------*/
1890 yyreduce:
1891   /* yyn is the number of a rule to reduce with.  */
1892   yylen = yyr2[yyn];
1893
1894   /* If YYLEN is nonzero, implement the default value of the action:
1895      `$$ = $1'.
1896
1897      Otherwise, the following line sets YYVAL to garbage.
1898      This behavior is undocumented and Bison
1899      users should not rely upon it.  Assigning to YYVAL
1900      unconditionally makes the parser a bit smaller, and it avoids a
1901      GCC warning that YYVAL may be used uninitialized.  */
1902   yyval = yyvsp[1-yylen];
1903
1904   /* Default location.  */
1905   YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
1906   YY_REDUCE_PRINT (yyn);
1907   switch (yyn)
1908     {
1909         case 2:
1910 #line 373 "ast_expr2.y"
1911     { ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
1912               ((struct parse_io *)parseio)->val->type = (yyvsp[(1) - (1)].val)->type;
1913               if( (yyvsp[(1) - (1)].val)->type == AST_EXPR_number )
1914                                   ((struct parse_io *)parseio)->val->u.i = (yyvsp[(1) - (1)].val)->u.i;
1915               else
1916                                   ((struct parse_io *)parseio)->val->u.s = (yyvsp[(1) - (1)].val)->u.s; 
1917                           free((yyvsp[(1) - (1)].val));
1918                         ;}
1919     break;
1920
1921   case 3:
1922 #line 381 "ast_expr2.y"
1923     {/* nothing */ ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
1924               ((struct parse_io *)parseio)->val->type = AST_EXPR_string;
1925                           ((struct parse_io *)parseio)->val->u.s = strdup(""); 
1926                         ;}
1927     break;
1928
1929   case 4:
1930 #line 388 "ast_expr2.y"
1931     { (yyval.arglist) = alloc_expr_node(AST_EXPR_NODE_VAL); (yyval.arglist)->val = (yyvsp[(1) - (1)].val);;}
1932     break;
1933
1934   case 5:
1935 #line 389 "ast_expr2.y"
1936     {struct expr_node *x = alloc_expr_node(AST_EXPR_NODE_VAL);
1937                                  struct expr_node *t;
1938                                                                  DESTROY((yyvsp[(2) - (3)].val));
1939                                  for (t=(yyvsp[(1) - (3)].arglist);t->right;t=t->right)
1940                                                                   ;
1941                                  (yyval.arglist) = (yyvsp[(1) - (3)].arglist); t->right = x; x->val = (yyvsp[(3) - (3)].val);;}
1942     break;
1943
1944   case 6:
1945 #line 395 "ast_expr2.y"
1946     {struct expr_node *x = alloc_expr_node(AST_EXPR_NODE_VAL);
1947                                  struct expr_node *t;  /* NULL args should OK */
1948                                                                  DESTROY((yyvsp[(2) - (2)].val));
1949                                  for (t=(yyvsp[(1) - (2)].arglist);t->right;t=t->right)
1950                                                                   ;
1951                                  (yyval.arglist) = (yyvsp[(1) - (2)].arglist); t->right = x; x->val = make_str("");;}
1952     break;
1953
1954   case 7:
1955 #line 404 "ast_expr2.y"
1956     { (yyval.val) = op_func((yyvsp[(1) - (4)].val),(yyvsp[(3) - (4)].arglist), ((struct parse_io *)parseio)->chan);
1957                                             DESTROY((yyvsp[(2) - (4)].val));
1958                                                                         DESTROY((yyvsp[(4) - (4)].val));
1959                                                                         DESTROY((yyvsp[(1) - (4)].val));
1960                                                                         destroy_arglist((yyvsp[(3) - (4)].arglist));
1961                                   ;}
1962     break;
1963
1964   case 8:
1965 #line 410 "ast_expr2.y"
1966     {(yyval.val) = (yyvsp[(1) - (1)].val);;}
1967     break;
1968
1969   case 9:
1970 #line 411 "ast_expr2.y"
1971     { (yyval.val) = (yyvsp[(2) - (3)].val);
1972                                (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
1973                                                    (yyloc).first_line=0; (yyloc).last_line=0;
1974                                                         DESTROY((yyvsp[(1) - (3)].val)); DESTROY((yyvsp[(3) - (3)].val)); ;}
1975     break;
1976
1977   case 10:
1978 #line 415 "ast_expr2.y"
1979     { (yyval.val) = op_or ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
1980                                                 DESTROY((yyvsp[(2) - (3)].val));        
1981                          (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
1982                                                  (yyloc).first_line=0; (yyloc).last_line=0;;}
1983     break;
1984
1985   case 11:
1986 #line 419 "ast_expr2.y"
1987     { (yyval.val) = op_and ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
1988                                                 DESTROY((yyvsp[(2) - (3)].val));        
1989                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
1990                           (yyloc).first_line=0; (yyloc).last_line=0;;}
1991     break;
1992
1993   case 12:
1994 #line 423 "ast_expr2.y"
1995     { (yyval.val) = op_eq ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
1996                                                 DESTROY((yyvsp[(2) - (3)].val));        
1997                              (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
1998                                                  (yyloc).first_line=0; (yyloc).last_line=0;;}
1999     break;
2000
2001   case 13:
2002 #line 427 "ast_expr2.y"
2003     { (yyval.val) = op_gt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
2004                                                 DESTROY((yyvsp[(2) - (3)].val));        
2005                          (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
2006                                                  (yyloc).first_line=0; (yyloc).last_line=0;;}
2007     break;
2008
2009   case 14:
2010 #line 431 "ast_expr2.y"
2011     { (yyval.val) = op_lt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2012                                                 DESTROY((yyvsp[(2) - (3)].val));        
2013                              (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2014                                                  (yyloc).first_line=0; (yyloc).last_line=0;;}
2015     break;
2016
2017   case 15:
2018 #line 435 "ast_expr2.y"
2019     { (yyval.val) = op_ge ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2020                                                 DESTROY((yyvsp[(2) - (3)].val));        
2021                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2022                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2023     break;
2024
2025   case 16:
2026 #line 439 "ast_expr2.y"
2027     { (yyval.val) = op_le ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2028                                                 DESTROY((yyvsp[(2) - (3)].val));        
2029                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2030                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2031     break;
2032
2033   case 17:
2034 #line 443 "ast_expr2.y"
2035     { (yyval.val) = op_ne ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2036                                                 DESTROY((yyvsp[(2) - (3)].val));        
2037                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2038                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2039     break;
2040
2041   case 18:
2042 #line 447 "ast_expr2.y"
2043     { (yyval.val) = op_plus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2044                                                 DESTROY((yyvsp[(2) - (3)].val));        
2045                                (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2046                                                    (yyloc).first_line=0; (yyloc).last_line=0;;}
2047     break;
2048
2049   case 19:
2050 #line 451 "ast_expr2.y"
2051     { (yyval.val) = op_minus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2052                                                 DESTROY((yyvsp[(2) - (3)].val));        
2053                                 (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2054                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2055     break;
2056
2057   case 20:
2058 #line 455 "ast_expr2.y"
2059     { (yyval.val) = op_negate ((yyvsp[(2) - (2)].val)); 
2060                                                 DESTROY((yyvsp[(1) - (2)].val));        
2061                                 (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column; 
2062                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2063     break;
2064
2065   case 21:
2066 #line 459 "ast_expr2.y"
2067     { (yyval.val) = op_compl ((yyvsp[(2) - (2)].val)); 
2068                                                 DESTROY((yyvsp[(1) - (2)].val));        
2069                                 (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column; 
2070                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2071     break;
2072
2073   case 22:
2074 #line 463 "ast_expr2.y"
2075     { (yyval.val) = op_times ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2076                                                 DESTROY((yyvsp[(2) - (3)].val));        
2077                                (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2078                                                    (yyloc).first_line=0; (yyloc).last_line=0;;}
2079     break;
2080
2081   case 23:
2082 #line 467 "ast_expr2.y"
2083     { (yyval.val) = op_div ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2084                                                 DESTROY((yyvsp[(2) - (3)].val));        
2085                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2086                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2087     break;
2088
2089   case 24:
2090 #line 471 "ast_expr2.y"
2091     { (yyval.val) = op_rem ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2092                                                 DESTROY((yyvsp[(2) - (3)].val));        
2093                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2094                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2095     break;
2096
2097   case 25:
2098 #line 475 "ast_expr2.y"
2099     { (yyval.val) = op_colon ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2100                                                 DESTROY((yyvsp[(2) - (3)].val));        
2101                                 (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2102                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2103     break;
2104
2105   case 26:
2106 #line 479 "ast_expr2.y"
2107     { (yyval.val) = op_eqtilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2108                                                 DESTROY((yyvsp[(2) - (3)].val));        
2109                                 (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2110                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2111     break;
2112
2113   case 27:
2114 #line 483 "ast_expr2.y"
2115     { (yyval.val) = op_cond ((yyvsp[(1) - (5)].val), (yyvsp[(3) - (5)].val), (yyvsp[(5) - (5)].val)); 
2116                                                 DESTROY((yyvsp[(2) - (5)].val));        
2117                                                 DESTROY((yyvsp[(4) - (5)].val));        
2118                                 (yyloc).first_column = (yylsp[(1) - (5)]).first_column; (yyloc).last_column = (yylsp[(3) - (5)]).last_column; 
2119                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2120     break;
2121
2122   case 28:
2123 #line 488 "ast_expr2.y"
2124     { (yyval.val) = op_tildetilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2125                                                 DESTROY((yyvsp[(2) - (3)].val));        
2126                                 (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2127                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2128     break;
2129
2130
2131 /* Line 1267 of yacc.c.  */
2132 #line 2133 "ast_expr2.c"
2133       default: break;
2134     }
2135   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
2136
2137   YYPOPSTACK (yylen);
2138   yylen = 0;
2139   YY_STACK_PRINT (yyss, yyssp);
2140
2141   *++yyvsp = yyval;
2142   *++yylsp = yyloc;
2143
2144   /* Now `shift' the result of the reduction.  Determine what state
2145      that goes to, based on the state we popped back to and the rule
2146      number reduced by.  */
2147
2148   yyn = yyr1[yyn];
2149
2150   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
2151   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
2152     yystate = yytable[yystate];
2153   else
2154     yystate = yydefgoto[yyn - YYNTOKENS];
2155
2156   goto yynewstate;
2157
2158
2159 /*------------------------------------.
2160 | yyerrlab -- here on detecting error |
2161 `------------------------------------*/
2162 yyerrlab:
2163   /* If not already recovering from an error, report this error.  */
2164   if (!yyerrstatus)
2165     {
2166       ++yynerrs;
2167 #if ! YYERROR_VERBOSE
2168       yyerror (YY_("syntax error"));
2169 #else
2170       {
2171         YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
2172         if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
2173           {
2174             YYSIZE_T yyalloc = 2 * yysize;
2175             if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
2176               yyalloc = YYSTACK_ALLOC_MAXIMUM;
2177             if (yymsg != yymsgbuf)
2178               YYSTACK_FREE (yymsg);
2179             yymsg = (char *) YYSTACK_ALLOC (yyalloc);
2180             if (yymsg)
2181               yymsg_alloc = yyalloc;
2182             else
2183               {
2184                 yymsg = yymsgbuf;
2185                 yymsg_alloc = sizeof yymsgbuf;
2186               }
2187           }
2188
2189         if (0 < yysize && yysize <= yymsg_alloc)
2190           {
2191             (void) yysyntax_error (yymsg, yystate, yychar);
2192             yyerror (yymsg);
2193           }
2194         else
2195           {
2196             yyerror (YY_("syntax error"));
2197             if (yysize != 0)
2198               goto yyexhaustedlab;
2199           }
2200       }
2201 #endif
2202     }
2203
2204   yyerror_range[0] = yylloc;
2205
2206   if (yyerrstatus == 3)
2207     {
2208       /* If just tried and failed to reuse look-ahead token after an
2209          error, discard it.  */
2210
2211       if (yychar <= YYEOF)
2212         {
2213           /* Return failure if at end of input.  */
2214           if (yychar == YYEOF)
2215             YYABORT;
2216         }
2217       else
2218         {
2219           yydestruct ("Error: discarding",
2220                       yytoken, &yylval, &yylloc);
2221           yychar = YYEMPTY;
2222         }
2223     }
2224
2225   /* Else will try to reuse look-ahead token after shifting the error
2226      token.  */
2227   goto yyerrlab1;
2228
2229
2230 /*---------------------------------------------------.
2231 | yyerrorlab -- error raised explicitly by YYERROR.  |
2232 `---------------------------------------------------*/
2233 yyerrorlab:
2234
2235   /* Pacify compilers like GCC when the user code never invokes
2236      YYERROR and the label yyerrorlab therefore never appears in user
2237      code.  */
2238   if (/*CONSTCOND*/ 0)
2239      goto yyerrorlab;
2240
2241   yyerror_range[0] = yylsp[1-yylen];
2242   /* Do not reclaim the symbols of the rule which action triggered
2243      this YYERROR.  */
2244   YYPOPSTACK (yylen);
2245   yylen = 0;
2246   YY_STACK_PRINT (yyss, yyssp);
2247   yystate = *yyssp;
2248   goto yyerrlab1;
2249
2250
2251 /*-------------------------------------------------------------.
2252 | yyerrlab1 -- common code for both syntax error and YYERROR.  |
2253 `-------------------------------------------------------------*/
2254 yyerrlab1:
2255   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
2256
2257   for (;;)
2258     {
2259       yyn = yypact[yystate];
2260       if (yyn != YYPACT_NINF)
2261         {
2262           yyn += YYTERROR;
2263           if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2264             {
2265               yyn = yytable[yyn];
2266               if (0 < yyn)
2267                 break;
2268             }
2269         }
2270
2271       /* Pop the current state because it cannot handle the error token.  */
2272       if (yyssp == yyss)
2273         YYABORT;
2274
2275       yyerror_range[0] = *yylsp;
2276       yydestruct ("Error: popping",
2277                   yystos[yystate], yyvsp, yylsp);
2278       YYPOPSTACK (1);
2279       yystate = *yyssp;
2280       YY_STACK_PRINT (yyss, yyssp);
2281     }
2282
2283   if (yyn == YYFINAL)
2284     YYACCEPT;
2285
2286   *++yyvsp = yylval;
2287
2288   yyerror_range[1] = yylloc;
2289   /* Using YYLLOC is tempting, but would change the location of
2290      the look-ahead.  YYLOC is available though.  */
2291   YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
2292   *++yylsp = yyloc;
2293
2294   /* Shift the error token.  */
2295   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
2296
2297   yystate = yyn;
2298   goto yynewstate;
2299
2300
2301 /*-------------------------------------.
2302 | yyacceptlab -- YYACCEPT comes here.  |
2303 `-------------------------------------*/
2304 yyacceptlab:
2305   yyresult = 0;
2306   goto yyreturn;
2307
2308 /*-----------------------------------.
2309 | yyabortlab -- YYABORT comes here.  |
2310 `-----------------------------------*/
2311 yyabortlab:
2312   yyresult = 1;
2313   goto yyreturn;
2314
2315 #ifndef yyoverflow
2316 /*-------------------------------------------------.
2317 | yyexhaustedlab -- memory exhaustion comes here.  |
2318 `-------------------------------------------------*/
2319 yyexhaustedlab:
2320   yyerror (YY_("memory exhausted"));
2321   yyresult = 2;
2322   /* Fall through.  */
2323 #endif
2324
2325 yyreturn:
2326   if (yychar != YYEOF && yychar != YYEMPTY)
2327      yydestruct ("Cleanup: discarding lookahead",
2328                  yytoken, &yylval, &yylloc);
2329   /* Do not reclaim the symbols of the rule which action triggered
2330      this YYABORT or YYACCEPT.  */
2331   YYPOPSTACK (yylen);
2332   YY_STACK_PRINT (yyss, yyssp);
2333   while (yyssp != yyss)
2334     {
2335       yydestruct ("Cleanup: popping",
2336                   yystos[*yyssp], yyvsp, yylsp);
2337       YYPOPSTACK (1);
2338     }
2339 #ifndef yyoverflow
2340   if (yyss != yyssa)
2341     YYSTACK_FREE (yyss);
2342 #endif
2343 #if YYERROR_VERBOSE
2344   if (yymsg != yymsgbuf)
2345     YYSTACK_FREE (yymsg);
2346 #endif
2347   /* Make sure YYID is used.  */
2348   return YYID (yyresult);
2349 }
2350
2351
2352 #line 494 "ast_expr2.y"
2353
2354
2355 static struct expr_node *alloc_expr_node(enum node_type nt)
2356 {
2357         struct expr_node *x = calloc(1,sizeof(struct expr_node));
2358         if (!x) {
2359                 ast_log(LOG_ERROR, "Allocation for expr_node FAILED!!\n");
2360                 return 0;
2361         }
2362         x->type = nt;
2363         return x;
2364 }
2365
2366
2367
2368 static struct val *
2369 make_number (FP___TYPE i)
2370 {
2371         struct val *vp;
2372
2373         vp = (struct val *) malloc (sizeof (*vp));
2374         if (vp == NULL) {
2375                 ast_log(LOG_WARNING, "malloc() failed\n");
2376                 return(NULL);
2377         }
2378
2379         vp->type = AST_EXPR_number;
2380         vp->u.i  = i;
2381         return vp; 
2382 }
2383
2384 static struct val *
2385 make_str (const char *s)
2386 {
2387         struct val *vp;
2388         size_t i;
2389         int isint; /* this started out being a test for an integer, but then ended up being a test for a float */
2390
2391         vp = (struct val *) malloc (sizeof (*vp));
2392         if (vp == NULL || ((vp->u.s = strdup (s)) == NULL)) {
2393                 ast_log(LOG_WARNING,"malloc() failed\n");
2394                 return(NULL);
2395         }
2396
2397         for (i = 0, isint = (isdigit(s[0]) || s[0] == '-' || s[0]=='.'); isint && i < strlen(s); i++)
2398         {
2399                 if (!isdigit(s[i]) && s[i] != '.') {
2400                         isint = 0;
2401                         break;
2402                 }
2403         }
2404         if (isint)
2405                 vp->type = AST_EXPR_numeric_string;
2406         else    
2407                 vp->type = AST_EXPR_string;
2408
2409         return vp;
2410 }
2411
2412
2413 static void
2414 free_value (struct val *vp)
2415 {       
2416         if (vp==NULL) {
2417                 return;
2418         }
2419         if (vp->type == AST_EXPR_string || vp->type == AST_EXPR_numeric_string)
2420                 free (vp->u.s); 
2421         free(vp);
2422 }
2423
2424
2425 static int
2426 to_number (struct val *vp)
2427 {
2428         FP___TYPE i;
2429         
2430         if (vp == NULL) {
2431                 ast_log(LOG_WARNING,"vp==NULL in to_number()\n");
2432                 return(0);
2433         }
2434
2435         if (vp->type == AST_EXPR_number)
2436                 return 1;
2437
2438         if (vp->type == AST_EXPR_string)
2439                 return 0;
2440
2441         /* vp->type == AST_EXPR_numeric_string, make it numeric */
2442         errno = 0;
2443         i  = FUNC_STRTOD(vp->u.s, (char**)0); /* either strtod, or strtold on a good day */
2444         if (errno != 0) {
2445                 ast_log(LOG_WARNING,"Conversion of %s to number under/overflowed!\n", vp->u.s);
2446                 free(vp->u.s);
2447                 vp->u.s = 0;
2448                 return(0);
2449         }
2450         free (vp->u.s);
2451         vp->u.i = i;
2452         vp->type = AST_EXPR_number;
2453         return 1;
2454 }
2455
2456 static void
2457 strip_quotes(struct val *vp)
2458 {
2459         if (vp->type != AST_EXPR_string && vp->type != AST_EXPR_numeric_string)
2460                 return;
2461         
2462         if( vp->u.s[0] == '"' && vp->u.s[strlen(vp->u.s)-1] == '"' )
2463         {
2464                 char *f, *t;
2465                 f = vp->u.s;
2466                 t = vp->u.s;
2467                 
2468                 while( *f )
2469                 {
2470                         if( *f  && *f != '"' )
2471                                 *t++ = *f++;
2472                         else
2473                                 f++;
2474                 }
2475                 *t = *f;
2476         }
2477 }
2478
2479 static void
2480 to_string (struct val *vp)
2481 {
2482         char *tmp;
2483
2484         if (vp->type == AST_EXPR_string || vp->type == AST_EXPR_numeric_string)
2485                 return;
2486
2487         tmp = malloc ((size_t)25);
2488         if (tmp == NULL) {
2489                 ast_log(LOG_WARNING,"malloc() failed\n");
2490                 return;
2491         }
2492
2493         sprintf(tmp, FP___PRINTF, vp->u.i);
2494         vp->type = AST_EXPR_string;
2495         vp->u.s  = tmp;
2496 }
2497
2498
2499 static int
2500 isstring (struct val *vp)
2501 {
2502         /* only TRUE if this string is not a valid number */
2503         return (vp->type == AST_EXPR_string);
2504 }
2505
2506
2507 static int
2508 is_zero_or_null (struct val *vp)
2509 {
2510         if (vp->type == AST_EXPR_number) {
2511                 return (vp->u.i == 0);
2512         } else {
2513                 return (*vp->u.s == 0 || (to_number(vp) && vp->u.i == 0));
2514         }
2515         /* NOTREACHED */
2516 }
2517
2518 #undef ast_yyerror
2519 #define ast_yyerror(x) ast_yyerror(x, YYLTYPE *yylloc, struct parse_io *parseio)
2520
2521 /* I put the ast_yyerror func in the flex input file,
2522    because it refers to the buffer state. Best to
2523    let it access the BUFFER stuff there and not trying
2524    define all the structs, macros etc. in this file! */
2525
2526 static void destroy_arglist(struct expr_node *arglist)
2527 {
2528         struct expr_node *arglist_next;
2529         
2530         while (arglist)
2531         {
2532                 arglist_next = arglist->right;
2533                 if (arglist->val)
2534                         free_value(arglist->val);
2535                 arglist->val = 0;
2536                 arglist->right = 0;
2537                 free(arglist);
2538                 arglist = arglist_next;
2539         }
2540 }
2541
2542 #if !defined(STANDALONE)
2543 static char *compose_func_args(struct expr_node *arglist)
2544 {
2545         struct expr_node *t = arglist;
2546         char *argbuf;
2547         int total_len = 0;
2548         
2549         while (t) {
2550                 if (t != arglist)
2551                         total_len += 1; /* for the sep */
2552                 if (t->val) {
2553                         if (t->val->type == AST_EXPR_number)
2554                                 total_len += 25; /* worst case */
2555                         else
2556                                 total_len += strlen(t->val->u.s);
2557                 }
2558                 
2559                 t = t->right;
2560         }
2561         total_len++; /* for the null */
2562         ast_log(LOG_NOTICE,"argbuf allocated %d bytes;\n", total_len);
2563         argbuf = malloc(total_len);
2564         argbuf[0] = 0;
2565         t = arglist;
2566         while (t) {
2567                 char numbuf[30];
2568                 
2569                 if (t != arglist)
2570                         strcat(argbuf,",");
2571                 
2572                 if (t->val) {
2573                         if (t->val->type == AST_EXPR_number) {
2574                                 sprintf(numbuf,FP___PRINTF,t->val->u.i);
2575                                 strcat(argbuf,numbuf);
2576                         } else
2577                                 strcat(argbuf,t->val->u.s);
2578                 }
2579                 t = t->right;
2580         }
2581         ast_log(LOG_NOTICE,"argbuf uses %d bytes;\n", (int) strlen(argbuf));
2582         return argbuf;
2583 }
2584
2585 static int is_really_num(char *str)
2586 {
2587         if ( strspn(str,"-0123456789.   ") == strlen(str))
2588                 return 1;
2589         else
2590                 return 0;
2591 }
2592 #endif
2593
2594 static struct val *op_func(struct val *funcname, struct expr_node *arglist, struct ast_channel *chan)
2595 {
2596         if (strspn(funcname->u.s,"ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789") == strlen(funcname->u.s))
2597         {
2598                 struct val *result;
2599                 if (0) {
2600 #ifdef FUNC_COS
2601                 } else if (strcmp(funcname->u.s,"COS") == 0) {
2602                         if (arglist && !arglist->right && arglist->val){
2603                                 to_number(arglist->val);
2604                                 result = make_number(FUNC_COS(arglist->val->u.i));
2605                                 return result;
2606                         } else {
2607                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2608                                 return make_number(0.0);
2609                         }
2610 #endif
2611 #ifdef FUNC_SIN
2612                 } else if (strcmp(funcname->u.s,"SIN") == 0) {
2613                         if (arglist && !arglist->right && arglist->val){
2614                                 to_number(arglist->val);
2615                                 result = make_number(FUNC_SIN(arglist->val->u.i));
2616                                 return result;
2617                         } else {
2618                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2619                                 return make_number(0.0);
2620                         }
2621 #endif
2622 #ifdef FUNC_TAN
2623                 } else if (strcmp(funcname->u.s,"TAN") == 0) {
2624                         if (arglist && !arglist->right && arglist->val){
2625                                 to_number(arglist->val);
2626                                 result = make_number(FUNC_TAN(arglist->val->u.i));
2627                                 return result;
2628                         } else {
2629                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2630                                 return make_number(0.0);
2631                         }
2632 #endif
2633 #ifdef FUNC_ACOS
2634                 } else if (strcmp(funcname->u.s,"ACOS") == 0) {
2635                         if (arglist && !arglist->right && arglist->val){
2636                                 to_number(arglist->val);
2637                                 result = make_number(FUNC_ACOS(arglist->val->u.i));
2638                                 return result;
2639                         } else {
2640                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2641                                 return make_number(0.0);
2642                         }
2643 #endif
2644 #ifdef FUNC_ASIN
2645                 } else if (strcmp(funcname->u.s,"ASIN") == 0) {
2646                         if (arglist && !arglist->right && arglist->val){
2647                                 to_number(arglist->val);
2648                                 result = make_number(FUNC_ASIN(arglist->val->u.i));
2649                                 return result;
2650                         } else {
2651                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2652                                 return make_number(0.0);
2653                         }
2654 #endif
2655 #ifdef FUNC_ATAN
2656                 } else if (strcmp(funcname->u.s,"ATAN") == 0) {
2657                         if (arglist && !arglist->right && arglist->val){
2658                                 to_number(arglist->val);
2659                                 result = make_number(FUNC_ATAN(arglist->val->u.i));
2660                                 return result;
2661                         } else {
2662                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2663                                 return make_number(0.0);
2664                         }
2665 #endif
2666 #ifdef FUNC_ATAN2
2667                 } else if (strcmp(funcname->u.s,"ATAN2") == 0) {
2668                         if (arglist && arglist->right && !arglist->right->right && arglist->val && arglist->right->val){
2669                                 to_number(arglist->val);
2670                                 to_number(arglist->right->val);
2671                                 result = make_number(FUNC_ATAN2(arglist->val->u.i, arglist->right->val->u.i));
2672                                 return result;
2673                         } else {
2674                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2675                                 return make_number(0.0);
2676                         }
2677 #endif
2678 #ifdef FUNC_POW
2679                 } else if (strcmp(funcname->u.s,"POW") == 0) {
2680                         if (arglist && arglist->right && !arglist->right->right && arglist->val && arglist->right->val){
2681                                 to_number(arglist->val);
2682                                 to_number(arglist->right->val);
2683                                 result = make_number(FUNC_POW(arglist->val->u.i, arglist->right->val->u.i));
2684                                 return result;
2685                         } else {
2686                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2687                                 return make_number(0.0);
2688                         }
2689 #endif
2690 #ifdef FUNC_SQRT
2691                 } else if (strcmp(funcname->u.s,"SQRT") == 0) {
2692                         if (arglist && !arglist->right && arglist->val){
2693                                 to_number(arglist->val);
2694                                 result = make_number(FUNC_SQRT(arglist->val->u.i));
2695                                 return result;
2696                         } else {
2697                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2698                                 return make_number(0.0);
2699                         }
2700 #endif
2701 #ifdef FUNC_FLOOR
2702                 } else if (strcmp(funcname->u.s,"FLOOR") == 0) {
2703                         if (arglist && !arglist->right && arglist->val){
2704                                 to_number(arglist->val);
2705                                 result = make_number(FUNC_FLOOR(arglist->val->u.i));
2706                                 return result;
2707                         } else {
2708                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2709                                 return make_number(0.0);
2710                         }
2711 #endif
2712 #ifdef FUNC_CEIL
2713                 } else if (strcmp(funcname->u.s,"CEIL") == 0) {
2714                         if (arglist && !arglist->right && arglist->val){
2715                                 to_number(arglist->val);
2716                                 result = make_number(FUNC_CEIL(arglist->val->u.i));
2717                                 return result;
2718                         } else {
2719                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2720                                 return make_number(0.0);
2721                         }
2722 #endif
2723 #ifdef FUNC_ROUND
2724                 } else if (strcmp(funcname->u.s,"ROUND") == 0) {
2725                         if (arglist && !arglist->right && arglist->val){
2726                                 to_number(arglist->val);
2727                                 result = make_number(FUNC_ROUND(arglist->val->u.i));
2728                                 return result;
2729                         } else {
2730                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2731                                 return make_number(0.0);
2732                         }
2733 #endif /* defined(FUNC_ROUND) */
2734 #ifdef FUNC_RINT
2735                 } else if (strcmp(funcname->u.s,"RINT") == 0) {
2736                         if (arglist && !arglist->right && arglist->val){
2737                                 to_number(arglist->val);
2738                                 result = make_number(FUNC_RINT(arglist->val->u.i));
2739                                 return result;
2740                         } else {
2741                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2742                                 return make_number(0.0);
2743                         }
2744 #endif
2745 #ifdef FUNC_TRUNC
2746                 } else if (strcmp(funcname->u.s,"TRUNC") == 0) {
2747                         if (arglist && !arglist->right && arglist->val){
2748                                 to_number(arglist->val);
2749                                 result = make_number(FUNC_TRUNC(arglist->val->u.i));
2750                                 return result;
2751                         } else {
2752                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2753                                 return make_number(0.0);
2754                         }
2755 #endif /* defined(FUNC_TRUNC) */
2756 #ifdef FUNC_EXP
2757                 } else if (strcmp(funcname->u.s,"EXP") == 0) {
2758                         if (arglist && !arglist->right && arglist->val){
2759                                 to_number(arglist->val);
2760                                 result = make_number(FUNC_EXP(arglist->val->u.i));
2761                                 return result;
2762                         } else {
2763                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2764                                 return make_number(0.0);
2765                         }
2766 #endif
2767 #ifdef FUNC_EXP2
2768                 } else if (strcmp(funcname->u.s,"EXP2") == 0) {
2769                         if (arglist && !arglist->right && arglist->val){
2770                                 to_number(arglist->val);
2771                                 result = make_number(FUNC_EXP2(arglist->val->u.i));
2772                                 return result;
2773                         } else {
2774                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2775                                 return make_number(0.0);
2776                         }
2777 #endif
2778 #ifdef FUNC_EXP10
2779                 } else if (strcmp(funcname->u.s,"EXP10") == 0) {
2780                         if (arglist && !arglist->right && arglist->val){
2781                                 to_number(arglist->val);
2782                                 result = make_number(FUNC_EXP10(arglist->val->u.i));
2783                                 return result;
2784                         } else {
2785                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2786                                 return make_number(0.0);
2787                         }
2788 #endif
2789 #ifdef FUNC_LOG
2790                 } else if (strcmp(funcname->u.s,"LOG") == 0) {
2791                         if (arglist && !arglist->right && arglist->val){
2792                                 to_number(arglist->val);
2793                                 result = make_number(FUNC_LOG(arglist->val->u.i));
2794                                 return result;
2795                         } else {
2796                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2797                                 return make_number(0.0);
2798                         }
2799 #endif
2800 #ifdef FUNC_LOG2
2801                 } else if (strcmp(funcname->u.s,"LOG2") == 0) {
2802                         if (arglist && !arglist->right && arglist->val){
2803                                 to_number(arglist->val);
2804                                 result = make_number(FUNC_LOG2(arglist->val->u.i));
2805                                 return result;
2806                         } else {
2807                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2808                                 return make_number(0.0);
2809                         }
2810 #endif
2811 #ifdef FUNC_LOG10
2812                 } else if (strcmp(funcname->u.s,"LOG10") == 0) {
2813                         if (arglist && !arglist->right && arglist->val){
2814                                 to_number(arglist->val);
2815                                 result = make_number(FUNC_LOG10(arglist->val->u.i));
2816                                 return result;
2817                         } else {
2818                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2819                                 return make_number(0.0);
2820                         }
2821 #endif
2822 #ifdef FUNC_REMAINDER
2823                 } else if (strcmp(funcname->u.s,"REMAINDER") == 0) {
2824                         if (arglist && arglist->right && !arglist->right->right && arglist->val && arglist->right->val){
2825                                 to_number(arglist->val);
2826                                 to_number(arglist->right->val);
2827                                 result = make_number(FUNC_REMAINDER(arglist->val->u.i, arglist->right->val->u.i));
2828                                 return result;
2829                         } else {
2830                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2831                                 return make_number(0.0);
2832                         }
2833 #endif
2834                 } else {
2835                         /* is this a custom function we should execute and collect the results of? */
2836 #ifndef STANDALONE
2837                         struct ast_custom_function *f = ast_custom_function_find(funcname->u.s);
2838                         if (!chan)
2839                                 ast_log(LOG_WARNING,"Hey! chan is NULL.\n");
2840                         if (!f)
2841                                 ast_log(LOG_WARNING,"Hey! could not find func %s.\n", funcname->u.s);
2842                         
2843                         if (f && chan) {
2844                                 if (f->read) {
2845                                         char workspace[512];
2846                                         char *argbuf = compose_func_args(arglist);
2847                                         f->read(chan, funcname->u.s, argbuf, workspace, sizeof(workspace));
2848                                         free(argbuf);
2849                                         if (is_really_num(workspace))
2850                                                 return make_number(FUNC_STRTOD(workspace,(char **)NULL));
2851                                         else
2852                                                 return make_str(workspace);
2853                                 } else {
2854                                         ast_log(LOG_ERROR,"Error! Function '%s' cannot be read!\n", funcname->u.s);
2855                                         return (make_number ((FP___TYPE)0.0));
2856                                 }
2857                                 
2858                         } else {
2859                                 ast_log(LOG_ERROR,"Error! '%s' doesn't appear to be an available function!", funcname->u.s);
2860                                 return (make_number ((FP___TYPE)0.0));
2861                         }
2862 #else
2863                         ast_log(LOG_ERROR,"Error! '%s' is not available in the standalone version!", funcname->u.s);
2864                         return (make_number ((FP___TYPE)0.0));
2865 #endif
2866                 }
2867         }
2868         else
2869         {
2870                 ast_log(LOG_ERROR,"Error! '%s' is not possibly a function name!", funcname->u.s);
2871                 return (make_number ((FP___TYPE)0.0));
2872         }
2873         return (make_number ((FP___TYPE)0.0));
2874 }
2875
2876
2877 static struct val *
2878 op_or (struct val *a, struct val *b)
2879 {
2880         if (is_zero_or_null (a)) {
2881                 free_value (a);
2882                 return (b);
2883         } else {
2884                 free_value (b);
2885                 return (a);
2886         }
2887 }
2888                 
2889 static struct val *
2890 op_and (struct val *a, struct val *b)
2891 {
2892         if (is_zero_or_null (a) || is_zero_or_null (b)) {
2893                 free_value (a);
2894                 free_value (b);
2895                 return (make_number ((FP___TYPE)0.0));
2896         } else {
2897                 free_value (b);
2898                 return (a);
2899         }
2900 }
2901
2902 static struct val *
2903 op_eq (struct val *a, struct val *b)
2904 {
2905         struct val *r; 
2906
2907         if (isstring (a) || isstring (b)) {
2908                 to_string (a);
2909                 to_string (b);  
2910                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) == 0));
2911         } else {
2912 #ifdef DEBUG_FOR_CONVERSIONS
2913                 char buffer[2000];
2914                 sprintf(buffer,"Converting '%s' and '%s' ", a->u.s, b->u.s);
2915 #endif
2916                 (void)to_number(a);
2917                 (void)to_number(b);
2918 #ifdef DEBUG_FOR_CONVERSIONS
2919                 ast_log(LOG_WARNING,"%s to '%lld' and '%lld'\n", buffer, a->u.i, b->u.i);
2920 #endif
2921                 r = make_number ((FP___TYPE)(a->u.i == b->u.i));
2922         }
2923
2924         free_value (a);
2925         free_value (b);
2926         return r;
2927 }
2928
2929 static struct val *
2930 op_gt (struct val *a, struct val *b)
2931 {
2932         struct val *r;
2933
2934         if (isstring (a) || isstring (b)) {
2935                 to_string (a);
2936                 to_string (b);
2937                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) > 0));
2938         } else {
2939                 (void)to_number(a);
2940                 (void)to_number(b);
2941                 r = make_number ((FP___TYPE)(a->u.i > b->u.i));
2942         }
2943
2944         free_value (a);
2945         free_value (b);
2946         return r;
2947 }
2948
2949 static struct val *
2950 op_lt (struct val *a, struct val *b)
2951 {
2952         struct val *r;
2953
2954         if (isstring (a) || isstring (b)) {
2955                 to_string (a);
2956                 to_string (b);
2957                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) < 0));
2958         } else {
2959                 (void)to_number(a);
2960                 (void)to_number(b);
2961                 r = make_number ((FP___TYPE)(a->u.i < b->u.i));
2962         }
2963
2964         free_value (a);
2965         free_value (b);
2966         return r;
2967 }
2968
2969 static struct val *
2970 op_ge (struct val *a, struct val *b)
2971 {
2972         struct val *r;
2973
2974         if (isstring (a) || isstring (b)) {
2975                 to_string (a);
2976                 to_string (b);
2977                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) >= 0));
2978         } else {
2979                 (void)to_number(a);
2980                 (void)to_number(b);
2981                 r = make_number ((FP___TYPE)(a->u.i >= b->u.i));
2982         }
2983
2984         free_value (a);
2985         free_value (b);
2986         return r;
2987 }
2988
2989 static struct val *
2990 op_le (struct val *a, struct val *b)
2991 {
2992         struct val *r;
2993
2994         if (isstring (a) || isstring (b)) {
2995                 to_string (a);
2996                 to_string (b);
2997                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) <= 0));
2998         } else {
2999                 (void)to_number(a);
3000                 (void)to_number(b);
3001                 r = make_number ((FP___TYPE)(a->u.i <= b->u.i));
3002         }
3003
3004         free_value (a);
3005         free_value (b);
3006         return r;
3007 }
3008
3009 static struct val *
3010 op_cond (struct val *a, struct val *b, struct val *c)
3011 {
3012         struct val *r;
3013
3014         if( isstring(a) )
3015         {
3016                 if( strlen(a->u.s) && strcmp(a->u.s, "\"\"") != 0 && strcmp(a->u.s,"0") != 0 )
3017                 {
3018                         free_value(a);
3019                         free_value(c);
3020                         r = b;
3021                 }
3022                 else
3023                 {
3024                         free_value(a);
3025                         free_value(b);
3026                         r = c;
3027                 }
3028         }
3029         else
3030         {
3031                 (void)to_number(a);
3032                 if( a->u.i )
3033                 {
3034                         free_value(a);
3035                         free_value(c);
3036                         r = b;
3037                 }
3038                 else
3039                 {
3040                         free_value(a);
3041                         free_value(b);
3042                         r = c;
3043                 }
3044         }
3045         return r;
3046 }
3047
3048 static struct val *
3049 op_ne (struct val *a, struct val *b)
3050 {
3051         struct val *r;
3052
3053         if (isstring (a) || isstring (b)) {
3054                 to_string (a);
3055                 to_string (b);
3056                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) != 0));
3057         } else {
3058                 (void)to_number(a);
3059                 (void)to_number(b);
3060                 r = make_number ((FP___TYPE)(a->u.i != b->u.i));
3061         }
3062
3063         free_value (a);
3064         free_value (b);
3065         return r;
3066 }
3067
3068 static int
3069 chk_plus (FP___TYPE a, FP___TYPE b, FP___TYPE r)
3070 {
3071         /* sum of two positive numbers must be positive */
3072         if (a > 0 && b > 0 && r <= 0)
3073                 return 1;
3074         /* sum of two negative numbers must be negative */
3075         if (a < 0 && b < 0 && r >= 0)
3076                 return 1;
3077         /* all other cases are OK */
3078         return 0;
3079 }
3080
3081 static struct val *
3082 op_plus (struct val *a, struct val *b)
3083 {
3084         struct val *r;
3085
3086         if (!to_number (a)) {
3087                 if( !extra_error_message_supplied )
3088                         ast_log(LOG_WARNING,"non-numeric argument\n");
3089                 if (!to_number (b)) {
3090                         free_value(a);
3091                         free_value(b);
3092                         return make_number(0);
3093                 } else {
3094                         free_value(a);
3095                         return (b);
3096                 }
3097         } else if (!to_number(b)) {
3098                 free_value(b);
3099                 return (a);
3100         }
3101
3102         r = make_number (a->u.i + b->u.i);
3103         if (chk_plus (a->u.i, b->u.i, r->u.i)) {
3104                 ast_log(LOG_WARNING,"overflow\n");
3105         }
3106         free_value (a);
3107         free_value (b);
3108         return r;
3109 }
3110
3111 static int
3112 chk_minus (FP___TYPE a, FP___TYPE b, FP___TYPE r)
3113 {
3114         /* special case subtraction of QUAD_MIN */
3115         if (b == QUAD_MIN) {
3116                 if (a >= 0)
3117                         return 1;
3118                 else
3119                         return 0;
3120         }
3121         /* this is allowed for b != QUAD_MIN */
3122         return chk_plus (a, -b, r);
3123 }
3124
3125 static struct val *
3126 op_minus (struct val *a, struct val *b)
3127 {
3128         struct val *r;
3129
3130         if (!to_number (a)) {
3131                 if( !extra_error_message_supplied )
3132                         ast_log(LOG_WARNING, "non-numeric argument\n");
3133                 if (!to_number (b)) {
3134                         free_value(a);
3135                         free_value(b);
3136                         return make_number(0);
3137                 } else {
3138                         r = make_number(0 - b->u.i);
3139                         free_value(a);
3140                         free_value(b);
3141                         return (r);
3142                 }
3143         } else if (!to_number(b)) {
3144                 if( !extra_error_message_supplied )
3145                         ast_log(LOG_WARNING, "non-numeric argument\n");
3146                 free_value(b);
3147                 return (a);
3148         }
3149
3150         r = make_number (a->u.i - b->u.i);
3151         if (chk_minus (a->u.i, b->u.i, r->u.i)) {
3152                 ast_log(LOG_WARNING, "overflow\n");
3153         }
3154         free_value (a);
3155         free_value (b);
3156         return r;
3157 }
3158
3159 static struct val *
3160 op_negate (struct val *a)
3161 {
3162         struct val *r;
3163
3164         if (!to_number (a) ) {
3165                 free_value(a);
3166                 if( !extra_error_message_supplied )
3167                         ast_log(LOG_WARNING, "non-numeric argument\n");
3168                 return make_number(0);
3169         }
3170
3171         r = make_number (- a->u.i);
3172         if (chk_minus (0, a->u.i, r->u.i)) {
3173                 ast_log(LOG_WARNING, "overflow\n");
3174         }
3175         free_value (a);
3176         return r;
3177 }
3178
3179 static struct val *
3180 op_compl (struct val *a)
3181 {
3182         int v1 = 1;
3183         struct val *r;
3184         
3185         if( !a )
3186         {
3187                 v1 = 0;
3188         }
3189         else
3190         {
3191                 switch( a->type )
3192                 {
3193                 case AST_EXPR_number:
3194                         if( a->u.i == 0 )
3195                                 v1 = 0;
3196                         break;
3197                         
3198                 case AST_EXPR_string:
3199                         if( a->u.s == 0 )
3200                                 v1 = 0;
3201                         else
3202                         {
3203                                 if( a->u.s[0] == 0 )
3204                                         v1 = 0;
3205                                 else if (strlen(a->u.s) == 1 && a->u.s[0] == '0' )
3206                                         v1 = 0;
3207                         }
3208                         break;
3209                         
3210                 case AST_EXPR_numeric_string:
3211                         if( a->u.s == 0 )
3212                                 v1 = 0;
3213                         else
3214                         {
3215                                 if( a->u.s[0] == 0 )
3216                                         v1 = 0;
3217                                 else if (strlen(a->u.s) == 1 && a->u.s[0] == '0' )
3218                                         v1 = 0;
3219                         }
3220                         break;
3221                 }
3222         }
3223         
3224         r = make_number (!v1);
3225         free_value (a);
3226         return r;
3227 }
3228
3229 static int
3230 chk_times (FP___TYPE a, FP___TYPE b, FP___TYPE r)
3231 {
3232         /* special case: first operand is 0, no overflow possible */
3233         if (a == 0)
3234                 return 0;
3235         /* cerify that result of division matches second operand */
3236         if (r / a != b)
3237                 return 1;
3238         return 0;
3239 }
3240
3241 static struct val *
3242 op_times (struct val *a, struct val *b)
3243 {
3244         struct val *r;
3245
3246         if (!to_number (a) || !to_number (b)) {
3247                 free_value(a);
3248                 free_value(b);
3249                 if( !extra_error_message_supplied )
3250                         ast_log(LOG_WARNING, "non-numeric argument\n");
3251                 return(make_number(0));
3252         }
3253
3254         r = make_number (a->u.i * b->u.i);
3255         if (chk_times (a->u.i, b->u.i, r->u.i)) {
3256                 ast_log(LOG_WARNING, "overflow\n");
3257         }
3258         free_value (a);
3259         free_value (b);
3260         return (r);
3261 }
3262
3263 static int
3264 chk_div (FP___TYPE a, FP___TYPE b)
3265 {
3266         /* div by zero has been taken care of before */
3267         /* only QUAD_MIN / -1 causes overflow */
3268         if (a == QUAD_MIN && b == -1)
3269                 return 1;
3270         /* everything else is OK */
3271         return 0;
3272 }
3273
3274 static struct val *
3275 op_div (struct val *a, struct val *b)
3276 {
3277         struct val *r;
3278
3279         if (!to_number (a)) {
3280                 free_value(a);
3281                 free_value(b);
3282                 if( !extra_error_message_supplied )
3283                         ast_log(LOG_WARNING, "non-numeric argument\n");
3284                 return make_number(0);
3285         } else if (!to_number (b)) {
3286                 free_value(a);
3287                 free_value(b);
3288                 if( !extra_error_message_supplied )
3289                         ast_log(LOG_WARNING, "non-numeric argument\n");
3290                 return make_number(INT_MAX);
3291         }
3292
3293         if (b->u.i == 0) {
3294                 ast_log(LOG_WARNING, "division by zero\n");             
3295                 free_value(a);
3296                 free_value(b);
3297                 return make_number(INT_MAX);
3298         }
3299
3300         r = make_number (a->u.i / b->u.i);
3301         if (chk_div (a->u.i, b->u.i)) {
3302                 ast_log(LOG_WARNING, "overflow\n");
3303         }
3304         free_value (a);
3305         free_value (b);
3306         return r;
3307 }
3308         
3309 static struct val *
3310 op_rem (struct val *a, struct val *b)
3311 {
3312         struct val *r;
3313
3314         if (!to_number (a) || !to_number (b)) {
3315                 if( !extra_error_message_supplied )
3316                         ast_log(LOG_WARNING, "non-numeric argument\n");
3317                 free_value(a);
3318                 free_value(b);
3319                 return make_number(0);
3320         }
3321
3322         if (b->u.i == 0) {
3323                 ast_log(LOG_WARNING, "div by zero\n");
3324                 free_value(a);
3325                 return(b);
3326         }
3327
3328         r = make_number (FUNC_FMOD(a->u.i, b->u.i)); /* either fmod or fmodl if FP___TYPE is available */
3329         /* chk_rem necessary ??? */
3330         free_value (a);
3331         free_value (b);
3332         return r;
3333 }
3334         
3335
3336 static struct val *
3337 op_colon (struct val *a, struct val *b)
3338 {
3339         regex_t rp;
3340         regmatch_t rm[2];
3341         char errbuf[256];
3342         int eval;
3343         struct val *v;
3344
3345         /* coerce to both arguments to strings */
3346         to_string(a);
3347         to_string(b);
3348         /* strip double quotes from both -- they'll screw up the pattern, and the search string starting at ^ */
3349         strip_quotes(a);
3350         strip_quotes(b);
3351         /* compile regular expression */
3352         if ((eval = regcomp (&rp, b->u.s, REG_EXTENDED)) != 0) {
3353                 regerror (eval, &rp, errbuf, sizeof(errbuf));
3354                 ast_log(LOG_WARNING,"regcomp() error : %s",errbuf);
3355                 free_value(a);
3356                 free_value(b);
3357                 return make_str("");            
3358         }
3359
3360         /* compare string against pattern */
3361         /* remember that patterns are anchored to the beginning of the line */
3362         if (regexec(&rp, a->u.s, (size_t)2, rm, 0) == 0 && rm[0].rm_so == 0) {
3363                 if (rm[1].rm_so >= 0) {
3364                         *(a->u.s + rm[1].rm_eo) = '\0';
3365                         v = make_str (a->u.s + rm[1].rm_so);
3366
3367                 } else {
3368                         v = make_number ((FP___TYPE)(rm[0].rm_eo - rm[0].rm_so));
3369                 }
3370         } else {
3371                 if (rp.re_nsub == 0) {
3372                         v = make_number ((FP___TYPE)0);
3373                 } else {
3374                         v = make_str ("");
3375                 }
3376         }
3377
3378         /* free arguments and pattern buffer */
3379         free_value (a);
3380         free_value (b);
3381         regfree (&rp);
3382
3383         return v;
3384 }
3385         
3386
3387 static struct val *
3388 op_eqtilde (struct val *a, struct val *b)
3389 {
3390         regex_t rp;
3391         regmatch_t rm[2];
3392         char errbuf[256];
3393         int eval;
3394         struct val *v;
3395
3396         /* coerce to both arguments to strings */
3397         to_string(a);
3398         to_string(b);
3399         /* strip double quotes from both -- they'll screw up the pattern, and the search string starting at ^ */
3400         strip_quotes(a);
3401         strip_quotes(b);
3402         /* compile regular expression */
3403         if ((eval = regcomp (&rp, b->u.s, REG_EXTENDED)) != 0) {
3404                 regerror (eval, &rp, errbuf, sizeof(errbuf));
3405                 ast_log(LOG_WARNING,"regcomp() error : %s",errbuf);
3406                 free_value(a);
3407                 free_value(b);
3408                 return make_str("");            
3409         }
3410
3411         /* compare string against pattern */
3412         /* remember that patterns are anchored to the beginning of the line */
3413         if (regexec(&rp, a->u.s, (size_t)2, rm, 0) == 0 ) {
3414                 if (rm[1].rm_so >= 0) {
3415                         *(a->u.s + rm[1].rm_eo) = '\0';
3416                         v = make_str (a->u.s + rm[1].rm_so);
3417
3418                 } else {
3419                         v = make_number ((FP___TYPE)(rm[0].rm_eo - rm[0].rm_so));
3420                 }
3421         } else {
3422                 if (rp.re_nsub == 0) {
3423                         v = make_number ((FP___TYPE)0.0);
3424                 } else {
3425                         v = make_str ("");
3426                 }
3427         }
3428
3429         /* free arguments and pattern buffer */
3430         free_value (a);
3431         free_value (b);
3432         regfree (&rp);
3433
3434         return v;
3435 }
3436
3437 static struct val *  /* this is a string concat operator */
3438 op_tildetilde (struct val *a, struct val *b)
3439 {
3440         struct val *v;
3441         char *vs;
3442
3443         /* coerce to both arguments to strings */
3444         to_string(a);
3445         to_string(b);
3446         /* strip double quotes from both -- */
3447         strip_quotes(a);
3448         strip_quotes(b);
3449         
3450         vs = malloc(strlen(a->u.s)+strlen(b->u.s)+1);
3451         strcpy(vs,a->u.s);
3452         strcat(vs,b->u.s);
3453
3454         v = make_str(vs);
3455
3456         /* free arguments */
3457         free_value(a);
3458         free_value(b);
3459
3460         return v;
3461 }
3462