mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
58 lines
1.5 KiB
C++
58 lines
1.5 KiB
C++
// See the file "COPYING" in the main distribution directory for copyright.
|
|
|
|
#include "zeek/ZeekArgs.h"
|
|
|
|
#include "zeek/Desc.h"
|
|
#include "zeek/ID.h"
|
|
#include "zeek/Type.h"
|
|
#include "zeek/Val.h"
|
|
|
|
namespace zeek {
|
|
|
|
Args val_list_to_args(const ValPList& vl) {
|
|
Args rval;
|
|
rval.reserve(vl.length());
|
|
|
|
for ( auto& v : vl )
|
|
rval.emplace_back(AdoptRef{}, v);
|
|
|
|
return rval;
|
|
}
|
|
|
|
VectorValPtr MakeCallArgumentVector(const Args& vals, const RecordTypePtr& types) {
|
|
static auto call_argument_vector = id::find_type<VectorType>("call_argument_vector");
|
|
|
|
auto rval = make_intrusive<VectorVal>(call_argument_vector);
|
|
|
|
for ( int i = 0; i < types->NumFields(); i++ ) {
|
|
const char* fname = types->FieldName(i);
|
|
const auto& ftype = types->GetFieldType(i);
|
|
auto fdefault = types->FieldDefault(i);
|
|
|
|
static auto call_argument = id::find_type<RecordType>("call_argument");
|
|
auto rec = make_intrusive<RecordVal>(call_argument);
|
|
rec->Assign(0, fname);
|
|
|
|
ODesc d;
|
|
d.SetShort();
|
|
ftype->Describe(&d);
|
|
rec->Assign(1, d.Description());
|
|
|
|
if ( fdefault )
|
|
rec->Assign(2, std::move(fdefault));
|
|
|
|
if ( i < static_cast<int>(vals.size()) && vals[i] )
|
|
rec->Assign(3, vals[i]);
|
|
|
|
rval->Assign(i, std::move(rec));
|
|
}
|
|
|
|
return rval;
|
|
}
|
|
|
|
VectorValPtr MakeEmptyCallArgumentVector() {
|
|
static auto call_argument_vector = id::find_type<VectorType>("call_argument_vector");
|
|
return make_intrusive<VectorVal>(call_argument_vector);
|
|
}
|
|
|
|
} // namespace zeek
|