%{ #include #include #include #include #include #include #include /* Some distributions can't use the output from flex without help */ #ifndef ECHO # define ECHO if(fwrite( yytext, yyleng, 1, yyout )) #endif int _line_count = 1; static void _unescape(char *val) { size_t x,y; int e = 0; y = strlen(val); for (x = 0; x < y; x++) { if (e == 1) { if (val[x] == '"') { memmove(&val[x-1], &val[x], y-x); --y; --x; } e = 0; } if (val[x] == '\\') { e = 1; } } val[y] = 0; } %} %% "\\\n" { ++_line_count; } [\n] { ++_line_count; return T_ENDL; } [ \t]* {} \#[^\n]* {} ^"device" { return T_DEVICE; } ^"options" { return T_OPTIONS; } ^"priority" { return T_PRIO; } ^"ports" { return T_PORTMAP; } ^"unfence" { return T_UNFENCE; } "=" { return T_EQ; } [^ &\|!\t\(\){},;=\"\n\[\]]+ { yylval.sval = crm_strdup(yytext); return T_VAL; } \"(\\\"|[^\"])+\" { yylval.sval = crm_strdup(yytext+1); yylval.sval[strlen(yytext)-2] = 0; /* unescape backslash-quote to be quotes */ _unescape(yylval.sval); return T_VAL; } \"\" { yylval.sval = NULL; return T_VAL; } %% int yywrap(void) { /* This if block that is never executed is here to * get rid of some compile warnings about * unused autogenerated functions. Probably * not the best solution... but a solution... * unless the compiler optimizes it away and complains * again. It may be possible to execute some sed * magic to remove the code from the autogenerated .c * file before compile time if this doesn't hold up.*/ if (0) { yyunput(1, NULL); input(); } return 1; }