[asterisk-commits] murf: branch 1.4 r84133 - in /branches/1.4/pbx/ael: ael.flex ael_lex.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Sep 29 16:47:54 CDT 2007


Author: murf
Date: Sat Sep 29 16:47:53 2007
New Revision: 84133

URL: http://svn.digium.com/view/asterisk?view=rev&rev=84133
Log:
This issue sort of closes 10786; All config files support #include with globbing (you know, *,[chars],?,{list,list},etc), so I've updated the AEL system to support this also.

Modified:
    branches/1.4/pbx/ael/ael.flex
    branches/1.4/pbx/ael/ael_lex.c

Modified: branches/1.4/pbx/ael/ael.flex
URL: http://svn.digium.com/view/asterisk/branches/1.4/pbx/ael/ael.flex?view=diff&rev=84133&r1=84132&r2=84133
==============================================================================
--- branches/1.4/pbx/ael/ael.flex (original)
+++ branches/1.4/pbx/ael/ael.flex Sat Sep 29 16:47:53 2007
@@ -62,6 +62,11 @@
 #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"
@@ -107,11 +112,14 @@
 	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
@@ -382,9 +390,12 @@
 	}
 
 \#include[ \t]+\"[^\"]+\" {
-		FILE *in1;
 		char fnamebuf[1024],*p1,*p2;
-		int error = 1;	/* don't use the file if set */
+		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 ) {
@@ -392,68 +403,64 @@
 		} 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 {
-			int i;
-			strncpy(fnamebuf, p1, p2-p1);
-			fnamebuf[p2-p1] = 0;
-			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;
+			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) {
+			free(my_file);
+			my_file = 0;
+			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 ( --include_stack_index < 0 ) {
+				yyterminate();
+			} else {
+				if (my_file) {
+					free(my_file);
+					my_file = 0;
 				}
+				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);
 			}
-			if (i == include_stack_index)
-				error = 0;	/* we can use this file */
-		}
-		if ( !error ) {	/* valid file name */
-			*p2 = 0;
-			/* relative vs. absolute */
-			if (*(p1+1) != '/')
-				snprintf(fnamebuf, sizeof(fnamebuf), "%s/%s", ast_config_AST_CONFIG_DIR, p1 + 1);
-			else
-#if defined(STANDALONE) || defined(LOW_MEMORY) || defined(STANDALONE_AEL)
-				strncpy(fnamebuf, p1 + 1, sizeof(fnamebuf) - 1);
-#else
-				ast_copy_string(fnamebuf, p1 + 1, sizeof(fnamebuf));
-#endif
-			in1 = fopen( fnamebuf, "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, fnamebuf);
-			} else {
-				char *buffer;
-				struct stat stats;
-				stat(fnamebuf, &stats);
-				buffer = (char*)malloc(stats.st_size+1);
-				fread(buffer, 1, stats.st_size, in1);
-				buffer[stats.st_size] = 0;
-				ast_log(LOG_NOTICE,"  --Read in included file %s, %d chars\n",fnamebuf, (int)stats.st_size);
-				fclose(in1);
-
-				include_stack[include_stack_index].fname = my_file;
-				my_file = strdup(fnamebuf);
-				include_stack[include_stack_index].lineno = my_lineno;
-				include_stack[include_stack_index].colno = my_col+yyleng;
-				include_stack[include_stack_index++].bufstate = YY_CURRENT_BUFFER;
-
-				yy_switch_to_buffer(ael_yy_scan_string (buffer ,yyscanner),yyscanner);
-				free(buffer);
-				my_lineno = 1;
-				my_col = 1;
-				BEGIN(INITIAL);
-			}
-		}
-	}
-
-<<EOF>>		{
-		if ( --include_stack_index < 0 ) {
-			yyterminate();
-		} else {
-			free(my_file);
-			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   = include_stack[include_stack_index].fname;
 		}
 	}
 
@@ -568,6 +575,8 @@
 		*errors = 1;
 		return 0;
 	}
+	if (my_file)
+		free(my_file);
 	my_file = strdup(filename);
 	stat(filename, &stats);
 	buffer = (char*)malloc(stats.st_size+2);
@@ -592,3 +601,76 @@
 
 	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);
+			fread(buffer, 1, stats.st_size, in1);
+			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 (my_file)
+				free(my_file);
+			my_file = strdup(fnamebuf2);
+			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 (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);
+		}
+	}
+}

Modified: branches/1.4/pbx/ael/ael_lex.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/pbx/ael/ael_lex.c?view=diff&rev=84133&r1=84132&r2=84133
==============================================================================
--- branches/1.4/pbx/ael/ael_lex.c (original)
+++ branches/1.4/pbx/ael/ael_lex.c Sat Sep 29 16:47:53 2007
@@ -782,6 +782,11 @@
 #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"
@@ -827,11 +832,14 @@
 	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
@@ -881,7 +889,7 @@
 #define	STORE_POS
 #define	STORE_LOC
 #endif
-#line 884 "ael_lex.c"
+#line 892 "ael_lex.c"
 
 #define INITIAL 0
 #define paren 1
@@ -889,11 +897,13 @@
 #define argg 3
 #define comment 4
 
+#ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
  * down here because we want the user's section 1 to have been scanned first.
  * The user has a chance to override it with an option.
  */
 #include <unistd.h>
+#endif
 
 #ifndef YY_EXTRA_TYPE
 #define YY_EXTRA_TYPE void *
@@ -936,6 +946,8 @@
     YYLTYPE * yylloc_r;
 
     }; /* end struct yyguts_t */
+
+static int yy_init_globals (yyscan_t yyscanner );
 
     /* This must go here because YYSTYPE and YYLTYPE are included
      * from bison output in section 1.*/
@@ -1087,9 +1099,11 @@
 #ifndef YY_DECL
 #define YY_DECL_IS_OURS 1
 
-extern int ael_yylex (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);
-
-#define YY_DECL int ael_yylex (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
+extern int ael_yylex \
+               (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);
+
+#define YY_DECL int ael_yylex \
+               (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
 #endif /* !YY_DECL */
 
 /* Code executed at the beginning of each rule, after yytext and yyleng
@@ -1116,10 +1130,10 @@
 	register int yy_act;
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
-#line 173 "ael.flex"
-
-
-#line 1122 "ael_lex.c"
+#line 181 "ael.flex"
+
+
+#line 1136 "ael_lex.c"
 
     yylval = yylval_param;
 
@@ -1210,250 +1224,250 @@
 
 case 1:
 YY_RULE_SETUP
-#line 175 "ael.flex"
+#line 183 "ael.flex"
 { STORE_POS; return LC;}
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 176 "ael.flex"
+#line 184 "ael.flex"
 { STORE_POS; return RC;}
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 177 "ael.flex"
+#line 185 "ael.flex"
 { STORE_POS; return LP;}
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 178 "ael.flex"
+#line 186 "ael.flex"
 { STORE_POS; return RP;}
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 179 "ael.flex"
+#line 187 "ael.flex"
 { STORE_POS; return SEMI;}
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 180 "ael.flex"
+#line 188 "ael.flex"
 { STORE_POS; return EQ;}
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 181 "ael.flex"
+#line 189 "ael.flex"
 { STORE_POS; return COMMA;}
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 182 "ael.flex"
+#line 190 "ael.flex"
 { STORE_POS; return COLON;}
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 183 "ael.flex"
+#line 191 "ael.flex"
 { STORE_POS; return AMPER;}
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 184 "ael.flex"
+#line 192 "ael.flex"
 { STORE_POS; return BAR;}
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 185 "ael.flex"
+#line 193 "ael.flex"
 { STORE_POS; return EXTENMARK;}
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 186 "ael.flex"
+#line 194 "ael.flex"
 { STORE_POS; return AT;}
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 187 "ael.flex"
+#line 195 "ael.flex"
 {/*comment*/}
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 188 "ael.flex"
+#line 196 "ael.flex"
 { STORE_POS; return KW_CONTEXT;}
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 189 "ael.flex"
+#line 197 "ael.flex"
 { STORE_POS; return KW_ABSTRACT;}
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 190 "ael.flex"
+#line 198 "ael.flex"
 { STORE_POS; return KW_MACRO;};
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 191 "ael.flex"
+#line 199 "ael.flex"
 { STORE_POS; return KW_GLOBALS;}
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 192 "ael.flex"
+#line 200 "ael.flex"
 { STORE_POS; return KW_IGNOREPAT;}
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 193 "ael.flex"
+#line 201 "ael.flex"
 { STORE_POS; return KW_SWITCH;}
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 194 "ael.flex"
+#line 202 "ael.flex"
 { STORE_POS; return KW_IF;}
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 195 "ael.flex"
+#line 203 "ael.flex"
 { STORE_POS; return KW_IFTIME;}
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 196 "ael.flex"
+#line 204 "ael.flex"
 { STORE_POS; return KW_RANDOM;}
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 197 "ael.flex"
+#line 205 "ael.flex"
 { STORE_POS; return KW_REGEXTEN;}
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 198 "ael.flex"
+#line 206 "ael.flex"
 { STORE_POS; return KW_HINT;}
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 199 "ael.flex"
+#line 207 "ael.flex"
 { STORE_POS; return KW_ELSE;}
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 200 "ael.flex"
+#line 208 "ael.flex"
 { STORE_POS; return KW_GOTO;}
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 201 "ael.flex"
+#line 209 "ael.flex"
 { STORE_POS; return KW_JUMP;}
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 202 "ael.flex"
+#line 210 "ael.flex"
 { STORE_POS; return KW_RETURN;}
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 203 "ael.flex"
+#line 211 "ael.flex"
 { STORE_POS; return KW_BREAK;}
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 204 "ael.flex"
+#line 212 "ael.flex"
 { STORE_POS; return KW_CONTINUE;}
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 205 "ael.flex"
+#line 213 "ael.flex"
 { STORE_POS; return KW_FOR;}
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 206 "ael.flex"
+#line 214 "ael.flex"
 { STORE_POS; return KW_WHILE;}
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 207 "ael.flex"
+#line 215 "ael.flex"
 { STORE_POS; return KW_CASE;}
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 208 "ael.flex"
+#line 216 "ael.flex"
 { STORE_POS; return KW_DEFAULT;}
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 209 "ael.flex"
+#line 217 "ael.flex"
 { STORE_POS; return KW_PATTERN;}
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 210 "ael.flex"
+#line 218 "ael.flex"
 { STORE_POS; return KW_CATCH;}
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 211 "ael.flex"
+#line 219 "ael.flex"
 { STORE_POS; return KW_SWITCHES;}
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 212 "ael.flex"
+#line 220 "ael.flex"
 { STORE_POS; return KW_ESWITCHES;}
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 213 "ael.flex"
+#line 221 "ael.flex"
 { STORE_POS; return KW_INCLUDES;}
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 214 "ael.flex"
+#line 222 "ael.flex"
 { BEGIN(comment); my_col += 2; }
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 216 "ael.flex"
+#line 224 "ael.flex"
 { my_col += yyleng; }
 	YY_BREAK
 case 42:
 /* rule 42 can match eol */
 YY_RULE_SETUP
-#line 217 "ael.flex"
+#line 225 "ael.flex"
 { ++my_lineno; my_col=1;}
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 218 "ael.flex"
+#line 226 "ael.flex"
 { my_col += yyleng; }
 	YY_BREAK
 case 44:
 /* rule 44 can match eol */
 YY_RULE_SETUP
-#line 219 "ael.flex"
+#line 227 "ael.flex"
 { ++my_lineno; my_col=1;}
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 220 "ael.flex"
+#line 228 "ael.flex"
 { my_col += 2; BEGIN(INITIAL); }
 	YY_BREAK
 case 46:
 /* rule 46 can match eol */
 YY_RULE_SETUP
-#line 222 "ael.flex"
+#line 230 "ael.flex"
 { my_lineno++; my_col = 1; }
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 223 "ael.flex"
+#line 231 "ael.flex"
 { my_col += yyleng; }
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 224 "ael.flex"
+#line 232 "ael.flex"
 { my_col += (yyleng*8)-(my_col%8); }
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 226 "ael.flex"
+#line 234 "ael.flex"
 {
 		STORE_POS;
 		yylval->str = strdup(yytext);
@@ -1471,7 +1485,7 @@
 case 50:
 /* rule 50 can match eol */
 YY_RULE_SETUP
-#line 242 "ael.flex"
+#line 250 "ael.flex"
 {
 		if ( pbcpop(')') ) {	/* error */
 			STORE_LOC;
@@ -1497,7 +1511,7 @@
 case 51:
 /* rule 51 can match eol */
 YY_RULE_SETUP
-#line 264 "ael.flex"
+#line 272 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if (c == '(')
@@ -1509,7 +1523,7 @@
 case 52:
 /* rule 52 can match eol */
 YY_RULE_SETUP
-#line 272 "ael.flex"
+#line 280 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if ( pbcpop(c))  { /* error */
@@ -1534,7 +1548,7 @@
 case 53:
 /* rule 53 can match eol */
 YY_RULE_SETUP
-#line 294 "ael.flex"
+#line 302 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if (c == '(')
@@ -1546,7 +1560,7 @@
 case 54:
 /* rule 54 can match eol */
 YY_RULE_SETUP
-#line 302 "ael.flex"
+#line 310 "ael.flex"
 {
 		if ( pbcpop(')') ) { /* error */
 			STORE_LOC;
@@ -1574,7 +1588,7 @@
 case 55:
 /* rule 55 can match eol */
 YY_RULE_SETUP
-#line 326 "ael.flex"
+#line 334 "ael.flex"
 {
 		if( parencount != 0) { /* printf("Folding in a comma!\n"); */
 			yymore();
@@ -1592,7 +1606,7 @@
 case 56:
 /* rule 56 can match eol */
 YY_RULE_SETUP
-#line 340 "ael.flex"
+#line 348 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if ( pbcpop(c) ) { /* error */
@@ -1613,7 +1627,7 @@
 case 57:
 /* rule 57 can match eol */
 YY_RULE_SETUP
-#line 357 "ael.flex"
+#line 365 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		yymore();
@@ -1623,7 +1637,7 @@
 case 58:
 /* rule 58 can match eol */
 YY_RULE_SETUP
-#line 363 "ael.flex"
+#line 371 "ael.flex"
 {
 		char c = yytext[yyleng-1];
 		if ( pbcpop(c) ) { /* error */
@@ -1639,7 +1653,7 @@
 case 59:
 /* rule 59 can match eol */
 YY_RULE_SETUP
-#line 375 "ael.flex"
+#line 383 "ael.flex"
 {
 		STORE_LOC;
 		yylval->str = strdup(yytext);
@@ -1652,11 +1666,14 @@
 case 60:
 /* rule 60 can match eol */
 YY_RULE_SETUP
-#line 384 "ael.flex"
-{
-		FILE *in1;
+#line 392 "ael.flex"
+{
 		char fnamebuf[1024],*p1,*p2;
-		int error = 1;	/* don't use the file if set */
+		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 ) {
@@ -1664,55 +1681,29 @@
 		} 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 {
-			int i;
-			strncpy(fnamebuf, p1, p2-p1);
-			fnamebuf[p2-p1] = 0;
-			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;
-				}
+			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 (i == include_stack_index)
-				error = 0;	/* we can use this file */
 		}
-		if ( !error ) {	/* valid file name */
-			*p2 = 0;
-			/* relative vs. absolute */
-			if (*(p1+1) != '/')
-				snprintf(fnamebuf, sizeof(fnamebuf), "%s/%s", ast_config_AST_CONFIG_DIR, p1 + 1);
-			else
-#if defined(STANDALONE) || defined(LOW_MEMORY) || defined(STANDALONE_AEL)
-				strncpy(fnamebuf, p1 + 1, sizeof(fnamebuf) - 1);
-#else
-				ast_copy_string(fnamebuf, p1 + 1, sizeof(fnamebuf));
-#endif
-			in1 = fopen( fnamebuf, "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, fnamebuf);
-			} else {
-				char *buffer;
-				struct stat stats;
-				stat(fnamebuf, &stats);
-				buffer = (char*)malloc(stats.st_size+1);
-				fread(buffer, 1, stats.st_size, in1);
-				buffer[stats.st_size] = 0;
-				ast_log(LOG_NOTICE,"  --Read in included file %s, %d chars\n",fnamebuf, (int)stats.st_size);
-				fclose(in1);
-
-				include_stack[include_stack_index].fname = my_file;
-				my_file = strdup(fnamebuf);
-				include_stack[include_stack_index].lineno = my_lineno;
-				include_stack[include_stack_index].colno = my_col+yyleng;
-				include_stack[include_stack_index++].bufstate = YY_CURRENT_BUFFER;
-
-				ael_yy_switch_to_buffer(ael_yy_scan_string (buffer ,yyscanner),yyscanner);
-				free(buffer);
-				my_lineno = 1;
-				my_col = 1;
-				BEGIN(INITIAL);
-			}
+		if (globbuf_pos > -1) {
+			setup_filestack(fnamebuf, sizeof(fnamebuf), &globbuf, 0, yyscanner, 1);
 		}
 	}
 	YY_BREAK
@@ -1721,26 +1712,47 @@
 case YY_STATE_EOF(semic):
 case YY_STATE_EOF(argg):
 case YY_STATE_EOF(comment):
-#line 447 "ael.flex"
-{
-		if ( --include_stack_index < 0 ) {
-			yyterminate();
+#line 433 "ael.flex"
+{
+		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) {
+			free(my_file);
+			my_file = 0;
+			ael_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 {
-			free(my_file);
-			ael_yy_delete_buffer(YY_CURRENT_BUFFER,yyscanner );
-			ael_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   = include_stack[include_stack_index].fname;
+			if (include_stack[include_stack_index].fname) {
+				free(include_stack[include_stack_index].fname);
+				include_stack[include_stack_index].fname = 0;
+			}
+			if ( --include_stack_index < 0 ) {
+				yyterminate();
+			} else {
+				if (my_file) {
+					free(my_file);
+					my_file = 0;
+				}
+				globfree(&include_stack[include_stack_index].globbuf);
+				include_stack[include_stack_index].globbuf_pos = -1;
+				
+				ael_yy_delete_buffer(YY_CURRENT_BUFFER,yyscanner );
+				ael_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);
+			}
 		}
 	}
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 460 "ael.flex"
+#line 467 "ael.flex"
 ECHO;
 	YY_BREAK
-#line 1743 "ael_lex.c"
+#line 1755 "ael_lex.c"
 
 	case YY_END_OF_BUFFER:
 		{
@@ -1926,7 +1938,7 @@
 
 	else
 		{
-			size_t num_to_read =
+			int num_to_read =
 			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
 		while ( num_to_read <= 0 )
@@ -2491,10 +2503,10 @@
  * @note If you want to scan bytes that may contain NUL values, then use
  *       ael_yy_scan_bytes() instead.
  */
-YY_BUFFER_STATE ael_yy_scan_string (yyconst char * str , yyscan_t yyscanner)
+YY_BUFFER_STATE ael_yy_scan_string (yyconst char * yy_str , yyscan_t yyscanner)
 {
     
-	return ael_yy_scan_bytes(str,strlen(str) ,yyscanner);
+	return ael_yy_scan_bytes(yy_str,strlen(yy_str) ,yyscanner);
 }
 
 /** Setup the input buffer state to scan the given bytes. The next call to ael_yylex() will
@@ -2876,7 +2888,7 @@
 #undef YY_DECL_IS_OURS
 #undef YY_DECL
 #endif
-#line 460 "ael.flex"
+#line 467 "ael.flex"
 
 
 
@@ -2989,6 +3001,8 @@
 		*errors = 1;
 		return 0;
 	}
+	if (my_file)
+		free(my_file);
 	my_file = strdup(filename);
 	stat(filename, &stats);
 	buffer = (char*)malloc(stats.st_size+2);
@@ -3014,3 +3028,76 @@
 	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);
+			fread(buffer, 1, stats.st_size, in1);
+			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 (my_file)
+				free(my_file);
+			my_file = strdup(fnamebuf2);
+			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 (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++;
+			ael_yy_switch_to_buffer(ael_yy_scan_string (buffer ,yyscanner),yyscanner);
+			free(buffer);
+			my_lineno = 1;
+			my_col = 1;
+			BEGIN(INITIAL);
+		}
+	}
+}
+




More information about the asterisk-commits mailing list