summaryrefslogtreecommitdiff
path: root/src/analysis/scan/grammar.y
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2023-10-15 22:16:29 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2023-10-15 22:16:29 (GMT)
commit12d33579e3916baae3f350f615c8f9de98e47d41 (patch)
treeb4dca88cb7a44c050227a07abf46468f7dcb4d65 /src/analysis/scan/grammar.y
parente30e083de9009e52bec5bc574d9c80de4e49a3c3 (diff)
Handle more fuzzy pattern properties.
Diffstat (limited to 'src/analysis/scan/grammar.y')
-rw-r--r--src/analysis/scan/grammar.y266
1 files changed, 259 insertions, 7 deletions
diff --git a/src/analysis/scan/grammar.y b/src/analysis/scan/grammar.y
index 1daa519..6dfbd75 100644
--- a/src/analysis/scan/grammar.y
+++ b/src/analysis/scan/grammar.y
@@ -30,7 +30,6 @@ typedef void *yyscan_t;
#include "exprs/access.h"
#include "exprs/arithmetic.h"
#include "exprs/call.h"
-#include "exprs/counter.h"
#include "exprs/extract.h"
#include "exprs/handler.h"
#include "exprs/intersect.h"
@@ -133,9 +132,13 @@ YY_DECL;
%token BYTES_ID
%token BYTES_FUZZY_ID
%token BYTES_ID_COUNTER
+%token BYTES_FUZZY_ID_COUNTER
%token BYTES_ID_START
+%token BYTES_FUZZY_ID_START
%token BYTES_ID_LENGTH
+%token BYTES_FUZZY_ID_LENGTH
%token BYTES_ID_END
+%token BYTES_FUZZY_ID_END
%token NAME
@@ -230,9 +233,13 @@ YY_DECL;
%type <sized_cstring> BYTES_ID
%type <sized_cstring> BYTES_FUZZY_ID
%type <sized_cstring> BYTES_ID_COUNTER
+%type <sized_cstring> BYTES_FUZZY_ID_COUNTER
%type <sized_cstring> BYTES_ID_START
+%type <sized_cstring> BYTES_FUZZY_ID_START
%type <sized_cstring> BYTES_ID_LENGTH
+%type <sized_cstring> BYTES_FUZZY_ID_LENGTH
%type <sized_cstring> BYTES_ID_END
+%type <sized_cstring> BYTES_FUZZY_ID_END
%type <sized_cstring> NAME
@@ -1401,62 +1408,307 @@ relational_expr : cexpression "<" cexpression { $$ = g_scan_relational_operatio
_pattern_handler : BYTES_ID
{
GSearchPattern *__pat;
+
__pat = g_scan_rule_get_local_variable(*built_rule, $1.data);
+
if (__pat == NULL)
- $$ = NULL;
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
else
{
$$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_RAW);
g_object_unref(G_OBJECT(__pat));
}
+
+ }
+ | BYTES_FUZZY_ID
+ {
+ size_t __count;
+ GSearchPattern **__patterns;
+ size_t __i;
+
+ __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count);
+
+ if (__count == 0)
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
+ $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_RAW);
+
+ for (__i = 0; __i < __count; __i++)
+ g_object_unref(G_OBJECT(__patterns[__i]));
+
+ free(__patterns);
+
}
| BYTES_ID_COUNTER
{
GSearchPattern *__pat;
+
__pat = g_scan_rule_get_local_variable(*built_rule, $1.data);
+
if (__pat == NULL)
- $$ = NULL;
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
else
{
- $$ = g_scan_match_counter_new(__pat);
+ $$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_COUNTER);
g_object_unref(G_OBJECT(__pat));
}
+
+ }
+ | BYTES_FUZZY_ID_COUNTER
+ {
+ size_t __count;
+ GSearchPattern **__patterns;
+ size_t __i;
+
+ __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count);
+
+ if (__count == 0)
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
+ $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_COUNTER);
+
+ for (__i = 0; __i < __count; __i++)
+ g_object_unref(G_OBJECT(__patterns[__i]));
+
+ free(__patterns);
+
}
| BYTES_ID_START
{
GSearchPattern *__pat;
+
__pat = g_scan_rule_get_local_variable(*built_rule, $1.data);
+
if (__pat == NULL)
- $$ = NULL;
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
else
{
$$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_START);
g_object_unref(G_OBJECT(__pat));
}
+
+ }
+ | BYTES_FUZZY_ID_START
+ {
+ size_t __count;
+ GSearchPattern **__patterns;
+ size_t __i;
+
+ __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count);
+
+ if (__count == 0)
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
+ $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_START);
+
+ for (__i = 0; __i < __count; __i++)
+ g_object_unref(G_OBJECT(__patterns[__i]));
+
+ free(__patterns);
+
}
| BYTES_ID_LENGTH
{
GSearchPattern *__pat;
+
__pat = g_scan_rule_get_local_variable(*built_rule, $1.data);
+
if (__pat == NULL)
- $$ = NULL;
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
else
{
$$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_LENGTH);
g_object_unref(G_OBJECT(__pat));
}
+
+ }
+ | BYTES_FUZZY_ID_LENGTH
+ {
+ size_t __count;
+ GSearchPattern **__patterns;
+ size_t __i;
+
+ __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count);
+
+ if (__count == 0)
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
+ $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_LENGTH);
+
+ for (__i = 0; __i < __count; __i++)
+ g_object_unref(G_OBJECT(__patterns[__i]));
+
+ free(__patterns);
+
}
| BYTES_ID_END
{
GSearchPattern *__pat;
+
__pat = g_scan_rule_get_local_variable(*built_rule, $1.data);
+
if (__pat == NULL)
- $$ = NULL;
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Pattern not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
else
{
$$ = g_scan_pattern_handler_new((GSearchPattern *[]) { __pat }, 1, SHT_END);
g_object_unref(G_OBJECT(__pat));
}
+
+ }
+ | BYTES_FUZZY_ID_END
+ {
+ size_t __count;
+ GSearchPattern **__patterns;
+ size_t __i;
+
+ __patterns = g_scan_rule_get_local_variables(*built_rule, $1.data, &__count);
+
+ if (__count == 0)
+ {
+ char *_msg;
+ int _ret;
+
+ _ret = asprintf(&_msg, _("Patterns not found: \"%s\""), $1.data);
+
+ if (_ret != -1)
+ {
+ raise_error(_msg);
+ free(_msg);
+ }
+
+ YYERROR;
+ }
+
+ $$ = g_scan_pattern_handler_new(__patterns, __count, SHT_END);
+
+ for (__i = 0; __i < __count; __i++)
+ g_object_unref(G_OBJECT(__patterns[__i]));
+
+ free(__patterns);
+
}
;