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