mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 00:28:21 +00:00
BIT-466: add redef += support to vectors
This commit is contained in:
parent
95c72f3717
commit
bd24421734
8 changed files with 59 additions and 3 deletions
4
CHANGES
4
CHANGES
|
@ -1,4 +1,8 @@
|
|||
|
||||
2.5-852 | 2018-08-17 15:15:55 -0500
|
||||
|
||||
* BIT-466: add redef += support to vectors (Jon Siwek, Corelight)
|
||||
|
||||
2.5-850 | 2018-08-17 11:12:53 -0500
|
||||
|
||||
* BIT-1815: move SMB::write_cmd_log functionality into policy/ script
|
||||
|
|
3
NEWS
3
NEWS
|
@ -314,6 +314,9 @@ New Functionality
|
|||
|
||||
- An expression of the form "v += e" will append the value of the expression
|
||||
"e" to the end of the vector "v" (of course assuming type-compatbility).
|
||||
"redef v += { a, b, c }" will similarly extend a vector previously declared
|
||||
with &redef by appending the result of expressions "a", "b", and "c" to
|
||||
the vector at initialization-time.
|
||||
|
||||
Changed Functionality
|
||||
---------------------
|
||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
|||
2.5-850
|
||||
2.5-852
|
||||
|
|
|
@ -140,10 +140,11 @@ void ID::SetVal(Val* v, init_class c)
|
|||
}
|
||||
|
||||
if ( type->Tag() != TYPE_TABLE &&
|
||||
(type->Tag() != TYPE_PATTERN || c == INIT_REMOVE) )
|
||||
(type->Tag() != TYPE_PATTERN || c == INIT_REMOVE) &&
|
||||
(type->Tag() != TYPE_VECTOR || c == INIT_REMOVE) )
|
||||
{
|
||||
if ( c == INIT_EXTRA )
|
||||
Error("+= initializer only applies to tables, sets and patterns", v);
|
||||
Error("+= initializer only applies to tables, sets, vectors and patterns", v);
|
||||
else
|
||||
Error("-= initializer only applies to tables and sets", v);
|
||||
}
|
||||
|
|
23
src/Val.cc
23
src/Val.cc
|
@ -3321,6 +3321,29 @@ bool VectorVal::AssignRepeat(unsigned int index, unsigned int how_many,
|
|||
return true;
|
||||
}
|
||||
|
||||
int VectorVal::AddTo(Val* val, int /* is_first_init */) const
|
||||
{
|
||||
if ( val->Type()->Tag() != TYPE_VECTOR )
|
||||
{
|
||||
val->Error("not a vector");
|
||||
return 0;
|
||||
}
|
||||
|
||||
VectorVal* v = val->AsVectorVal();
|
||||
|
||||
if ( ! same_type(type, v->Type()) )
|
||||
{
|
||||
type->Error("vector type clash", v->Type());
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto last_idx = v->Size();
|
||||
|
||||
for ( auto i = 0u; i < Size(); ++i )
|
||||
v->Assign(last_idx++, Lookup(i)->Ref());
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
Val* VectorVal::Lookup(unsigned int index) const
|
||||
{
|
||||
|
|
|
@ -1046,6 +1046,10 @@ public:
|
|||
bool AssignRepeat(unsigned int index, unsigned int how_many,
|
||||
Val* element);
|
||||
|
||||
// Add this value to the given value (if appropriate).
|
||||
// Returns true if succcessful.
|
||||
int AddTo(Val* v, int is_first_init) const override;
|
||||
|
||||
// Returns nil if no element was at that value.
|
||||
// Lookup does NOT grow the vector to this size.
|
||||
// The Val* variant assumes that the index Val* has been type-checked.
|
||||
|
|
3
testing/btest/Baseline/language.redef-vector/out
Normal file
3
testing/btest/Baseline/language.redef-vector/out
Normal file
|
@ -0,0 +1,3 @@
|
|||
[testing, blah, foo, foo, testing]
|
||||
[one, two, three]
|
||||
[a, b, c, one, two, three, a, b, c, abc, d]
|
18
testing/btest/language/redef-vector.bro
Normal file
18
testing/btest/language/redef-vector.bro
Normal file
|
@ -0,0 +1,18 @@
|
|||
# @TEST-EXEC: bro -b %INPUT >out
|
||||
# @TEST-EXEC: btest-diff out
|
||||
|
||||
const foo: vector of string &redef;
|
||||
redef foo += { "testing", "blah", "foo", "foo", "testing" };
|
||||
|
||||
const bar: vector of string = vector() &redef;
|
||||
redef bar += { "one", "two", "three" };
|
||||
|
||||
const baz: vector of string = vector("a", "b", "c") &redef;
|
||||
redef baz += { "one", "two", "three" };
|
||||
redef baz += { "a", "b", "c" };
|
||||
const d = "d";
|
||||
redef baz += { "a" + "b" + "c", d };
|
||||
|
||||
print foo;
|
||||
print bar;
|
||||
print baz;
|
Loading…
Add table
Add a link
Reference in a new issue