/* Copyright (C) 2011 Jiri Olsa This file is part of the latrace. The latrace is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The latrace is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the latrace (file COPYING). If not, see . */ %option prefix="lt_config_" %{ #include #include "config.h" #include "config-bison.h" #include "lib-include.h" extern struct lt_include *lt_config_sinc; static int block_cnt; #define NEW_LINE() \ do { \ lt_inc_stack(lt_config_sinc)->lineno++; \ } while(0) #define RETURN_STR(token) \ do { \ lt_config_lval.s = strdup(lt_config_text); return token; \ } while(0) #define RETURN_LONG(token) \ do { \ lt_config_lval.l = atol(lt_config_text); return token; \ } while(0) #define BLOCK_BEGIN() \ do { \ block_cnt++; \ } while(0) #define BLOCK_END() \ do { \ if (!--block_cnt) \ BEGIN(INITIAL); \ } while(0) %} num [-0-9] value ({num})+ name ([-0-9a-zA-Z\./_\-\*])+ bool YES|NO comment ^([\s\t])*#.* %x comment include options error %% <> { return END; } "\n" { NEW_LINE(); } {comment} { ; } . { ; } INCLUDE { BEGIN(include); return INCLUDE; } {name} { RETURN_STR(NAME); } "\"" { return '"'; } \n { BEGIN(INITIAL); NEW_LINE(); } . { ; } OPTIONS { BEGIN(options); return OPTIONS; } HEADERS { return OPT_HEADERS; } INDENT_SYM { return OPT_INDENT_SYM; } PIPE { return OPT_PIPE; } TIMESTAMP { return OPT_TIMESTAMP; } FRAMESIZE { return OPT_FRAMESIZE; } FRAMESIZE_CHECK { return OPT_FRAMESIZE_CHECK; } HIDE_TID { return OPT_HIDE_TID; } FOLLOW_FORK { return OPT_FOLLOW_FORK; } FOLLOW_EXEC { return OPT_FOLLOW_EXEC; } DEMANGLE { return OPT_DEMANGLE; } BRACES { return OPT_BRACES; } ENABLE_ARGS { return OPT_ENABLE_ARGS; } DETAIL_ARGS { return OPT_DETAIL_ARGS; } OUTPUT_TTY { return OPT_OUTPUT_TTY; } LIBS { return OPT_LIBS; } LIBS_TO { return OPT_LIBS_TO; } LIBS_FROM { return OPT_LIBS_FROM; } SYM { return OPT_SYM; } SYM_OMIT { return OPT_SYM_OMIT; } SYM_BELOW { return OPT_SYM_BELOW; } SYM_NOEXIT { return OPT_SYM_NOEXIT; } ARGS_STRING_POINTER_LENGTH { return OPT_ARGS_STRING_POINTER_LENGTH; } {bool} { RETURN_STR(BOOL); } {value} { RETURN_LONG(VALUE); } {name} { RETURN_STR(NAME); } {comment} { ; } "}" { BEGIN(INITIAL); return '}'; } "{" { return '{'; } "=" { return '='; } "\"" { return '"'; } "," { return ','; } "\\" { ; } "\n" { NEW_LINE(); } . { ; } ERROR { BEGIN(error); return ERROR; } DIR { return ERR_DIR; } RUN { return ERR_RUN; } GO { return ERR_GO; } RETURN { return ERR_RETURN; } PROG { return ERR_PROG; } ARGS { return ERR_ARGS; } N { return ERR_N; } START { return ERR_START; } FILTER { return ERR_FILTER; } SEQ { return ERR_SEQ; } SIGSEGV { return ERR_SIGSEGV; } AUTOMATED { return ERR_AUTOMATED; } REPLAY { return ERR_REPLAY; } KEEP { return ERR_KEEP; } {value} { RETURN_LONG(VALUE); } {name} { RETURN_STR(NAME); } {comment} { ; } "}" { BLOCK_END(); return '}'; } "{" { BLOCK_BEGIN(); return '{'; } "=" { return '='; } "\"" { return '"'; } "\\" { ; } "," { return ','; } "\n" { NEW_LINE(); } . { ; } %% #ifndef yywrap int yywrap() { return 1; /* XXX not to get the compiler 'not used' warning */ yyunput(0, NULL); input(); } #endif void lt_config_error(const char *m) { printf("conf file [%s] line %d: %s\n", lt_inc_stack(lt_config_sinc)->file, lt_inc_stack(lt_config_sinc)->lineno, m); }