1*de1e4e89SAndroid Build Coastguard Worker %{ 2*de1e4e89SAndroid Build Coastguard Worker #include "emp_ematch.yacc.h" 3*de1e4e89SAndroid Build Coastguard Worker #include "m_ematch.h" 4*de1e4e89SAndroid Build Coastguard Worker 5*de1e4e89SAndroid Build Coastguard Worker extern int ematch_argc; 6*de1e4e89SAndroid Build Coastguard Worker extern char **ematch_argv; 7*de1e4e89SAndroid Build Coastguard Worker 8*de1e4e89SAndroid Build Coastguard Worker #define yylval ematch_lval 9*de1e4e89SAndroid Build Coastguard Worker 10*de1e4e89SAndroid Build Coastguard Worker #define NEXT_EM_ARG() do { ematch_argc--; ematch_argv++; } while(0); 11*de1e4e89SAndroid Build Coastguard Worker 12*de1e4e89SAndroid Build Coastguard Worker #define YY_INPUT(buf, result, max_size) \ 13*de1e4e89SAndroid Build Coastguard Worker { \ 14*de1e4e89SAndroid Build Coastguard Worker next: \ 15*de1e4e89SAndroid Build Coastguard Worker if (ematch_argc <= 0) \ 16*de1e4e89SAndroid Build Coastguard Worker result = YY_NULL; \ 17*de1e4e89SAndroid Build Coastguard Worker else if (**ematch_argv == '\0') { \ 18*de1e4e89SAndroid Build Coastguard Worker NEXT_EM_ARG(); \ 19*de1e4e89SAndroid Build Coastguard Worker goto next; \ 20*de1e4e89SAndroid Build Coastguard Worker } else { \ 21*de1e4e89SAndroid Build Coastguard Worker if (max_size <= strlen(*ematch_argv) + 1) { \ 22*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "match argument too long.\n"); \ 23*de1e4e89SAndroid Build Coastguard Worker result = YY_NULL; \ 24*de1e4e89SAndroid Build Coastguard Worker } else { \ 25*de1e4e89SAndroid Build Coastguard Worker strcpy(buf, *ematch_argv); \ 26*de1e4e89SAndroid Build Coastguard Worker result = strlen(*ematch_argv) + 1; \ 27*de1e4e89SAndroid Build Coastguard Worker buf[result-1] = ' '; \ 28*de1e4e89SAndroid Build Coastguard Worker buf[result] = '\0'; \ 29*de1e4e89SAndroid Build Coastguard Worker NEXT_EM_ARG(); \ 30*de1e4e89SAndroid Build Coastguard Worker } \ 31*de1e4e89SAndroid Build Coastguard Worker } \ 32*de1e4e89SAndroid Build Coastguard Worker } 33*de1e4e89SAndroid Build Coastguard Worker 34*de1e4e89SAndroid Build Coastguard Worker static void __attribute__ ((unused)) yyunput (int c,char *buf_ptr ); 35*de1e4e89SAndroid Build Coastguard Worker static void __attribute__ ((unused)) yy_push_state (int new_state ); 36*de1e4e89SAndroid Build Coastguard Worker static void __attribute__ ((unused)) yy_pop_state (void); 37*de1e4e89SAndroid Build Coastguard Worker static int __attribute__ ((unused)) yy_top_state (void ); 38*de1e4e89SAndroid Build Coastguard Worker 39*de1e4e89SAndroid Build Coastguard Worker static char *strbuf; 40*de1e4e89SAndroid Build Coastguard Worker static unsigned int strbuf_size; 41*de1e4e89SAndroid Build Coastguard Worker static unsigned int strbuf_index; 42*de1e4e89SAndroid Build Coastguard Worker strbuf_enlarge(void)43*de1e4e89SAndroid Build Coastguard Worker static void strbuf_enlarge(void) 44*de1e4e89SAndroid Build Coastguard Worker { 45*de1e4e89SAndroid Build Coastguard Worker strbuf_size += 512; 46*de1e4e89SAndroid Build Coastguard Worker strbuf = realloc(strbuf, strbuf_size); 47*de1e4e89SAndroid Build Coastguard Worker } 48*de1e4e89SAndroid Build Coastguard Worker strbuf_append_char(char c)49*de1e4e89SAndroid Build Coastguard Worker static void strbuf_append_char(char c) 50*de1e4e89SAndroid Build Coastguard Worker { 51*de1e4e89SAndroid Build Coastguard Worker while (strbuf_index >= strbuf_size) 52*de1e4e89SAndroid Build Coastguard Worker strbuf_enlarge(); 53*de1e4e89SAndroid Build Coastguard Worker strbuf[strbuf_index++] = c; 54*de1e4e89SAndroid Build Coastguard Worker } 55*de1e4e89SAndroid Build Coastguard Worker strbuf_append_charp(char * s)56*de1e4e89SAndroid Build Coastguard Worker static void strbuf_append_charp(char *s) 57*de1e4e89SAndroid Build Coastguard Worker { 58*de1e4e89SAndroid Build Coastguard Worker while (strbuf_index >= strbuf_size) 59*de1e4e89SAndroid Build Coastguard Worker strbuf_enlarge(); 60*de1e4e89SAndroid Build Coastguard Worker memcpy(strbuf + strbuf_index, s, strlen(s)); 61*de1e4e89SAndroid Build Coastguard Worker strbuf_index += strlen(s); 62*de1e4e89SAndroid Build Coastguard Worker } 63*de1e4e89SAndroid Build Coastguard Worker 64*de1e4e89SAndroid Build Coastguard Worker %} 65*de1e4e89SAndroid Build Coastguard Worker 66*de1e4e89SAndroid Build Coastguard Worker %x lexstr 67*de1e4e89SAndroid Build Coastguard Worker 68*de1e4e89SAndroid Build Coastguard Worker %option 8bit stack warn noyywrap prefix="ematch_" 69*de1e4e89SAndroid Build Coastguard Worker %% 70*de1e4e89SAndroid Build Coastguard Worker [ \t\r\n]+ 71*de1e4e89SAndroid Build Coastguard Worker 72*de1e4e89SAndroid Build Coastguard Worker \" { 73*de1e4e89SAndroid Build Coastguard Worker if (strbuf == NULL) { 74*de1e4e89SAndroid Build Coastguard Worker strbuf_size = 512; 75*de1e4e89SAndroid Build Coastguard Worker strbuf = calloc(1, strbuf_size); 76*de1e4e89SAndroid Build Coastguard Worker if (strbuf == NULL) 77*de1e4e89SAndroid Build Coastguard Worker return ERROR; 78*de1e4e89SAndroid Build Coastguard Worker } 79*de1e4e89SAndroid Build Coastguard Worker strbuf_index = 0; 80*de1e4e89SAndroid Build Coastguard Worker 81*de1e4e89SAndroid Build Coastguard Worker BEGIN(lexstr); 82*de1e4e89SAndroid Build Coastguard Worker } 83*de1e4e89SAndroid Build Coastguard Worker 84*de1e4e89SAndroid Build Coastguard Worker <lexstr>\" { 85*de1e4e89SAndroid Build Coastguard Worker BEGIN(INITIAL); 86*de1e4e89SAndroid Build Coastguard Worker yylval.b = bstr_new(strbuf, strbuf_index); 87*de1e4e89SAndroid Build Coastguard Worker yylval.b->quoted = 1; 88*de1e4e89SAndroid Build Coastguard Worker return ATTRIBUTE; 89*de1e4e89SAndroid Build Coastguard Worker } 90*de1e4e89SAndroid Build Coastguard Worker 91*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\[0-7]{1,3} { /* octal escape sequence */ 92*de1e4e89SAndroid Build Coastguard Worker int res; 93*de1e4e89SAndroid Build Coastguard Worker 94*de1e4e89SAndroid Build Coastguard Worker sscanf(yytext + 1, "%o", &res); 95*de1e4e89SAndroid Build Coastguard Worker if (res > 0xFF) { 96*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error: octal escape sequence" \ 97*de1e4e89SAndroid Build Coastguard Worker " out of range\n"); 98*de1e4e89SAndroid Build Coastguard Worker return ERROR; 99*de1e4e89SAndroid Build Coastguard Worker } 100*de1e4e89SAndroid Build Coastguard Worker strbuf_append_char((unsigned char) res); 101*de1e4e89SAndroid Build Coastguard Worker } 102*de1e4e89SAndroid Build Coastguard Worker 103*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\[0-9]+ { /* catch wrong octal escape seq. */ 104*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error: invalid octale escape sequence\n"); 105*de1e4e89SAndroid Build Coastguard Worker return ERROR; 106*de1e4e89SAndroid Build Coastguard Worker } 107*de1e4e89SAndroid Build Coastguard Worker 108*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\x[0-9a-fA-F]{1,2} { 109*de1e4e89SAndroid Build Coastguard Worker int res; 110*de1e4e89SAndroid Build Coastguard Worker 111*de1e4e89SAndroid Build Coastguard Worker sscanf(yytext + 2, "%x", &res); 112*de1e4e89SAndroid Build Coastguard Worker 113*de1e4e89SAndroid Build Coastguard Worker if (res > 0xFF) { 114*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "error: hexadecimal escape " \ 115*de1e4e89SAndroid Build Coastguard Worker "sequence out of range\n"); 116*de1e4e89SAndroid Build Coastguard Worker return ERROR; 117*de1e4e89SAndroid Build Coastguard Worker } 118*de1e4e89SAndroid Build Coastguard Worker strbuf_append_char((unsigned char) res); 119*de1e4e89SAndroid Build Coastguard Worker } 120*de1e4e89SAndroid Build Coastguard Worker 121*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\n strbuf_append_char('\n'); 122*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\r strbuf_append_char('\r'); 123*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\t strbuf_append_char('\t'); 124*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\v strbuf_append_char('\v'); 125*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\b strbuf_append_char('\b'); 126*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\f strbuf_append_char('\f'); 127*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\a strbuf_append_char('\a'); 128*de1e4e89SAndroid Build Coastguard Worker 129*de1e4e89SAndroid Build Coastguard Worker <lexstr>\\(.|\n) strbuf_append_char(yytext[1]); 130*de1e4e89SAndroid Build Coastguard Worker <lexstr>[^\\\n\"]+ strbuf_append_charp(yytext); 131*de1e4e89SAndroid Build Coastguard Worker 132*de1e4e89SAndroid Build Coastguard Worker [aA][nN][dD] return AND; 133*de1e4e89SAndroid Build Coastguard Worker [oO][rR] return OR; 134*de1e4e89SAndroid Build Coastguard Worker [nN][oO][tT] return NOT; 135*de1e4e89SAndroid Build Coastguard Worker "(" | 136*de1e4e89SAndroid Build Coastguard Worker ")" { 137*de1e4e89SAndroid Build Coastguard Worker return yylval.i = *yytext; 138*de1e4e89SAndroid Build Coastguard Worker } 139*de1e4e89SAndroid Build Coastguard Worker [^ \t\r\n()]+ { 140*de1e4e89SAndroid Build Coastguard Worker yylval.b = bstr_alloc(yytext); 141*de1e4e89SAndroid Build Coastguard Worker if (yylval.b == NULL) 142*de1e4e89SAndroid Build Coastguard Worker return ERROR; 143*de1e4e89SAndroid Build Coastguard Worker return ATTRIBUTE; 144*de1e4e89SAndroid Build Coastguard Worker } 145*de1e4e89SAndroid Build Coastguard Worker %% 146