mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
88 lines
2.6 KiB
C++
88 lines
2.6 KiB
C++
// See the file "COPYING" in the main distribution directory for copyright.
|
|
|
|
#ifndef pac_array_h
|
|
#define pac_array_h
|
|
|
|
#include "pac_common.h"
|
|
#include "pac_type.h"
|
|
|
|
// Fixed-length array and variable length sequence with an ending pattern
|
|
|
|
class ArrayType : public Type {
|
|
public:
|
|
ArrayType(Type* arg_elemtype, Expr* arg_length = nullptr);
|
|
~ArrayType() override;
|
|
|
|
bool DefineValueVar() const override;
|
|
string DataTypeStr() const override;
|
|
string DefaultValue() const override { return "0"; }
|
|
Type* ElementDataType() const override;
|
|
|
|
string EvalElement(const string& array, const string& index) const override;
|
|
|
|
void ProcessAttr(Attr* a) override;
|
|
|
|
void Prepare(Env* env, int flags) override;
|
|
|
|
void GenPubDecls(Output* out, Env* env) override;
|
|
void GenPrivDecls(Output* out, Env* env) override;
|
|
|
|
void GenInitCode(Output* out, Env* env) override;
|
|
void GenCleanUpCode(Output* out, Env* env) override;
|
|
|
|
int StaticSize(Env* env) const override;
|
|
|
|
void SetBoundaryChecked() override;
|
|
void GenUntilInputCheck(Output* out_cc, Env* env);
|
|
|
|
bool IsPointerType() const override { return true; }
|
|
|
|
protected:
|
|
void init();
|
|
|
|
void DoGenParseCode(Output* out, Env* env, const DataPtr& data, int flags) override;
|
|
void GenDynamicSize(Output* out, Env* env, const DataPtr& data) override;
|
|
void GenArrayLength(Output* out_cc, Env* env, const DataPtr& data);
|
|
string GenArrayInit(Output* out_cc, Env* env, bool known_array_length);
|
|
void GenElementAssignment(Output* out_cc, Env* env, string const& array_str, bool use_vector);
|
|
void GenUntilCheck(Output* out_cc, Env* env, Expr* until_condition, bool delete_elem);
|
|
|
|
bool ByteOrderSensitive() const override { return elemtype_->RequiresByteOrder(); }
|
|
bool RequiresAnalyzerContext() override;
|
|
|
|
Type* DoClone() const override;
|
|
|
|
void DoMarkIncrementalInput() override;
|
|
|
|
const ID* arraylength_var() const;
|
|
const ID* elem_it_var() const;
|
|
const ID* elem_var() const;
|
|
const ID* elem_dataptr_var() const;
|
|
const ID* elem_input_var() const;
|
|
|
|
protected:
|
|
bool DoTraverse(DataDepVisitor* visitor) override;
|
|
|
|
private:
|
|
Type* elemtype_;
|
|
Expr* length_;
|
|
|
|
string vector_str_;
|
|
string datatype_str_;
|
|
string end_of_array_loop_label_;
|
|
|
|
Field* arraylength_var_field_;
|
|
Field* elem_it_var_field_;
|
|
Field* elem_var_field_;
|
|
Field* elem_dataptr_var_field_;
|
|
Field* elem_input_var_field_;
|
|
|
|
// This does not come from &until, but is internally generated
|
|
Expr* elem_dataptr_until_expr_;
|
|
|
|
Expr* attr_generic_until_expr_;
|
|
Expr* attr_until_element_expr_;
|
|
Expr* attr_until_input_expr_;
|
|
};
|
|
|
|
#endif // pac_array_h
|