mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 00:28:21 +00:00
binpac: Initial import of Bro's binpac subdirectory from SVN r7088.
This commit is contained in:
parent
5a1c4fd5fe
commit
c8665318e6
113 changed files with 15630 additions and 0 deletions
80
tools/binpac/src/pac_withinput.cc
Normal file
80
tools/binpac/src/pac_withinput.cc
Normal file
|
@ -0,0 +1,80 @@
|
|||
#include "pac_withinput.h"
|
||||
#include "pac_dataptr.h"
|
||||
#include "pac_expr.h"
|
||||
#include "pac_inputbuf.h"
|
||||
#include "pac_output.h"
|
||||
#include "pac_type.h"
|
||||
|
||||
WithInputField::WithInputField(ID* id, Type *type, InputBuffer* input)
|
||||
: Field(WITHINPUT_FIELD,
|
||||
TYPE_TO_BE_PARSED | CLASS_MEMBER | PUBLIC_READABLE,
|
||||
id, type),
|
||||
input_(input)
|
||||
{
|
||||
ASSERT(type_);
|
||||
ASSERT(input_);
|
||||
}
|
||||
|
||||
WithInputField::~WithInputField()
|
||||
{
|
||||
delete input_;
|
||||
}
|
||||
|
||||
bool WithInputField::DoTraverse(DataDepVisitor *visitor)
|
||||
{
|
||||
return Field::DoTraverse(visitor) &&
|
||||
input()->Traverse(visitor);
|
||||
}
|
||||
|
||||
bool WithInputField::RequiresAnalyzerContext() const
|
||||
{
|
||||
return Field::RequiresAnalyzerContext() ||
|
||||
(input() && input()->RequiresAnalyzerContext());
|
||||
}
|
||||
|
||||
void WithInputField::Prepare(Env* env)
|
||||
{
|
||||
Field::Prepare(env);
|
||||
env->SetEvalMethod(id_, this);
|
||||
}
|
||||
|
||||
void WithInputField::GenEval(Output* out_cc, Env* env)
|
||||
{
|
||||
GenParseCode(out_cc, env);
|
||||
if ( type_->attr_if_expr() )
|
||||
{
|
||||
out_cc->println("BINPAC_ASSERT(%s);",
|
||||
env->RValue(type_->has_value_var()));
|
||||
}
|
||||
}
|
||||
|
||||
void WithInputField::GenParseCode(Output* out_cc, Env* env)
|
||||
{
|
||||
out_cc->println("// Parse \"%s\"", id_->Name());
|
||||
if ( type_->attr_if_expr() )
|
||||
{
|
||||
// A conditional field
|
||||
env->Evaluate(out_cc, type_->has_value_var());
|
||||
out_cc->println("if ( %s )",
|
||||
env->RValue(type_->has_value_var()));
|
||||
out_cc->inc_indent();
|
||||
out_cc->println("{");
|
||||
}
|
||||
else
|
||||
out_cc->println("{");
|
||||
|
||||
Env field_env(env, this);
|
||||
ASSERT(! type_->incremental_input());
|
||||
type_->GenPreParsing(out_cc, &field_env);
|
||||
type_->GenParseCode(out_cc, &field_env,
|
||||
input()->GenDataBeginEnd(out_cc, &field_env),
|
||||
0);
|
||||
|
||||
if ( type_->attr_if_expr() )
|
||||
{
|
||||
out_cc->println("}");
|
||||
out_cc->dec_indent();
|
||||
}
|
||||
else
|
||||
out_cc->println("}");
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue