diff options
author | murf <murf@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-07-03 20:17:31 +0000 |
---|---|---|
committer | murf <murf@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-07-03 20:17:31 +0000 |
commit | 3a37070093275603ff3c797c2ca426f6d52b6fe2 (patch) | |
tree | 54ccd89a92a427e6ca4d727612181f40eb82ffc2 /main/ast_expr2.y | |
parent | 9982b145f400fd20c6dffa27529a75b4af67adec (diff) |
Removing expr floating patch from 1.4; too much of a behavior change. If you want this fix, try trunk instead. bug 9508.
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@73143 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/ast_expr2.y')
-rw-r--r-- | main/ast_expr2.y | 213 |
1 files changed, 98 insertions, 115 deletions
diff --git a/main/ast_expr2.y b/main/ast_expr2.y index 31956e6e8..e47c2e721 100644 --- a/main/ast_expr2.y +++ b/main/ast_expr2.y @@ -12,33 +12,16 @@ * $FreeBSD: src/bin/expr/expr.y,v 1.16 2000/07/22 10:59:36 se Exp $ */ -#include <sys/types.h> -#include <stdio.h> - -#ifdef STANDALONE /* I guess somewhere, the feature is set in the asterisk includes */ -#ifndef __USE_ISOC99 -#define __USE_ISOC99 1 -#endif -#endif +#include "asterisk.h" -#ifdef __USE_ISOC99 -#define FP___PRINTF "%.16Lg" -#define FP___FMOD fmodl -#define FP___STRTOD strtold -#define FP___TYPE long double -#else -#define FP___PRINTF "%.8g" -#define FP___FMOD fmod -#define FP___STRTOD strtod -#define FP___TYPE double +#ifndef STANDALONE +ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #endif +#include <sys/types.h> +#include <stdio.h> #include <stdlib.h> -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif #include <string.h> -#include <math.h> #include <locale.h> #include <unistd.h> #include <ctype.h> @@ -51,7 +34,6 @@ #include <regex.h> #include <limits.h> -#include "asterisk.h" #include "asterisk/ast_expr.h" #include "asterisk/logger.h" @@ -68,7 +50,7 @@ # if ! defined(QUAD_MAX) # define QUAD_MAX (0x7fffffffffffffffLL) # endif -#define YYENABLE_NLS 0 + #define YYPARSE_PARAM parseio #define YYLEX_PARAM ((struct parse_io *)parseio)->scanner #define YYERROR_VERBOSE 1 @@ -76,7 +58,7 @@ extern char extra_error_message[4095]; extern int extra_error_message_supplied; enum valtype { - AST_EXPR_number, AST_EXPR_numeric_string, AST_EXPR_string + AST_EXPR_integer, AST_EXPR_numeric_string, AST_EXPR_string } ; #ifdef STANDALONE @@ -87,7 +69,7 @@ struct val { enum valtype type; union { char *s; - FP___TYPE i; /* either long double, or just double, on a bad day */ + quad_t i; } u; } ; @@ -100,14 +82,14 @@ struct parse_io yyscan_t scanner; }; -static int chk_div __P((FP___TYPE, FP___TYPE)); -static int chk_minus __P((FP___TYPE, FP___TYPE, FP___TYPE)); -static int chk_plus __P((FP___TYPE, FP___TYPE, FP___TYPE)); -static int chk_times __P((FP___TYPE, FP___TYPE, FP___TYPE)); +static int chk_div __P((quad_t, quad_t)); +static int chk_minus __P((quad_t, quad_t, quad_t)); +static int chk_plus __P((quad_t, quad_t, quad_t)); +static int chk_times __P((quad_t, quad_t, quad_t)); static void free_value __P((struct val *)); static int is_zero_or_null __P((struct val *)); static int isstring __P((struct val *)); -static struct val *make_number __P((FP___TYPE)); +static struct val *make_integer __P((quad_t)); static struct val *make_str __P((const char *)); static struct val *op_and __P((struct val *, struct val *)); static struct val *op_colon __P((struct val *, struct val *)); @@ -127,7 +109,7 @@ static struct val *op_or __P((struct val *, struct val *)); static struct val *op_plus __P((struct val *, struct val *)); static struct val *op_rem __P((struct val *, struct val *)); static struct val *op_times __P((struct val *, struct val *)); -static int to_number __P((struct val *)); +static quad_t to_integer __P((struct val *)); static void to_string __P((struct val *)); /* uh, if I want to predeclare yylex with a YYLTYPE, I have to predeclare the yyltype... sigh */ @@ -192,7 +174,7 @@ extern int ast_yylex __P((YYSTYPE *, YYLTYPE *, yyscan_t)); start: expr { ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1); ((struct parse_io *)parseio)->val->type = $1->type; - if( $1->type == AST_EXPR_number ) + if( $1->type == AST_EXPR_integer ) ((struct parse_io *)parseio)->val->u.i = $1->u.i; else ((struct parse_io *)parseio)->val->u.s = $1->u.s; @@ -288,7 +270,7 @@ expr: TOKEN { $$= $1;} %% static struct val * -make_number (FP___TYPE i) +make_integer (quad_t i) { struct val *vp; @@ -298,7 +280,7 @@ make_number (FP___TYPE i) return(NULL); } - vp->type = AST_EXPR_number; + vp->type = AST_EXPR_integer; vp->u.i = i; return vp; } @@ -308,7 +290,7 @@ make_str (const char *s) { struct val *vp; size_t i; - int isint; /* this started out being a test for an integer, but then ended up being a test for a float */ + int isint; vp = (struct val *) malloc (sizeof (*vp)); if (vp == NULL || ((vp->u.s = strdup (s)) == NULL)) { @@ -316,13 +298,14 @@ make_str (const char *s) return(NULL); } - for (i = 0, isint = (isdigit(s[0]) || s[0] == '-' || s[0]=='.'); isint && i < strlen(s); i++) + for(i = 1, isint = isdigit(s[0]) || s[0] == '-'; + isint && i < strlen(s); + i++) { - if (!isdigit(s[i]) && s[i] != '.') { - isint = 0; - break; - } + if(!isdigit(s[i])) + isint = 0; } + if (isint) vp->type = AST_EXPR_numeric_string; else @@ -344,17 +327,17 @@ free_value (struct val *vp) } -static int -to_number (struct val *vp) +static quad_t +to_integer (struct val *vp) { - FP___TYPE i; + quad_t i; if (vp == NULL) { - ast_log(LOG_WARNING,"vp==NULL in to_number()\n"); + ast_log(LOG_WARNING,"vp==NULL in to_integer()\n"); return(0); } - if (vp->type == AST_EXPR_number) + if (vp->type == AST_EXPR_integer) return 1; if (vp->type == AST_EXPR_string) @@ -362,16 +345,16 @@ to_number (struct val *vp) /* vp->type == AST_EXPR_numeric_string, make it numeric */ errno = 0; - i = FP___STRTOD(vp->u.s, (char**)0); /* either strtod, or strtold on a good day */ + i = strtoll(vp->u.s, (char**)NULL, 10); if (errno != 0) { - ast_log(LOG_WARNING,"Conversion of %s to number under/overflowed!\n", vp->u.s); + ast_log(LOG_WARNING,"Conversion of %s to integer under/overflowed!\n", vp->u.s); free(vp->u.s); vp->u.s = 0; return(0); } free (vp->u.s); vp->u.i = i; - vp->type = AST_EXPR_number; + vp->type = AST_EXPR_integer; return 1; } @@ -412,7 +395,7 @@ to_string (struct val *vp) return; } - sprintf(tmp, FP___PRINTF, vp->u.i); + sprintf(tmp, "%ld", (long int) vp->u.i); vp->type = AST_EXPR_string; vp->u.s = tmp; } @@ -421,7 +404,7 @@ to_string (struct val *vp) static int isstring (struct val *vp) { - /* only TRUE if this string is not a valid number */ + /* only TRUE if this string is not a valid integer */ return (vp->type == AST_EXPR_string); } @@ -429,10 +412,10 @@ isstring (struct val *vp) static int is_zero_or_null (struct val *vp) { - if (vp->type == AST_EXPR_number) { + if (vp->type == AST_EXPR_integer) { return (vp->u.i == 0); } else { - return (*vp->u.s == 0 || (to_number(vp) && vp->u.i == 0)); + return (*vp->u.s == 0 || (to_integer (vp) && vp->u.i == 0)); } /* NOTREACHED */ } @@ -519,7 +502,7 @@ op_and (struct val *a, struct val *b) if (is_zero_or_null (a) || is_zero_or_null (b)) { free_value (a); free_value (b); - return (make_number ((double)0.0)); + return (make_integer ((quad_t)0)); } else { free_value (b); return (a); @@ -534,18 +517,18 @@ op_eq (struct val *a, struct val *b) if (isstring (a) || isstring (b)) { to_string (a); to_string (b); - r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) == 0)); + r = make_integer ((quad_t)(strcoll (a->u.s, b->u.s) == 0)); } else { #ifdef DEBUG_FOR_CONVERSIONS char buffer[2000]; sprintf(buffer,"Converting '%s' and '%s' ", a->u.s, b->u.s); #endif - (void)to_number(a); - (void)to_number(b); + (void)to_integer(a); + (void)to_integer(b); #ifdef DEBUG_FOR_CONVERSIONS ast_log(LOG_WARNING,"%s to '%lld' and '%lld'\n", buffer, a->u.i, b->u.i); #endif - r = make_number ((FP___TYPE)(a->u.i == b->u.i)); + r = make_integer ((quad_t)(a->u.i == b->u.i)); } free_value (a); @@ -561,11 +544,11 @@ op_gt (struct val *a, struct val *b) if (isstring (a) || isstring (b)) { to_string (a); to_string (b); - r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) > 0)); + r = make_integer ((quad_t)(strcoll (a->u.s, b->u.s) > 0)); } else { - (void)to_number(a); - (void)to_number(b); - r = make_number ((FP___TYPE)(a->u.i > b->u.i)); + (void)to_integer(a); + (void)to_integer(b); + r = make_integer ((quad_t)(a->u.i > b->u.i)); } free_value (a); @@ -581,11 +564,11 @@ op_lt (struct val *a, struct val *b) if (isstring (a) || isstring (b)) { to_string (a); to_string (b); - r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) < 0)); + r = make_integer ((quad_t)(strcoll (a->u.s, b->u.s) < 0)); } else { - (void)to_number(a); - (void)to_number(b); - r = make_number ((FP___TYPE)(a->u.i < b->u.i)); + (void)to_integer(a); + (void)to_integer(b); + r = make_integer ((quad_t)(a->u.i < b->u.i)); } free_value (a); @@ -601,11 +584,11 @@ op_ge (struct val *a, struct val *b) if (isstring (a) || isstring (b)) { to_string (a); to_string (b); - r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) >= 0)); + r = make_integer ((quad_t)(strcoll (a->u.s, b->u.s) >= 0)); } else { - (void)to_number(a); - (void)to_number(b); - r = make_number ((FP___TYPE)(a->u.i >= b->u.i)); + (void)to_integer(a); + (void)to_integer(b); + r = make_integer ((quad_t)(a->u.i >= b->u.i)); } free_value (a); @@ -621,11 +604,11 @@ op_le (struct val *a, struct val *b) if (isstring (a) || isstring (b)) { to_string (a); to_string (b); - r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) <= 0)); + r = make_integer ((quad_t)(strcoll (a->u.s, b->u.s) <= 0)); } else { - (void)to_number(a); - (void)to_number(b); - r = make_number ((FP___TYPE)(a->u.i <= b->u.i)); + (void)to_integer(a); + (void)to_integer(b); + r = make_integer ((quad_t)(a->u.i <= b->u.i)); } free_value (a); @@ -655,7 +638,7 @@ op_cond (struct val *a, struct val *b, struct val *c) } else { - (void)to_number(a); + (void)to_integer(a); if( a->u.i ) { free_value(a); @@ -680,11 +663,11 @@ op_ne (struct val *a, struct val *b) if (isstring (a) || isstring (b)) { to_string (a); to_string (b); - r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) != 0)); + r = make_integer ((quad_t)(strcoll (a->u.s, b->u.s) != 0)); } else { - (void)to_number(a); - (void)to_number(b); - r = make_number ((FP___TYPE)(a->u.i != b->u.i)); + (void)to_integer(a); + (void)to_integer(b); + r = make_integer ((quad_t)(a->u.i != b->u.i)); } free_value (a); @@ -693,7 +676,7 @@ op_ne (struct val *a, struct val *b) } static int -chk_plus (FP___TYPE a, FP___TYPE b, FP___TYPE r) +chk_plus (quad_t a, quad_t b, quad_t r) { /* sum of two positive numbers must be positive */ if (a > 0 && b > 0 && r <= 0) @@ -710,23 +693,23 @@ op_plus (struct val *a, struct val *b) { struct val *r; - if (!to_number (a)) { + if (!to_integer (a)) { if( !extra_error_message_supplied ) ast_log(LOG_WARNING,"non-numeric argument\n"); - if (!to_number (b)) { + if (!to_integer (b)) { free_value(a); free_value(b); - return make_number(0); + return make_integer(0); } else { free_value(a); return (b); } - } else if (!to_number(b)) { + } else if (!to_integer(b)) { free_value(b); return (a); } - r = make_number (a->u.i + b->u.i); + r = make_integer (/*(quad_t)*/(a->u.i + b->u.i)); if (chk_plus (a->u.i, b->u.i, r->u.i)) { ast_log(LOG_WARNING,"overflow\n"); } @@ -736,7 +719,7 @@ op_plus (struct val *a, struct val *b) } static int -chk_minus (FP___TYPE a, FP___TYPE b, FP___TYPE r) +chk_minus (quad_t a, quad_t b, quad_t r) { /* special case subtraction of QUAD_MIN */ if (b == QUAD_MIN) { @@ -754,27 +737,27 @@ op_minus (struct val *a, struct val *b) { struct val *r; - if (!to_number (a)) { + if (!to_integer (a)) { if( !extra_error_message_supplied ) ast_log(LOG_WARNING, "non-numeric argument\n"); - if (!to_number (b)) { + if (!to_integer (b)) { free_value(a); free_value(b); - return make_number(0); + return make_integer(0); } else { - r = make_number(0 - b->u.i); + r = make_integer(0 - b->u.i); free_value(a); free_value(b); return (r); } - } else if (!to_number(b)) { + } else if (!to_integer(b)) { if( !extra_error_message_supplied ) ast_log(LOG_WARNING, "non-numeric argument\n"); free_value(b); return (a); } - r = make_number (a->u.i - b->u.i); + r = make_integer (/*(quad_t)*/(a->u.i - b->u.i)); if (chk_minus (a->u.i, b->u.i, r->u.i)) { ast_log(LOG_WARNING, "overflow\n"); } @@ -788,14 +771,14 @@ op_negate (struct val *a) { struct val *r; - if (!to_number (a) ) { + if (!to_integer (a) ) { free_value(a); if( !extra_error_message_supplied ) ast_log(LOG_WARNING, "non-numeric argument\n"); - return make_number(0); + return make_integer(0); } - r = make_number (- a->u.i); + r = make_integer (/*(quad_t)*/(- a->u.i)); if (chk_minus (0, a->u.i, r->u.i)) { ast_log(LOG_WARNING, "overflow\n"); } @@ -817,7 +800,7 @@ op_compl (struct val *a) { switch( a->type ) { - case AST_EXPR_number: + case AST_EXPR_integer: if( a->u.i == 0 ) v1 = 0; break; @@ -848,13 +831,13 @@ op_compl (struct val *a) } } - r = make_number (!v1); + r = make_integer (!v1); free_value (a); return r; } static int -chk_times (FP___TYPE a, FP___TYPE b, FP___TYPE r) +chk_times (quad_t a, quad_t b, quad_t r) { /* special case: first operand is 0, no overflow possible */ if (a == 0) @@ -870,15 +853,15 @@ op_times (struct val *a, struct val *b) { struct val *r; - if (!to_number (a) || !to_number (b)) { + if (!to_integer (a) || !to_integer (b)) { free_value(a); free_value(b); if( !extra_error_message_supplied ) ast_log(LOG_WARNING, "non-numeric argument\n"); - return(make_number(0)); + return(make_integer(0)); } - r = make_number (a->u.i * b->u.i); + r = make_integer (/*(quad_t)*/(a->u.i * b->u.i)); if (chk_times (a->u.i, b->u.i, r->u.i)) { ast_log(LOG_WARNING, "overflow\n"); } @@ -888,7 +871,7 @@ op_times (struct val *a, struct val *b) } static int -chk_div (FP___TYPE a, FP___TYPE b) +chk_div (quad_t a, quad_t b) { /* div by zero has been taken care of before */ /* only QUAD_MIN / -1 causes overflow */ @@ -903,28 +886,28 @@ op_div (struct val *a, struct val *b) { struct val *r; - if (!to_number (a)) { + if (!to_integer (a)) { free_value(a); free_value(b); if( !extra_error_message_supplied ) ast_log(LOG_WARNING, "non-numeric argument\n"); - return make_number(0); - } else if (!to_number (b)) { + return make_integer(0); + } else if (!to_integer (b)) { free_value(a); free_value(b); if( !extra_error_message_supplied ) ast_log(LOG_WARNING, "non-numeric argument\n"); - return make_number(INT_MAX); + return make_integer(INT_MAX); } if (b->u.i == 0) { ast_log(LOG_WARNING, "division by zero\n"); free_value(a); free_value(b); - return make_number(INT_MAX); + return make_integer(INT_MAX); } - r = make_number (a->u.i / b->u.i); + r = make_integer (/*(quad_t)*/(a->u.i / b->u.i)); if (chk_div (a->u.i, b->u.i)) { ast_log(LOG_WARNING, "overflow\n"); } @@ -938,12 +921,12 @@ op_rem (struct val *a, struct val *b) { struct val *r; - if (!to_number (a) || !to_number (b)) { + if (!to_integer (a) || !to_integer (b)) { if( !extra_error_message_supplied ) ast_log(LOG_WARNING, "non-numeric argument\n"); free_value(a); free_value(b); - return make_number(0); + return make_integer(0); } if (b->u.i == 0) { @@ -952,7 +935,7 @@ op_rem (struct val *a, struct val *b) return(b); } - r = make_number (FP___FMOD(a->u.i, b->u.i)); /* either fmod or fmodl if FP___TYPE is available */ + r = make_integer (/*(quad_t)*/(a->u.i % b->u.i)); /* chk_rem necessary ??? */ free_value (a); free_value (b); @@ -992,11 +975,11 @@ op_colon (struct val *a, struct val *b) v = make_str (a->u.s + rm[1].rm_so); } else { - v = make_number ((FP___TYPE)(rm[0].rm_eo - rm[0].rm_so)); + v = make_integer ((quad_t)(rm[0].rm_eo - rm[0].rm_so)); } } else { if (rp.re_nsub == 0) { - v = make_number ((FP___TYPE)0); + v = make_integer ((quad_t)0); } else { v = make_str (""); } @@ -1043,11 +1026,11 @@ op_eqtilde (struct val *a, struct val *b) v = make_str (a->u.s + rm[1].rm_so); } else { - v = make_number ((FP___TYPE)(rm[0].rm_eo - rm[0].rm_so)); + v = make_integer ((quad_t)(rm[0].rm_eo - rm[0].rm_so)); } } else { if (rp.re_nsub == 0) { - v = make_number ((FP___TYPE)0.0); + v = make_integer ((quad_t)0); } else { v = make_str (""); } |