Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv13964

Modified Files:
        .cvsignore ast_expr2.c ast_expr2.fl ast_expr2.y ast_expr2f.c 
        pbx.c 
Log Message:
don't make expression evaluator allocate a memory buffer for each result 
to 
be returned; use the buffers already present in the PBX for this purpose
update testexpr2/check_expr to allocate buffers for expression 
evaluation


Index: .cvsignore
===================================================================
RCS file: /usr/cvsroot/asterisk/.cvsignore,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- .cvsignore  26 Aug 2005 19:21:57 -0000      1.17
+++ .cvsignore  29 Aug 2005 22:03:37 -0000      1.18
@@ -13,3 +13,4 @@
 .tags-sources
 tags
 TAGS
+testexpr2

Index: ast_expr2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/ast_expr2.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ast_expr2.c 29 Aug 2005 20:43:16 -0000      1.3
+++ ast_expr2.c 29 Aug 2005 22:03:37 -0000      1.4
@@ -1734,7 +1734,7 @@
                return;
        }
 
-       sprintf (tmp, "%ld", vp->u.i);
+       sprintf(tmp, "%ld", (long int) vp->u.i);
        vp->type = AST_EXPR_string;
        vp->u.s  = tmp;
 }
@@ -1775,11 +1775,12 @@
 
 
 int main(int argc,char **argv) {
-       char *s;
-
-       s=ast_expr(argv[1]);
-
-       printf("=====%s======\n",s);
+       char s[4096];
+       
+       if (ast_expr(argv[1], s, sizeof(s)))
+               printf("=====%s======\n",s);
+       else
+               printf("No result\n");
 }
 
 #endif

Index: ast_expr2.fl
===================================================================
RCS file: /usr/cvsroot/asterisk/ast_expr2.fl,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- ast_expr2.fl        29 Aug 2005 20:43:16 -0000      1.6
+++ ast_expr2.fl        29 Aug 2005 22:03:37 -0000      1.7
@@ -15,6 +15,7 @@
 #include <limits.h>
 #include <asterisk/ast_expr.h>
 #include <asterisk/logger.h>
+#include <asterisk/strings.h>
 
 enum valtype {
        AST_EXPR_integer, AST_EXPR_numeric_string, AST_EXPR_string
@@ -41,6 +42,8 @@
        yyscan_t scanner;
 };
  
+void ast_yyset_column(int column_no, yyscan_t yyscanner);
+int ast_yyget_column(yyscan_t yyscanner);
 
 %}
 
@@ -90,42 +93,47 @@
    ast_yy_scan_string in the .y file, because then, I'd have to define 
YY_BUFFER_STATE there...
        UGH! that would be inappropriate. */
 
-int ast_yyparse( void *); /* need to/should define this prototype for the call 
to yyparse */
-char *ast_expr(char *arg); /* and this prototype for the following func */
-int            ast_yyerror(const char *,YYLTYPE *, struct parse_io *); /* 
likewise */
+int ast_yyparse(void *); /* need to/should define this prototype for the call 
to yyparse */
+int ast_yyerror(const char *, YYLTYPE *, struct parse_io *); /* likewise */
 
-char *ast_expr (char *arg)
+int ast_expr(char *expr, char *buf, int length)
 {
        struct parse_io *io;
-       char *pirouni;
        
-       io = (struct parse_io *)calloc(sizeof(struct parse_io),1);
-       io->string = arg;  /* to pass to the error routine */
+       io = calloc(sizeof(struct parse_io),1);
+       io->string = expr;  /* to pass to the error routine */
        
        ast_yylex_init(&io->scanner);
        
-       ast_yy_scan_string(arg,io->scanner);
+       ast_yy_scan_string(expr, io->scanner);
        
-       ast_yyparse ((void *)io);
+       ast_yyparse ((void *) io);
 
        ast_yylex_destroy(io->scanner);
-       
 
-       if (io->val==NULL) {
-               pirouni=strdup("0");
-               return(pirouni);
+       if (io->val == NULL) {
+               if (length > 1) {
+                       strcpy(buf, "0");
+                       return 1;
+               }
        } else {
                if (io->val->type == AST_EXPR_integer) {
-                       pirouni = malloc(24);
-                       sprintf(pirouni, "%ld", io->val->u.i);
-               }
-               else {
-                       pirouni=strdup(io->val->u.s);
+                       int res_length;
+
+                       res_length = snprintf(buf, length, "%ld", (long int) 
io->val->u.i);
+                       return res_length <= length ? res_length : length;
+               } else {
+#ifdef STANDALONE
+                       strncpy(buf, io->val->u.s, length - 1);
+#else /* !STANDALONE */
+                       ast_copy_string(buf, io->val->u.s, length);
+#endif /* STANDALONE */
+                       return strlen(buf);
                }
                free(io->val);
        }
        free(io);
-       return(pirouni);
+       return 0;
 }
 
 int ast_yyerror (const char *s,  yyltype *loc, struct parse_io *parseio )

Index: ast_expr2.y
===================================================================
RCS file: /usr/cvsroot/asterisk/ast_expr2.y,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- ast_expr2.y 29 Aug 2005 20:43:16 -0000      1.6
+++ ast_expr2.y 29 Aug 2005 22:03:37 -0000      1.7
@@ -349,7 +349,7 @@
                return;
        }
 
-       sprintf (tmp, "%ld", vp->u.i);
+       sprintf(tmp, "%ld", (long int) vp->u.i);
        vp->type = AST_EXPR_string;
        vp->u.s  = tmp;
 }
@@ -390,11 +390,12 @@
 
 
 int main(int argc,char **argv) {
-       char *s;
-
-       s=ast_expr(argv[1]);
-
-       printf("=====%s======\n",s);
+       char s[4096];
+       
+       if (ast_expr(argv[1], s, sizeof(s)))
+               printf("=====%s======\n",s);
+       else
+               printf("No result\n");
 }
 
 #endif

Index: ast_expr2f.c
===================================================================
RCS file: /usr/cvsroot/asterisk/ast_expr2f.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ast_expr2f.c        29 Aug 2005 20:43:16 -0000      1.2
+++ ast_expr2f.c        29 Aug 2005 22:03:37 -0000      1.3
@@ -460,6 +460,7 @@
 #include <limits.h>
 #include <asterisk/ast_expr.h>
 #include <asterisk/logger.h>
+#include <asterisk/strings.h>
 
 enum valtype {
        AST_EXPR_integer, AST_EXPR_numeric_string, AST_EXPR_string
@@ -486,8 +487,10 @@
        yyscan_t scanner;
 };
  
+void ast_yyset_column(int column_no, yyscan_t yyscanner);
+int ast_yyget_column(yyscan_t yyscanner);
 
-#line 491 "ast_expr2f.c"
+#line 494 "ast_expr2f.c"
 
 #define INITIAL 0
 
@@ -720,10 +723,10 @@
        register int yy_act;
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
-#line 55 "ast_expr2.fl"
+#line 58 "ast_expr2.fl"
 
 
-#line 727 "ast_expr2f.c"
+#line 730 "ast_expr2f.c"
 
     yylval = yylval_param;
 
@@ -808,129 +811,129 @@
 
 case 1:
 YY_RULE_SETUP
-#line 57 "ast_expr2.fl"
+#line 60 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_OR;}
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 58 "ast_expr2.fl"
+#line 61 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_AND;}
        YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 59 "ast_expr2.fl"
+#line 62 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_EQ;}
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 60 "ast_expr2.fl"
+#line 63 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_GT;}
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 61 "ast_expr2.fl"
+#line 64 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_LT;}
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 62 "ast_expr2.fl"
+#line 65 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_GE;}
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 63 "ast_expr2.fl"
+#line 66 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_LE;}
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 64 "ast_expr2.fl"
+#line 67 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_NE;}
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 65 "ast_expr2.fl"
+#line 68 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_PLUS;}
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 66 "ast_expr2.fl"
+#line 69 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_MINUS;}
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 67 "ast_expr2.fl"
+#line 70 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_MULT;}
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 68 "ast_expr2.fl"
+#line 71 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_DIV;}
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 69 "ast_expr2.fl"
+#line 72 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_MOD;}
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 70 "ast_expr2.fl"
+#line 73 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_COND;}
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 71 "ast_expr2.fl"
+#line 74 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_COLON;}
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 72 "ast_expr2.fl"
+#line 75 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_COLONCOLON;}
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 73 "ast_expr2.fl"
+#line 76 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_LP;}
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 74 "ast_expr2.fl"
+#line 77 "ast_expr2.fl"
 { SET_COLUMNS; SET_STRING; return TOK_RP;}
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 76 "ast_expr2.fl"
+#line 79 "ast_expr2.fl"
 {}
        YY_BREAK
 case 20:
 /* rule 20 can match eol */
 YY_RULE_SETUP
-#line 77 "ast_expr2.fl"
+#line 80 "ast_expr2.fl"
 {SET_COLUMNS; SET_STRING; return TOKEN;}
        YY_BREAK
 case 21:
 /* rule 21 can match eol */
 YY_RULE_SETUP
-#line 79 "ast_expr2.fl"
+#line 82 "ast_expr2.fl"
 {/* what to do with eol */}
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 80 "ast_expr2.fl"
+#line 83 "ast_expr2.fl"
 {   SET_COLUMNS;  /* the original behavior of the expression parser was to 
bring in numbers as a numeric string */
                                SET_NUMERIC_STRING;
                                return TOKEN;}
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 83 "ast_expr2.fl"
+#line 86 "ast_expr2.fl"
 {SET_COLUMNS; SET_STRING; return TOKEN;}
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 85 "ast_expr2.fl"
+#line 88 "ast_expr2.fl"
 ECHO;
        YY_BREAK
-#line 934 "ast_expr2f.c"
+#line 937 "ast_expr2f.c"
 case YY_STATE_EOF(INITIAL):
        yyterminate();
 
@@ -2068,7 +2071,7 @@
 #undef YY_DECL_IS_OURS
 #undef YY_DECL
 #endif
-#line 85 "ast_expr2.fl"
+#line 88 "ast_expr2.fl"
 
 
 
@@ -2078,42 +2081,47 @@
    ast_yy_scan_string in the .y file, because then, I'd have to define 
YY_BUFFER_STATE there...
        UGH! that would be inappropriate. */
 
-int ast_yyparse( void *); /* need to/should define this prototype for the call 
to yyparse */
-char *ast_expr(char *arg); /* and this prototype for the following func */
-int            ast_yyerror(const char *,YYLTYPE *, struct parse_io *); /* 
likewise */
+int ast_yyparse(void *); /* need to/should define this prototype for the call 
to yyparse */
+int ast_yyerror(const char *, YYLTYPE *, struct parse_io *); /* likewise */
 
-char *ast_expr (char *arg)
+int ast_expr(char *expr, char *buf, int length)
 {
        struct parse_io *io;
-       char *pirouni;
        
-       io = (struct parse_io *)calloc(sizeof(struct parse_io),1);
-       io->string = arg;  /* to pass to the error routine */
+       io = calloc(sizeof(struct parse_io),1);
+       io->string = expr;  /* to pass to the error routine */
        
        ast_yylex_init(&io->scanner);
        
-       ast_yy_scan_string(arg,io->scanner);
+       ast_yy_scan_string(expr, io->scanner);
        
-       ast_yyparse ((void *)io);
+       ast_yyparse ((void *) io);
 
        ast_yylex_destroy(io->scanner);
-       
 
-       if (io->val==NULL) {
-               pirouni=strdup("0");
-               return(pirouni);
+       if (io->val == NULL) {
+               if (length > 1) {
+                       strcpy(buf, "0");
+                       return 1;
+               }
        } else {
                if (io->val->type == AST_EXPR_integer) {
-                       pirouni = malloc(24);
-                       sprintf(pirouni, "%ld", io->val->u.i);
-               }
-               else {
-                       pirouni=strdup(io->val->u.s);
+                       int res_length;
+
+                       res_length = snprintf(buf, length, "%ld", (long int) 
io->val->u.i);
+                       return res_length <= length ? res_length : length;
+               } else {
+#ifdef STANDALONE
+                       strncpy(buf, io->val->u.s, length - 1);
+#else /* !STANDALONE */
+                       ast_copy_string(buf, io->val->u.s, length);
+#endif /* STANDALONE */
+                       return strlen(buf);
                }
                free(io->val);
        }
        free(io);
-       return(pirouni);
+       return 0;
 }
 
 int ast_yyerror (const char *s,  yyltype *loc, struct parse_io *parseio )

Index: pbx.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx.c,v
retrieving revision 1.267
retrieving revision 1.268
diff -u -d -r1.267 -r1.268
--- pbx.c       27 Aug 2005 23:55:14 -0000      1.267
+++ pbx.c       29 Aug 2005 22:03:37 -0000      1.268
@@ -1522,19 +1522,12 @@
                                vars = var;
                        }
 
-                       /* Evaluate expression */                       
-                       cp4 = ast_expr(vars);
-                       
-                       ast_log(LOG_DEBUG, "Expression is '%s'\n", cp4);
-                       
-                       if (cp4) {
-                               length = strlen(cp4);
-                               if (length > count)
-                                       length = count;
-                               memcpy(cp2, cp4, length);
+                       length = ast_expr(vars, cp2, count);
+
+                       if (length) {
+                               ast_log(LOG_DEBUG, "Expression result is 
'%s'\n", cp2);
                                count -= length;
                                cp2 += length;
-                               free(cp4);
                        }
                } else
                        break;

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to