aboutsummaryrefslogtreecommitdiffstats
path: root/1.4.23-rc4/pbx/ael/ael.flex
diff options
context:
space:
mode:
Diffstat (limited to '1.4.23-rc4/pbx/ael/ael.flex')
-rw-r--r--1.4.23-rc4/pbx/ael/ael.flex904
1 files changed, 0 insertions, 904 deletions
diff --git a/1.4.23-rc4/pbx/ael/ael.flex b/1.4.23-rc4/pbx/ael/ael.flex
deleted file mode 100644
index 41c2a2963..000000000
--- a/1.4.23-rc4/pbx/ael/ael.flex
+++ /dev/null
@@ -1,904 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2006, Digium, Inc.
- *
- * Steve Murphy <murf@parsetree.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
-/*! \file
- *
- * \brief Flex scanner description of tokens used in AEL2 .
- *
- */
-
-/*
- * Start with flex options:
- *
- * %x describes the contexts we have: paren, semic and argg, plus INITIAL
- */
-%x paren semic argg comment curlystate wordstate brackstate
-
-/* prefix used for various globally-visible functions and variables.
- * This renames also yywrap, but since we do not use it, we just
- * add option noyywrap to remove it.
- */
-%option prefix="ael_yy"
-%option noyywrap
-
-/* I specify this option to suppress flex generating code with ECHO
- in it. This generates compiler warnings in some systems; We've
- seen the fwrite generate Unused variable warnings with 4.1.2 gcc.
- Some systems have tweaked flex ECHO macro to keep the compiler
- happy. To keep the warning message from getting output, I added
- a default rule at the end of the patterns section */
-%option nodefault
-
-/* yyfree normally just frees its arg. It can be null sometimes,
- which some systems will complain about, so, we'll define our own version */
-%option noyyfree
-
-/* batch gives a bit more performance if we are using it in
- * a non-interactive mode. We probably don't care much.
- */
-%option batch
-
-/* outfile is the filename to be used instead of lex.yy.c */
-%option outfile="ael_lex.c"
-
-/*
- * These are not supported in flex 2.5.4, but we need them
- * at the moment:
- * reentrant produces a thread-safe parser. Not 100% sure that
- * we require it, though.
- * bison-bridge passes an additional yylval argument to yylex().
- * bison-locations is probably not needed.
- */
-%option reentrant
-%option bison-bridge
-%option bison-locations
-
-%{
-#if !defined(STANDALONE_AEL)
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#if defined(__Darwin__) || defined(__CYGWIN__)
-#define GLOB_ABORTED GLOB_ABEND
-#endif
-# include <glob.h>
-
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "ael/ael.tab.h"
-#include "asterisk/ael_structs.h"
-
-/*
- * A stack to keep track of matching brackets ( [ { } ] )
- */
-static char pbcstack[400]; /* XXX missing size checks */
-static int pbcpos = 0;
-static void pbcpush(char x);
-static int pbcpop(char x);
-static int parencount = 0;
-
-/*
- * A similar stack to keep track of matching brackets ( [ { } ] ) in word tokens surrounded by ${ ... }
- */
-static char pbcstack2[400]; /* XXX missing size checks */
-static int pbcpos2 = 0;
-static void pbcpush2(char x);
-static int pbcpop2(char x);
-static int parencount2 = 0;
-
-/*
- * A similar stack to keep track of matching brackets ( [ { } ] ) in word tokens surrounded by $[ ... ]
- */
-static char pbcstack3[400]; /* XXX missing size checks */
-static int pbcpos3 = 0;
-static void pbcpush3(char x);
-static int pbcpop3(char x);
-static int parencount3 = 0;
-
-
-/*
- * current line, column and filename, updated as we read the input.
- */
-static int my_lineno = 1; /* current line in the source */
-static int my_col = 1; /* current column in the source */
-char *my_file = 0; /* used also in the bison code */
-char *prev_word; /* XXX document it */
-
-#define MAX_INCLUDE_DEPTH 50
-
-/*
- * flex is not too smart, and generates global functions
- * without prototypes so the compiler may complain.
- * To avoid that, we declare the prototypes here,
- * even though these functions are not used.
- */
-int ael_yyget_column (yyscan_t yyscanner);
-void ael_yyset_column (int column_no , yyscan_t yyscanner);
-
-int ael_yyparse (struct parse_io *);
-
-/*
- * A stack to process include files.
- * As we switch into the new file we need to store the previous
- * state to restore it later.
- */
-struct stackelement {
- char *fname;
- int lineno;
- int colno;
- glob_t globbuf; /* the current globbuf */
- int globbuf_pos; /* where we are in the current globbuf */
- YY_BUFFER_STATE bufstate;
-};
-
-static struct stackelement include_stack[MAX_INCLUDE_DEPTH];
-static int include_stack_index = 0;
-static void setup_filestack(char *fnamebuf, int fnamebuf_siz, glob_t *globbuf, int globpos, yyscan_t xscan, int create);
-
-/*
- * if we use the @n feature of bison, we must supply the start/end
- * location of tokens in the structure pointed by yylloc.
- * Simple tokens are just assumed to be on the same line, so
- * the line number is constant, and the column is incremented
- * by the length of the token.
- */
-#ifdef FLEX_BETA /* set for 2.5.33 */
-
-/* compute the total number of lines and columns in the text
- * passed as argument.
- */
-static void pbcwhere(const char *text, int *line, int *col )
-{
- int loc_line = *line;
- int loc_col = *col;
- char c;
- while ( (c = *text++) ) {
- if ( c == '\t' ) {
- loc_col += 8 - (loc_col % 8);
- } else if ( c == '\n' ) {
- loc_line++;
- loc_col = 1;
- } else
- loc_col++;
- }
- *line = loc_line;
- *col = loc_col;
-}
-
-#define STORE_POS do { \
- yylloc->first_line = yylloc->last_line = my_lineno; \
- yylloc->first_column=my_col; \
- yylloc->last_column=my_col+yyleng-1; \
- my_col+=yyleng; \
- } while (0)
-
-#define STORE_LOC do { \
- yylloc->first_line = my_lineno; \
- yylloc->first_column=my_col; \
- pbcwhere(yytext, &my_lineno, &my_col); \
- yylloc->last_line = my_lineno; \
- yylloc->last_column = my_col - 1; \
- } while (0)
-#else
-#define STORE_POS
-#define STORE_LOC
-#endif
-%}
-
-KEYWORD (context|abstract|extend|macro|globals|local|ignorepat|switch|if|ifTime|random|regexten|hint|else|goto|jump|return|break|continue|for|while|case|default|pattern|catch|switches|eswitches|includes)
-
-NOPARENS ([^()\[\]\{\}]|\\[()\[\]\{\}])*
-
-NOARGG ([^(),\{\}\[\]]|\\[,()\[\]\{\}])*
-
-NOSEMIC ([^;()\{\}\[\]]|\\[;()\[\]\{\}])*
-
-HIBIT [\x80-\xff]
-
-%%
-
-\{ { STORE_POS; return LC;}
-\} { STORE_POS; return RC;}
-\( { STORE_POS; return LP;}
-\) { STORE_POS; return RP;}
-\; { STORE_POS; return SEMI;}
-\= { STORE_POS; return EQ;}
-\, { STORE_POS; return COMMA;}
-\: { STORE_POS; return COLON;}
-\& { STORE_POS; return AMPER;}
-\| { STORE_POS; return BAR;}
-\=\> { STORE_POS; return EXTENMARK;}
-\@ { STORE_POS; return AT;}
-\/\/[^\n]* {/*comment*/}
-context { STORE_POS; return KW_CONTEXT;}
-abstract { STORE_POS; return KW_ABSTRACT;}
-extend { STORE_POS; return KW_EXTEND;}
-macro { STORE_POS; return KW_MACRO;};
-globals { STORE_POS; return KW_GLOBALS;}
-ignorepat { STORE_POS; return KW_IGNOREPAT;}
-switch { STORE_POS; return KW_SWITCH;}
-if { STORE_POS; return KW_IF;}
-ifTime { STORE_POS; return KW_IFTIME;}
-random { STORE_POS; return KW_RANDOM;}
-regexten { STORE_POS; return KW_REGEXTEN;}
-hint { STORE_POS; return KW_HINT;}
-else { STORE_POS; return KW_ELSE;}
-goto { STORE_POS; return KW_GOTO;}
-jump { STORE_POS; return KW_JUMP;}
-return { STORE_POS; return KW_RETURN;}
-break { STORE_POS; return KW_BREAK;}
-continue { STORE_POS; return KW_CONTINUE;}
-for { STORE_POS; return KW_FOR;}
-while { STORE_POS; return KW_WHILE;}
-case { STORE_POS; return KW_CASE;}
-default { STORE_POS; return KW_DEFAULT;}
-pattern { STORE_POS; return KW_PATTERN;}
-catch { STORE_POS; return KW_CATCH;}
-switches { STORE_POS; return KW_SWITCHES;}
-eswitches { STORE_POS; return KW_ESWITCHES;}
-includes { STORE_POS; return KW_INCLUDES;}
-"/*" { BEGIN(comment); my_col += 2; }
-
-<comment>[^*\n]* { my_col += yyleng; }
-<comment>[^*\n]*\n { ++my_lineno; my_col=1;}
-<comment>"*"+[^*/\n]* { my_col += yyleng; }
-<comment>"*"+[^*/\n]*\n { ++my_lineno; my_col=1;}
-<comment>"*/" { my_col += 2; BEGIN(INITIAL); } /* the nice thing about comments is that you know exactly what ends them */
-
-\n { my_lineno++; my_col = 1; }
-[ ]+ { my_col += yyleng; }
-[\t]+ { my_col += (yyleng*8)-(my_col%8); }
-
-({KEYWORD}?[-a-zA-Z0-9'"_/.\<\>\*\+!$#\[\]]|{HIBIT}|(\\.)|(\$\{)|(\$\[)) {
- /* boy did I open a can of worms when I changed the lexical token "word".
- all the above keywords can be used as a beginning to a "word".-
- before, a "word" would match a longer sequence than the above
- keywords, and all would be well. But now "word" is a single char
- and feeds into a statemachine sort of sequence from there on. So...
- I added the {KEYWORD}? to the beginning of the word match sequence */
-
- if (!strcmp(yytext,"${")) {
- parencount2 = 0;
- pbcpos2 = 0;
- pbcpush2('{'); /* push '{' so the last pcbpop (parencount2 = -1) will succeed */
- BEGIN(curlystate);
- yymore();
- } else if (!strcmp(yytext,"$[")) {
- parencount3 = 0;
- pbcpos3 = 0;
- pbcpush3('['); /* push '[' so the last pcbpop (parencount3 = -1) will succeed */
- BEGIN(brackstate);
- yymore();
- } else {
- BEGIN(wordstate);
- yymore();
- }
- }
-
-<wordstate>[-a-zA-Z0-9'"_/.\<\>\*\+!$#\[\]] { yymore(); /* Keep going */ }
-<wordstate>{HIBIT} { yymore(); /* Keep going */ }
-<wordstate>(\\.) { yymore(); /* Keep Going */ }
-<wordstate>(\$\{) { /* the beginning of a ${} construct. prepare and pop into curlystate */
- parencount2 = 0;
- pbcpos2 = 0;
- pbcpush2('{'); /* push '{' so the last pcbpop (parencount2 = -1) will succeed */
- BEGIN(curlystate);
- yymore();
- }
-<wordstate>(\$\[) { /* the beginning of a $[] construct. prepare and pop into brackstate */
- parencount3 = 0;
- pbcpos3 = 0;
- pbcpush3('['); /* push '[' so the last pcbpop (parencount3 = -1) will succeed */
- BEGIN(brackstate);
- yymore();
- }
-<wordstate>([^a-zA-Z0-9\x80-\xff\x2d'"_/.\<\>\*\+!$#\[\]]) {
- /* a non-word constituent char, like a space, tab, curly, paren, etc */
- char c = yytext[yyleng-1];
- STORE_POS;
- yylval->str = malloc(yyleng);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng-1] = 0;
- unput(c); /* put this ending char back in the stream */
- BEGIN(0);
- prev_word = yylval->str;
- return word;
- }
-<curlystate>{NOPARENS}\} {
- if ( pbcpop2('}') ) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = 0;
- return word;
- }
- parencount2--;
- if ( parencount2 >= 0) {
- yymore();
- } else {
- BEGIN(wordstate); /* Finished with the current ${} construct. Return to word gathering state */
- yymore();
- }
- }
-
-<curlystate>{NOPARENS}[\(\[\{] {
- char c = yytext[yyleng-1];
- if (c == '{')
- parencount2++;
- pbcpush2(c);
- yymore();
- }
-
-<curlystate>{NOPARENS}[\]\)] {
- char c = yytext[yyleng-1];
- if ( pbcpop2(c)) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
- my_file, my_lineno, my_col, c);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = 0;
- return word;
- }
- yymore();
- }
-
-
-<brackstate>{NOPARENS}\] {
- if ( pbcpop3(']') ) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = 0;
- return word;
- }
- parencount3--;
- if ( parencount3 >= 0) {
- yymore();
- } else {
- BEGIN(wordstate); /* Finished with the current ${} construct. Return to word gathering state */
- yymore();
- }
- }
-
-<brackstate>{NOPARENS}[\(\[\{] {
- char c = yytext[yyleng-1];
- if (c == '[')
- parencount3++;
- pbcpush3(c);
- yymore();
- }
-
-<brackstate>{NOPARENS}[\}\)] {
- char c = yytext[yyleng-1];
- if ( pbcpop3(c)) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
- my_file, my_lineno, my_col, c);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = 0;
- return word;
- }
- yymore();
- }
-
-
- /*
- * context used for arguments of if_head, random_head, switch_head,
- * for (last statement), while (XXX why not iftime_head ?).
- * End with the matching parentheses.
- * A comma at the top level is valid here, unlike in argg where it
- * is an argument separator so it must be returned as a token.
- */
-<paren>{NOPARENS}\) {
- if ( pbcpop(')') ) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression: %s !\n", my_file, my_lineno, my_col, yytext);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = 0;
- prev_word = 0;
- return word;
- }
- parencount--;
- if ( parencount >= 0) {
- yymore();
- } else {
- STORE_LOC;
- yylval->str = malloc(yyleng);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng-1] = 0;
- unput(')');
- BEGIN(0);
- return word;
- }
- }
-
-<paren>{NOPARENS}[\(\[\{] {
- char c = yytext[yyleng-1];
- if (c == '(')
- parencount++;
- pbcpush(c);
- yymore();
- }
-
-<paren>{NOPARENS}[\]\}] {
- char c = yytext[yyleng-1];
- if ( pbcpop(c)) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n",
- my_file, my_lineno, my_col, c);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = 0;
- return word;
- }
- yymore();
- }
-
-
- /*
- * handlers for arguments to a macro or application calls.
- * We enter this context when we find the initial '(' and
- * stay here until we close all matching parentheses,
- * and find the comma (argument separator) or the closing ')'
- * of the (external) call, which happens when parencount == 0
- * before the decrement.
- */
-<argg>{NOARGG}[\(\[\{] {
- char c = yytext[yyleng-1];
- if (c == '(')
- parencount++;
- pbcpush(c);
- yymore();
- }
-
-<argg>{NOARGG}\) {
- if ( pbcpop(')') ) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched ')' in expression!\n", my_file, my_lineno, my_col);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = 0;
- return word;
- }
-
- parencount--;
- if( parencount >= 0){
- yymore();
- } else {
- STORE_LOC;
- BEGIN(0);
- if ( !strcmp(yytext, ")") )
- return RP;
- yylval->str = malloc(yyleng);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng-1] = '\0'; /* trim trailing ')' */
- unput(')');
- return word;
- }
- }
-
-<argg>{NOARGG}\, {
- if( parencount != 0) { /* ast_log(LOG_NOTICE,"Folding in a comma!\n"); */
- yymore();
- } else {
- STORE_LOC;
- if( !strcmp(yytext,"," ) )
- return COMMA;
- yylval->str = malloc(yyleng);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng-1] = '\0'; /* trim trailing ',' */
- unput(',');
- return word;
- }
- }
-
-<argg>{NOARGG}[\]\}] {
- char c = yytext[yyleng-1];
- if ( pbcpop(c) ) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = '\0';
- return word;
- }
- yymore();
- }
-
- /*
- * context used to find tokens in the right hand side of assignments,
- * or in the first and second operand of a 'for'. As above, match
- * commas and use ';' as a separator (hence return it as a separate token).
- */
-<semic>{NOSEMIC}[\(\[\{] {
- char c = yytext[yyleng-1];
- yymore();
- pbcpush(c);
- }
-
-<semic>{NOSEMIC}[\)\]\}] {
- char c = yytext[yyleng-1];
- if ( pbcpop(c) ) { /* error */
- STORE_LOC;
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Mismatched '%c' in expression!\n", my_file, my_lineno, my_col, c);
- BEGIN(0);
- yylval->str = malloc(yyleng+1);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng] = '\0';
- return word;
- }
- yymore();
- }
-
-<semic>{NOSEMIC}; {
- STORE_LOC;
- yylval->str = malloc(yyleng);
- strncpy(yylval->str, yytext, yyleng);
- yylval->str[yyleng-1] = '\0'; /* trim trailing ';' */
- unput(';');
- BEGIN(0);
- return word;
- }
-
-\#include[ \t]+\"[^\"]+\" {
- char fnamebuf[1024],*p1,*p2;
- int glob_ret;
- glob_t globbuf; /* the current globbuf */
- int globbuf_pos = -1; /* where we are in the current globbuf */
- globbuf.gl_offs = 0; /* initialize it to silence gcc */
-
- p1 = strchr(yytext,'"');
- p2 = strrchr(yytext,'"');
- if ( include_stack_index >= MAX_INCLUDE_DEPTH ) {
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Includes nested too deeply! Wow!!! How did you do that?\n", my_file, my_lineno, my_col);
- } else if ( (int)(p2-p1) > sizeof(fnamebuf) - 1 ) {
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Filename is incredibly way too long (%d chars!). Inclusion ignored!\n", my_file, my_lineno, my_col, yyleng - 10);
- } else {
- strncpy(fnamebuf, p1+1, p2-p1-1);
- fnamebuf[p2-p1-1] = 0;
-
-#ifdef SOLARIS
- glob_ret = glob(fnamebuf, GLOB_NOCHECK, NULL, &globbuf);
-#else
- glob_ret = glob(fnamebuf, GLOB_NOMAGIC|GLOB_BRACE, NULL, &globbuf);
-#endif
- if (glob_ret == GLOB_NOSPACE) {
- ast_log(LOG_WARNING,
- "Glob Expansion of pattern '%s' failed: Not enough memory\n", fnamebuf);
- } else if (glob_ret == GLOB_ABORTED) {
- ast_log(LOG_WARNING,
- "Glob Expansion of pattern '%s' failed: Read error\n", fnamebuf);
- } else if (glob_ret == GLOB_NOMATCH) {
- ast_log(LOG_WARNING,
- "Glob Expansion of pattern '%s' failed: No matches!\n", fnamebuf);
- } else {
- globbuf_pos = 0;
- }
- }
- if (globbuf_pos > -1) {
- setup_filestack(fnamebuf, sizeof(fnamebuf), &globbuf, 0, yyscanner, 1);
- }
- }
-
-
-<<EOF>> {
- char fnamebuf[2048];
- if (include_stack_index > 0 && include_stack[include_stack_index-1].globbuf_pos < include_stack[include_stack_index-1].globbuf.gl_pathc-1) {
- yy_delete_buffer( YY_CURRENT_BUFFER, yyscanner );
- include_stack[include_stack_index-1].globbuf_pos++;
- setup_filestack(fnamebuf, sizeof(fnamebuf), &include_stack[include_stack_index-1].globbuf, include_stack[include_stack_index-1].globbuf_pos, yyscanner, 0);
- /* finish this */
-
- } else {
- if (include_stack[include_stack_index].fname) {
- free(include_stack[include_stack_index].fname);
- include_stack[include_stack_index].fname = 0;
- }
- if (my_file) {
- free(my_file);
- my_file = 0;
- }
- if ( --include_stack_index < 0 ) {
- yyterminate();
- } else {
- globfree(&include_stack[include_stack_index].globbuf);
- include_stack[include_stack_index].globbuf_pos = -1;
-
- yy_delete_buffer( YY_CURRENT_BUFFER, yyscanner );
- yy_switch_to_buffer(include_stack[include_stack_index].bufstate, yyscanner );
- my_lineno = include_stack[include_stack_index].lineno;
- my_col = include_stack[include_stack_index].colno;
- my_file = strdup(include_stack[include_stack_index].fname);
- }
- }
- }
-
-<*>.|\n { /* default rule */ ast_log(LOG_ERROR,"Unhandled char(s): %s\n", yytext); }
-
-%%
-
-static void pbcpush(char x)
-{
- pbcstack[pbcpos++] = x;
-}
-
-void ael_yyfree(void *ptr, yyscan_t yyscanner)
-{
- if (ptr)
- free( (char*) ptr );
-}
-
-static int pbcpop(char x)
-{
- if ( ( x == ')' && pbcstack[pbcpos-1] == '(' )
- || ( x == ']' && pbcstack[pbcpos-1] == '[' )
- || ( x == '}' && pbcstack[pbcpos-1] == '{' )) {
- pbcpos--;
- return 0;
- }
- return 1; /* error */
-}
-
-static void pbcpush2(char x)
-{
- pbcstack2[pbcpos2++] = x;
-}
-
-static int pbcpop2(char x)
-{
- if ( ( x == ')' && pbcstack2[pbcpos2-1] == '(' )
- || ( x == ']' && pbcstack2[pbcpos2-1] == '[' )
- || ( x == '}' && pbcstack2[pbcpos2-1] == '{' )) {
- pbcpos2--;
- return 0;
- }
- return 1; /* error */
-}
-
-static void pbcpush3(char x)
-{
- pbcstack3[pbcpos3++] = x;
-}
-
-static int pbcpop3(char x)
-{
- if ( ( x == ')' && pbcstack3[pbcpos3-1] == '(' )
- || ( x == ']' && pbcstack3[pbcpos3-1] == '[' )
- || ( x == '}' && pbcstack3[pbcpos3-1] == '{' )) {
- pbcpos3--;
- return 0;
- }
- return 1; /* error */
-}
-
-static int c_prevword(void)
-{
- char *c = prev_word;
- if (c == NULL)
- return 0;
- while ( *c ) {
- switch (*c) {
- case '{':
- case '[':
- case '(':
- pbcpush(*c);
- break;
- case '}':
- case ']':
- case ')':
- if (pbcpop(*c))
- return 1;
- break;
- }
- c++;
- }
- return 0;
-}
-
-
-/*
- * The following three functions, reset_*, are used in the bison
- * code to switch context. As a consequence, we need to
- * declare them global and add a prototype so that the
- * compiler does not complain.
- *
- * NOTE: yyg is declared because it is used in the BEGIN macros,
- * though that should be hidden as the macro changes
- * depending on the flex options that we use - in particular,
- * %reentrant changes the way the macro is declared;
- * without %reentrant, BEGIN uses yystart instead of yyg
- */
-
-void reset_parencount(yyscan_t yyscanner );
-void reset_parencount(yyscan_t yyscanner )
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- parencount = 0;
- pbcpos = 0;
- pbcpush('('); /* push '(' so the last pcbpop (parencount= -1) will succeed */
- c_prevword();
- BEGIN(paren);
-}
-
-void reset_semicount(yyscan_t yyscanner );
-void reset_semicount(yyscan_t yyscanner )
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- pbcpos = 0;
- BEGIN(semic);
-}
-
-void reset_argcount(yyscan_t yyscanner );
-void reset_argcount(yyscan_t yyscanner )
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- parencount = 0;
- pbcpos = 0;
- pbcpush('('); /* push '(' so the last pcbpop (parencount= -1) will succeed */
- c_prevword();
- BEGIN(argg);
-}
-
-/* used elsewhere, but some local vars */
-struct pval *ael2_parse(char *filename, int *errors)
-{
- struct pval *pval;
- struct parse_io *io;
- char *buffer;
- struct stat stats;
- FILE *fin;
-
- /* extern int ael_yydebug; */
-
- io = calloc(sizeof(struct parse_io),1);
- /* reset the global counters */
- prev_word = 0;
- my_lineno = 1;
- include_stack_index=0;
- my_col = 0;
- /* ael_yydebug = 1; */
- ael_yylex_init(&io->scanner);
- fin = fopen(filename,"r");
- if ( !fin ) {
- ast_log(LOG_ERROR,"File %s could not be opened\n", filename);
- *errors = 1;
- return 0;
- }
- if (my_file)
- free(my_file);
- my_file = strdup(filename);
- stat(filename, &stats);
- buffer = (char*)malloc(stats.st_size+2);
- if (fread(buffer, 1, stats.st_size, fin) != stats.st_size) {
- ast_log(LOG_ERROR, "fread() failed: %s\n", strerror(errno));
- }
- buffer[stats.st_size]=0;
- fclose(fin);
-
- ael_yy_scan_string (buffer ,io->scanner);
- ael_yyset_lineno(1 , io->scanner);
-
- /* ael_yyset_in (fin , io->scanner); OLD WAY */
-
- ael_yyparse(io);
-
-
- pval = io->pval;
- *errors = io->syntax_error_count;
-
- ael_yylex_destroy(io->scanner);
- free(buffer);
- free(io);
-
- return pval;
-}
-
-static void setup_filestack(char *fnamebuf2, int fnamebuf_siz, glob_t *globbuf, int globpos, yyscan_t yyscanner, int create)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- int error, i;
- FILE *in1;
- char fnamebuf[2048];
-
- if (globbuf && globbuf->gl_pathv && globbuf->gl_pathc > 0)
-#if defined(STANDALONE) || defined(LOW_MEMORY) || defined(STANDALONE_AEL)
- strncpy(fnamebuf, globbuf->gl_pathv[globpos], fnamebuf_siz);
-#else
- ast_copy_string(fnamebuf, globbuf->gl_pathv[globpos], fnamebuf_siz);
-#endif
- else {
- ast_log(LOG_ERROR,"Include file name not present!\n");
- return;
- }
- for (i=0; i<include_stack_index; i++) {
- if ( !strcmp(fnamebuf,include_stack[i].fname )) {
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Nice Try!!! But %s has already been included (perhaps by another file), and would cause an infinite loop of file inclusions!!! Include directive ignored\n",
- my_file, my_lineno, my_col, fnamebuf);
- break;
- }
- }
- error = 1;
- if (i == include_stack_index)
- error = 0; /* we can use this file */
- if ( !error ) { /* valid file name */
- /* relative vs. absolute */
- if (fnamebuf[0] != '/')
- snprintf(fnamebuf2, fnamebuf_siz, "%s/%s", ast_config_AST_CONFIG_DIR, fnamebuf);
- else
-#if defined(STANDALONE) || defined(LOW_MEMORY) || defined(STANDALONE_AEL)
- strncpy(fnamebuf2, fnamebuf, fnamebuf_siz);
-#else
- ast_copy_string(fnamebuf2, fnamebuf, fnamebuf_siz);
-#endif
- in1 = fopen( fnamebuf2, "r" );
-
- if ( ! in1 ) {
- ast_log(LOG_ERROR,"File=%s, line=%d, column=%d: Couldn't find the include file: %s; ignoring the Include directive!\n", my_file, my_lineno, my_col, fnamebuf2);
- } else {
- char *buffer;
- struct stat stats;
- stat(fnamebuf2, &stats);
- buffer = (char*)malloc(stats.st_size+1);
- if (fread(buffer, 1, stats.st_size, in1) != stats.st_size) {
- ast_log(LOG_ERROR, "fread() failed: %s\n", strerror(errno));
- }
- buffer[stats.st_size] = 0;
- ast_log(LOG_NOTICE," --Read in included file %s, %d chars\n",fnamebuf2, (int)stats.st_size);
- fclose(in1);
- if (include_stack[include_stack_index].fname) {
- free(include_stack[include_stack_index].fname);
- include_stack[include_stack_index].fname = 0;
- }
- include_stack[include_stack_index].fname = strdup(my_file);
- include_stack[include_stack_index].lineno = my_lineno;
- include_stack[include_stack_index].colno = my_col+yyleng;
- if (my_file)
- free(my_file);
- my_file = strdup(fnamebuf2);
- if (create)
- include_stack[include_stack_index].globbuf = *globbuf;
-
- include_stack[include_stack_index].globbuf_pos = 0;
-
- include_stack[include_stack_index].bufstate = YY_CURRENT_BUFFER;
- if (create)
- include_stack_index++;
- yy_switch_to_buffer(ael_yy_scan_string (buffer ,yyscanner),yyscanner);
- free(buffer);
- my_lineno = 1;
- my_col = 1;
- BEGIN(INITIAL);
- }
- }
-}