lexer.l (6402B)
1 %{ 2 #include "crossroads.h" 3 #include "parser.h" 4 5 /* Required by flex */ 6 static int yywrap () { 7 return (1); 8 } 9 10 /* Lexer debugging related */ 11 // #define LEXER_DEBUG 12 #ifdef LEXER_DEBUG 13 static void lmsg (char const *x) { 14 printf ("L: %s\n", x); 15 } 16 static void llmsg (char const *x, char const *y) { 17 printf ("L: %s %s\n", x, y); 18 } 19 #else 20 # define lmsg(x) 21 # define llmsg(x,y) 22 #endif 23 %} 24 25 %x stringstate commentstate 26 27 %% 28 29 #.*\n { 30 lmsg ("comment"); 31 yylineno++; 32 } 33 34 \/\/.*\n { 35 lmsg ("comment"); 36 yylineno++; 37 } 38 39 service { 40 lmsg ("service"); 41 return (SERVICE); 42 } 43 44 bindto { 45 lmsg ("bindto"); 46 BEGIN (stringstate); 47 free (laststring); 48 laststring = 0; 49 return (BINDTO); 50 } 51 52 port { 53 lmsg ("port"); 54 return (PORT); 55 } 56 57 over { 58 lmsg ("over"); 59 return (OVER); 60 } 61 62 shmkey { 63 lmsg ("shmkey"); 64 return (SHMKEY); 65 } 66 67 backend { 68 lmsg ("backend"); 69 return (BACKEND); 70 } 71 72 backlog { 73 lmsg ("backlog"); 74 return (BACKLOG); 75 } 76 77 (verbosity)|(verbose) { 78 lmsg ("verbosity"); 79 return (VERBOSITY); 80 } 81 82 connectiontimeout { 83 lmsg ("connectiontimeout"); 84 return (CONNECTIONTIMEOUT); 85 } 86 87 maxconnections { 88 lmsg ("maxconnections"); 89 return (MAXCONNECTIONS); 90 } 91 92 weight { 93 lmsg ("weight"); 94 return (WEIGHT); 95 } 96 97 decay { 98 lmsg ("decay"); 99 return (DECAY); 100 } 101 102 server { 103 lmsg ("server"); 104 BEGIN (stringstate); 105 free (laststring); 106 laststring = 0; 107 return (SERVER); 108 } 109 110 dispatchmode { 111 lmsg ("dispatchmode"); 112 return (DISPATCHMODE); 113 } 114 115 roundrobin { 116 lmsg ("roundrobin"); 117 return (ROUNDROBIN); 118 } 119 120 random { 121 lmsg ("random"); 122 return (RANDOM); 123 } 124 125 byduration { 126 lmsg ("byduration"); 127 return (BYDURATION); 128 } 129 130 bysize { 131 lmsg ("bysize"); 132 return (BYSIZE); 133 } 134 135 byorder { 136 lmsg ("byorder"); 137 return (BYORDER); 138 } 139 140 byconnections { 141 lmsg ("byconnections"); 142 return (BYCONNECTIONS); 143 } 144 145 externalhandler { 146 lmsg ("externalhandler"); 147 BEGIN (stringstate); 148 free (laststring); 149 laststring = 0; 150 return (EXTERNALHANDLER); 151 } 152 153 useraccount { 154 lmsg ("useraccount"); 155 BEGIN (stringstate); 156 free (laststring); 157 laststring = 0; 158 return (USERACCOUNT); 159 } 160 161 revivinginterval { 162 lmsg ("revivinginterval"); 163 return (REVIVINGINTERVAL); 164 } 165 166 type { 167 lmsg ("type"); 168 return (TYPE); 169 } 170 171 any { 172 lmsg ("any"); 173 return (ANY); 174 } 175 176 stickyhttp { 177 lmsg ("stickyhttp"); 178 warning ("The 'stickyhttp protocol is obsolte.\n" 179 "You should change to 'http'."); 180 return (HTTP); 181 } 182 183 http { 184 lmsg ("http"); 185 return (HTTP); 186 } 187 188 throughputlog { 189 lmsg ("throughputlog"); 190 BEGIN (stringstate); 191 free (laststring); 192 laststring = 0; 193 return (THROUGHPUTLOG); 194 } 195 196 trafficlog { 197 lmsg ("trafficlog"); 198 BEGIN (stringstate); 199 free (laststring); 200 laststring = 0; 201 return (TRAFFICLOG); 202 } 203 204 dumptraffic { 205 lmsg ("dumptraffic"); 206 warning ("The 'dumptraffic' statement is obsolete.\n" 207 "You should change to 'trafficlog'."); 208 BEGIN (stringstate); 209 free (laststring); 210 laststring = 0; 211 return (TRAFFICLOG); 212 } 213 214 onstart { 215 lmsg ("onstart"); 216 BEGIN (stringstate); 217 free (laststring); 218 laststring = 0; 219 return (ONSTART); 220 } 221 222 onfail { 223 lmsg ("onfail"); 224 BEGIN (stringstate); 225 free (laststring); 226 laststring = 0; 227 return (ONFAIL); 228 } 229 230 onend { 231 lmsg ("onend"); 232 BEGIN (stringstate); 233 free (laststring); 234 laststring = 0; 235 return (ONEND); 236 } 237 238 stickycookie { 239 lmsg ("stickycookie"); 240 BEGIN (stringstate); 241 free (laststring); 242 laststring = 0; 243 return (STICKYCOOKIE); 244 } 245 246 addclientheader { 247 lmsg ("addclientheader"); 248 BEGIN (stringstate); 249 free (laststring); 250 laststring = 0; 251 return (ADDCLIENTHEADER); 252 } 253 254 setclientheader { 255 lmsg ("setclientheader"); 256 BEGIN (stringstate); 257 free (laststring); 258 laststring = 0; 259 return (SETCLIENTHEADER); 260 } 261 262 appendclientheader { 263 lmsg ("appendclientheader"); 264 BEGIN (stringstate); 265 free (laststring); 266 laststring = 0; 267 return (APPENDCLIENTHEADER); 268 } 269 270 addserverheader { 271 lmsg ("addserverheader"); 272 BEGIN (stringstate); 273 free (laststring); 274 laststring = 0; 275 return (ADDSERVERHEADER); 276 } 277 278 setserverheader { 279 lmsg ("setserverheader"); 280 BEGIN (stringstate); 281 free (laststring); 282 laststring = 0; 283 return (SETSERVERHEADER); 284 } 285 286 appendserverheader { 287 lmsg ("appendserverheader"); 288 BEGIN (stringstate); 289 free (laststring); 290 laststring = 0; 291 return (APPENDSERVERHEADER); 292 } 293 294 allowfrom { 295 lmsg ("allowfrom"); 296 BEGIN (stringstate); 297 free (laststring); 298 laststring = 0; 299 return (ALLOWFROM); 300 } 301 302 denyfrom { 303 lmsg ("denyfrom"); 304 BEGIN (stringstate); 305 free (laststring); 306 laststring = 0; 307 return (DENYFROM); 308 } 309 310 allowfile { 311 lmsg ("allowfile"); 312 BEGIN (stringstate); 313 free (laststring); 314 laststring = 0; 315 return (ALLOWFILE); 316 } 317 318 denyfile { 319 lmsg ("denyfile"); 320 BEGIN (stringstate); 321 free (laststring); 322 laststring = 0; 323 return (DENYFILE); 324 } 325 326 on|true|yes { 327 lmsg ("on"); 328 return (ON); 329 } 330 331 off|false|no { 332 lmsg ("off"); 333 return (OFF); 334 } 335 336 [a-zA-Z_][a-zA-Z0-9_]* { 337 llmsg ("identifier", yytext); 338 return (IDENTIFIER); 339 } 340 341 [0-9]+ { 342 llmsg ("number", yytext); 343 return (NUMBER); 344 } 345 346 [ \t]+ { 347 lmsg ("space(s)"); 348 } 349 350 \n { 351 lmsg ("newline"); 352 yylineno++; 353 } 354 355 . { 356 llmsg ("lone char", yytext); 357 return (*yytext); 358 } 359 360 \/\* { 361 lmsg ("C-comment starts"); 362 BEGIN(commentstate); 363 } 364 <commentstate>\*\/ { 365 lmsg ("C-comment ends"); 366 BEGIN(0); 367 } 368 <commentstate>\n { 369 yylineno++; 370 } 371 <commentstate>. ; 372 373 <stringstate>\"[^\"]*\" { 374 llmsg ("string part", yytext); 375 laststring = xstrcat (laststring, yytext + 1); 376 laststring[strlen(laststring) - 1] = 0; 377 } 378 <stringstate>\'[^\']*\' { 379 llmsg ("string part", yytext); 380 laststring = xstrcat (laststring, yytext + 1); 381 laststring[strlen(laststring) - 1] = 0; 382 } 383 <stringstate>; { 384 BEGIN (0); 385 unput (';'); 386 llmsg ("string", laststring); 387 return (STRING); 388 } 389 <stringstate>" " { 390 if (laststring) { 391 laststring = xstrcat (laststring, yytext); 392 llmsg ("string part", yytext); 393 } 394 } 395 <stringstate>. { 396 llmsg ("string part", yytext); 397 laststring = xstrcat (laststring, yytext); 398 } 399 <stringstate>\n { 400 if (laststring) { 401 laststring = xstrcat (laststring, " "); 402 lmsg ("string part: newline, now space"); 403 } 404 yylineno++; 405 }