blob: d9b45be12055edb839a0c105d708644b97c4265a [file] [log] [blame]
shemminger311b4142005-06-23 20:25:16 +00001%{
2 #include "emp_ematch.yacc.h"
3 #include "m_ematch.h"
4
5 extern int ematch_argc;
6 extern char **ematch_argv;
7
shemminger737f15f2005-07-08 22:08:47 +00008 #define yylval ematch_lval
9
shemminger311b4142005-06-23 20:25:16 +000010 #define NEXT_EM_ARG() do { ematch_argc--; ematch_argv++; } while(0);
11
12 #define YY_INPUT(buf, result, max_size) \
13 { \
14 next: \
15 if (ematch_argc <= 0) \
16 result = YY_NULL; \
17 else if (**ematch_argv == '\0') { \
18 NEXT_EM_ARG(); \
19 goto next; \
20 } else { \
21 if (max_size <= strlen(*ematch_argv) + 1) { \
22 fprintf(stderr, "match argument too long.\n"); \
23 result = YY_NULL; \
24 } else { \
25 strcpy(buf, *ematch_argv); \
26 result = strlen(*ematch_argv) + 1; \
27 buf[result-1] = ' '; \
28 buf[result] = '\0'; \
29 NEXT_EM_ARG(); \
30 } \
31 } \
32 }
33
34 static void __attribute__ ((unused)) yyunput (int c,char *buf_ptr );
35 static void __attribute__ ((unused)) yy_push_state (int new_state );
36 static void __attribute__ ((unused)) yy_pop_state (void);
37 static int __attribute__ ((unused)) yy_top_state (void );
shemminger311b4142005-06-23 20:25:16 +000038
shemminger3fcdebb2005-07-14 16:49:27 +000039 static char *strbuf;
shemminger311b4142005-06-23 20:25:16 +000040 static unsigned int strbuf_size;
41 static unsigned int strbuf_index;
42
shemminger737f15f2005-07-08 22:08:47 +000043 static void strbuf_enlarge(void)
shemminger311b4142005-06-23 20:25:16 +000044 {
45 strbuf_size += 512;
46 strbuf = realloc(strbuf, strbuf_size);
47 }
48
shemminger3fcdebb2005-07-14 16:49:27 +000049 static void strbuf_append_char(char c)
shemminger311b4142005-06-23 20:25:16 +000050 {
51 while (strbuf_index >= strbuf_size)
52 strbuf_enlarge();
53 strbuf[strbuf_index++] = c;
54 }
55
shemminger3fcdebb2005-07-14 16:49:27 +000056 static void strbuf_append_charp(char *s)
shemminger311b4142005-06-23 20:25:16 +000057 {
58 while (strbuf_index >= strbuf_size)
59 strbuf_enlarge();
60 memcpy(strbuf + strbuf_index, s, strlen(s));
61 strbuf_index += strlen(s);
62 }
63
shemminger3fcdebb2005-07-14 16:49:27 +000064%}
65
Bart Trojanowski608a96c2010-04-19 09:12:57 -040066%x lexstr
shemminger3fcdebb2005-07-14 16:49:27 +000067
68%option 8bit stack warn noyywrap prefix="ematch_"
69%%
shemminger311b4142005-06-23 20:25:16 +000070[ \t\r\n]+
71
72\" {
73 if (strbuf == NULL) {
74 strbuf_size = 512;
75 strbuf = calloc(1, strbuf_size);
76 if (strbuf == NULL)
77 return ERROR;
78 }
79 strbuf_index = 0;
Stephen Hemmingerae665a52006-12-05 10:10:22 -080080
Bart Trojanowski608a96c2010-04-19 09:12:57 -040081 BEGIN(lexstr);
shemminger311b4142005-06-23 20:25:16 +000082 }
83
Bart Trojanowski608a96c2010-04-19 09:12:57 -040084<lexstr>\" {
shemminger311b4142005-06-23 20:25:16 +000085 BEGIN(INITIAL);
shemminger737f15f2005-07-08 22:08:47 +000086 yylval.b = bstr_new(strbuf, strbuf_index);
87 yylval.b->quoted = 1;
shemminger311b4142005-06-23 20:25:16 +000088 return ATTRIBUTE;
89 }
90
Bart Trojanowski608a96c2010-04-19 09:12:57 -040091<lexstr>\\[0-7]{1,3} { /* octal escape sequence */
shemminger311b4142005-06-23 20:25:16 +000092 int res;
Stephen Hemmingerae665a52006-12-05 10:10:22 -080093
shemminger311b4142005-06-23 20:25:16 +000094 sscanf(yytext + 1, "%o", &res);
95 if (res > 0xFF) {
96 fprintf(stderr, "error: octal escape sequence" \
97 " out of range\n");
98 return ERROR;
99 }
100 strbuf_append_char((unsigned char) res);
101 }
102
Bart Trojanowski608a96c2010-04-19 09:12:57 -0400103<lexstr>\\[0-9]+ { /* catch wrong octal escape seq. */
shemminger311b4142005-06-23 20:25:16 +0000104 fprintf(stderr, "error: invalid octale escape sequence\n");
105 return ERROR;
106 }
107
Bart Trojanowski608a96c2010-04-19 09:12:57 -0400108<lexstr>\\x[0-9a-fA-F]{1,2} {
shemminger311b4142005-06-23 20:25:16 +0000109 int res;
Stephen Hemmingerae665a52006-12-05 10:10:22 -0800110
shemminger311b4142005-06-23 20:25:16 +0000111 sscanf(yytext + 2, "%x", &res);
Stephen Hemmingerae665a52006-12-05 10:10:22 -0800112
shemminger311b4142005-06-23 20:25:16 +0000113 if (res > 0xFF) {
114 fprintf(stderr, "error: hexadecimal escape " \
115 "sequence out of range\n");
116 return ERROR;
117 }
118 strbuf_append_char((unsigned char) res);
119 }
120
Bart Trojanowski608a96c2010-04-19 09:12:57 -0400121<lexstr>\\n strbuf_append_char('\n');
122<lexstr>\\r strbuf_append_char('\r');
123<lexstr>\\t strbuf_append_char('\t');
124<lexstr>\\v strbuf_append_char('\v');
125<lexstr>\\b strbuf_append_char('\b');
126<lexstr>\\f strbuf_append_char('\f');
127<lexstr>\\a strbuf_append_char('\a');
shemminger311b4142005-06-23 20:25:16 +0000128
Bart Trojanowski608a96c2010-04-19 09:12:57 -0400129<lexstr>\\(.|\n) strbuf_append_char(yytext[1]);
130<lexstr>[^\\\n\"]+ strbuf_append_charp(yytext);
shemminger311b4142005-06-23 20:25:16 +0000131
132[aA][nN][dD] return AND;
133[oO][rR] return OR;
134[nN][oO][tT] return NOT;
135"(" |
136")" {
shemminger737f15f2005-07-08 22:08:47 +0000137 return yylval.i = *yytext;
shemminger311b4142005-06-23 20:25:16 +0000138 }
139[^ \t\r\n()]+ {
shemminger737f15f2005-07-08 22:08:47 +0000140 yylval.b = bstr_alloc(yytext);
141 if (yylval.b == NULL)
shemminger311b4142005-06-23 20:25:16 +0000142 return ERROR;
143 return ATTRIBUTE;
144 }
145%%