44 |
static void string_add_char(int n); |
static void string_add_char(int n); |
45 |
static void string_finish(); |
static void string_finish(); |
46 |
static int escape(int c); |
static int escape(int c); |
47 |
|
char * trimws(char *s); |
48 |
|
|
49 |
static struct string_list *str_head, *str_tail; |
static struct string_list *str_head, *str_tail; |
50 |
int cfg_line_num; |
int cfg_line_num; |
58 |
|
|
59 |
%} |
%} |
60 |
|
|
61 |
%x STR LIT RX |
%x STR LIT RX RXM |
62 |
|
|
63 |
WS [ \t][ \t]* |
WS [ \t][ \t]* |
64 |
IDENT [a-zA-Z_][a-zA-Z_0-9-]+ |
IDENT [a-zA-Z_][a-zA-Z_0-9-]+ |
92 |
[hH][eE][aA][dD][eE][rR] return T_HEADER; |
[hH][eE][aA][dD][eE][rR] return T_HEADER; |
93 |
[cC][oO][mM][mM][aA][nN][dD] return T_COMMAND; |
[cC][oO][mM][mM][aA][nN][dD] return T_COMMAND; |
94 |
/* Backward compatible (unquoted) regular expressions */ |
/* Backward compatible (unquoted) regular expressions */ |
95 |
!?=[^ \t][^!\n]*/\n {DBG("RX0", yytext); |
=[^ \t][^!\n]*/\n { yylval.string = trimws(strdup(yytext + 1)); |
96 |
yylval.string = strdup(yytext); |
DBG("RX0", yylval.string); |
97 |
|
return REGEX; } |
98 |
|
=[^ \t][^!\n]*!= { BEGIN(RXM); |
99 |
|
yylval.string = malloc(yyleng-2); |
100 |
|
memcpy(yylval.string, yytext + 1, yyleng-3); |
101 |
|
yylval.string[yyleng-3] = 0; |
102 |
|
trimws(yylval.string); |
103 |
|
DBG("RX1", yylval.string); |
104 |
|
return REGEX; } |
105 |
|
=[^ \t][^!\n]*! { BEGIN(RX); |
106 |
|
string_begin(); |
107 |
|
string_add(yytext+1, yyleng-1); } |
108 |
|
<RX>[^!\n]*!= { BEGIN(RXM); |
109 |
|
string_add(yytext, yyleng - 2); |
110 |
|
string_finish(); |
111 |
|
trimws(yylval.string); |
112 |
|
DBG("RX2", yylval.string); |
113 |
return REGEX; } |
return REGEX; } |
114 |
!?=[^ \t][^!\n]*/!= {DBG("RX1", yytext); |
<RX>[^!\n]*/\n { BEGIN(INITIAL); |
115 |
|
string_add(yytext, yyleng); |
116 |
|
string_finish(); |
117 |
|
trimws(yylval.string); |
118 |
|
DBG("RX2", yylval.string); |
119 |
|
return REGEX; } |
120 |
|
<RX>[^!\n]*! { string_add(yytext, yyleng); } |
121 |
|
<RXM>[^!\n]*/\n { BEGIN(INITIAL); |
122 |
yylval.string = strdup(yytext); |
yylval.string = strdup(yytext); |
123 |
|
trimws(yylval.string); |
124 |
|
DBG("RX3", yylval.string); |
125 |
return REGEX; } |
return REGEX; } |
126 |
!?=[^ \t][^!\n]*! { BEGIN(RX); |
<RXM>[^!\n]*! { BEGIN(RX); |
127 |
string_begin(); |
string_begin(); |
128 |
string_add(yytext, yyleng); } |
string_add(yytext, yyleng); } |
|
<RX>[^!\n]*/!= { BEGIN(INITIAL); |
|
|
string_add(yytext, yyleng); |
|
|
string_finish(); |
|
|
DBG("RX2", yylval.string); |
|
|
return REGEX; } |
|
|
<RX>[^!\n]*/\n { BEGIN(INITIAL); |
|
|
string_add(yytext, yyleng); |
|
|
string_finish(); |
|
|
DBG("RX2", yylval.string); |
|
|
return REGEX; } |
|
|
<RX>[^!\n]*! { string_add(yytext, yyleng); } |
|
129 |
= return EQ; |
= return EQ; |
130 |
!= return NE; |
!= return NE; |
131 |
[iI][fF] return IF; |
[iI][fF] return IF; |
267 |
return c; |
return c; |
268 |
} |
} |
269 |
|
|
270 |
|
char * |
271 |
|
trimws(char *s) |
272 |
|
{ |
273 |
|
int len; |
274 |
|
|
275 |
|
for (len = strlen(s) - 1; len > 0 && isspace(s[len]); len--) |
276 |
|
; |
277 |
|
if (len > 0) |
278 |
|
s[len+1] = 0; |
279 |
|
return s; |
280 |
|
} |
281 |
|
|
282 |
int |
int |
283 |
rc_open(char *name) |
rc_open(char *name) |
284 |
{ |
{ |