Blame tc/emp_ematch.l

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