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\n" );
51 if (strlen(yytext) <= 2) {
52 fprintf( stderr, "Empty include directive\n" );
56 yytext[strlen(yytext)-2]=0;
58 include_stack[include_stack_ptr]=YY_CURRENT_BUFFER;
59 include_stack_name[include_stack_ptr]=current_filename=strdup(yytext+1);
60 include_stack_ln[include_stack_ptr++]=linenumber;
63 if(*(yytext+1)=='/') {
64 if (strlen(yytext+1) >= sizeof(filename)) {
65 fprintf( stderr, "Filename '%s' is too long\n",yytext+1);
68 strcpy(filename,yytext+1);
71 size_t bind_directory_len = strlen(bind_directory);
72 if (bind_directory_len >= sizeof(filename) ||
73 strlen(yytext+1) + 2 >= sizeof(filename) - bind_directory_len) {
74 fprintf( stderr, "Filename '%s' is too long\n",yytext+1);
77 strcpy(filename,bind_directory);
79 strcat(filename,yytext+1);
81 filename[sizeof(filename)-1]='\0';
83 if (!(yyin=fopen(filename,"r"))) {
84 fprintf( stderr, "Unable to open '%s': %s\n",filename,strerror(errno));
89 yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
95 if ( --include_stack_ptr < 0 )
103 yy_delete_buffer(YY_CURRENT_BUFFER);
104 yy_switch_to_buffer(include_stack[include_stack_ptr]);
105 linenumber=include_stack_ln[include_stack_ptr];
106 free(include_stack_name[include_stack_ptr]);
107 if(include_stack_ptr)
108 current_filename=include_stack_name[include_stack_ptr-1];
110 current_filename=original_filename;
120 options return OPTIONSTOK;
121 also-notify return ALSONOTIFYTOK;
123 logging return LOGGINGTOK;
124 directory return DIRECTORYTOK;
125 masters return MASTERTOK;
127 \" yy_push_state(quoted);
128 <quoted>[^\"]* yylval=strdup(yytext); return QUOTEDWORD;
129 <quoted>\" yy_pop_state();
130 [^\" \t\n{};]* yylval=strdup(yytext);return AWORD;