aabc39a42c9d765ce52952cf95924afb3342a77b
[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 342 "ast_expr2.y"
489 {
490         struct val *val;
491         struct expr_node *arglist;
492 }
493 /* Line 187 of yacc.c.  */
494 #line 493 "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 347 "ast_expr2.y"
517
518 extern int              ast_yylex __P((YYSTYPE *, YYLTYPE *, yyscan_t));
519
520
521 /* Line 216 of yacc.c.  */
522 #line 521 "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  27
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,    17,    19,    23,
797       27,    31,    35,    39,    43,    47,    51,    55,    59,    63,
798       66,    69,    73,    77,    81,    85,    89,    95
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,    25,    23,    28,    24,    -1,    25,    -1,    23,
806       29,    24,    -1,    29,     6,    29,    -1,    29,     7,    29,
807       -1,    29,    13,    29,    -1,    29,    12,    29,    -1,    29,
808       11,    29,    -1,    29,    10,    29,    -1,    29,     9,    29,
809       -1,    29,     8,    29,    -1,    29,    15,    29,    -1,    29,
810       14,    29,    -1,    14,    29,    -1,    19,    29,    -1,    29,
811       18,    29,    -1,    29,    17,    29,    -1,    29,    16,    29,
812       -1,    29,    22,    29,    -1,    29,    21,    29,    -1,    29,
813        5,    29,     4,    29,    -1,    29,    20,    29,    -1
814 };
815
816 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
817 static const yytype_uint16 yyrline[] =
818 {
819        0,   371,   371,   379,   386,   387,   396,   402,   403,   407,
820      411,   415,   419,   423,   427,   431,   435,   439,   443,   447,
821      451,   455,   459,   463,   467,   471,   475,   480
822 };
823 #endif
824
825 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
826 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
827    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
828 static const char *const yytname[] =
829 {
830   "$end", "error", "$undefined", "TOK_COMMA", "TOK_COLONCOLON",
831   "TOK_COND", "TOK_OR", "TOK_AND", "TOK_NE", "TOK_LE", "TOK_GE", "TOK_LT",
832   "TOK_GT", "TOK_EQ", "TOK_MINUS", "TOK_PLUS", "TOK_MOD", "TOK_DIV",
833   "TOK_MULT", "TOK_COMPL", "TOK_TILDETILDE", "TOK_EQTILDE", "TOK_COLON",
834   "TOK_LP", "TOK_RP", "TOKEN", "$accept", "start", "arglist", "expr", 0
835 };
836 #endif
837
838 # ifdef YYPRINT
839 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
840    token YYLEX-NUM.  */
841 static const yytype_uint16 yytoknum[] =
842 {
843        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
844      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
845      275,   276,   277,   278,   279,   280
846 };
847 # endif
848
849 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
850 static const yytype_uint8 yyr1[] =
851 {
852        0,    26,    27,    27,    28,    28,    29,    29,    29,    29,
853       29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
854       29,    29,    29,    29,    29,    29,    29,    29
855 };
856
857 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
858 static const yytype_uint8 yyr2[] =
859 {
860        0,     2,     1,     0,     1,     3,     4,     1,     3,     3,
861        3,     3,     3,     3,     3,     3,     3,     3,     3,     2,
862        2,     3,     3,     3,     3,     3,     5,     3
863 };
864
865 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
866    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
867    means the default is an error.  */
868 static const yytype_uint8 yydefact[] =
869 {
870        3,     0,     0,     0,     7,     0,     2,    19,    20,     0,
871        0,     1,     0,     0,     0,     0,     0,     0,     0,     0,
872        0,     0,     0,     0,     0,     0,     0,     0,     0,     8,
873        0,     4,     0,     9,    10,    16,    15,    14,    13,    12,
874       11,    18,    17,    23,    22,    21,    27,    25,    24,     0,
875        6,     0,     5,    26
876 };
877
878 /* YYDEFGOTO[NTERM-NUM].  */
879 static const yytype_int8 yydefgoto[] =
880 {
881       -1,     5,    30,     6
882 };
883
884 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
885    STATE-NUM.  */
886 #define YYPACT_NINF -18
887 static const yytype_int16 yypact[] =
888 {
889      118,   118,   118,   118,   -15,     6,    65,   -17,   -17,    25,
890      118,   -18,   118,   118,   118,   118,   118,   118,   118,   118,
891      118,   118,   118,   118,   118,   118,   118,   118,   118,   -18,
892        4,    65,    47,    98,   113,   130,   130,   130,   130,   130,
893      130,   137,   137,   -17,   -17,   -17,   -18,   -18,   -18,   118,
894      -18,   118,    65,    82
895 };
896
897 /* YYPGOTO[NTERM-NUM].  */
898 static const yytype_int8 yypgoto[] =
899 {
900      -18,   -18,   -18,    -1
901 };
902
903 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
904    positive, shift that token.  If negative, reduce the rule which
905    number is the opposite.  If zero, do what YYDEFACT says.
906    If YYTABLE_NINF, syntax error.  */
907 #define YYTABLE_NINF -1
908 static const yytype_uint8 yytable[] =
909 {
910        7,     8,     9,    26,    27,    28,    11,    49,    10,    31,
911        0,    32,    33,    34,    35,    36,    37,    38,    39,    40,
912       41,    42,    43,    44,    45,    46,    47,    48,    50,     0,
913       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
914       22,    23,    24,    25,     0,    26,    27,    28,    52,    29,
915       53,    51,    12,    13,    14,    15,    16,    17,    18,    19,
916       20,    21,    22,    23,    24,    25,     0,    26,    27,    28,
917       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
918       22,    23,    24,    25,     0,    26,    27,    28,    13,    14,
919       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
920       25,     0,    26,    27,    28,    14,    15,    16,    17,    18,
921       19,    20,    21,    22,    23,    24,    25,     0,    26,    27,
922       28,    15,    16,    17,    18,    19,    20,    21,    22,    23,
923       24,    25,     1,    26,    27,    28,     0,     2,     0,     0,
924        0,     3,     0,     4,    21,    22,    23,    24,    25,     0,
925       26,    27,    28,    23,    24,    25,     0,    26,    27,    28
926 };
927
928 static const yytype_int8 yycheck[] =
929 {
930        1,     2,     3,    20,    21,    22,     0,     3,    23,    10,
931       -1,    12,    13,    14,    15,    16,    17,    18,    19,    20,
932       21,    22,    23,    24,    25,    26,    27,    28,    24,    -1,
933        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
934       15,    16,    17,    18,    -1,    20,    21,    22,    49,    24,
935       51,     4,     5,     6,     7,     8,     9,    10,    11,    12,
936       13,    14,    15,    16,    17,    18,    -1,    20,    21,    22,
937        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
938       15,    16,    17,    18,    -1,    20,    21,    22,     6,     7,
939        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
940       18,    -1,    20,    21,    22,     7,     8,     9,    10,    11,
941       12,    13,    14,    15,    16,    17,    18,    -1,    20,    21,
942       22,     8,     9,    10,    11,    12,    13,    14,    15,    16,
943       17,    18,    14,    20,    21,    22,    -1,    19,    -1,    -1,
944       -1,    23,    -1,    25,    14,    15,    16,    17,    18,    -1,
945       20,    21,    22,    16,    17,    18,    -1,    20,    21,    22
946 };
947
948 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
949    symbol of state STATE-NUM.  */
950 static const yytype_uint8 yystos[] =
951 {
952        0,    14,    19,    23,    25,    27,    29,    29,    29,    29,
953       23,     0,     5,     6,     7,     8,     9,    10,    11,    12,
954       13,    14,    15,    16,    17,    18,    20,    21,    22,    24,
955       28,    29,    29,    29,    29,    29,    29,    29,    29,    29,
956       29,    29,    29,    29,    29,    29,    29,    29,    29,     3,
957       24,     4,    29,    29
958 };
959
960 #define yyerrok         (yyerrstatus = 0)
961 #define yyclearin       (yychar = YYEMPTY)
962 #define YYEMPTY         (-2)
963 #define YYEOF           0
964
965 #define YYACCEPT        goto yyacceptlab
966 #define YYABORT         goto yyabortlab
967 #define YYERROR         goto yyerrorlab
968
969
970 /* Like YYERROR except do call yyerror.  This remains here temporarily
971    to ease the transition to the new meaning of YYERROR, for GCC.
972    Once GCC version 2 has supplanted version 1, this can go.  */
973
974 #define YYFAIL          goto yyerrlab
975
976 #define YYRECOVERING()  (!!yyerrstatus)
977
978 #define YYBACKUP(Token, Value)                                  \
979 do                                                              \
980   if (yychar == YYEMPTY && yylen == 1)                          \
981     {                                                           \
982       yychar = (Token);                                         \
983       yylval = (Value);                                         \
984       yytoken = YYTRANSLATE (yychar);                           \
985       YYPOPSTACK (1);                                           \
986       goto yybackup;                                            \
987     }                                                           \
988   else                                                          \
989     {                                                           \
990       yyerror (YY_("syntax error: cannot back up")); \
991       YYERROR;                                                  \
992     }                                                           \
993 while (YYID (0))
994
995
996 #define YYTERROR        1
997 #define YYERRCODE       256
998
999
1000 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
1001    If N is 0, then set CURRENT to the empty location which ends
1002    the previous symbol: RHS[0] (always defined).  */
1003
1004 #define YYRHSLOC(Rhs, K) ((Rhs)[K])
1005 #ifndef YYLLOC_DEFAULT
1006 # define YYLLOC_DEFAULT(Current, Rhs, N)                                \
1007     do                                                                  \
1008       if (YYID (N))                                                    \
1009         {                                                               \
1010           (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
1011           (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
1012           (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
1013           (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
1014         }                                                               \
1015       else                                                              \
1016         {                                                               \
1017           (Current).first_line   = (Current).last_line   =              \
1018             YYRHSLOC (Rhs, 0).last_line;                                \
1019           (Current).first_column = (Current).last_column =              \
1020             YYRHSLOC (Rhs, 0).last_column;                              \
1021         }                                                               \
1022     while (YYID (0))
1023 #endif
1024
1025
1026 /* YY_LOCATION_PRINT -- Print the location on the stream.
1027    This macro was not mandated originally: define only if we know
1028    we won't break user code: when these are the locations we know.  */
1029
1030 #ifndef YY_LOCATION_PRINT
1031 # if YYLTYPE_IS_TRIVIAL
1032 #  define YY_LOCATION_PRINT(File, Loc)                  \
1033      fprintf (File, "%d.%d-%d.%d",                      \
1034               (Loc).first_line, (Loc).first_column,     \
1035               (Loc).last_line,  (Loc).last_column)
1036 # else
1037 #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
1038 # endif
1039 #endif
1040
1041
1042 /* YYLEX -- calling `yylex' with the right arguments.  */
1043
1044 #ifdef YYLEX_PARAM
1045 # define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
1046 #else
1047 # define YYLEX yylex (&yylval, &yylloc)
1048 #endif
1049
1050 /* Enable debugging if requested.  */
1051 #if YYDEBUG
1052
1053 # ifndef YYFPRINTF
1054 #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
1055 #  define YYFPRINTF fprintf
1056 # endif
1057
1058 # define YYDPRINTF(Args)                        \
1059 do {                                            \
1060   if (yydebug)                                  \
1061     YYFPRINTF Args;                             \
1062 } while (YYID (0))
1063
1064 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
1065 do {                                                                      \
1066   if (yydebug)                                                            \
1067     {                                                                     \
1068       YYFPRINTF (stderr, "%s ", Title);                                   \
1069       yy_symbol_print (stderr,                                            \
1070                   Type, Value, Location); \
1071       YYFPRINTF (stderr, "\n");                                           \
1072     }                                                                     \
1073 } while (YYID (0))
1074
1075
1076 /*--------------------------------.
1077 | Print this symbol on YYOUTPUT.  |
1078 `--------------------------------*/
1079
1080 /*ARGSUSED*/
1081 #if (defined __STDC__ || defined __C99__FUNC__ \
1082      || defined __cplusplus || defined _MSC_VER)
1083 static void
1084 yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
1085 #else
1086 static void
1087 yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
1088     FILE *yyoutput;
1089     int yytype;
1090     YYSTYPE const * const yyvaluep;
1091     YYLTYPE const * const yylocationp;
1092 #endif
1093 {
1094   if (!yyvaluep)
1095     return;
1096   YYUSE (yylocationp);
1097 # ifdef YYPRINT
1098   if (yytype < YYNTOKENS)
1099     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
1100 # else
1101   YYUSE (yyoutput);
1102 # endif
1103   switch (yytype)
1104     {
1105       default:
1106         break;
1107     }
1108 }
1109
1110
1111 /*--------------------------------.
1112 | Print this symbol on YYOUTPUT.  |
1113 `--------------------------------*/
1114
1115 #if (defined __STDC__ || defined __C99__FUNC__ \
1116      || defined __cplusplus || defined _MSC_VER)
1117 static void
1118 yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
1119 #else
1120 static void
1121 yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
1122     FILE *yyoutput;
1123     int yytype;
1124     YYSTYPE const * const yyvaluep;
1125     YYLTYPE const * const yylocationp;
1126 #endif
1127 {
1128   if (yytype < YYNTOKENS)
1129     YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
1130   else
1131     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
1132
1133   YY_LOCATION_PRINT (yyoutput, *yylocationp);
1134   YYFPRINTF (yyoutput, ": ");
1135   yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
1136   YYFPRINTF (yyoutput, ")");
1137 }
1138
1139 /*------------------------------------------------------------------.
1140 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
1141 | TOP (included).                                                   |
1142 `------------------------------------------------------------------*/
1143
1144 #if (defined __STDC__ || defined __C99__FUNC__ \
1145      || defined __cplusplus || defined _MSC_VER)
1146 static void
1147 yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
1148 #else
1149 static void
1150 yy_stack_print (bottom, top)
1151     yytype_int16 *bottom;
1152     yytype_int16 *top;
1153 #endif
1154 {
1155   YYFPRINTF (stderr, "Stack now");
1156   for (; bottom <= top; ++bottom)
1157     YYFPRINTF (stderr, " %d", *bottom);
1158   YYFPRINTF (stderr, "\n");
1159 }
1160
1161 # define YY_STACK_PRINT(Bottom, Top)                            \
1162 do {                                                            \
1163   if (yydebug)                                                  \
1164     yy_stack_print ((Bottom), (Top));                           \
1165 } while (YYID (0))
1166
1167
1168 /*------------------------------------------------.
1169 | Report that the YYRULE is going to be reduced.  |
1170 `------------------------------------------------*/
1171
1172 #if (defined __STDC__ || defined __C99__FUNC__ \
1173      || defined __cplusplus || defined _MSC_VER)
1174 static void
1175 yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
1176 #else
1177 static void
1178 yy_reduce_print (yyvsp, yylsp, yyrule)
1179     YYSTYPE *yyvsp;
1180     YYLTYPE *yylsp;
1181     int yyrule;
1182 #endif
1183 {
1184   int yynrhs = yyr2[yyrule];
1185   int yyi;
1186   unsigned long int yylno = yyrline[yyrule];
1187   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
1188              yyrule - 1, yylno);
1189   /* The symbols being reduced.  */
1190   for (yyi = 0; yyi < yynrhs; yyi++)
1191     {
1192       fprintf (stderr, "   $%d = ", yyi + 1);
1193       yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
1194                        &(yyvsp[(yyi + 1) - (yynrhs)])
1195                        , &(yylsp[(yyi + 1) - (yynrhs)])                );
1196       fprintf (stderr, "\n");
1197     }
1198 }
1199
1200 # define YY_REDUCE_PRINT(Rule)          \
1201 do {                                    \
1202   if (yydebug)                          \
1203     yy_reduce_print (yyvsp, yylsp, Rule); \
1204 } while (YYID (0))
1205
1206 /* Nonzero means print parse trace.  It is left uninitialized so that
1207    multiple parsers can coexist.  */
1208 int yydebug;
1209 #else /* !YYDEBUG */
1210 # define YYDPRINTF(Args)
1211 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
1212 # define YY_STACK_PRINT(Bottom, Top)
1213 # define YY_REDUCE_PRINT(Rule)
1214 #endif /* !YYDEBUG */
1215
1216
1217 /* YYINITDEPTH -- initial size of the parser's stacks.  */
1218 #ifndef YYINITDEPTH
1219 # define YYINITDEPTH 200
1220 #endif
1221
1222 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
1223    if the built-in stack extension method is used).
1224
1225    Do not make this value too large; the results are undefined if
1226    YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
1227    evaluated with infinite-precision integer arithmetic.  */
1228
1229 #ifndef YYMAXDEPTH
1230 # define YYMAXDEPTH 10000
1231 #endif
1232
1233 \f
1234
1235 #if YYERROR_VERBOSE
1236
1237 # ifndef yystrlen
1238 #  if defined __GLIBC__ && defined _STRING_H
1239 #   define yystrlen strlen
1240 #  else
1241 /* Return the length of YYSTR.  */
1242 #if (defined __STDC__ || defined __C99__FUNC__ \
1243      || defined __cplusplus || defined _MSC_VER)
1244 static YYSIZE_T
1245 yystrlen (const char *yystr)
1246 #else
1247 static YYSIZE_T
1248 yystrlen (yystr)
1249     const char *yystr;
1250 #endif
1251 {
1252   YYSIZE_T yylen;
1253   for (yylen = 0; yystr[yylen]; yylen++)
1254     continue;
1255   return yylen;
1256 }
1257 #  endif
1258 # endif
1259
1260 # ifndef yystpcpy
1261 #  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
1262 #   define yystpcpy stpcpy
1263 #  else
1264 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
1265    YYDEST.  */
1266 #if (defined __STDC__ || defined __C99__FUNC__ \
1267      || defined __cplusplus || defined _MSC_VER)
1268 static char *
1269 yystpcpy (char *yydest, const char *yysrc)
1270 #else
1271 static char *
1272 yystpcpy (yydest, yysrc)
1273     char *yydest;
1274     const char *yysrc;
1275 #endif
1276 {
1277   char *yyd = yydest;
1278   const char *yys = yysrc;
1279
1280   while ((*yyd++ = *yys++) != '\0')
1281     continue;
1282
1283   return yyd - 1;
1284 }
1285 #  endif
1286 # endif
1287
1288 # ifndef yytnamerr
1289 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
1290    quotes and backslashes, so that it's suitable for yyerror.  The
1291    heuristic is that double-quoting is unnecessary unless the string
1292    contains an apostrophe, a comma, or backslash (other than
1293    backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
1294    null, do not copy; instead, return the length of what the result
1295    would have been.  */
1296 static YYSIZE_T
1297 yytnamerr (char *yyres, const char *yystr)
1298 {
1299   if (*yystr == '"')
1300     {
1301       YYSIZE_T yyn = 0;
1302       char const *yyp = yystr;
1303
1304       for (;;)
1305         switch (*++yyp)
1306           {
1307           case '\'':
1308           case ',':
1309             goto do_not_strip_quotes;
1310
1311           case '\\':
1312             if (*++yyp != '\\')
1313               goto do_not_strip_quotes;
1314             /* Fall through.  */
1315           default:
1316             if (yyres)
1317               yyres[yyn] = *yyp;
1318             yyn++;
1319             break;
1320
1321           case '"':
1322             if (yyres)
1323               yyres[yyn] = '\0';
1324             return yyn;
1325           }
1326     do_not_strip_quotes: ;
1327     }
1328
1329   if (! yyres)
1330     return yystrlen (yystr);
1331
1332   return yystpcpy (yyres, yystr) - yyres;
1333 }
1334 # endif
1335
1336 /* Copy into YYRESULT an error message about the unexpected token
1337    YYCHAR while in state YYSTATE.  Return the number of bytes copied,
1338    including the terminating null byte.  If YYRESULT is null, do not
1339    copy anything; just return the number of bytes that would be
1340    copied.  As a special case, return 0 if an ordinary "syntax error"
1341    message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
1342    size calculation.  */
1343 static YYSIZE_T
1344 yysyntax_error (char *yyresult, int yystate, int yychar)
1345 {
1346   int yyn = yypact[yystate];
1347
1348   if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
1349     return 0;
1350   else
1351     {
1352       int yytype = YYTRANSLATE (yychar);
1353       YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
1354       YYSIZE_T yysize = yysize0;
1355       YYSIZE_T yysize1;
1356       int yysize_overflow = 0;
1357       enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1358       char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1359       int yyx;
1360
1361 # if 0
1362       /* This is so xgettext sees the translatable formats that are
1363          constructed on the fly.  */
1364       YY_("syntax error, unexpected %s");
1365       YY_("syntax error, unexpected %s, expecting %s");
1366       YY_("syntax error, unexpected %s, expecting %s or %s");
1367       YY_("syntax error, unexpected %s, expecting %s or %s or %s");
1368       YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
1369 # endif
1370       char *yyfmt;
1371       char const *yyf;
1372       static char const yyunexpected[] = "syntax error, unexpected %s";
1373       static char const yyexpecting[] = ", expecting %s";
1374       static char const yyor[] = " or %s";
1375       char yyformat[sizeof yyunexpected
1376                     + sizeof yyexpecting - 1
1377                     + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
1378                        * (sizeof yyor - 1))];
1379       char const *yyprefix = yyexpecting;
1380
1381       /* Start YYX at -YYN if negative to avoid negative indexes in
1382          YYCHECK.  */
1383       int yyxbegin = yyn < 0 ? -yyn : 0;
1384
1385       /* Stay within bounds of both yycheck and yytname.  */
1386       int yychecklim = YYLAST - yyn + 1;
1387       int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1388       int yycount = 1;
1389
1390       yyarg[0] = yytname[yytype];
1391       yyfmt = yystpcpy (yyformat, yyunexpected);
1392
1393       for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1394         if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1395           {
1396             if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1397               {
1398                 yycount = 1;
1399                 yysize = yysize0;
1400                 yyformat[sizeof yyunexpected - 1] = '\0';
1401                 break;
1402               }
1403             yyarg[yycount++] = yytname[yyx];
1404             yysize1 = yysize + yytnamerr (0, yytname[yyx]);
1405             yysize_overflow |= (yysize1 < yysize);
1406             yysize = yysize1;
1407             yyfmt = yystpcpy (yyfmt, yyprefix);
1408             yyprefix = yyor;
1409           }
1410
1411       yyf = YY_(yyformat);
1412       yysize1 = yysize + yystrlen (yyf);
1413       yysize_overflow |= (yysize1 < yysize);
1414       yysize = yysize1;
1415
1416       if (yysize_overflow)
1417         return YYSIZE_MAXIMUM;
1418
1419       if (yyresult)
1420         {
1421           /* Avoid sprintf, as that infringes on the user's name space.
1422              Don't have undefined behavior even if the translation
1423              produced a string with the wrong number of "%s"s.  */
1424           char *yyp = yyresult;
1425           int yyi = 0;
1426           while ((*yyp = *yyf) != '\0')
1427             {
1428               if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
1429                 {
1430                   yyp += yytnamerr (yyp, yyarg[yyi++]);
1431                   yyf += 2;
1432                 }
1433               else
1434                 {
1435                   yyp++;
1436                   yyf++;
1437                 }
1438             }
1439         }
1440       return yysize;
1441     }
1442 }
1443 #endif /* YYERROR_VERBOSE */
1444 \f
1445
1446 /*-----------------------------------------------.
1447 | Release the memory associated to this symbol.  |
1448 `-----------------------------------------------*/
1449
1450 /*ARGSUSED*/
1451 #if (defined __STDC__ || defined __C99__FUNC__ \
1452      || defined __cplusplus || defined _MSC_VER)
1453 static void
1454 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
1455 #else
1456 static void
1457 yydestruct (yymsg, yytype, yyvaluep, yylocationp)
1458     const char *yymsg;
1459     int yytype;
1460     YYSTYPE *yyvaluep;
1461     YYLTYPE *yylocationp;
1462 #endif
1463 {
1464   YYUSE (yyvaluep);
1465   YYUSE (yylocationp);
1466
1467   if (!yymsg)
1468     yymsg = "Deleting";
1469   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1470
1471   switch (yytype)
1472     {
1473       case 4: /* "TOK_COLONCOLON" */
1474 #line 365 "ast_expr2.y"
1475         {  free_value((yyvaluep->val)); };
1476 #line 1475 "ast_expr2.c"
1477         break;
1478       case 5: /* "TOK_COND" */
1479 #line 365 "ast_expr2.y"
1480         {  free_value((yyvaluep->val)); };
1481 #line 1480 "ast_expr2.c"
1482         break;
1483       case 6: /* "TOK_OR" */
1484 #line 365 "ast_expr2.y"
1485         {  free_value((yyvaluep->val)); };
1486 #line 1485 "ast_expr2.c"
1487         break;
1488       case 7: /* "TOK_AND" */
1489 #line 365 "ast_expr2.y"
1490         {  free_value((yyvaluep->val)); };
1491 #line 1490 "ast_expr2.c"
1492         break;
1493       case 8: /* "TOK_NE" */
1494 #line 365 "ast_expr2.y"
1495         {  free_value((yyvaluep->val)); };
1496 #line 1495 "ast_expr2.c"
1497         break;
1498       case 9: /* "TOK_LE" */
1499 #line 365 "ast_expr2.y"
1500         {  free_value((yyvaluep->val)); };
1501 #line 1500 "ast_expr2.c"
1502         break;
1503       case 10: /* "TOK_GE" */
1504 #line 365 "ast_expr2.y"
1505         {  free_value((yyvaluep->val)); };
1506 #line 1505 "ast_expr2.c"
1507         break;
1508       case 11: /* "TOK_LT" */
1509 #line 365 "ast_expr2.y"
1510         {  free_value((yyvaluep->val)); };
1511 #line 1510 "ast_expr2.c"
1512         break;
1513       case 12: /* "TOK_GT" */
1514 #line 365 "ast_expr2.y"
1515         {  free_value((yyvaluep->val)); };
1516 #line 1515 "ast_expr2.c"
1517         break;
1518       case 13: /* "TOK_EQ" */
1519 #line 365 "ast_expr2.y"
1520         {  free_value((yyvaluep->val)); };
1521 #line 1520 "ast_expr2.c"
1522         break;
1523       case 14: /* "TOK_MINUS" */
1524 #line 365 "ast_expr2.y"
1525         {  free_value((yyvaluep->val)); };
1526 #line 1525 "ast_expr2.c"
1527         break;
1528       case 15: /* "TOK_PLUS" */
1529 #line 365 "ast_expr2.y"
1530         {  free_value((yyvaluep->val)); };
1531 #line 1530 "ast_expr2.c"
1532         break;
1533       case 16: /* "TOK_MOD" */
1534 #line 365 "ast_expr2.y"
1535         {  free_value((yyvaluep->val)); };
1536 #line 1535 "ast_expr2.c"
1537         break;
1538       case 17: /* "TOK_DIV" */
1539 #line 365 "ast_expr2.y"
1540         {  free_value((yyvaluep->val)); };
1541 #line 1540 "ast_expr2.c"
1542         break;
1543       case 18: /* "TOK_MULT" */
1544 #line 365 "ast_expr2.y"
1545         {  free_value((yyvaluep->val)); };
1546 #line 1545 "ast_expr2.c"
1547         break;
1548       case 19: /* "TOK_COMPL" */
1549 #line 365 "ast_expr2.y"
1550         {  free_value((yyvaluep->val)); };
1551 #line 1550 "ast_expr2.c"
1552         break;
1553       case 20: /* "TOK_TILDETILDE" */
1554 #line 365 "ast_expr2.y"
1555         {  free_value((yyvaluep->val)); };
1556 #line 1555 "ast_expr2.c"
1557         break;
1558       case 21: /* "TOK_EQTILDE" */
1559 #line 365 "ast_expr2.y"
1560         {  free_value((yyvaluep->val)); };
1561 #line 1560 "ast_expr2.c"
1562         break;
1563       case 22: /* "TOK_COLON" */
1564 #line 365 "ast_expr2.y"
1565         {  free_value((yyvaluep->val)); };
1566 #line 1565 "ast_expr2.c"
1567         break;
1568       case 23: /* "TOK_LP" */
1569 #line 365 "ast_expr2.y"
1570         {  free_value((yyvaluep->val)); };
1571 #line 1570 "ast_expr2.c"
1572         break;
1573       case 24: /* "TOK_RP" */
1574 #line 365 "ast_expr2.y"
1575         {  free_value((yyvaluep->val)); };
1576 #line 1575 "ast_expr2.c"
1577         break;
1578       case 25: /* "TOKEN" */
1579 #line 365 "ast_expr2.y"
1580         {  free_value((yyvaluep->val)); };
1581 #line 1580 "ast_expr2.c"
1582         break;
1583       case 29: /* "expr" */
1584 #line 365 "ast_expr2.y"
1585         {  free_value((yyvaluep->val)); };
1586 #line 1585 "ast_expr2.c"
1587         break;
1588
1589       default:
1590         break;
1591     }
1592 }
1593 \f
1594
1595 /* Prevent warnings from -Wmissing-prototypes.  */
1596
1597 #ifdef YYPARSE_PARAM
1598 #if defined __STDC__ || defined __cplusplus
1599 int yyparse (void *YYPARSE_PARAM);
1600 #else
1601 int yyparse ();
1602 #endif
1603 #else /* ! YYPARSE_PARAM */
1604 #if defined __STDC__ || defined __cplusplus
1605 int yyparse (void);
1606 #else
1607 int yyparse ();
1608 #endif
1609 #endif /* ! YYPARSE_PARAM */
1610
1611
1612
1613
1614
1615
1616 /*----------.
1617 | yyparse.  |
1618 `----------*/
1619
1620 #ifdef YYPARSE_PARAM
1621 #if (defined __STDC__ || defined __C99__FUNC__ \
1622      || defined __cplusplus || defined _MSC_VER)
1623 int
1624 yyparse (void *YYPARSE_PARAM)
1625 #else
1626 int
1627 yyparse (YYPARSE_PARAM)
1628     void *YYPARSE_PARAM;
1629 #endif
1630 #else /* ! YYPARSE_PARAM */
1631 #if (defined __STDC__ || defined __C99__FUNC__ \
1632      || defined __cplusplus || defined _MSC_VER)
1633 int
1634 yyparse (void)
1635 #else
1636 int
1637 yyparse ()
1638
1639 #endif
1640 #endif
1641 {
1642   /* The look-ahead symbol.  */
1643 int yychar;
1644
1645 /* The semantic value of the look-ahead symbol.  */
1646 YYSTYPE yylval;
1647
1648 /* Number of syntax errors so far.  */
1649 int yynerrs;
1650 /* Location data for the look-ahead symbol.  */
1651 YYLTYPE yylloc;
1652
1653   int yystate;
1654   int yyn;
1655   int yyresult;
1656   /* Number of tokens to shift before error messages enabled.  */
1657   int yyerrstatus;
1658   /* Look-ahead token as an internal (translated) token number.  */
1659   int yytoken = 0;
1660 #if YYERROR_VERBOSE
1661   /* Buffer for error messages, and its allocated size.  */
1662   char yymsgbuf[128];
1663   char *yymsg = yymsgbuf;
1664   YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1665 #endif
1666
1667   /* Three stacks and their tools:
1668      `yyss': related to states,
1669      `yyvs': related to semantic values,
1670      `yyls': related to locations.
1671
1672      Refer to the stacks thru separate pointers, to allow yyoverflow
1673      to reallocate them elsewhere.  */
1674
1675   /* The state stack.  */
1676   yytype_int16 yyssa[YYINITDEPTH];
1677   yytype_int16 *yyss = yyssa;
1678   yytype_int16 *yyssp;
1679
1680   /* The semantic value stack.  */
1681   YYSTYPE yyvsa[YYINITDEPTH];
1682   YYSTYPE *yyvs = yyvsa;
1683   YYSTYPE *yyvsp;
1684
1685   /* The location stack.  */
1686   YYLTYPE yylsa[YYINITDEPTH];
1687   YYLTYPE *yyls = yylsa;
1688   YYLTYPE *yylsp;
1689   /* The locations where the error started and ended.  */
1690   YYLTYPE yyerror_range[2];
1691
1692 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
1693
1694   YYSIZE_T yystacksize = YYINITDEPTH;
1695
1696   /* The variables used to return semantic value and location from the
1697      action routines.  */
1698   YYSTYPE yyval;
1699   YYLTYPE yyloc;
1700
1701   /* The number of symbols on the RHS of the reduced rule.
1702      Keep to zero when no symbol should be popped.  */
1703   int yylen = 0;
1704
1705   YYDPRINTF ((stderr, "Starting parse\n"));
1706
1707   yystate = 0;
1708   yyerrstatus = 0;
1709   yynerrs = 0;
1710   yychar = YYEMPTY;             /* Cause a token to be read.  */
1711
1712   /* Initialize stack pointers.
1713      Waste one element of value and location stack
1714      so that they stay on the same level as the state stack.
1715      The wasted elements are never initialized.  */
1716
1717   yyssp = yyss;
1718   yyvsp = yyvs;
1719   yylsp = yyls;
1720 #if YYLTYPE_IS_TRIVIAL
1721   /* Initialize the default location before parsing starts.  */
1722   yylloc.first_line   = yylloc.last_line   = 1;
1723   yylloc.first_column = yylloc.last_column = 0;
1724 #endif
1725
1726   goto yysetstate;
1727
1728 /*------------------------------------------------------------.
1729 | yynewstate -- Push a new state, which is found in yystate.  |
1730 `------------------------------------------------------------*/
1731  yynewstate:
1732   /* In all cases, when you get here, the value and location stacks
1733      have just been pushed.  So pushing a state here evens the stacks.  */
1734   yyssp++;
1735
1736  yysetstate:
1737   *yyssp = yystate;
1738
1739   if (yyss + yystacksize - 1 <= yyssp)
1740     {
1741       /* Get the current used size of the three stacks, in elements.  */
1742       YYSIZE_T yysize = yyssp - yyss + 1;
1743
1744 #ifdef yyoverflow
1745       {
1746         /* Give user a chance to reallocate the stack.  Use copies of
1747            these so that the &'s don't force the real ones into
1748            memory.  */
1749         YYSTYPE *yyvs1 = yyvs;
1750         yytype_int16 *yyss1 = yyss;
1751         YYLTYPE *yyls1 = yyls;
1752
1753         /* Each stack pointer address is followed by the size of the
1754            data in use in that stack, in bytes.  This used to be a
1755            conditional around just the two extra args, but that might
1756            be undefined if yyoverflow is a macro.  */
1757         yyoverflow (YY_("memory exhausted"),
1758                     &yyss1, yysize * sizeof (*yyssp),
1759                     &yyvs1, yysize * sizeof (*yyvsp),
1760                     &yyls1, yysize * sizeof (*yylsp),
1761                     &yystacksize);
1762         yyls = yyls1;
1763         yyss = yyss1;
1764         yyvs = yyvs1;
1765       }
1766 #else /* no yyoverflow */
1767 # ifndef YYSTACK_RELOCATE
1768       goto yyexhaustedlab;
1769 # else
1770       /* Extend the stack our own way.  */
1771       if (YYMAXDEPTH <= yystacksize)
1772         goto yyexhaustedlab;
1773       yystacksize *= 2;
1774       if (YYMAXDEPTH < yystacksize)
1775         yystacksize = YYMAXDEPTH;
1776
1777       {
1778         yytype_int16 *yyss1 = yyss;
1779         union yyalloc *yyptr =
1780           (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1781         if (! yyptr)
1782           goto yyexhaustedlab;
1783         YYSTACK_RELOCATE (yyss);
1784         YYSTACK_RELOCATE (yyvs);
1785         YYSTACK_RELOCATE (yyls);
1786 #  undef YYSTACK_RELOCATE
1787         if (yyss1 != yyssa)
1788           YYSTACK_FREE (yyss1);
1789       }
1790 # endif
1791 #endif /* no yyoverflow */
1792
1793       yyssp = yyss + yysize - 1;
1794       yyvsp = yyvs + yysize - 1;
1795       yylsp = yyls + yysize - 1;
1796
1797       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1798                   (unsigned long int) yystacksize));
1799
1800       if (yyss + yystacksize - 1 <= yyssp)
1801         YYABORT;
1802     }
1803
1804   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1805
1806   goto yybackup;
1807
1808 /*-----------.
1809 | yybackup.  |
1810 `-----------*/
1811 yybackup:
1812
1813   /* Do appropriate processing given the current state.  Read a
1814      look-ahead token if we need one and don't already have one.  */
1815
1816   /* First try to decide what to do without reference to look-ahead token.  */
1817   yyn = yypact[yystate];
1818   if (yyn == YYPACT_NINF)
1819     goto yydefault;
1820
1821   /* Not known => get a look-ahead token if don't already have one.  */
1822
1823   /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
1824   if (yychar == YYEMPTY)
1825     {
1826       YYDPRINTF ((stderr, "Reading a token: "));
1827       yychar = YYLEX;
1828     }
1829
1830   if (yychar <= YYEOF)
1831     {
1832       yychar = yytoken = YYEOF;
1833       YYDPRINTF ((stderr, "Now at end of input.\n"));
1834     }
1835   else
1836     {
1837       yytoken = YYTRANSLATE (yychar);
1838       YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1839     }
1840
1841   /* If the proper action on seeing token YYTOKEN is to reduce or to
1842      detect an error, take that action.  */
1843   yyn += yytoken;
1844   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1845     goto yydefault;
1846   yyn = yytable[yyn];
1847   if (yyn <= 0)
1848     {
1849       if (yyn == 0 || yyn == YYTABLE_NINF)
1850         goto yyerrlab;
1851       yyn = -yyn;
1852       goto yyreduce;
1853     }
1854
1855   if (yyn == YYFINAL)
1856     YYACCEPT;
1857
1858   /* Count tokens shifted since error; after three, turn off error
1859      status.  */
1860   if (yyerrstatus)
1861     yyerrstatus--;
1862
1863   /* Shift the look-ahead token.  */
1864   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1865
1866   /* Discard the shifted token unless it is eof.  */
1867   if (yychar != YYEOF)
1868     yychar = YYEMPTY;
1869
1870   yystate = yyn;
1871   *++yyvsp = yylval;
1872   *++yylsp = yylloc;
1873   goto yynewstate;
1874
1875
1876 /*-----------------------------------------------------------.
1877 | yydefault -- do the default action for the current state.  |
1878 `-----------------------------------------------------------*/
1879 yydefault:
1880   yyn = yydefact[yystate];
1881   if (yyn == 0)
1882     goto yyerrlab;
1883   goto yyreduce;
1884
1885
1886 /*-----------------------------.
1887 | yyreduce -- Do a reduction.  |
1888 `-----------------------------*/
1889 yyreduce:
1890   /* yyn is the number of a rule to reduce with.  */
1891   yylen = yyr2[yyn];
1892
1893   /* If YYLEN is nonzero, implement the default value of the action:
1894      `$$ = $1'.
1895
1896      Otherwise, the following line sets YYVAL to garbage.
1897      This behavior is undocumented and Bison
1898      users should not rely upon it.  Assigning to YYVAL
1899      unconditionally makes the parser a bit smaller, and it avoids a
1900      GCC warning that YYVAL may be used uninitialized.  */
1901   yyval = yyvsp[1-yylen];
1902
1903   /* Default location.  */
1904   YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
1905   YY_REDUCE_PRINT (yyn);
1906   switch (yyn)
1907     {
1908         case 2:
1909 #line 371 "ast_expr2.y"
1910     { ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
1911               ((struct parse_io *)parseio)->val->type = (yyvsp[(1) - (1)].val)->type;
1912               if( (yyvsp[(1) - (1)].val)->type == AST_EXPR_number )
1913                                   ((struct parse_io *)parseio)->val->u.i = (yyvsp[(1) - (1)].val)->u.i;
1914               else
1915                                   ((struct parse_io *)parseio)->val->u.s = (yyvsp[(1) - (1)].val)->u.s; 
1916                           free((yyvsp[(1) - (1)].val));
1917                         ;}
1918     break;
1919
1920   case 3:
1921 #line 379 "ast_expr2.y"
1922     {/* nothing */ ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
1923               ((struct parse_io *)parseio)->val->type = AST_EXPR_string;
1924                           ((struct parse_io *)parseio)->val->u.s = strdup(""); 
1925                         ;}
1926     break;
1927
1928   case 4:
1929 #line 386 "ast_expr2.y"
1930     { (yyval.arglist) = alloc_expr_node(AST_EXPR_NODE_VAL); (yyval.arglist)->val = (yyvsp[(1) - (1)].val);;}
1931     break;
1932
1933   case 5:
1934 #line 387 "ast_expr2.y"
1935     {struct expr_node *x = alloc_expr_node(AST_EXPR_NODE_VAL);
1936                                  struct expr_node *t;
1937                                                                  DESTROY((yyvsp[(2) - (3)].val));
1938                                  for (t=(yyvsp[(1) - (3)].arglist);t->right;t=t->right)
1939                                                                   ;
1940                                  (yyval.arglist) = (yyvsp[(1) - (3)].arglist); t->right = x; x->val = (yyvsp[(3) - (3)].val);;}
1941     break;
1942
1943   case 6:
1944 #line 396 "ast_expr2.y"
1945     { (yyval.val) = op_func((yyvsp[(1) - (4)].val),(yyvsp[(3) - (4)].arglist), ((struct parse_io *)parseio)->chan);
1946                                             DESTROY((yyvsp[(2) - (4)].val));
1947                                                                         DESTROY((yyvsp[(4) - (4)].val));
1948                                                                         DESTROY((yyvsp[(1) - (4)].val));
1949                                                                         destroy_arglist((yyvsp[(3) - (4)].arglist));
1950                                   ;}
1951     break;
1952
1953   case 7:
1954 #line 402 "ast_expr2.y"
1955     {(yyval.val) = (yyvsp[(1) - (1)].val);;}
1956     break;
1957
1958   case 8:
1959 #line 403 "ast_expr2.y"
1960     { (yyval.val) = (yyvsp[(2) - (3)].val);
1961                                (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
1962                                                    (yyloc).first_line=0; (yyloc).last_line=0;
1963                                                         DESTROY((yyvsp[(1) - (3)].val)); DESTROY((yyvsp[(3) - (3)].val)); ;}
1964     break;
1965
1966   case 9:
1967 #line 407 "ast_expr2.y"
1968     { (yyval.val) = op_or ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
1969                                                 DESTROY((yyvsp[(2) - (3)].val));        
1970                          (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
1971                                                  (yyloc).first_line=0; (yyloc).last_line=0;;}
1972     break;
1973
1974   case 10:
1975 #line 411 "ast_expr2.y"
1976     { (yyval.val) = op_and ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
1977                                                 DESTROY((yyvsp[(2) - (3)].val));        
1978                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
1979                           (yyloc).first_line=0; (yyloc).last_line=0;;}
1980     break;
1981
1982   case 11:
1983 #line 415 "ast_expr2.y"
1984     { (yyval.val) = op_eq ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
1985                                                 DESTROY((yyvsp[(2) - (3)].val));        
1986                              (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
1987                                                  (yyloc).first_line=0; (yyloc).last_line=0;;}
1988     break;
1989
1990   case 12:
1991 #line 419 "ast_expr2.y"
1992     { (yyval.val) = op_gt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
1993                                                 DESTROY((yyvsp[(2) - (3)].val));        
1994                          (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
1995                                                  (yyloc).first_line=0; (yyloc).last_line=0;;}
1996     break;
1997
1998   case 13:
1999 #line 423 "ast_expr2.y"
2000     { (yyval.val) = op_lt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2001                                                 DESTROY((yyvsp[(2) - (3)].val));        
2002                              (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2003                                                  (yyloc).first_line=0; (yyloc).last_line=0;;}
2004     break;
2005
2006   case 14:
2007 #line 427 "ast_expr2.y"
2008     { (yyval.val) = op_ge ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2009                                                 DESTROY((yyvsp[(2) - (3)].val));        
2010                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2011                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2012     break;
2013
2014   case 15:
2015 #line 431 "ast_expr2.y"
2016     { (yyval.val) = op_le ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2017                                                 DESTROY((yyvsp[(2) - (3)].val));        
2018                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2019                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2020     break;
2021
2022   case 16:
2023 #line 435 "ast_expr2.y"
2024     { (yyval.val) = op_ne ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2025                                                 DESTROY((yyvsp[(2) - (3)].val));        
2026                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2027                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2028     break;
2029
2030   case 17:
2031 #line 439 "ast_expr2.y"
2032     { (yyval.val) = op_plus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2033                                                 DESTROY((yyvsp[(2) - (3)].val));        
2034                                (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2035                                                    (yyloc).first_line=0; (yyloc).last_line=0;;}
2036     break;
2037
2038   case 18:
2039 #line 443 "ast_expr2.y"
2040     { (yyval.val) = op_minus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2041                                                 DESTROY((yyvsp[(2) - (3)].val));        
2042                                 (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2043                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2044     break;
2045
2046   case 19:
2047 #line 447 "ast_expr2.y"
2048     { (yyval.val) = op_negate ((yyvsp[(2) - (2)].val)); 
2049                                                 DESTROY((yyvsp[(1) - (2)].val));        
2050                                 (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column; 
2051                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2052     break;
2053
2054   case 20:
2055 #line 451 "ast_expr2.y"
2056     { (yyval.val) = op_compl ((yyvsp[(2) - (2)].val)); 
2057                                                 DESTROY((yyvsp[(1) - (2)].val));        
2058                                 (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column; 
2059                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2060     break;
2061
2062   case 21:
2063 #line 455 "ast_expr2.y"
2064     { (yyval.val) = op_times ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2065                                                 DESTROY((yyvsp[(2) - (3)].val));        
2066                                (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2067                                                    (yyloc).first_line=0; (yyloc).last_line=0;;}
2068     break;
2069
2070   case 22:
2071 #line 459 "ast_expr2.y"
2072     { (yyval.val) = op_div ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2073                                                 DESTROY((yyvsp[(2) - (3)].val));        
2074                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2075                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2076     break;
2077
2078   case 23:
2079 #line 463 "ast_expr2.y"
2080     { (yyval.val) = op_rem ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2081                                                 DESTROY((yyvsp[(2) - (3)].val));        
2082                               (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2083                                                   (yyloc).first_line=0; (yyloc).last_line=0;;}
2084     break;
2085
2086   case 24:
2087 #line 467 "ast_expr2.y"
2088     { (yyval.val) = op_colon ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2089                                                 DESTROY((yyvsp[(2) - (3)].val));        
2090                                 (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2091                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2092     break;
2093
2094   case 25:
2095 #line 471 "ast_expr2.y"
2096     { (yyval.val) = op_eqtilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2097                                                 DESTROY((yyvsp[(2) - (3)].val));        
2098                                 (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2099                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2100     break;
2101
2102   case 26:
2103 #line 475 "ast_expr2.y"
2104     { (yyval.val) = op_cond ((yyvsp[(1) - (5)].val), (yyvsp[(3) - (5)].val), (yyvsp[(5) - (5)].val)); 
2105                                                 DESTROY((yyvsp[(2) - (5)].val));        
2106                                                 DESTROY((yyvsp[(4) - (5)].val));        
2107                                 (yyloc).first_column = (yylsp[(1) - (5)]).first_column; (yyloc).last_column = (yylsp[(3) - (5)]).last_column; 
2108                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2109     break;
2110
2111   case 27:
2112 #line 480 "ast_expr2.y"
2113     { (yyval.val) = op_tildetilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
2114                                                 DESTROY((yyvsp[(2) - (3)].val));        
2115                                 (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
2116                                                         (yyloc).first_line=0; (yyloc).last_line=0;;}
2117     break;
2118
2119
2120 /* Line 1267 of yacc.c.  */
2121 #line 2120 "ast_expr2.c"
2122       default: break;
2123     }
2124   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
2125
2126   YYPOPSTACK (yylen);
2127   yylen = 0;
2128   YY_STACK_PRINT (yyss, yyssp);
2129
2130   *++yyvsp = yyval;
2131   *++yylsp = yyloc;
2132
2133   /* Now `shift' the result of the reduction.  Determine what state
2134      that goes to, based on the state we popped back to and the rule
2135      number reduced by.  */
2136
2137   yyn = yyr1[yyn];
2138
2139   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
2140   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
2141     yystate = yytable[yystate];
2142   else
2143     yystate = yydefgoto[yyn - YYNTOKENS];
2144
2145   goto yynewstate;
2146
2147
2148 /*------------------------------------.
2149 | yyerrlab -- here on detecting error |
2150 `------------------------------------*/
2151 yyerrlab:
2152   /* If not already recovering from an error, report this error.  */
2153   if (!yyerrstatus)
2154     {
2155       ++yynerrs;
2156 #if ! YYERROR_VERBOSE
2157       yyerror (YY_("syntax error"));
2158 #else
2159       {
2160         YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
2161         if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
2162           {
2163             YYSIZE_T yyalloc = 2 * yysize;
2164             if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
2165               yyalloc = YYSTACK_ALLOC_MAXIMUM;
2166             if (yymsg != yymsgbuf)
2167               YYSTACK_FREE (yymsg);
2168             yymsg = (char *) YYSTACK_ALLOC (yyalloc);
2169             if (yymsg)
2170               yymsg_alloc = yyalloc;
2171             else
2172               {
2173                 yymsg = yymsgbuf;
2174                 yymsg_alloc = sizeof yymsgbuf;
2175               }
2176           }
2177
2178         if (0 < yysize && yysize <= yymsg_alloc)
2179           {
2180             (void) yysyntax_error (yymsg, yystate, yychar);
2181             yyerror (yymsg);
2182           }
2183         else
2184           {
2185             yyerror (YY_("syntax error"));
2186             if (yysize != 0)
2187               goto yyexhaustedlab;
2188           }
2189       }
2190 #endif
2191     }
2192
2193   yyerror_range[0] = yylloc;
2194
2195   if (yyerrstatus == 3)
2196     {
2197       /* If just tried and failed to reuse look-ahead token after an
2198          error, discard it.  */
2199
2200       if (yychar <= YYEOF)
2201         {
2202           /* Return failure if at end of input.  */
2203           if (yychar == YYEOF)
2204             YYABORT;
2205         }
2206       else
2207         {
2208           yydestruct ("Error: discarding",
2209                       yytoken, &yylval, &yylloc);
2210           yychar = YYEMPTY;
2211         }
2212     }
2213
2214   /* Else will try to reuse look-ahead token after shifting the error
2215      token.  */
2216   goto yyerrlab1;
2217
2218
2219 /*---------------------------------------------------.
2220 | yyerrorlab -- error raised explicitly by YYERROR.  |
2221 `---------------------------------------------------*/
2222 yyerrorlab:
2223
2224   /* Pacify compilers like GCC when the user code never invokes
2225      YYERROR and the label yyerrorlab therefore never appears in user
2226      code.  */
2227   if (/*CONSTCOND*/ 0)
2228      goto yyerrorlab;
2229
2230   yyerror_range[0] = yylsp[1-yylen];
2231   /* Do not reclaim the symbols of the rule which action triggered
2232      this YYERROR.  */
2233   YYPOPSTACK (yylen);
2234   yylen = 0;
2235   YY_STACK_PRINT (yyss, yyssp);
2236   yystate = *yyssp;
2237   goto yyerrlab1;
2238
2239
2240 /*-------------------------------------------------------------.
2241 | yyerrlab1 -- common code for both syntax error and YYERROR.  |
2242 `-------------------------------------------------------------*/
2243 yyerrlab1:
2244   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
2245
2246   for (;;)
2247     {
2248       yyn = yypact[yystate];
2249       if (yyn != YYPACT_NINF)
2250         {
2251           yyn += YYTERROR;
2252           if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2253             {
2254               yyn = yytable[yyn];
2255               if (0 < yyn)
2256                 break;
2257             }
2258         }
2259
2260       /* Pop the current state because it cannot handle the error token.  */
2261       if (yyssp == yyss)
2262         YYABORT;
2263
2264       yyerror_range[0] = *yylsp;
2265       yydestruct ("Error: popping",
2266                   yystos[yystate], yyvsp, yylsp);
2267       YYPOPSTACK (1);
2268       yystate = *yyssp;
2269       YY_STACK_PRINT (yyss, yyssp);
2270     }
2271
2272   if (yyn == YYFINAL)
2273     YYACCEPT;
2274
2275   *++yyvsp = yylval;
2276
2277   yyerror_range[1] = yylloc;
2278   /* Using YYLLOC is tempting, but would change the location of
2279      the look-ahead.  YYLOC is available though.  */
2280   YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
2281   *++yylsp = yyloc;
2282
2283   /* Shift the error token.  */
2284   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
2285
2286   yystate = yyn;
2287   goto yynewstate;
2288
2289
2290 /*-------------------------------------.
2291 | yyacceptlab -- YYACCEPT comes here.  |
2292 `-------------------------------------*/
2293 yyacceptlab:
2294   yyresult = 0;
2295   goto yyreturn;
2296
2297 /*-----------------------------------.
2298 | yyabortlab -- YYABORT comes here.  |
2299 `-----------------------------------*/
2300 yyabortlab:
2301   yyresult = 1;
2302   goto yyreturn;
2303
2304 #ifndef yyoverflow
2305 /*-------------------------------------------------.
2306 | yyexhaustedlab -- memory exhaustion comes here.  |
2307 `-------------------------------------------------*/
2308 yyexhaustedlab:
2309   yyerror (YY_("memory exhausted"));
2310   yyresult = 2;
2311   /* Fall through.  */
2312 #endif
2313
2314 yyreturn:
2315   if (yychar != YYEOF && yychar != YYEMPTY)
2316      yydestruct ("Cleanup: discarding lookahead",
2317                  yytoken, &yylval, &yylloc);
2318   /* Do not reclaim the symbols of the rule which action triggered
2319      this YYABORT or YYACCEPT.  */
2320   YYPOPSTACK (yylen);
2321   YY_STACK_PRINT (yyss, yyssp);
2322   while (yyssp != yyss)
2323     {
2324       yydestruct ("Cleanup: popping",
2325                   yystos[*yyssp], yyvsp, yylsp);
2326       YYPOPSTACK (1);
2327     }
2328 #ifndef yyoverflow
2329   if (yyss != yyssa)
2330     YYSTACK_FREE (yyss);
2331 #endif
2332 #if YYERROR_VERBOSE
2333   if (yymsg != yymsgbuf)
2334     YYSTACK_FREE (yymsg);
2335 #endif
2336   /* Make sure YYID is used.  */
2337   return YYID (yyresult);
2338 }
2339
2340
2341 #line 486 "ast_expr2.y"
2342
2343
2344 static struct expr_node *alloc_expr_node(enum node_type nt)
2345 {
2346         struct expr_node *x = calloc(1,sizeof(struct expr_node));
2347         if (!x) {
2348                 ast_log(LOG_ERROR, "Allocation for expr_node FAILED!!\n");
2349                 return 0;
2350         }
2351         x->type = nt;
2352         return x;
2353 }
2354
2355
2356
2357 static struct val *
2358 make_number (FP___TYPE i)
2359 {
2360         struct val *vp;
2361
2362         vp = (struct val *) malloc (sizeof (*vp));
2363         if (vp == NULL) {
2364                 ast_log(LOG_WARNING, "malloc() failed\n");
2365                 return(NULL);
2366         }
2367
2368         vp->type = AST_EXPR_number;
2369         vp->u.i  = i;
2370         return vp; 
2371 }
2372
2373 static struct val *
2374 make_str (const char *s)
2375 {
2376         struct val *vp;
2377         size_t i;
2378         int isint; /* this started out being a test for an integer, but then ended up being a test for a float */
2379
2380         vp = (struct val *) malloc (sizeof (*vp));
2381         if (vp == NULL || ((vp->u.s = strdup (s)) == NULL)) {
2382                 ast_log(LOG_WARNING,"malloc() failed\n");
2383                 return(NULL);
2384         }
2385
2386         for (i = 0, isint = (isdigit(s[0]) || s[0] == '-' || s[0]=='.'); isint && i < strlen(s); i++)
2387         {
2388                 if (!isdigit(s[i]) && s[i] != '.') {
2389                         isint = 0;
2390                         break;
2391                 }
2392         }
2393         if (isint)
2394                 vp->type = AST_EXPR_numeric_string;
2395         else    
2396                 vp->type = AST_EXPR_string;
2397
2398         return vp;
2399 }
2400
2401
2402 static void
2403 free_value (struct val *vp)
2404 {       
2405         if (vp==NULL) {
2406                 return;
2407         }
2408         if (vp->type == AST_EXPR_string || vp->type == AST_EXPR_numeric_string)
2409                 free (vp->u.s); 
2410         free(vp);
2411 }
2412
2413
2414 static int
2415 to_number (struct val *vp)
2416 {
2417         FP___TYPE i;
2418         
2419         if (vp == NULL) {
2420                 ast_log(LOG_WARNING,"vp==NULL in to_number()\n");
2421                 return(0);
2422         }
2423
2424         if (vp->type == AST_EXPR_number)
2425                 return 1;
2426
2427         if (vp->type == AST_EXPR_string)
2428                 return 0;
2429
2430         /* vp->type == AST_EXPR_numeric_string, make it numeric */
2431         errno = 0;
2432         i  = FUNC_STRTOD(vp->u.s, (char**)0); /* either strtod, or strtold on a good day */
2433         if (errno != 0) {
2434                 ast_log(LOG_WARNING,"Conversion of %s to number under/overflowed!\n", vp->u.s);
2435                 free(vp->u.s);
2436                 vp->u.s = 0;
2437                 return(0);
2438         }
2439         free (vp->u.s);
2440         vp->u.i = i;
2441         vp->type = AST_EXPR_number;
2442         return 1;
2443 }
2444
2445 static void
2446 strip_quotes(struct val *vp)
2447 {
2448         if (vp->type != AST_EXPR_string && vp->type != AST_EXPR_numeric_string)
2449                 return;
2450         
2451         if( vp->u.s[0] == '"' && vp->u.s[strlen(vp->u.s)-1] == '"' )
2452         {
2453                 char *f, *t;
2454                 f = vp->u.s;
2455                 t = vp->u.s;
2456                 
2457                 while( *f )
2458                 {
2459                         if( *f  && *f != '"' )
2460                                 *t++ = *f++;
2461                         else
2462                                 f++;
2463                 }
2464                 *t = *f;
2465         }
2466 }
2467
2468 static void
2469 to_string (struct val *vp)
2470 {
2471         char *tmp;
2472
2473         if (vp->type == AST_EXPR_string || vp->type == AST_EXPR_numeric_string)
2474                 return;
2475
2476         tmp = malloc ((size_t)25);
2477         if (tmp == NULL) {
2478                 ast_log(LOG_WARNING,"malloc() failed\n");
2479                 return;
2480         }
2481
2482         sprintf(tmp, FP___PRINTF, vp->u.i);
2483         vp->type = AST_EXPR_string;
2484         vp->u.s  = tmp;
2485 }
2486
2487
2488 static int
2489 isstring (struct val *vp)
2490 {
2491         /* only TRUE if this string is not a valid number */
2492         return (vp->type == AST_EXPR_string);
2493 }
2494
2495
2496 static int
2497 is_zero_or_null (struct val *vp)
2498 {
2499         if (vp->type == AST_EXPR_number) {
2500                 return (vp->u.i == 0);
2501         } else {
2502                 return (*vp->u.s == 0 || (to_number(vp) && vp->u.i == 0));
2503         }
2504         /* NOTREACHED */
2505 }
2506
2507 #undef ast_yyerror
2508 #define ast_yyerror(x) ast_yyerror(x, YYLTYPE *yylloc, struct parse_io *parseio)
2509
2510 /* I put the ast_yyerror func in the flex input file,
2511    because it refers to the buffer state. Best to
2512    let it access the BUFFER stuff there and not trying
2513    define all the structs, macros etc. in this file! */
2514
2515 static void destroy_arglist(struct expr_node *arglist)
2516 {
2517         struct expr_node *arglist_next;
2518         
2519         while (arglist)
2520         {
2521                 arglist_next = arglist->right;
2522                 if (arglist->val)
2523                         free_value(arglist->val);
2524                 arglist->val = 0;
2525                 arglist->right = 0;
2526                 free(arglist);
2527                 arglist = arglist_next;
2528         }
2529 }
2530
2531 #if !defined(STANDALONE)
2532 static char *compose_func_args(struct expr_node *arglist)
2533 {
2534         struct expr_node *t = arglist;
2535         char *argbuf;
2536         int total_len = 0;
2537         
2538         while (t) {
2539                 if (t != arglist)
2540                         total_len += 1; /* for the sep */
2541                 if (t->val) {
2542                         if (t->val->type == AST_EXPR_number)
2543                                 total_len += 25; /* worst case */
2544                         else
2545                                 total_len += strlen(t->val->u.s);
2546                 }
2547                 
2548                 t = t->right;
2549         }
2550         total_len++; /* for the null */
2551         ast_log(LOG_NOTICE,"argbuf allocated %d bytes;\n", total_len);
2552         argbuf = malloc(total_len);
2553         argbuf[0] = 0;
2554         t = arglist;
2555         while (t) {
2556                 char numbuf[30];
2557                 
2558                 if (t != arglist)
2559                         strcat(argbuf,"|");
2560                 
2561                 if (t->val) {
2562                         if (t->val->type == AST_EXPR_number) {
2563                                 sprintf(numbuf,FP___PRINTF,t->val->u.i);
2564                                 strcat(argbuf,numbuf);
2565                         } else
2566                                 strcat(argbuf,t->val->u.s);
2567                 }
2568                 t = t->right;
2569         }
2570         ast_log(LOG_NOTICE,"argbuf uses %d bytes;\n", (int) strlen(argbuf));
2571         return argbuf;
2572 }
2573
2574 static int is_really_num(char *str)
2575 {
2576         if ( strspn(str,"-0123456789.   ") == strlen(str))
2577                 return 1;
2578         else
2579                 return 0;
2580 }
2581 #endif
2582
2583 static struct val *op_func(struct val *funcname, struct expr_node *arglist, struct ast_channel *chan)
2584 {
2585         if (strspn(funcname->u.s,"ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789") == strlen(funcname->u.s))
2586         {
2587                 struct val *result;
2588                 if (0) {
2589 #ifdef FUNC_COS
2590                 } else if (strcmp(funcname->u.s,"COS") == 0) {
2591                         if (arglist && !arglist->right && arglist->val){
2592                                 to_number(arglist->val);
2593                                 result = make_number(FUNC_COS(arglist->val->u.i));
2594                                 return result;
2595                         } else {
2596                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2597                                 return make_number(0.0);
2598                         }
2599 #endif
2600 #ifdef FUNC_SIN
2601                 } else if (strcmp(funcname->u.s,"SIN") == 0) {
2602                         if (arglist && !arglist->right && arglist->val){
2603                                 to_number(arglist->val);
2604                                 result = make_number(FUNC_SIN(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_TAN
2612                 } else if (strcmp(funcname->u.s,"TAN") == 0) {
2613                         if (arglist && !arglist->right && arglist->val){
2614                                 to_number(arglist->val);
2615                                 result = make_number(FUNC_TAN(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_ACOS
2623                 } else if (strcmp(funcname->u.s,"ACOS") == 0) {
2624                         if (arglist && !arglist->right && arglist->val){
2625                                 to_number(arglist->val);
2626                                 result = make_number(FUNC_ACOS(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_ASIN
2634                 } else if (strcmp(funcname->u.s,"ASIN") == 0) {
2635                         if (arglist && !arglist->right && arglist->val){
2636                                 to_number(arglist->val);
2637                                 result = make_number(FUNC_ASIN(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_ATAN
2645                 } else if (strcmp(funcname->u.s,"ATAN") == 0) {
2646                         if (arglist && !arglist->right && arglist->val){
2647                                 to_number(arglist->val);
2648                                 result = make_number(FUNC_ATAN(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_ATAN2
2656                 } else if (strcmp(funcname->u.s,"ATAN2") == 0) {
2657                         if (arglist && arglist->right && !arglist->right->right && arglist->val && arglist->right->val){
2658                                 to_number(arglist->val);
2659                                 to_number(arglist->right->val);
2660                                 result = make_number(FUNC_ATAN2(arglist->val->u.i, arglist->right->val->u.i));
2661                                 return result;
2662                         } else {
2663                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2664                                 return make_number(0.0);
2665                         }
2666 #endif
2667 #ifdef FUNC_POW
2668                 } else if (strcmp(funcname->u.s,"POW") == 0) {
2669                         if (arglist && arglist->right && !arglist->right->right && arglist->val && arglist->right->val){
2670                                 to_number(arglist->val);
2671                                 to_number(arglist->right->val);
2672                                 result = make_number(FUNC_POW(arglist->val->u.i, arglist->right->val->u.i));
2673                                 return result;
2674                         } else {
2675                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2676                                 return make_number(0.0);
2677                         }
2678 #endif
2679 #ifdef FUNC_SQRT
2680                 } else if (strcmp(funcname->u.s,"SQRT") == 0) {
2681                         if (arglist && !arglist->right && arglist->val){
2682                                 to_number(arglist->val);
2683                                 result = make_number(FUNC_SQRT(arglist->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_FLOOR
2691                 } else if (strcmp(funcname->u.s,"FLOOR") == 0) {
2692                         if (arglist && !arglist->right && arglist->val){
2693                                 to_number(arglist->val);
2694                                 result = make_number(FUNC_FLOOR(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_CEIL
2702                 } else if (strcmp(funcname->u.s,"CEIL") == 0) {
2703                         if (arglist && !arglist->right && arglist->val){
2704                                 to_number(arglist->val);
2705                                 result = make_number(FUNC_CEIL(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_ROUND
2713                 } else if (strcmp(funcname->u.s,"ROUND") == 0) {
2714                         if (arglist && !arglist->right && arglist->val){
2715                                 to_number(arglist->val);
2716                                 result = make_number(FUNC_ROUND(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 /* defined(FUNC_ROUND) */
2723 #ifdef FUNC_RINT
2724                 } else if (strcmp(funcname->u.s,"RINT") == 0) {
2725                         if (arglist && !arglist->right && arglist->val){
2726                                 to_number(arglist->val);
2727                                 result = make_number(FUNC_RINT(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
2734 #ifdef FUNC_TRUNC
2735                 } else if (strcmp(funcname->u.s,"TRUNC") == 0) {
2736                         if (arglist && !arglist->right && arglist->val){
2737                                 to_number(arglist->val);
2738                                 result = make_number(FUNC_TRUNC(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 /* defined(FUNC_TRUNC) */
2745 #ifdef FUNC_EXP
2746                 } else if (strcmp(funcname->u.s,"EXP") == 0) {
2747                         if (arglist && !arglist->right && arglist->val){
2748                                 to_number(arglist->val);
2749                                 result = make_number(FUNC_EXP(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
2756 #ifdef FUNC_EXP2
2757                 } else if (strcmp(funcname->u.s,"EXP2") == 0) {
2758                         if (arglist && !arglist->right && arglist->val){
2759                                 to_number(arglist->val);
2760                                 result = make_number(FUNC_EXP2(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_EXP10
2768                 } else if (strcmp(funcname->u.s,"EXP10") == 0) {
2769                         if (arglist && !arglist->right && arglist->val){
2770                                 to_number(arglist->val);
2771                                 result = make_number(FUNC_EXP10(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_LOG
2779                 } else if (strcmp(funcname->u.s,"LOG") == 0) {
2780                         if (arglist && !arglist->right && arglist->val){
2781                                 to_number(arglist->val);
2782                                 result = make_number(FUNC_LOG(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_LOG2
2790                 } else if (strcmp(funcname->u.s,"LOG2") == 0) {
2791                         if (arglist && !arglist->right && arglist->val){
2792                                 to_number(arglist->val);
2793                                 result = make_number(FUNC_LOG2(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_LOG10
2801                 } else if (strcmp(funcname->u.s,"LOG10") == 0) {
2802                         if (arglist && !arglist->right && arglist->val){
2803                                 to_number(arglist->val);
2804                                 result = make_number(FUNC_LOG10(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_REMAINDER
2812                 } else if (strcmp(funcname->u.s,"REMAINDER") == 0) {
2813                         if (arglist && arglist->right && !arglist->right->right && arglist->val && arglist->right->val){
2814                                 to_number(arglist->val);
2815                                 to_number(arglist->right->val);
2816                                 result = make_number(FUNC_REMAINDER(arglist->val->u.i, arglist->right->val->u.i));
2817                                 return result;
2818                         } else {
2819                                 ast_log(LOG_WARNING,"Wrong args to %s() function\n",funcname->u.s);
2820                                 return make_number(0.0);
2821                         }
2822 #endif
2823                 } else {
2824                         /* is this a custom function we should execute and collect the results of? */
2825 #ifndef STANDALONE
2826                         struct ast_custom_function *f = ast_custom_function_find(funcname->u.s);
2827                         if (!chan)
2828                                 ast_log(LOG_WARNING,"Hey! chan is NULL.\n");
2829                         if (!f)
2830                                 ast_log(LOG_WARNING,"Hey! could not find func %s.\n", funcname->u.s);
2831                         
2832                         if (f && chan) {
2833                                 if (f->read) {
2834                                         char workspace[512];
2835                                         char *argbuf = compose_func_args(arglist);
2836                                         f->read(chan, funcname->u.s, argbuf, workspace, sizeof(workspace));
2837                                         free(argbuf);
2838                                         if (is_really_num(workspace))
2839                                                 return make_number(FUNC_STRTOD(workspace,(char **)NULL));
2840                                         else
2841                                                 return make_str(workspace);
2842                                 } else {
2843                                         ast_log(LOG_ERROR,"Error! Function '%s' cannot be read!\n", funcname->u.s);
2844                                         return (make_number ((FP___TYPE)0.0));
2845                                 }
2846                                 
2847                         } else {
2848                                 ast_log(LOG_ERROR,"Error! '%s' doesn't appear to be an available function!", funcname->u.s);
2849                                 return (make_number ((FP___TYPE)0.0));
2850                         }
2851 #else
2852                         ast_log(LOG_ERROR,"Error! '%s' is not available in the standalone version!", funcname->u.s);
2853                         return (make_number ((FP___TYPE)0.0));
2854 #endif
2855                 }
2856         }
2857         else
2858         {
2859                 ast_log(LOG_ERROR,"Error! '%s' is not possibly a function name!", funcname->u.s);
2860                 return (make_number ((FP___TYPE)0.0));
2861         }
2862         return (make_number ((FP___TYPE)0.0));
2863 }
2864
2865
2866 static struct val *
2867 op_or (struct val *a, struct val *b)
2868 {
2869         if (is_zero_or_null (a)) {
2870                 free_value (a);
2871                 return (b);
2872         } else {
2873                 free_value (b);
2874                 return (a);
2875         }
2876 }
2877                 
2878 static struct val *
2879 op_and (struct val *a, struct val *b)
2880 {
2881         if (is_zero_or_null (a) || is_zero_or_null (b)) {
2882                 free_value (a);
2883                 free_value (b);
2884                 return (make_number ((FP___TYPE)0.0));
2885         } else {
2886                 free_value (b);
2887                 return (a);
2888         }
2889 }
2890
2891 static struct val *
2892 op_eq (struct val *a, struct val *b)
2893 {
2894         struct val *r; 
2895
2896         if (isstring (a) || isstring (b)) {
2897                 to_string (a);
2898                 to_string (b);  
2899                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) == 0));
2900         } else {
2901 #ifdef DEBUG_FOR_CONVERSIONS
2902                 char buffer[2000];
2903                 sprintf(buffer,"Converting '%s' and '%s' ", a->u.s, b->u.s);
2904 #endif
2905                 (void)to_number(a);
2906                 (void)to_number(b);
2907 #ifdef DEBUG_FOR_CONVERSIONS
2908                 ast_log(LOG_WARNING,"%s to '%lld' and '%lld'\n", buffer, a->u.i, b->u.i);
2909 #endif
2910                 r = make_number ((FP___TYPE)(a->u.i == b->u.i));
2911         }
2912
2913         free_value (a);
2914         free_value (b);
2915         return r;
2916 }
2917
2918 static struct val *
2919 op_gt (struct val *a, struct val *b)
2920 {
2921         struct val *r;
2922
2923         if (isstring (a) || isstring (b)) {
2924                 to_string (a);
2925                 to_string (b);
2926                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) > 0));
2927         } else {
2928                 (void)to_number(a);
2929                 (void)to_number(b);
2930                 r = make_number ((FP___TYPE)(a->u.i > b->u.i));
2931         }
2932
2933         free_value (a);
2934         free_value (b);
2935         return r;
2936 }
2937
2938 static struct val *
2939 op_lt (struct val *a, struct val *b)
2940 {
2941         struct val *r;
2942
2943         if (isstring (a) || isstring (b)) {
2944                 to_string (a);
2945                 to_string (b);
2946                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) < 0));
2947         } else {
2948                 (void)to_number(a);
2949                 (void)to_number(b);
2950                 r = make_number ((FP___TYPE)(a->u.i < b->u.i));
2951         }
2952
2953         free_value (a);
2954         free_value (b);
2955         return r;
2956 }
2957
2958 static struct val *
2959 op_ge (struct val *a, struct val *b)
2960 {
2961         struct val *r;
2962
2963         if (isstring (a) || isstring (b)) {
2964                 to_string (a);
2965                 to_string (b);
2966                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) >= 0));
2967         } else {
2968                 (void)to_number(a);
2969                 (void)to_number(b);
2970                 r = make_number ((FP___TYPE)(a->u.i >= b->u.i));
2971         }
2972
2973         free_value (a);
2974         free_value (b);
2975         return r;
2976 }
2977
2978 static struct val *
2979 op_le (struct val *a, struct val *b)
2980 {
2981         struct val *r;
2982
2983         if (isstring (a) || isstring (b)) {
2984                 to_string (a);
2985                 to_string (b);
2986                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) <= 0));
2987         } else {
2988                 (void)to_number(a);
2989                 (void)to_number(b);
2990                 r = make_number ((FP___TYPE)(a->u.i <= b->u.i));
2991         }
2992
2993         free_value (a);
2994         free_value (b);
2995         return r;
2996 }
2997
2998 static struct val *
2999 op_cond (struct val *a, struct val *b, struct val *c)
3000 {
3001         struct val *r;
3002
3003         if( isstring(a) )
3004         {
3005                 if( strlen(a->u.s) && strcmp(a->u.s, "\"\"") != 0 && strcmp(a->u.s,"0") != 0 )
3006                 {
3007                         free_value(a);
3008                         free_value(c);
3009                         r = b;
3010                 }
3011                 else
3012                 {
3013                         free_value(a);
3014                         free_value(b);
3015                         r = c;
3016                 }
3017         }
3018         else
3019         {
3020                 (void)to_number(a);
3021                 if( a->u.i )
3022                 {
3023                         free_value(a);
3024                         free_value(c);
3025                         r = b;
3026                 }
3027                 else
3028                 {
3029                         free_value(a);
3030                         free_value(b);
3031                         r = c;
3032                 }
3033         }
3034         return r;
3035 }
3036
3037 static struct val *
3038 op_ne (struct val *a, struct val *b)
3039 {
3040         struct val *r;
3041
3042         if (isstring (a) || isstring (b)) {
3043                 to_string (a);
3044                 to_string (b);
3045                 r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) != 0));
3046         } else {
3047                 (void)to_number(a);
3048                 (void)to_number(b);
3049                 r = make_number ((FP___TYPE)(a->u.i != b->u.i));
3050         }
3051
3052         free_value (a);
3053         free_value (b);
3054         return r;
3055 }
3056
3057 static int
3058 chk_plus (FP___TYPE a, FP___TYPE b, FP___TYPE r)
3059 {
3060         /* sum of two positive numbers must be positive */
3061         if (a > 0 && b > 0 && r <= 0)
3062                 return 1;
3063         /* sum of two negative numbers must be negative */
3064         if (a < 0 && b < 0 && r >= 0)
3065                 return 1;
3066         /* all other cases are OK */
3067         return 0;
3068 }
3069
3070 static struct val *
3071 op_plus (struct val *a, struct val *b)
3072 {
3073         struct val *r;
3074
3075         if (!to_number (a)) {
3076                 if( !extra_error_message_supplied )
3077                         ast_log(LOG_WARNING,"non-numeric argument\n");
3078                 if (!to_number (b)) {
3079                         free_value(a);
3080                         free_value(b);
3081                         return make_number(0);
3082                 } else {
3083                         free_value(a);
3084                         return (b);
3085                 }
3086         } else if (!to_number(b)) {
3087                 free_value(b);
3088                 return (a);
3089         }
3090
3091         r = make_number (a->u.i + b->u.i);
3092         if (chk_plus (a->u.i, b->u.i, r->u.i)) {
3093                 ast_log(LOG_WARNING,"overflow\n");
3094         }
3095         free_value (a);
3096         free_value (b);
3097         return r;
3098 }
3099
3100 static int
3101 chk_minus (FP___TYPE a, FP___TYPE b, FP___TYPE r)
3102 {
3103         /* special case subtraction of QUAD_MIN */
3104         if (b == QUAD_MIN) {
3105                 if (a >= 0)
3106                         return 1;
3107                 else
3108                         return 0;
3109         }
3110         /* this is allowed for b != QUAD_MIN */
3111         return chk_plus (a, -b, r);
3112 }
3113
3114 static struct val *
3115 op_minus (struct val *a, struct val *b)
3116 {
3117         struct val *r;
3118
3119         if (!to_number (a)) {
3120                 if( !extra_error_message_supplied )
3121                         ast_log(LOG_WARNING, "non-numeric argument\n");
3122                 if (!to_number (b)) {
3123                         free_value(a);
3124                         free_value(b);
3125                         return make_number(0);
3126                 } else {
3127                         r = make_number(0 - b->u.i);
3128                         free_value(a);
3129                         free_value(b);
3130                         return (r);
3131                 }
3132         } else if (!to_number(b)) {
3133                 if( !extra_error_message_supplied )
3134                         ast_log(LOG_WARNING, "non-numeric argument\n");
3135                 free_value(b);
3136                 return (a);
3137         }
3138
3139         r = make_number (a->u.i - b->u.i);
3140         if (chk_minus (a->u.i, b->u.i, r->u.i)) {
3141                 ast_log(LOG_WARNING, "overflow\n");
3142         }
3143         free_value (a);
3144         free_value (b);
3145         return r;
3146 }
3147
3148 static struct val *
3149 op_negate (struct val *a)
3150 {
3151         struct val *r;
3152
3153         if (!to_number (a) ) {
3154                 free_value(a);
3155                 if( !extra_error_message_supplied )
3156                         ast_log(LOG_WARNING, "non-numeric argument\n");
3157                 return make_number(0);
3158         }
3159
3160         r = make_number (- a->u.i);
3161         if (chk_minus (0, a->u.i, r->u.i)) {
3162                 ast_log(LOG_WARNING, "overflow\n");
3163         }
3164         free_value (a);
3165         return r;
3166 }
3167
3168 static struct val *
3169 op_compl (struct val *a)
3170 {
3171         int v1 = 1;
3172         struct val *r;
3173         
3174         if( !a )
3175         {
3176                 v1 = 0;
3177         }
3178         else
3179         {
3180                 switch( a->type )
3181                 {
3182                 case AST_EXPR_number:
3183                         if( a->u.i == 0 )
3184                                 v1 = 0;
3185                         break;
3186                         
3187                 case AST_EXPR_string:
3188                         if( a->u.s == 0 )
3189                                 v1 = 0;
3190                         else
3191                         {
3192                                 if( a->u.s[0] == 0 )
3193                                         v1 = 0;
3194                                 else if (strlen(a->u.s) == 1 && a->u.s[0] == '0' )
3195                                         v1 = 0;
3196                         }
3197                         break;
3198                         
3199                 case AST_EXPR_numeric_string:
3200                         if( a->u.s == 0 )
3201                                 v1 = 0;
3202                         else
3203                         {
3204                                 if( a->u.s[0] == 0 )
3205                                         v1 = 0;
3206                                 else if (strlen(a->u.s) == 1 && a->u.s[0] == '0' )
3207                                         v1 = 0;
3208                         }
3209                         break;
3210                 }
3211         }
3212         
3213         r = make_number (!v1);
3214         free_value (a);
3215         return r;
3216 }
3217
3218 static int
3219 chk_times (FP___TYPE a, FP___TYPE b, FP___TYPE r)
3220 {
3221         /* special case: first operand is 0, no overflow possible */
3222         if (a == 0)
3223                 return 0;
3224         /* cerify that result of division matches second operand */
3225         if (r / a != b)
3226                 return 1;
3227         return 0;
3228 }
3229
3230 static struct val *
3231 op_times (struct val *a, struct val *b)
3232 {
3233         struct val *r;
3234
3235         if (!to_number (a) || !to_number (b)) {
3236                 free_value(a);
3237                 free_value(b);
3238                 if( !extra_error_message_supplied )
3239                         ast_log(LOG_WARNING, "non-numeric argument\n");
3240                 return(make_number(0));
3241         }
3242
3243         r = make_number (a->u.i * b->u.i);
3244         if (chk_times (a->u.i, b->u.i, r->u.i)) {
3245                 ast_log(LOG_WARNING, "overflow\n");
3246         }
3247         free_value (a);
3248         free_value (b);
3249         return (r);
3250 }
3251
3252 static int
3253 chk_div (FP___TYPE a, FP___TYPE b)
3254 {
3255         /* div by zero has been taken care of before */
3256         /* only QUAD_MIN / -1 causes overflow */
3257         if (a == QUAD_MIN && b == -1)
3258                 return 1;
3259         /* everything else is OK */
3260         return 0;
3261 }
3262
3263 static struct val *
3264 op_div (struct val *a, struct val *b)
3265 {
3266         struct val *r;
3267
3268         if (!to_number (a)) {
3269                 free_value(a);
3270                 free_value(b);
3271                 if( !extra_error_message_supplied )
3272                         ast_log(LOG_WARNING, "non-numeric argument\n");
3273                 return make_number(0);
3274         } else if (!to_number (b)) {
3275                 free_value(a);
3276                 free_value(b);
3277                 if( !extra_error_message_supplied )
3278                         ast_log(LOG_WARNING, "non-numeric argument\n");
3279                 return make_number(INT_MAX);
3280         }
3281
3282         if (b->u.i == 0) {
3283                 ast_log(LOG_WARNING, "division by zero\n");             
3284                 free_value(a);
3285                 free_value(b);
3286                 return make_number(INT_MAX);
3287         }
3288
3289         r = make_number (a->u.i / b->u.i);
3290         if (chk_div (a->u.i, b->u.i)) {
3291                 ast_log(LOG_WARNING, "overflow\n");
3292         }
3293         free_value (a);
3294         free_value (b);
3295         return r;
3296 }
3297         
3298 static struct val *
3299 op_rem (struct val *a, struct val *b)
3300 {
3301         struct val *r;
3302
3303         if (!to_number (a) || !to_number (b)) {
3304                 if( !extra_error_message_supplied )
3305                         ast_log(LOG_WARNING, "non-numeric argument\n");
3306                 free_value(a);
3307                 free_value(b);
3308                 return make_number(0);
3309         }
3310
3311         if (b->u.i == 0) {
3312                 ast_log(LOG_WARNING, "div by zero\n");
3313                 free_value(a);
3314                 return(b);
3315         }
3316
3317         r = make_number (FUNC_FMOD(a->u.i, b->u.i)); /* either fmod or fmodl if FP___TYPE is available */
3318         /* chk_rem necessary ??? */
3319         free_value (a);
3320         free_value (b);
3321         return r;
3322 }
3323         
3324
3325 static struct val *
3326 op_colon (struct val *a, struct val *b)
3327 {
3328         regex_t rp;
3329         regmatch_t rm[2];
3330         char errbuf[256];
3331         int eval;
3332         struct val *v;
3333
3334         /* coerce to both arguments to strings */
3335         to_string(a);
3336         to_string(b);
3337         /* strip double quotes from both -- they'll screw up the pattern, and the search string starting at ^ */
3338         strip_quotes(a);
3339         strip_quotes(b);
3340         /* compile regular expression */
3341         if ((eval = regcomp (&rp, b->u.s, REG_EXTENDED)) != 0) {
3342                 regerror (eval, &rp, errbuf, sizeof(errbuf));
3343                 ast_log(LOG_WARNING,"regcomp() error : %s",errbuf);
3344                 free_value(a);
3345                 free_value(b);
3346                 return make_str("");            
3347         }
3348
3349         /* compare string against pattern */
3350         /* remember that patterns are anchored to the beginning of the line */
3351         if (regexec(&rp, a->u.s, (size_t)2, rm, 0) == 0 && rm[0].rm_so == 0) {
3352                 if (rm[1].rm_so >= 0) {
3353                         *(a->u.s + rm[1].rm_eo) = '\0';
3354                         v = make_str (a->u.s + rm[1].rm_so);
3355
3356                 } else {
3357                         v = make_number ((FP___TYPE)(rm[0].rm_eo - rm[0].rm_so));
3358                 }
3359         } else {
3360                 if (rp.re_nsub == 0) {
3361                         v = make_number ((FP___TYPE)0);
3362                 } else {
3363                         v = make_str ("");
3364                 }
3365         }
3366
3367         /* free arguments and pattern buffer */
3368         free_value (a);
3369         free_value (b);
3370         regfree (&rp);
3371
3372         return v;
3373 }
3374         
3375
3376 static struct val *
3377 op_eqtilde (struct val *a, struct val *b)
3378 {
3379         regex_t rp;
3380         regmatch_t rm[2];
3381         char errbuf[256];
3382         int eval;
3383         struct val *v;
3384
3385         /* coerce to both arguments to strings */
3386         to_string(a);
3387         to_string(b);
3388         /* strip double quotes from both -- they'll screw up the pattern, and the search string starting at ^ */
3389         strip_quotes(a);
3390         strip_quotes(b);
3391         /* compile regular expression */
3392         if ((eval = regcomp (&rp, b->u.s, REG_EXTENDED)) != 0) {
3393                 regerror (eval, &rp, errbuf, sizeof(errbuf));
3394                 ast_log(LOG_WARNING,"regcomp() error : %s",errbuf);
3395                 free_value(a);
3396                 free_value(b);
3397                 return make_str("");            
3398         }
3399
3400         /* compare string against pattern */
3401         /* remember that patterns are anchored to the beginning of the line */
3402         if (regexec(&rp, a->u.s, (size_t)2, rm, 0) == 0 ) {
3403                 if (rm[1].rm_so >= 0) {
3404                         *(a->u.s + rm[1].rm_eo) = '\0';
3405                         v = make_str (a->u.s + rm[1].rm_so);
3406
3407                 } else {
3408                         v = make_number ((FP___TYPE)(rm[0].rm_eo - rm[0].rm_so));
3409                 }
3410         } else {
3411                 if (rp.re_nsub == 0) {
3412                         v = make_number ((FP___TYPE)0.0);
3413                 } else {
3414                         v = make_str ("");
3415                 }
3416         }
3417
3418         /* free arguments and pattern buffer */
3419         free_value (a);
3420         free_value (b);
3421         regfree (&rp);
3422
3423         return v;
3424 }
3425
3426 static struct val *  /* this is a string concat operator */
3427 op_tildetilde (struct val *a, struct val *b)
3428 {
3429         struct val *v;
3430         char *vs;
3431
3432         /* coerce to both arguments to strings */
3433         to_string(a);
3434         to_string(b);
3435         /* strip double quotes from both -- */
3436         strip_quotes(a);
3437         strip_quotes(b);
3438         
3439         vs = malloc(strlen(a->u.s)+strlen(b->u.s)+1);
3440         strcpy(vs,a->u.s);
3441         strcat(vs,b->u.s);
3442
3443         v = make_str(vs);
3444
3445         /* free arguments */
3446         free_value(a);
3447         free_value(b);
3448
3449         return v;
3450 }
3451