Blame tc/emp_ematch.l

Packit d3f73b
/* SPDX-License-Identifier: GPL-2.0 */
Packit d3f73b
%{
Packit d3f73b
 #include "emp_ematch.yacc.h"
Packit d3f73b
 #include "m_ematch.h"
Packit d3f73b
Packit d3f73b
 extern int ematch_argc;
Packit d3f73b
 extern char **ematch_argv;
Packit d3f73b
Packit d3f73b
 #define yylval ematch_lval
Packit d3f73b
Packit d3f73b
 #define NEXT_EM_ARG() do { ematch_argc--; ematch_argv++; } while(0);
Packit d3f73b
Packit d3f73b
 #define YY_INPUT(buf, result, max_size)				\
Packit d3f73b
 {									\
Packit d3f73b
 next:									\
Packit d3f73b
 	if (ematch_argc <= 0)						\
Packit d3f73b
		result = YY_NULL;					\
Packit d3f73b
	else if (**ematch_argv == '\0') {				\
Packit d3f73b
		NEXT_EM_ARG();						\
Packit d3f73b
		goto next;						\
Packit d3f73b
	} else {							\
Packit d3f73b
		if (max_size <= strlen(*ematch_argv) + 1) {		\
Packit d3f73b
			fprintf(stderr, "match argument too long.\n");	\
Packit d3f73b
			result = YY_NULL;				\
Packit d3f73b
		} else {						\
Packit d3f73b
			strcpy(buf, *ematch_argv);			\
Packit d3f73b
			result = strlen(*ematch_argv) + 1;		\
Packit d3f73b
			buf[result-1] = ' ';				\
Packit d3f73b
			buf[result] = '\0';				\
Packit d3f73b
			NEXT_EM_ARG();					\
Packit d3f73b
		}							\
Packit d3f73b
	}								\
Packit d3f73b
 }
Packit d3f73b
Packit d3f73b
 static void __attribute__ ((unused)) yyunput (int c,char *buf_ptr  );
Packit d3f73b
 static void __attribute__ ((unused)) yy_push_state (int  new_state );
Packit d3f73b
 static void __attribute__ ((unused)) yy_pop_state  (void);
Packit d3f73b
 static int  __attribute__ ((unused)) yy_top_state (void );
Packit d3f73b
Packit d3f73b
 static char *strbuf;
Packit d3f73b
 static unsigned int strbuf_size;
Packit d3f73b
 static unsigned int strbuf_index;
Packit d3f73b
Packit d3f73b
 static void strbuf_enlarge(void)
Packit d3f73b
 {
Packit d3f73b
 	strbuf_size += 512;
Packit d3f73b
 	strbuf = realloc(strbuf, strbuf_size);
Packit d3f73b
 }
Packit d3f73b
Packit d3f73b
 static void strbuf_append_char(char c)
Packit d3f73b
 {
Packit d3f73b
 	while (strbuf_index >= strbuf_size)
Packit d3f73b
 		strbuf_enlarge();
Packit d3f73b
 	strbuf[strbuf_index++] = c;
Packit d3f73b
 }
Packit d3f73b
Packit d3f73b
 static void strbuf_append_charp(char *s)
Packit d3f73b
 {
Packit d3f73b
 	while (strbuf_index >= strbuf_size)
Packit d3f73b
 		strbuf_enlarge();
Packit d3f73b
 	memcpy(strbuf + strbuf_index, s, strlen(s));
Packit d3f73b
 	strbuf_index += strlen(s);
Packit d3f73b
 }
Packit d3f73b
Packit d3f73b
%}
Packit d3f73b
Packit d3f73b
%x lexstr
Packit d3f73b
Packit d3f73b
%option 8bit stack warn noyywrap prefix="ematch_"
Packit d3f73b
%%
Packit d3f73b
[ \t\r\n]+
Packit d3f73b
Packit d3f73b
\"					{
Packit d3f73b
						if (strbuf == NULL) {
Packit d3f73b
							strbuf_size = 512;
Packit d3f73b
							strbuf = calloc(1, strbuf_size);
Packit d3f73b
							if (strbuf == NULL)
Packit d3f73b
								return ERROR;
Packit d3f73b
						}
Packit d3f73b
						strbuf_index = 0;
Packit d3f73b
Packit d3f73b
						BEGIN(lexstr);
Packit d3f73b
					}
Packit d3f73b
Packit d3f73b
<lexstr>\"					{
Packit d3f73b
						BEGIN(INITIAL);
Packit d3f73b
						yylval.b = bstr_new(strbuf, strbuf_index);
Packit d3f73b
						yylval.b->quoted = 1;
Packit d3f73b
						return ATTRIBUTE;
Packit d3f73b
					}
Packit d3f73b
Packit d3f73b
<lexstr>\\[0-7]{1,3}			{ /* octal escape sequence */
Packit d3f73b
						int res;
Packit d3f73b
Packit d3f73b
						sscanf(yytext + 1, "%o", &res;;
Packit d3f73b
						if (res > 0xFF) {
Packit d3f73b
							fprintf(stderr, "error: octal escape sequence" \
Packit d3f73b
							" out of range\n");
Packit d3f73b
							return ERROR;
Packit d3f73b
						}
Packit d3f73b
						strbuf_append_char((unsigned char) res);
Packit d3f73b
					}
Packit d3f73b
Packit d3f73b
<lexstr>\\[0-9]+				{ /* catch wrong octal escape seq. */
Packit d3f73b
						fprintf(stderr, "error: invalid octale escape sequence\n");
Packit d3f73b
						return ERROR;
Packit d3f73b
					}
Packit d3f73b
Packit d3f73b
<lexstr>\\x[0-9a-fA-F]{1,2}		{
Packit d3f73b
						int res;
Packit d3f73b
Packit d3f73b
						sscanf(yytext + 2, "%x", &res;;
Packit d3f73b
Packit d3f73b
						if (res > 0xFF) {
Packit d3f73b
							fprintf(stderr, "error: hexadecimal escape " \
Packit d3f73b
							"sequence out of range\n");
Packit d3f73b
							return ERROR;
Packit d3f73b
						}
Packit d3f73b
						strbuf_append_char((unsigned char) res);
Packit d3f73b
					}
Packit d3f73b
Packit d3f73b
<lexstr>\\n				strbuf_append_char('\n');
Packit d3f73b
<lexstr>\\r				strbuf_append_char('\r');
Packit d3f73b
<lexstr>\\t				strbuf_append_char('\t');
Packit d3f73b
<lexstr>\\v				strbuf_append_char('\v');
Packit d3f73b
<lexstr>\\b				strbuf_append_char('\b');
Packit d3f73b
<lexstr>\\f				strbuf_append_char('\f');
Packit d3f73b
<lexstr>\\a				strbuf_append_char('\a');
Packit d3f73b
Packit d3f73b
<lexstr>\\(.|\n)			strbuf_append_char(yytext[1]);
Packit d3f73b
<lexstr>[^\\\n\"]+			strbuf_append_charp(yytext);
Packit d3f73b
Packit d3f73b
[aA][nN][dD]				return AND;
Packit d3f73b
[oO][rR]				return OR;
Packit d3f73b
[nN][oO][tT]				return NOT;
Packit d3f73b
"("					|
Packit d3f73b
")"					{
Packit d3f73b
						return yylval.i = *yytext;
Packit d3f73b
					}
Packit d3f73b
[^" \t\r\n()][^ \t\r\n()]*		{
Packit d3f73b
						yylval.b = bstr_alloc(yytext);
Packit d3f73b
						if (yylval.b == NULL)
Packit d3f73b
							return ERROR;
Packit d3f73b
						return ATTRIBUTE;
Packit d3f73b
					}
Packit d3f73b
%%