diff options
Diffstat (limited to 'src/config-flex.l')
-rw-r--r-- | src/config-flex.l | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/config-flex.l b/src/config-flex.l new file mode 100644 index 0000000..61a775e --- /dev/null +++ b/src/config-flex.l @@ -0,0 +1,119 @@ +/* + Copyright (C) 2011 Jiri Olsa <olsajiri@gmail.com> + + 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 + <http://www.gnu.org/licenses/>. +*/ + +%option prefix="lt_config_" + +%{ + +#include <string.h> + +#include "config.h" +#include "config-bison.h" +#include "lib-include.h" + +extern struct lt_include *lt_config_sinc; + + +#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) + +%} + +num [-0-9] +value ({num})+ +alphnum [-0-9a-zA-Z_] +name ({alphnum})+ +filename ([-0-9a-zA-Z\./_])+ +bool YES|NO +comment ^([\s\t])*#.* + +%x comment include options + +%% + +<<EOF>> { return END; } +"\n" { NEW_LINE(); } +{comment} { ; } +. { ; } + +INCLUDE { BEGIN(include); return INCLUDE; } +<include>{filename} { RETURN_STR(FILENAME); } +<include>"\"" { return '"'; } +<include>\n { BEGIN(INITIAL); NEW_LINE(); } +<include>. { ; } + +OPTIONS { BEGIN(options); return OPTIONS; } +<options>HEADERS { return OPT_HEADERS; } +<options>INDENT_SYM { return OPT_INDENT_SYM; } +<options>PIPE { return OPT_PIPE; } +<options>TIMESTAMP { return OPT_TIMESTAMP; } +<options>FRAMESIZE { return OPT_FRAMESIZE; } +<options>FRAMESIZE_CHECK { return OPT_FRAMESIZE_CHECK; } +<options>HIDE_TID { return OPT_HIDE_TID; } +<options>FOLLOW_FORK { return OPT_FOLLOW_FORK; } +<options>FOLLOW_EXEC { return OPT_FOLLOW_EXEC; } +<options>DEMANGLE { return OPT_DEMANGLE; } +<options>BRACES { return OPT_BRACES; } +<options>ENABLE_ARGS { return OPT_ENABLE_ARGS; } +<options>DETAIL_ARGS { return OPT_DETAIL_ARGS; } + +<options>{bool} { RETURN_STR(BOOL); } +<options>{value} { RETURN_LONG(VALUE); } +<options>{filename} { RETURN_STR(FILENAME); } +<options>{comment} { ; } +<options>"}" { BEGIN(INITIAL); return '}'; } +<options>"{" { return '{'; } +<options>"=" { return '='; } +<options>"\"" { return '"'; } +<options>"\\" { ; } +<options>"\n" { NEW_LINE(); } +<options>. { ; } + +%% + +#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); +} |