xref: /aosp_15_r20/external/iproute2/tc/emp_ematch.l (revision de1e4e894b0c224df933550f0afdecc354b238c4)
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