| %{ |
| |
| #include "drbd_endian.h" |
| #include "drbdmeta_parser.h" |
| #include "drbdtool_common.h" |
| |
| static void bad_token(char*); |
| |
| //#define DP printf("%s ",yytext); |
| #define DP |
| #define CP yylval.txt=yytext |
| #define YY_NO_INPUT 1 |
| #define YY_NO_UNPUT 1 |
| |
| %} |
| |
| %option noyywrap |
| %option yylineno |
| %option nounput |
| |
| /* remember to avoid backing up. |
| * tell user about bad/unexpected tokens. */ |
| |
| OP [{};\[\]] |
| WS [ \r\t\n] |
| COMMENT \#[^\n]* |
| |
| /* 1<<63 is 19 digits. has to be enough. |
| * 20 digits would risk overflow of 64bit unsigned int */ |
| NUM -?[0-9]{1,19} |
| NUM_TOO_LONG {NUM}[0-9] |
| |
| U64 0x[0-9A-Fa-f]{16} |
| U32 0x[0-9A-Fa-f]{8} |
| INVALID_HEX 0x[0-9A-Fa-f]{0,17} |
| |
| STRING \"[^\"\r\n]{1,20}\" |
| EMPTY_STRING \"\"? |
| INVALID_STRING \"[^\"\r\n]{1,20} |
| |
| INVALID_TOKEN [-_a-zA-Z0-9]{1,100} |
| INVALID_CHAR [^-_a-zA-Z0-9 \t\r\n\";{}] |
| |
| %% |
| |
| {WS} /* skip silently */ |
| {COMMENT} /* skip silently */ |
| {OP} DP; return yytext[0]; |
| {STRING} unescape(yytext); DP; CP; return TK_STRING; |
| {U64} yylval.u64 = strto_u64(yytext, NULL, 16); DP; return TK_U64; |
| {U32} yylval.u64 = strto_u64(yytext, NULL, 16); DP; return TK_U32; |
| {NUM} yylval.u64 = strto_u64(yytext, NULL, 10); DP; return TK_NUM; |
| gc DP; CP; return TK_GC; |
| bm DP; CP; return TK_BM; |
| uuid DP; CP; return TK_UUID; |
| version DP; CP; return TK_VERSION; |
| la-size-sect DP; CP; return TK_LA_SIZE; |
| bm-byte-per-bit DP; CP; return TK_BM_BYTE_PER_BIT; |
| device-uuid DP; CP; return TK_DEVICE_UUID; |
| times DP; CP; return TK_TIMES; |
| flags DP; CP; return TK_FLAGS; |
| al-stripes DP; CP; return TK_AL_STRIPES; |
| al-stripe-size-4k DP; CP; return TK_AL_STRIPE_SIZE_4K; |
| la-peer-max-bio-size DP; CP; return TK_LA_BIO_SIZE; |
| node-id DP; CP; return TK_NODE_ID; |
| current-uuid DP; CP; return TK_CURRENT_UUID; |
| bitmap DP; CP; return TK_BITMAP; |
| bitmap-uuid DP; CP; return TK_BITMAP_UUID; |
| bitmap-dagtag DP; CP; return TK_BITMAP_DAGTAG; |
| history-uuids DP; CP; return TK_HISTORY_UUIDS; |
| peer DP; CP; return TK_PEER; |
| hash DP; CP; return TK_HASH; |
| max-peers DP; CP; return TK_MAX_PEERS; |
| bitmap-index DP; CP; return TK_BITMAP_INDEX; |
| |
| {INVALID_STRING} CP; bad_token("invalid string"); return TK_INVALID; |
| {EMPTY_STRING} CP; bad_token("invalid string"); return TK_INVALID; |
| {INVALID_HEX} CP; bad_token("invalid hex number (only 8 or 16 hex digits accepted)"); return TK_INVALID; |
| {NUM_TOO_LONG} CP; bad_token("number too big"); return TK_INVALID; |
| {INVALID_TOKEN} CP; bad_token("unknown token"); return TK_INVALID; |
| {INVALID_CHAR} CP; return TK_INVALID_CHAR; |
| |
| %% |
| |
| static void bad_token(char *msg) |
| { |
| fflush(stdout); |
| fprintf(stderr,"line %u: %s: %s ...\n", yylineno, msg, yytext); |
| } |
| |
| int my_yy_unscaned_characters(void) |
| { |
| return (yy_n_chars) - ((yy_c_buf_p) - YY_CURRENT_BUFFER->yy_ch_buf); |
| } |