forked from osmocom/wireshark
161 lines
2.6 KiB
Plaintext
161 lines
2.6 KiB
Plaintext
%{
|
|
#include <glib.h>
|
|
#include "rt-grammar.h"
|
|
guint8* parse_bytes(char *text);
|
|
enum nibble_t { high, low };
|
|
static char *in_buffer;
|
|
|
|
/* from libpcap */
|
|
#ifdef FLEX_SCANNER
|
|
#define YY_NO_UNPUT
|
|
#undef YY_INPUT
|
|
#define YY_INPUT(buf, result, max)\
|
|
{\
|
|
char *src = in_buffer;\
|
|
int i;\
|
|
\
|
|
if (*src == 0)\
|
|
result = YY_NULL;\
|
|
else {\
|
|
for (i = 0; *src && i < max; ++i)\
|
|
buf[i] = *src++;\
|
|
in_buffer += i;\
|
|
result = i;\
|
|
}\
|
|
}
|
|
#else
|
|
#undef getc
|
|
#define getc(fp) (*in_buffer == 0 ? EOF : *in_buffer++)
|
|
#endif
|
|
|
|
|
|
%}
|
|
|
|
N ([0-9]+|(0X|0x)[0-9A-Fa-f]+)
|
|
B [0-9A-Fa-f][0-9A-Fa-f]?([-:.]?[0-9A-Fa-f][0-9A-Fa-f]?)*
|
|
W [A-Za-z_]
|
|
quoted \"[^"\n]*["\n]
|
|
|
|
%%
|
|
|
|
[\n\t ]+ /* eat whitespace */
|
|
|
|
{quoted} {
|
|
wtap_lval.s = g_string_new(wtap_text + 1);
|
|
g_string_truncate(wtap_lval.s, strlen(wtap_text) - 2);
|
|
return QUOTED;
|
|
}
|
|
|
|
";" return ';';
|
|
"," return ',';
|
|
"(" return '(';
|
|
")" return ')';
|
|
"@" return '@';
|
|
|
|
/* ct-compile: lex tokens */
|
|
|
|
eq return EQ;
|
|
ne return NE;
|
|
|
|
{B} {
|
|
wtap_lval.b = parse_bytes(wtap_text);
|
|
return BYTES;
|
|
}
|
|
|
|
{N} {
|
|
wtap_lval.d = atoi(wtap_text);
|
|
return NUMBER;
|
|
}
|
|
|
|
{W}+ {
|
|
wtap_lval.s = g_string_new(wtap_text);
|
|
return TEXT;
|
|
}
|
|
|
|
%%
|
|
|
|
guint8*
|
|
parse_bytes(char *text)
|
|
{
|
|
guint8 buffer[256];
|
|
guint8 index = 0;
|
|
char *cp;
|
|
char character;
|
|
guint8 byte_val=0;
|
|
gchar *dup_ptr;
|
|
enum nibble_t nibble = high;
|
|
|
|
for (cp = text; (*cp != '\x0') && index < 256; cp++) {
|
|
character = *cp;
|
|
|
|
if (nibble == high) {
|
|
/* assumes ASCII, not EBCDIC */
|
|
if (character >= '0' && character <= '9') {
|
|
byte_val = (character - '0') << 4;
|
|
}
|
|
else if (character >= 'A' && character <= 'F') {
|
|
byte_val = (character - 'A' + 10) << 4;
|
|
}
|
|
else if (character >= 'a' && character <= 'f') {
|
|
byte_val = (character - 'a' + 10) << 4;
|
|
}
|
|
else {
|
|
continue;
|
|
}
|
|
nibble = low;
|
|
continue;
|
|
}
|
|
else {
|
|
/* assumes ASCII, not EBCDIC */
|
|
if (character >= '0' && character <= '9') {
|
|
byte_val += (character - '0');
|
|
}
|
|
else if (character >= 'A' && character <= 'F') {
|
|
byte_val += (character - 'A' + 10);
|
|
}
|
|
else if (character >= 'a' && character <= 'f') {
|
|
byte_val += (character - 'a' + 10);
|
|
}
|
|
else {
|
|
byte_val >>= 4;
|
|
}
|
|
nibble = high;
|
|
|
|
buffer[index] = byte_val;
|
|
index++;
|
|
}
|
|
|
|
}
|
|
|
|
/* did we finish mid-nibble? */
|
|
if (nibble == low) {
|
|
buffer[index] = byte_val >> 4;
|
|
index++;
|
|
}
|
|
|
|
dup_ptr = g_malloc(index + 1);
|
|
dup_ptr[0] = index;
|
|
memcpy(dup_ptr + 1, buffer, index);
|
|
return dup_ptr;
|
|
}
|
|
|
|
|
|
void wtap_error(char *string)
|
|
{
|
|
g_error("%s\n",string);
|
|
exit(0);
|
|
}
|
|
|
|
void
|
|
wtap_lex_init(char *buf)
|
|
{
|
|
in_buffer = buf;
|
|
}
|
|
|
|
int
|
|
yywrap()
|
|
{
|
|
return 1;
|
|
}
|
|
|