10 #include "bindparser.h"
13 #define MAX_INCLUDE_DEPTH 10
14 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
15 int include_stack_ln[MAX_INCLUDE_DEPTH];
16 char *include_stack_name[MAX_INCLUDE_DEPTH];
17 char *current_filename;
18 char *original_filename;
19 int include_stack_ptr = 0;
20 extern const char *bind_directory;
29 %option noyy_top_state
36 <comment>[^*\n]* /* eat anything that's not a '*' */
37 <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
38 <comment>\n ++linenumber;
39 <comment>"*"+"/" BEGIN(INITIAL);
42 <incl>[ \t;]* /* eat the whitespace */
43 <incl>\"[^ \t\n";]+\"; { /* got the include file name */
45 if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
47 fprintf( stderr, "Includes nested too deeply" );
51 yytext[strlen(yytext)-2]=0;
53 include_stack[include_stack_ptr]=YY_CURRENT_BUFFER;
54 include_stack_name[include_stack_ptr]=current_filename=strdup(yytext+1);
55 include_stack_ln[include_stack_ptr++]=linenumber;
58 strcpy(filename,yytext+1);
60 strcpy(filename,bind_directory);
62 strcat(filename,yytext+1);
65 if (*yytext &&!(yyin=fopen(filename,"r"))) {
66 fprintf( stderr, "Unable to open '%s': %s\n",filename,strerror(errno));
71 yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
77 if ( --include_stack_ptr < 0 )
85 yy_delete_buffer(YY_CURRENT_BUFFER);
86 yy_switch_to_buffer(include_stack[include_stack_ptr]);
87 linenumber=include_stack_ln[include_stack_ptr];
88 free(include_stack_name[include_stack_ptr]);
90 current_filename=include_stack_name[include_stack_ptr-1];
92 current_filename=original_filename;
102 options return OPTIONSTOK;
103 also-notify return ALSONOTIFYTOK;
105 logging return LOGGINGTOK;
106 directory return DIRECTORYTOK;
107 masters return MASTERTOK;
109 \" yy_push_state(quoted);
110 <quoted>[^\"]* yylval=strdup(yytext); return QUOTEDWORD;
111 <quoted>\" yy_pop_state();
112 [^\" \t\n{};]* yylval=strdup(yytext);return AWORD;
121 fprintf(stderr,"Parsing '%s': unable to parse line %d at character '%s'\n",current_filename, linenumber, yytext);