Add find_first string function

This commit is contained in:
yexiaochuan 2025-04-30 00:15:34 +08:00
parent 5bf660a9ce
commit 6c240dc0bb
3 changed files with 41 additions and 0 deletions

View file

@ -265,6 +265,7 @@ static std::unordered_map<std::string, unsigned int> func_attrs = {
{"find_entropy", ATTR_FOLDABLE}, {"find_entropy", ATTR_FOLDABLE},
{"find_in_zeekpath", ATTR_IDEMPOTENT}, // can error {"find_in_zeekpath", ATTR_IDEMPOTENT}, // can error
{"find_last", ATTR_FOLDABLE}, {"find_last", ATTR_FOLDABLE},
{"find_first", ATTR_FOLDABLE},
{"find_str", ATTR_FOLDABLE}, {"find_str", ATTR_FOLDABLE},
{"floor", ATTR_FOLDABLE}, {"floor", ATTR_FOLDABLE},
{"flush_all", ATTR_NO_SCRIPT_SIDE_EFFECTS}, {"flush_all", ATTR_NO_SCRIPT_SIDE_EFFECTS},

View file

@ -1107,6 +1107,30 @@ function find_last%(str: string, re: pattern%) : string
return zeek::val_mgr->EmptyString(); return zeek::val_mgr->EmptyString();
%} %}
## Finds the first occurrence of a pattern in a string.
##
## str: The string to inspect.
##
## re: The pattern to look for in *str*.
##
## Returns: The first string in *str* that matches *re*, or the empty string.
##
## .. zeek:see:: find_all find_all_ordered find_last strstr
function find_first%(str: string, re: pattern%) : string
%{
const u_char* s = str->Bytes();
const u_char* e = s + str->Len();
for ( const u_char* t = s; t < e; ++t )
{
int n = re->MatchPrefix(t, e - t);
if ( n >= 0 )
return zeek::make_intrusive<zeek::StringVal>(n, (const char*) t);
}
return zeek::val_mgr->EmptyString();
%}
## Returns a hex dump for given input data. The hex dump renders 16 bytes per ## Returns a hex dump for given input data. The hex dump renders 16 bytes per
## line, with hex on the left and ASCII (where printable) ## line, with hex on the left and ASCII (where printable)
## on the right. ## on the right.

View file

@ -0,0 +1,16 @@
# @TEST-EXEC: zeek -b %INPUT >out
# @TEST-EXEC: btest-diff out
event zeek_init()
{
local a = "this is a test";
local pat = /hi|es/;
local pat2 = /aa|bb/;
local b = find_first(a, pat);
local b2 = find_first(a, pat2);
print b;
print "-------------------";
print |b2|;
}