Fix expression handling for string comparisions without quotes (bug #4478)
authorMark Spencer <markster@digium.com>
Fri, 17 Jun 2005 00:33:00 +0000 (00:33 +0000)
committerMark Spencer <markster@digium.com>
Fri, 17 Jun 2005 00:33:00 +0000 (00:33 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5919 65c4cc65-6c06-0410-ace0-fbb531ad65f3

ast_expr2.fl
ast_expr2.y
doc/README.variables

index 452d28f..55dffd5 100755 (executable)
@@ -32,6 +32,7 @@ struct val {
 
 #define SET_COLUMNS yylloc_param->first_column = (int)(yyg->yytext_r - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf);yylloc_param->last_column = yylloc_param->last_column + yyleng - 1; yylloc_param->first_line = yylloc_param->last_line = 1
 #define SET_STRING yylval_param->val = (struct val *)calloc(sizeof(struct val),1); yylval_param->val->type = AST_EXPR_string; yylval_param->val->u.s = strdup(yytext);
+#define SET_NUMERIC_STRING yylval_param->val = (struct val *)calloc(sizeof(struct val),1); yylval_param->val->type = AST_EXPR_numeric_string; yylval_param->val->u.s = strdup(yytext);
 
 struct parse_io
 {
@@ -74,10 +75,8 @@ struct parse_io
 \"[^"]*\"   {SET_COLUMNS; SET_STRING; return TOKEN;}
 
 [\n]   {/* what to do with eol */}
-[0-9]+         {   SET_COLUMNS; 
-                               yylval_param->val = (struct val *)calloc(sizeof(struct val),1);
-                               yylval_param->val->type = AST_EXPR_integer; 
-                               yylval_param->val->u.i = atoi(yytext); 
+[0-9]+         {   SET_COLUMNS;  /* the original behavior of the expression parser was to bring in numbers as a numeric string */
+                               SET_NUMERIC_STRING;
                                return TOKEN;}
 [a-zA-Z0-9,.?';{}\\_^%$#@!]+   {SET_COLUMNS; SET_STRING; return TOKEN;}
 
index 14c84e8..dc0a375 100755 (executable)
@@ -296,10 +296,11 @@ to_integer (struct val *vp)
 
        /* vp->type == AST_EXPR_numeric_string, make it numeric */
        errno = 0;
-       i  = strtoq(vp->u.s, (char**)NULL, 10);
+       i  = strtoll(vp->u.s, (char**)NULL, 10);
        if (errno != 0) {
+               ast_log(LOG_WARNING,"Conversion of %s to integer under/overflowed!\n", vp->u.s);
                free(vp->u.s);
-               ast_log(LOG_WARNING,"overflow\n");
+               vp->u.s = 0;
                return(0);
        }
        free (vp->u.s);
@@ -433,8 +434,15 @@ op_eq (struct val *a, struct val *b)
                to_string (b);  
                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_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_integer ((quad_t)(a->u.i == b->u.i));
        }
 
index 3a8a7b4..1bf9007 100755 (executable)
@@ -310,7 +310,13 @@ Of course, all of the above examples use constants, but would work the same if a
 numeric or string constants were replaced with a variable reference ${CALLERIDNUM}, for
 instance.
 
+__________________________
+NUMBERS VS STRINGS
+--------------------------
+
+Tokens consisting only of numbers are converted to 64-bit numbers for most of the
+operators. This means that overflows can occur when the numbers get above 18 digits.
+Warnings will appear in the logs in this case.
 ___________________________
 CONDITIONALS
 ---------------------------