Merged revisions 7736 via svnmerge from
[asterisk/asterisk.git] / ast_expr2.fl
old mode 100755 (executable)
new mode 100644 (file)
index 55dffd5..9e198e7
@@ -5,16 +5,17 @@
 #include <string.h>
 #include <locale.h>
 #include <ctype.h>
-#ifndef SOLARIS
+#if !defined(SOLARIS) && !defined(__CYGWIN__)
 #include <err.h>
 #else
-#define quad_t uint64_t
+#define quad_t int64_t
 #endif
 #include <errno.h>
 #include <regex.h>
 #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 @@ struct parse_io
        yyscan_t scanner;
 };
  
+void ast_yyset_column(int column_no, yyscan_t yyscanner);
+int ast_yyget_column(yyscan_t yyscanner);
 
 %}
 
@@ -67,7 +70,9 @@ struct parse_io
 \*     { SET_COLUMNS; SET_STRING; return TOK_MULT;}
 \/     { SET_COLUMNS; SET_STRING; return TOK_DIV;}
 \%     { SET_COLUMNS; SET_STRING; return TOK_MOD;}
+\?     { SET_COLUMNS; SET_STRING; return TOK_COND;}
 \:     { SET_COLUMNS; SET_STRING; return TOK_COLON;}
+\:\:   { SET_COLUMNS; SET_STRING; return TOK_COLONCOLON;}
 \(     { SET_COLUMNS; SET_STRING; return TOK_LP;}
 \)     { SET_COLUMNS; SET_STRING; return TOK_RP;}
 
@@ -78,7 +83,7 @@ struct parse_io
 [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;}
+[a-zA-Z0-9,.';{}\\_^%$#@!]+    {SET_COLUMNS; SET_STRING; return TOKEN;}
 
 %%
 
@@ -88,42 +93,47 @@ struct parse_io
    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;
+       struct parse_io io;
+       int return_value = 0;
        
-       io = (struct parse_io *)calloc(sizeof(struct parse_io),1);
-       io->string = arg;  /* to pass to the error routine */
+       memset(&io, 0, sizeof(io));
+       io.string = expr;  /* to pass to the error routine */
        
-       ast_yylex_init(&io->scanner);
+       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);
-       
+       ast_yylex_destroy(io.scanner);
 
-       if (io->val==NULL) {
-               pirouni=strdup("0");
-               return(pirouni);
-       } else {
-               if (io->val->type == AST_EXPR_integer) {
-                       pirouni=malloc(256);
-                       sprintf (pirouni,"%lld", (long long)io->val->u.i);
+       if (!io.val) {
+               if (length > 1) {
+                       strcpy(buf, "0");
+                       return_value = 1;
                }
-               else {
-                       pirouni=strdup(io->val->u.s);
+       } else {
+               if (io.val->type == AST_EXPR_integer) {
+                       int res_length;
+
+                       res_length = snprintf(buf, length, "%ld", (long int) io.val->u.i);
+                       return_value = (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_value = strlen(buf);
                }
-               free(io->val);
+               free(io.val);
        }
-       free(io);
-       return(pirouni);
+       return return_value;
 }
 
 int ast_yyerror (const char *s,  yyltype *loc, struct parse_io *parseio )
@@ -157,14 +167,16 @@ int ast_yyerror (const char *s,  yyltype *loc, struct parse_io *parseio )
        spacebuf2[i++]='^';
        spacebuf2[i]= 0;
 
-#ifdef STANDALONE
+#ifdef STANDALONE3
        /* easier to read in the standalone version */
        printf("ast_yyerror(): syntax error: %s; Input:\n%s\n%s\n",  
                        s, parseio->string,spacebuf2);
 #else
        ast_log(LOG_WARNING,"ast_yyerror(): syntax error: %s; Input:\n%s\n%s\n",  
                        s, parseio->string,spacebuf2);
-       ast_log(LOG_WARNING,"If you have questions, please refer to doc/README.variables2 in the asterisk source.\n");
+#endif
+#ifndef STANDALONE
+       ast_log(LOG_WARNING,"If you have questions, please refer to doc/README.variables in the asterisk source.\n");
 #endif
        return(0);
 }