binpac: Fix a large number of clang-tidy warnings

This commit is contained in:
Tim Wojtulewicz 2025-08-21 15:05:42 +00:00
parent 4dc546f8c8
commit 31b65f70da
48 changed files with 231 additions and 193 deletions

View file

@ -21,6 +21,7 @@ if (BUILD_STATIC_BINPAC)
target_compile_options(binpac_static PRIVATE "/J") target_compile_options(binpac_static PRIVATE "/J")
endif () endif ()
set(BinPAC_LIBRARY binpac_static CACHE STRING "BinPAC library" FORCE) set(BinPAC_LIBRARY binpac_static CACHE STRING "BinPAC library" FORCE)
zeek_target_add_linters(binpac_static)
else () else ()
add_library(binpac_lib SHARED) add_library(binpac_lib SHARED)
target_sources(binpac_lib PRIVATE ${binpac_lib_SRCS}) target_sources(binpac_lib PRIVATE ${binpac_lib_SRCS})
@ -31,6 +32,7 @@ else ()
endif () endif ()
install(TARGETS binpac_lib DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(TARGETS binpac_lib DESTINATION ${CMAKE_INSTALL_LIBDIR})
set(BinPAC_LIBRARY binpac_lib CACHE STRING "BinPAC library" FORCE) set(BinPAC_LIBRARY binpac_lib CACHE STRING "BinPAC library" FORCE)
zeek_target_add_linters(binpac_lib)
endif () endif ()
if (ZEEK_ROOT_DIR) if (ZEEK_ROOT_DIR)

View file

@ -1,8 +1,8 @@
// See the file "COPYING" in the main distribution directory for copyright. // See the file "COPYING" in the main distribution directory for copyright.
#include <stdio.h> #include <cstdio>
#include <stdlib.h> #include <cstdlib>
#include <string.h> // for memcpy #include <cstring> // for memcpy
#define binpac_regex_h #define binpac_regex_h
@ -82,7 +82,7 @@ void FlowBuffer::ResetLineState() {
case CR_OR_LF: state_ = CR_OR_LF_0; break; case CR_OR_LF: state_ = CR_OR_LF_0; break;
case STRICT_CRLF: state_ = STRICT_CRLF_0; break; case STRICT_CRLF: state_ = STRICT_CRLF_0; break;
case LINE_BREAKER: break; // Nothing to reset case LINE_BREAKER: break; // Nothing to reset
default: BINPAC_ASSERT(0); break; default: BINPAC_ASSERT(false); break;
} }
} }
@ -248,7 +248,7 @@ void FlowBuffer::MarkOrCopyLine() {
case CR_OR_LF: MarkOrCopyLine_CR_OR_LF(); break; case CR_OR_LF: MarkOrCopyLine_CR_OR_LF(); break;
case STRICT_CRLF: MarkOrCopyLine_STRICT_CRLF(); break; case STRICT_CRLF: MarkOrCopyLine_STRICT_CRLF(); break;
case LINE_BREAKER: MarkOrCopyLine_LINEBREAK(); break; case LINE_BREAKER: MarkOrCopyLine_LINEBREAK(); break;
default: BINPAC_ASSERT(0); break; default: BINPAC_ASSERT(false); break;
} }
} }

View file

@ -4,11 +4,11 @@
#include "binpac_bytestring.h" #include "binpac_bytestring.h"
#include <stdlib.h> #include <cstdlib>
namespace binpac { namespace binpac {
std::string std_string(bytestring const* s) { return std::string((const char*)s->begin(), (const char*)s->end()); } std::string std_string(bytestring const* s) { return {(const char*)s->begin(), (const char*)s->end()}; }
int bytestring_to_int(bytestring const* s) { return atoi((const char*)s->begin()); } int bytestring_to_int(bytestring const* s) { return atoi((const char*)s->begin()); }

View file

@ -11,6 +11,18 @@ else ()
set_property(SOURCE pac_scan.cc APPEND_STRING PROPERTY COMPILE_FLAGS "-Wno-sign-compare") set_property(SOURCE pac_scan.cc APPEND_STRING PROPERTY COMPILE_FLAGS "-Wno-sign-compare")
endif () endif ()
set(binpac_bison_generated_files
${CMAKE_CURRENT_BINARY_DIR}/pac_parse.cc ${CMAKE_CURRENT_BINARY_DIR}/pac_parse.h
${CMAKE_CURRENT_BINARY_DIR}/pac_scan.cc)
set_source_files_properties(${binpac_bison_generated_files} PROPERTIES SKIP_LINTING ON)
# pac_main.cc includes up pac_parse.h, and so clang-tidy reports a bunch of warnings from
# that header as part of it. adding NOLINTBEGIN/END around the include didn't resolve it.
# I fixed the findings in pac_main.cc, but am ignoring it from here on to avoid the extra
# noise.
set_source_files_properties(pac_main.cc PROPERTIES SKIP_LINTING ON)
set(binpac_SRCS set(binpac_SRCS
${BISON_PACParser_INPUT} ${BISON_PACParser_INPUT}
${FLEX_PACScanner_INPUT} ${FLEX_PACScanner_INPUT}
@ -55,7 +67,9 @@ set(binpac_SRCS
pac_exception.cc pac_exception.cc
pac_main.cc) pac_main.cc)
add_executable(binpac ${binpac_SRCS}) add_executable(binpac)
target_sources(binpac PRIVATE ${binpac_SRCS})
zeek_target_add_linters(binpac)
target_include_directories(binpac BEFORE PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(binpac BEFORE PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(binpac BEFORE PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(binpac BEFORE PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

View file

@ -11,7 +11,7 @@
#include "pac_utils.h" #include "pac_utils.h"
AnalyzerAction::AnalyzerAction(ID* action_id, When when, ActionParam* param, EmbeddedCode* code) AnalyzerAction::AnalyzerAction(ID* action_id, When when, ActionParam* param, EmbeddedCode* code)
: AnalyzerElement(ACTION), action_id_(action_id), when_(when), param_(param), code_(code), analyzer_(nullptr) {} : AnalyzerElement(ACTION), action_id_(action_id), when_(when), param_(param), code_(code) {}
AnalyzerAction::~AnalyzerAction() { AnalyzerAction::~AnalyzerAction() {
delete action_id_; delete action_id_;

View file

@ -3,6 +3,8 @@
#ifndef pac_action_h #ifndef pac_action_h
#define pac_action_h #define pac_action_h
#include <cstdint>
// Classes representing analyzer actions. // Classes representing analyzer actions.
#include "pac_analyzer.h" #include "pac_analyzer.h"
@ -10,7 +12,7 @@
class AnalyzerAction : public AnalyzerElement { class AnalyzerAction : public AnalyzerElement {
public: public:
enum When { BEFORE, AFTER }; enum When : uint8_t { BEFORE, AFTER };
AnalyzerAction(ID* action_id, When when, ActionParam* param, EmbeddedCode* code); AnalyzerAction(ID* action_id, When when, ActionParam* param, EmbeddedCode* code);
@ -35,7 +37,7 @@ private:
When when_; When when_;
ActionParam* param_; ActionParam* param_;
EmbeddedCode* code_; EmbeddedCode* code_;
AnalyzerDecl* analyzer_; AnalyzerDecl* analyzer_ = nullptr;
}; };
class ActionParam { class ActionParam {
@ -56,7 +58,7 @@ private:
class ActionParamType { class ActionParamType {
public: public:
ActionParamType(const ID* type_id, const ID* field_id = 0) : type_id_(type_id), field_id_(field_id) {} ActionParamType(const ID* type_id, const ID* field_id = nullptr) : type_id_(type_id), field_id_(field_id) {}
const ID* type_id() const { return type_id_; } const ID* type_id() const { return type_id_; }
const ID* field_id() const { return field_id_; } const ID* field_id() const { return field_id_; }

View file

@ -3,6 +3,8 @@
#ifndef pac_analyzer_h #ifndef pac_analyzer_h
#define pac_analyzer_h #define pac_analyzer_h
#include <cstdint>
#include "pac_common.h" #include "pac_common.h"
#include "pac_field.h" #include "pac_field.h"
#include "pac_typedecl.h" #include "pac_typedecl.h"
@ -16,8 +18,8 @@ class AnalyzerDataUnit;
class AnalyzerFunction; class AnalyzerFunction;
class ConnDecl; class ConnDecl;
class FlowDecl; class FlowDecl;
typedef vector<AnalyzerHelper*> AnalyzerHelperList; using AnalyzerHelperList = vector<AnalyzerHelper*>;
typedef vector<Function*> FunctionList; using FunctionList = vector<Function*>;
class AnalyzerDecl : public TypeDecl { class AnalyzerDecl : public TypeDecl {
public: public:
@ -84,7 +86,7 @@ protected:
class AnalyzerElement : public Object { class AnalyzerElement : public Object {
public: public:
enum ElementType { STATE, ACTION, FUNCTION, HELPER, FLOW, DATAUNIT }; enum ElementType : uint8_t { STATE, ACTION, FUNCTION, HELPER, FLOW, DATAUNIT };
AnalyzerElement(ElementType type) : type_(type) {} AnalyzerElement(ElementType type) : type_(type) {}
virtual ~AnalyzerElement() {} virtual ~AnalyzerElement() {}
@ -109,7 +111,7 @@ private:
// A collection of embedded C++ code // A collection of embedded C++ code
class AnalyzerHelper : public AnalyzerElement { class AnalyzerHelper : public AnalyzerElement {
public: public:
enum Type { enum Type : uint8_t {
MEMBER_DECLS, MEMBER_DECLS,
INIT_CODE, INIT_CODE,
CLEANUP_CODE, CLEANUP_CODE,
@ -140,7 +142,7 @@ public:
class AnalyzerFlow : public AnalyzerElement { class AnalyzerFlow : public AnalyzerElement {
public: public:
enum Direction { UP, DOWN }; enum Direction : uint8_t { UP, DOWN };
AnalyzerFlow(Direction dir, ID* type_id, ExprList* params); AnalyzerFlow(Direction dir, ID* type_id, ExprList* params);
~AnalyzerFlow() override; ~AnalyzerFlow() override;

View file

@ -3,10 +3,12 @@
#ifndef pac_attr_h #ifndef pac_attr_h
#define pac_attr_h #define pac_attr_h
#include <cstdint>
#include "pac_common.h" #include "pac_common.h"
#include "pac_datadep.h" #include "pac_datadep.h"
enum AttrType { enum AttrType : uint8_t {
ATTR_BYTEORDER, ATTR_BYTEORDER,
ATTR_CHECK, ATTR_CHECK,
ATTR_CHUNKED, ATTR_CHUNKED,

View file

@ -19,6 +19,7 @@ bool BuiltInType::CompatibleBuiltInTypes(BuiltInType* type1, BuiltInType* type2)
} }
static const char* basic_pactype_name[] = { static const char* basic_pactype_name[] = {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TYPE_DEF(name, pactype, ctype, size) pactype, #define TYPE_DEF(name, pactype, ctype, size) pactype,
#include "pac_type.def" #include "pac_type.def"
#undef TYPE_DEF #undef TYPE_DEF
@ -40,6 +41,7 @@ int BuiltInType::LookUpByName(const char* name) {
} }
static const char* basic_ctype_name[] = { static const char* basic_ctype_name[] = {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TYPE_DEF(name, pactype, ctype, size) ctype, #define TYPE_DEF(name, pactype, ctype, size) ctype,
#include "pac_type.def" #include "pac_type.def"
#undef TYPE_DEF #undef TYPE_DEF
@ -52,6 +54,7 @@ string BuiltInType::DataTypeStr() const { return basic_ctype_name[bit_type_]; }
int BuiltInType::StaticSize(Env* /* env */) const { int BuiltInType::StaticSize(Env* /* env */) const {
static const size_t basic_type_size[] = { static const size_t basic_type_size[] = {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TYPE_DEF(name, pactype, ctype, size) size, #define TYPE_DEF(name, pactype, ctype, size) size,
#include "pac_type.def" #include "pac_type.def"
#undef TYPE_DEF #undef TYPE_DEF

View file

@ -3,11 +3,14 @@
#ifndef pac_btype_h #ifndef pac_btype_h
#define pac_btype_h #define pac_btype_h
#include <cstdint>
#include "pac_type.h" #include "pac_type.h"
class BuiltInType : public Type { class BuiltInType : public Type {
public: public:
enum BITType { enum BITType : uint8_t {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define TYPE_DEF(name, pactype, ctype, size) name, #define TYPE_DEF(name, pactype, ctype, size) name,
#include "pac_type.def" #include "pac_type.def"
#undef TYPE_DEF #undef TYPE_DEF
@ -29,7 +32,7 @@ public:
bool IsPointerType() const override { return false; } bool IsPointerType() const override { return false; }
bool ByteOrderSensitive() const override { return StaticSize(0) >= 2; } bool ByteOrderSensitive() const override { return StaticSize(nullptr) >= 2; }
void GenInitCode(Output* out_cc, Env* env) override; void GenInitCode(Output* out_cc, Env* env) override;

View file

@ -2,7 +2,7 @@
#include "pac_case.h" #include "pac_case.h"
#include <stdint.h> #include <cstdint>
#include <limits> #include <limits>
#include "pac_btype.h" #include "pac_btype.h"

View file

@ -49,7 +49,7 @@ protected:
ID* index_var_; ID* index_var_;
CaseFieldList* cases_; CaseFieldList* cases_;
typedef map<const ID*, CaseField*, ID_ptr_cmp> member_map_t; using member_map_t = map<const ID*, CaseField*, ID_ptr_cmp>;
member_map_t member_map_; member_map_t member_map_;
}; };

View file

@ -3,9 +3,9 @@
#ifndef pac_common_h #ifndef pac_common_h
#define pac_common_h #define pac_common_h
#include <ctype.h> #include <cctype>
#include <stdlib.h> #include <cstdlib>
#include <string.h> #include <cstring>
#include <vector> #include <vector>
#include "pac_utils.h" #include "pac_utils.h"
@ -87,26 +87,28 @@ class WithInputField;
// The ID of the current declaration. // The ID of the current declaration.
extern const ID* current_decl_id; extern const ID* current_decl_id;
typedef vector<ActionParam*> ActionParamList; using ActionParamList = vector<ActionParam*>;
typedef vector<AnalyzerAction*> AnalyzerActionList; using AnalyzerActionList = vector<AnalyzerAction*>;
typedef vector<AnalyzerElement*> AnalyzerElementList; using AnalyzerElementList = vector<AnalyzerElement*>;
typedef vector<Attr*> AttrList; using AttrList = vector<Attr*>;
typedef vector<CaseExpr*> CaseExprList; using CaseExprList = vector<CaseExpr*>;
typedef vector<CaseField*> CaseFieldList; using CaseFieldList = vector<CaseField*>;
typedef vector<ContextField*> ContextFieldList; using ContextFieldList = vector<ContextField*>;
typedef vector<Decl*> DeclList; using DeclList = vector<Decl*>;
typedef vector<Enum*> EnumList; using EnumList = vector<Enum*>;
typedef vector<Expr*> ExprList; using ExprList = vector<Expr*>;
typedef vector<Field*> FieldList; using FieldList = vector<Field*>;
typedef vector<LetField*> LetFieldList; using LetFieldList = vector<LetField*>;
typedef vector<Number*> NumList; using NumList = vector<Number*>;
typedef vector<Param*> ParamList; using ParamList = vector<Param*>;
typedef vector<RecordField*> RecordFieldList; using RecordFieldList = vector<RecordField*>;
typedef vector<StateVar*> StateVarList; using StateVarList = vector<StateVar*>;
// NOLINTBEGIN(cppcoreguidelines-macro-usage,modernize-loop-convert)
#define foreach(i, ct, pc) \ #define foreach(i, ct, pc) \
if ( pc ) \ if ( pc ) \
for ( ct::iterator i = (pc)->begin(); i != (pc)->end(); ++i ) for ( ct::iterator i = (pc)->begin(); (i) != (pc)->end(); ++(i) )
// NOLINTEND(cppcoreguidelines-macro-usage,modernize-loop-convert)
template<typename T> template<typename T>
constexpr void delete_list(T* container) { constexpr void delete_list(T* container) {
@ -117,17 +119,17 @@ constexpr void delete_list(T* container) {
} }
// Constants // Constants
const char* const kComputeFrameLength = "compute_frame_length"; constexpr char kComputeFrameLength[] = "compute_frame_length";
const char* const kFlowBufferClass = "FlowBuffer"; constexpr char kFlowBufferClass[] = "FlowBuffer";
const char* const kFlowBufferVar = "flow_buffer"; constexpr char kFlowBufferVar[] = "flow_buffer";
const char* const kFlowEOF = "FlowEOF"; constexpr char kFlowEOF[] = "FlowEOF";
const char* const kFlowGap = "NewGap"; constexpr char kFlowGap[] = "NewGap";
const char* const kInitialBufferLengthFunc = "initial_buffer_length"; constexpr char kInitialBufferLengthFunc[] = "initial_buffer_length";
const char* const kNeedMoreData = "need_more_data"; constexpr char kNeedMoreData[] = "need_more_data";
const char* const kNewData = "NewData"; constexpr char kNewData[] = "NewData";
const char* const kParseFuncWithBuffer = "ParseBuffer"; constexpr char kParseFuncWithBuffer[] = "ParseBuffer";
const char* const kParseFuncWithoutBuffer = "Parse"; constexpr char kParseFuncWithoutBuffer[] = "Parse";
const char* const kRefCountClass = "binpac::RefCount"; constexpr char kRefCountClass[] = "binpac::RefCount";
const char* const kTypeWithLengthClass = "binpac::TypeWithLength"; constexpr char kTypeWithLengthClass[] = "binpac::TypeWithLength";
#endif // pac_common_h #endif // pac_common_h

View file

@ -26,7 +26,7 @@ ConnDecl::~ConnDecl() {
} }
void ConnDecl::AddBaseClass(vector<string>* base_classes) const { void ConnDecl::AddBaseClass(vector<string>* base_classes) const {
base_classes->push_back("binpac::ConnectionAnalyzer"); base_classes->emplace_back("binpac::ConnectionAnalyzer");
} }
void ConnDecl::ProcessFlowElement(AnalyzerFlow* flow_elem) { void ConnDecl::ProcessFlowElement(AnalyzerFlow* flow_elem) {

View file

@ -77,7 +77,7 @@ int expand_escape(const char*& s) {
} // namespace } // namespace
ConstString::ConstString(const string& s) : str_(s) { ConstString::ConstString(string s) : str_(std::move(s)) {
// Copied from scan.l of Zeek // Copied from scan.l of Zeek
try { try {
const char* text = str_.c_str(); const char* text = str_.c_str();

View file

@ -7,7 +7,7 @@
class ConstString : public Object { class ConstString : public Object {
public: public:
ConstString(const string& s); ConstString(string s);
// The string in its escaped form, with surrounding '"'s // The string in its escaped form, with surrounding '"'s
const string& str() const { return str_; } const string& str() const { return str_; }

View file

@ -6,7 +6,7 @@
#include "pac_id.h" #include "pac_id.h"
#include "pac_type.h" #include "pac_type.h"
DataDepElement::DataDepElement(DDE_Type type) : dde_type_(type), in_traversal(false) {} DataDepElement::DataDepElement(DDE_Type type) : dde_type_(type) {}
bool DataDepElement::Traverse(DataDepVisitor* visitor) { bool DataDepElement::Traverse(DataDepVisitor* visitor) {
// Avoid infinite loop // Avoid infinite loop

View file

@ -3,17 +3,18 @@
#ifndef pac_datadep_h #ifndef pac_datadep_h
#define pac_datadep_h #define pac_datadep_h
#include <cstdint>
// To provide a way to traverse through the data dependency graph. // To provide a way to traverse through the data dependency graph.
// That is, to evaluate X, what must be evaluated. // That is, to evaluate X, what must be evaluated.
#include "pac_common.h" #include "pac_common.h"
#include "pac_dbg.h"
class DataDepVisitor; class DataDepVisitor;
class DataDepElement { class DataDepElement {
public: public:
enum DDE_Type { enum DDE_Type : uint8_t {
ATTR, ATTR,
CASEEXPR, CASEEXPR,
EXPR, EXPR,
@ -38,7 +39,7 @@ public:
protected: protected:
DDE_Type dde_type_; DDE_Type dde_type_;
bool in_traversal; bool in_traversal = false;
}; };
class DataDepVisitor { class DataDepVisitor {
@ -51,8 +52,6 @@ public:
class RequiresAnalyzerContext : public DataDepVisitor { class RequiresAnalyzerContext : public DataDepVisitor {
public: public:
RequiresAnalyzerContext() : requires_analyzer_context_(false) {}
// Returns whether to continue traversal // Returns whether to continue traversal
bool PreProcess(DataDepElement* element) override; bool PreProcess(DataDepElement* element) override;
bool PostProcess(DataDepElement* element) override; bool PostProcess(DataDepElement* element) override;
@ -64,7 +63,7 @@ public:
protected: protected:
void ProcessExpr(Expr* expr); void ProcessExpr(Expr* expr);
bool requires_analyzer_context_; bool requires_analyzer_context_ = false;
}; };
#endif // pac_datadep_h #endif // pac_datadep_h

View file

@ -17,6 +17,9 @@ public:
DataPtr(DataPtr const& x) { *this = x; } DataPtr(DataPtr const& x) { *this = x; }
DataPtr const& operator=(DataPtr const& x) { DataPtr const& operator=(DataPtr const& x) {
if ( this == &x )
return *this;
id_ = x.id(); id_ = x.id();
offset_ = x.offset(); offset_ = x.offset();
ptr_expr_ = x.ptr_expr(); ptr_expr_ = x.ptr_expr();

View file

@ -3,6 +3,8 @@
#ifndef pac_dataunit_h #ifndef pac_dataunit_h
#define pac_dataunit_h #define pac_dataunit_h
#include <cstdint>
#include "pac_analyzer.h" #include "pac_analyzer.h"
// The type and parameters of input data unit of a flow. For instance, the // The type and parameters of input data unit of a flow. For instance, the
@ -10,7 +12,7 @@
class AnalyzerDataUnit : public AnalyzerElement { class AnalyzerDataUnit : public AnalyzerElement {
public: public:
enum DataUnitType { DATAGRAM, FLOWUNIT }; enum DataUnitType : uint8_t { DATAGRAM, FLOWUNIT };
AnalyzerDataUnit(DataUnitType type, ID* id, ExprList* type_params, ExprList* context_params); AnalyzerDataUnit(DataUnitType type, ID* id, ExprList* type_params, ExprList* context_params);
~AnalyzerDataUnit() override; ~AnalyzerDataUnit() override;

View file

@ -8,7 +8,8 @@
extern bool FLAGS_pac_debug; extern bool FLAGS_pac_debug;
#define ASSERT(x) assert(x) constexpr void ASSERT(bool flag) { assert(flag); }
constexpr void ASSERT(int flag) { assert(flag); }
#define DEBUG_MSG(...) \ #define DEBUG_MSG(...) \
if ( FLAGS_pac_debug ) \ if ( FLAGS_pac_debug ) \
fprintf(stderr, __VA_ARGS__) fprintf(stderr, __VA_ARGS__)

View file

@ -19,15 +19,13 @@
DeclList* Decl::decl_list_ = nullptr; DeclList* Decl::decl_list_ = nullptr;
Decl::DeclMap Decl::decl_map_; Decl::DeclMap Decl::decl_map_;
Decl::Decl(ID* id, DeclType decl_type) : id_(id), decl_type_(decl_type), attrlist_(nullptr) { Decl::Decl(ID* id, DeclType decl_type) : id_(id), decl_type_(decl_type) {
decl_map_[id_] = this; decl_map_[id_] = this;
if ( ! decl_list_ ) if ( ! decl_list_ )
decl_list_ = new DeclList(); decl_list_ = new DeclList();
decl_list_->push_back(this); decl_list_->push_back(this);
DEBUG_MSG("Finished Decl %s\n", id_->Name()); DEBUG_MSG("Finished Decl %s\n", id_->Name());
analyzer_context_ = nullptr;
} }
Decl::~Decl() { Decl::~Decl() {

View file

@ -3,6 +3,8 @@
#ifndef pac_decl_h #ifndef pac_decl_h
#define pac_decl_h #define pac_decl_h
#include <cstdint>
#include "pac_common.h" #include "pac_common.h"
#include "pac_id.h" #include "pac_id.h"
@ -10,7 +12,7 @@ class Decl : public Object {
public: public:
// Note: ANALYZER is not for AnalyzerDecl (which is an // Note: ANALYZER is not for AnalyzerDecl (which is an
// abstract class) , but for AnalyzerContextDecl. // abstract class) , but for AnalyzerContextDecl.
enum DeclType { ENUM, LET, TYPE, FUNC, CONN, FLOW, ANALYZER, HELPER, REGEX }; enum DeclType : uint8_t { ENUM, LET, TYPE, FUNC, CONN, FLOW, ANALYZER, HELPER, REGEX };
Decl(ID* id, DeclType decl_type); Decl(ID* id, DeclType decl_type);
virtual ~Decl(); virtual ~Decl();
@ -41,8 +43,8 @@ protected:
ID* id_; ID* id_;
DeclType decl_type_; DeclType decl_type_;
AttrList* attrlist_; AttrList* attrlist_ = nullptr;
AnalyzerContextDecl* analyzer_context_; AnalyzerContextDecl* analyzer_context_ = nullptr;
public: public:
static void ProcessDecls(Output* out_h, Output* out_cc); static void ProcessDecls(Output* out_h, Output* out_cc);
@ -50,13 +52,13 @@ public:
private: private:
static DeclList* decl_list_; static DeclList* decl_list_;
typedef map<const ID*, Decl*, ID_ptr_cmp> DeclMap; using DeclMap = map<const ID*, Decl*, ID_ptr_cmp>;
static DeclMap decl_map_; static DeclMap decl_map_;
}; };
class HelperDecl : public Decl { class HelperDecl : public Decl {
public: public:
enum HelperType { enum HelperType : uint8_t {
HEADER, HEADER,
CODE, CODE,
EXTERN, EXTERN,

View file

@ -6,7 +6,7 @@
#include "pac_output.h" #include "pac_output.h"
#include "pac_primitive.h" #include "pac_primitive.h"
EmbeddedCodeSegment::EmbeddedCodeSegment(const string& s) : s_(s), primitive_(nullptr) {} EmbeddedCodeSegment::EmbeddedCodeSegment(string s) : s_(std::move(s)), primitive_(nullptr) {}
EmbeddedCodeSegment::EmbeddedCodeSegment(PacPrimitive* primitive) : s_(""), primitive_(primitive) {} EmbeddedCodeSegment::EmbeddedCodeSegment(PacPrimitive* primitive) : s_(""), primitive_(primitive) {}

View file

@ -7,7 +7,7 @@
class EmbeddedCodeSegment { class EmbeddedCodeSegment {
public: public:
explicit EmbeddedCodeSegment(const string& s); explicit EmbeddedCodeSegment(string s);
explicit EmbeddedCodeSegment(PacPrimitive* primitive); explicit EmbeddedCodeSegment(PacPrimitive* primitive);
~EmbeddedCodeSegment(); ~EmbeddedCodeSegment();
@ -18,7 +18,7 @@ private:
PacPrimitive* primitive_; PacPrimitive* primitive_;
}; };
typedef vector<EmbeddedCodeSegment*> EmbeddedCodeSegmentList; using EmbeddedCodeSegmentList = vector<EmbeddedCodeSegment*>;
class EmbeddedCode : public Object { class EmbeddedCode : public Object {
public: public:

View file

@ -7,7 +7,7 @@
class Enum { class Enum {
public: public:
Enum(ID* id, Expr* expr = 0); Enum(ID* id, Expr* expr = nullptr);
~Enum(); ~Enum();
void GenHeader(Output* out_h, int* pval); void GenHeader(Output* out_h, int* pval);

View file

@ -45,6 +45,7 @@ string EvalExprList(ExprList* exprlist, Output* out, Env* env) {
} }
static const char* expr_fmt[] = { static const char* expr_fmt[] = {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define EXPR_DEF(type, num_op, fmt) fmt, #define EXPR_DEF(type, num_op, fmt) fmt,
#include "pac_expr.def" #include "pac_expr.def"
#undef EXPR_DEF #undef EXPR_DEF
@ -311,11 +312,11 @@ void Expr::GenEval(Output* out_cc, Env* env) {
Type* ty; Type* ty;
try { try {
if ( (rf = GetRecordField(id, env)) != nullptr ) { if ( rf = GetRecordField(id, env); rf != nullptr ) {
str_ = strfmt("%s", rf->FieldSize(out_cc, env)); str_ = strfmt("%s", rf->FieldSize(out_cc, env));
} }
} catch ( ExceptionIDNotFound& e ) { } catch ( ExceptionIDNotFound& e ) {
if ( (ty = TypeDecl::LookUpType(id)) != nullptr ) { if ( ty = TypeDecl::LookUpType(id); ty != nullptr ) {
int ty_size = ty->StaticSize(global_env()); int ty_size = ty->StaticSize(global_env());
if ( ty_size >= 0 ) if ( ty_size >= 0 )
str_ = strfmt("%d", ty_size); str_ = strfmt("%d", ty_size);
@ -339,9 +340,9 @@ void Expr::GenEval(Output* out_cc, Env* env) {
default: default:
// Evaluate every operand by default // Evaluate every operand by default
for ( int i = 0; i < 3; ++i ) for ( auto& op : operand_ )
if ( operand_[i] ) if ( op )
operand_[i]->GenEval(out_cc, env); op->GenEval(out_cc, env);
GenStrFromFormat(env); GenStrFromFormat(env);
break; break;
} }
@ -373,9 +374,9 @@ void Expr::ForceIDEval(Output* out_cc, Env* env) {
default: default:
// Evaluate every operand by default // Evaluate every operand by default
for ( int i = 0; i < 3; ++i ) for ( auto& op : operand_ )
if ( operand_[i] ) if ( op )
operand_[i]->ForceIDEval(out_cc, env); op->ForceIDEval(out_cc, env);
break; break;
} }
} }
@ -670,14 +671,14 @@ int Expr::MinimalHeaderSize(Env* env) {
RecordField* rf; RecordField* rf;
Type* ty; Type* ty;
if ( (rf = GetRecordField(id, env)) != nullptr ) { if ( rf = GetRecordField(id, env); rf != nullptr ) {
if ( rf->StaticSize(env, -1) >= 0 ) if ( rf->StaticSize(env, -1) >= 0 )
mhs = 0; mhs = 0;
else else
mhs = mhs_recordfield(env, rf); mhs = mhs_recordfield(env, rf);
} }
else if ( (ty = TypeDecl::LookUpType(id)) != nullptr ) { else if ( ty = TypeDecl::LookUpType(id); ty != nullptr ) {
mhs = 0; mhs = 0;
} }
@ -703,25 +704,24 @@ int Expr::MinimalHeaderSize(Env* env) {
case EXPR_CALLARGS: { case EXPR_CALLARGS: {
mhs = 0; mhs = 0;
if ( args_ ) if ( args_ )
for ( unsigned int i = 0; i < args_->size(); ++i ) for ( const auto& arg : *args_ )
mhs = mhs_max(mhs, (*args_)[i]->MinimalHeaderSize(env)); mhs = mhs_max(mhs, arg->MinimalHeaderSize(env));
} break; } break;
case EXPR_CASE: { case EXPR_CASE: {
mhs = operand_[0]->MinimalHeaderSize(env); mhs = operand_[0]->MinimalHeaderSize(env);
for ( unsigned int i = 0; i < cases_->size(); ++i ) { for ( const auto& ce : *cases_ ) {
CaseExpr* ce = (*cases_)[i];
if ( ce->index() ) if ( ce->index() )
for ( unsigned int j = 0; j < ce->index()->size(); ++j ) for ( const auto& idx : *(ce->index()) )
mhs = mhs_max(mhs, (*ce->index())[j]->MinimalHeaderSize(env)); mhs = mhs_max(mhs, idx->MinimalHeaderSize(env));
mhs = mhs_max(mhs, ce->value()->MinimalHeaderSize(env)); mhs = mhs_max(mhs, ce->value()->MinimalHeaderSize(env));
} }
} break; } break;
default: default:
// Evaluate every operand by default // Evaluate every operand by default
mhs = 0; mhs = 0;
for ( int i = 0; i < 3; ++i ) for ( auto& op : operand_ )
if ( operand_[i] ) if ( op )
mhs = mhs_max(mhs, operand_[i]->MinimalHeaderSize(env)); mhs = mhs_max(mhs, op->MinimalHeaderSize(env));
break; break;
} }
@ -750,8 +750,8 @@ bool Expr::HasReference(const ID* id) const {
default: default:
// Evaluate every operand by default // Evaluate every operand by default
for ( int i = 0; i < 3; ++i ) { for ( auto& op : operand_ ) {
if ( operand_[i] && operand_[i]->HasReference(id) ) { if ( op && op->HasReference(id) ) {
return true; return true;
} }
} }
@ -788,8 +788,8 @@ bool Expr::DoTraverse(DataDepVisitor* visitor) {
default: default:
// Evaluate every operand by default // Evaluate every operand by default
for ( int i = 0; i < 3; ++i ) { for ( auto& op : operand_ ) {
if ( operand_[i] && ! operand_[i]->Traverse(visitor) ) { if ( op && ! op->Traverse(visitor) ) {
return false; return false;
} }
} }
@ -828,9 +828,9 @@ bool Expr::RequiresAnalyzerContext() const {
default: default:
// Evaluate every operand by default // Evaluate every operand by default
for ( int i = 0; i < 3; ++i ) for ( auto& op : operand_ )
if ( operand_[i] && operand_[i]->RequiresAnalyzerContext() ) { if ( op && op->RequiresAnalyzerContext() ) {
DEBUG_MSG("'%s' requires analyzer context\n", operand_[i]->orig()); DEBUG_MSG("'%s' requires analyzer context\n", op->orig());
return true; return true;
} }
return false; return false;

View file

@ -13,6 +13,7 @@ class CaseExpr;
class Expr : public Object, public DataDepElement { class Expr : public Object, public DataDepElement {
public: public:
enum ExprType : uint8_t { enum ExprType : uint8_t {
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
#define EXPR_DEF(type, x, y) type, #define EXPR_DEF(type, x, y) type,
#include "pac_expr.def" #include "pac_expr.def"
#undef EXPR_DEF #undef EXPR_DEF

View file

@ -3,6 +3,8 @@
#ifndef pac_exttype_h #ifndef pac_exttype_h
#define pac_exttype_h #define pac_exttype_h
#include <cstdint>
#include "pac_type.h" #include "pac_type.h"
// ExternType represent external C++ types that are not defined in // ExternType represent external C++ types that are not defined in
@ -12,7 +14,7 @@
class ExternType : public Type { class ExternType : public Type {
public: public:
enum EXTType { PLAIN, NUMBER, POINTER, BOOLEAN }; enum EXTType : uint8_t { PLAIN, NUMBER, POINTER, BOOLEAN };
ExternType(const ID* id, EXTType ext_type) : Type(EXTERN), id_(id), ext_type_(ext_type) {} ExternType(const ID* id, EXTType ext_type) : Type(EXTERN), id_(id), ext_type_(ext_type) {}
bool DefineValueVar() const override; bool DefineValueVar() const override;

View file

@ -3,12 +3,14 @@
#ifndef pac_field_h #ifndef pac_field_h
#define pac_field_h #define pac_field_h
#include <cstdint>
#include "pac_common.h" #include "pac_common.h"
#include "pac_datadep.h" #include "pac_datadep.h"
// A "field" is a member of class. // A "field" is a member of class.
enum FieldType { enum FieldType : uint8_t {
CASE_FIELD, CASE_FIELD,
CONTEXT_FIELD, CONTEXT_FIELD,
FLOW_FIELD, FLOW_FIELD,

View file

@ -38,7 +38,7 @@ ParameterizedType* FlowDecl::flow_buffer_type() {
return flow_buffer_type_; return flow_buffer_type_;
} }
void FlowDecl::AddBaseClass(vector<string>* base_classes) const { base_classes->push_back("binpac::FlowAnalyzer"); } void FlowDecl::AddBaseClass(vector<string>* base_classes) const { base_classes->emplace_back("binpac::FlowAnalyzer"); }
void FlowDecl::ProcessFlowElement(AnalyzerFlow* flow_elem) { void FlowDecl::ProcessFlowElement(AnalyzerFlow* flow_elem) {
throw Exception(flow_elem, "flow should be defined in only a connection declaration"); throw Exception(flow_elem, "flow should be defined in only a connection declaration");

View file

@ -8,11 +8,7 @@
#include "pac_param.h" #include "pac_param.h"
#include "pac_type.h" #include "pac_type.h"
Function::Function(ID* id, Type* type, ParamList* params) Function::Function(ID* id, Type* type, ParamList* params) : id_(id), type_(type), params_(params) {}
: id_(id), type_(type), params_(params), expr_(nullptr), code_(nullptr) {
analyzer_decl_ = nullptr;
env_ = nullptr;
}
Function::~Function() { Function::~Function() {
delete id_; delete id_;

View file

@ -27,16 +27,16 @@ public:
void GenCode(Output* out_h, Output* out_cc); void GenCode(Output* out_h, Output* out_cc);
private: private:
Env* env_; Env* env_ = nullptr;
ID* id_; ID* id_;
Type* type_; Type* type_;
ParamList* params_; ParamList* params_;
AnalyzerDecl* analyzer_decl_; AnalyzerDecl* analyzer_decl_ = nullptr;
Expr* expr_; Expr* expr_ = nullptr;
EmbeddedCode* code_; EmbeddedCode* code_ = nullptr;
}; };
class FuncDecl : public Decl { class FuncDecl : public Decl {

View file

@ -168,9 +168,9 @@ Env::Env(Env* parent_env, Object* context_object) : parent(parent_env), context_
} }
Env::~Env() { Env::~Env() {
for ( id_map_t::iterator it = id_map.begin(); it != id_map.end(); ++it ) { for ( auto& id : id_map ) {
delete it->second; delete id.second;
it->second = 0; id.second = nullptr;
} }
} }
@ -365,8 +365,8 @@ Env* global_env() {
the_global_env->AddConstID(null_id, 0, extern_type_nullptr); the_global_env->AddConstID(null_id, 0, extern_type_nullptr);
#if 0 #if 0
the_global_env->AddID(null_byteseg_id, the_global_env->AddID(null_byteseg_id,
GLOBAL_VAR, GLOBAL_VAR,
extern_type_const_byteseg); extern_type_const_byteseg);
#endif #endif
} }

View file

@ -3,6 +3,7 @@
#ifndef pac_id_h #ifndef pac_id_h
#define pac_id_h #define pac_id_h
#include <cstdint>
#include <map> #include <map>
#include <string> #include <string>
using namespace std; using namespace std;
@ -24,7 +25,7 @@ using namespace std;
// Env -- a mapping from ID names to their L/R-value expressions and evaluation // Env -- a mapping from ID names to their L/R-value expressions and evaluation
// methods. // methods.
enum IDType { enum IDType : uint8_t {
CONST, CONST,
GLOBAL_VAR, GLOBAL_VAR,
TEMP_VAR, TEMP_VAR,
@ -44,7 +45,7 @@ class Evaluatable;
class ID : public Object { class ID : public Object {
public: public:
ID(string arg_name) : name(arg_name), anonymous_id_(false) { locname = nfmt("%s:%s", Location(), Name()); } ID(string arg_name) : name(std::move(arg_name)) { locname = nfmt("%s:%s", Location(), Name()); }
~ID() { delete[] locname; } ~ID() { delete[] locname; }
bool operator==(ID const& x) const { return name == x.Name(); } bool operator==(ID const& x) const { return name == x.Name(); }
@ -57,8 +58,8 @@ public:
protected: protected:
string name; string name;
bool anonymous_id_; bool anonymous_id_ = false;
char* locname; char* locname = nullptr;
friend class ID_ptr_cmp; friend class ID_ptr_cmp;
public: public:
@ -146,7 +147,7 @@ public:
void set_in_branch(bool x) { in_branch_ = x; } void set_in_branch(bool x) { in_branch_ = x; }
void AddID(const ID* id, IDType id_type, Type* type); void AddID(const ID* id, IDType id_type, Type* type);
void AddConstID(const ID* id, const int c, Type* type = 0); void AddConstID(const ID* id, const int c, Type* type = nullptr);
void AddMacro(const ID* id, Expr* expr); void AddMacro(const ID* id, Expr* expr);
// Generate a temp ID with a unique name // Generate a temp ID with a unique name
@ -192,7 +193,7 @@ protected:
private: private:
Env* parent; Env* parent;
Object* context_object_; Object* context_object_;
typedef map<const ID*, IDRecord*, ID_ptr_cmp> id_map_t; using id_map_t = map<const ID*, IDRecord*, ID_ptr_cmp>;
id_map_t id_map; id_map_t id_map;
bool allow_undefined_id_; bool allow_undefined_id_;
bool in_branch_; bool in_branch_;

View file

@ -31,5 +31,5 @@ DataPtr InputBuffer::GenDataBeginEnd(Output* out_cc, Env* env) {
env->SetEvaluated(begin_of_data); env->SetEvaluated(begin_of_data);
env->SetEvaluated(end_of_data); env->SetEvaluated(end_of_data);
return DataPtr(env, begin_of_data, 0); return {env, begin_of_data, 0};
} }

View file

@ -1,7 +1,7 @@
// See the file "COPYING" in the main distribution directory for copyright. // See the file "COPYING" in the main distribution directory for copyright.
#include <ctype.h>
#include <unistd.h> #include <unistd.h>
#include <cctype>
#include "pac_common.h" #include "pac_common.h"
#include "pac_decl.h" #include "pac_decl.h"
@ -9,7 +9,9 @@
#include "pac_exttype.h" #include "pac_exttype.h"
#include "pac_id.h" #include "pac_id.h"
#include "pac_output.h" #include "pac_output.h"
// NOLINTBEGIN
#include "pac_parse.h" #include "pac_parse.h"
// NOLINTEND
#include "pac_type.h" #include "pac_type.h"
#include "pac_utils.h" #include "pac_utils.h"
@ -27,7 +29,8 @@ Output* header_output = nullptr;
Output* source_output = nullptr; Output* source_output = nullptr;
void add_to_include_directories(string dirs) { void add_to_include_directories(string dirs) {
unsigned int dir_begin = 0, dir_end; unsigned int dir_begin = 0;
unsigned int dir_end = 0;
while ( dir_begin < dirs.length() ) { while ( dir_begin < dirs.length() ) {
for ( dir_end = dir_begin; dir_end < dirs.length(); ++dir_end ) for ( dir_end = dir_begin; dir_end < dirs.length(); ++dir_end )
if ( dirs[dir_end] == ':' ) if ( dirs[dir_end] == ':' )

View file

@ -2,10 +2,10 @@
#include "pac_output.h" #include "pac_output.h"
#include <errno.h> #include <cerrno>
#include <stdarg.h> #include <cstdarg>
#include <stdio.h> #include <cstdio>
#include <string.h> #include <cstring>
#include "pac_utils.h" #include "pac_utils.h"

View file

@ -1,7 +1,7 @@
%token TOK_TYPE TOK_RECORD TOK_CASE TOK_ENUM TOK_LET TOK_FUNCTION %token TOK_TYPE TOK_RECORD TOK_CASE TOK_ENUM TOK_LET TOK_FUNCTION
%token TOK_REFINE TOK_CASEFUNC TOK_CASETYPE TOK_TYPEATTR %token TOK_REFINE TOK_CASEFUNC TOK_CASETYPE TOK_TYPEATTR
%token TOK_HELPERHEADER TOK_HELPERCODE %token TOK_HELPERHEADER TOK_HELPERCODE
%token TOK_RIGHTARROW TOK_DEFAULT TOK_OF %token TOK_RIGHTARROW TOK_DEFAULT TOK_OF
%token TOK_PADDING TOK_TO TOK_ALIGN %token TOK_PADDING TOK_TO TOK_ALIGN
%token TOK_WITHINPUT %token TOK_WITHINPUT
%token TOK_INT8 TOK_INT16 TOK_INT32 TOK_INT64 %token TOK_INT8 TOK_INT16 TOK_INT32 TOK_INT64
@ -11,19 +11,19 @@
%token TOK_ATTR_ALSO %token TOK_ATTR_ALSO
%token TOK_ATTR_BYTEORDER TOK_ATTR_CHECK TOK_ATTR_CHUNKED TOK_ATTR_ENFORCE %token TOK_ATTR_BYTEORDER TOK_ATTR_CHECK TOK_ATTR_CHUNKED TOK_ATTR_ENFORCE
%token TOK_ATTR_EXPORTSOURCEDATA TOK_ATTR_IF %token TOK_ATTR_EXPORTSOURCEDATA TOK_ATTR_IF
%token TOK_ATTR_LENGTH TOK_ATTR_LET %token TOK_ATTR_LENGTH TOK_ATTR_LET
%token TOK_ATTR_LINEBREAKER TOK_ATTR_MULTILINE TOK_ATTR_ONELINE %token TOK_ATTR_LINEBREAKER TOK_ATTR_MULTILINE TOK_ATTR_ONELINE
%token TOK_ATTR_REFCOUNT TOK_ATTR_REQUIRES %token TOK_ATTR_REFCOUNT TOK_ATTR_REQUIRES
%token TOK_ATTR_RESTOFDATA TOK_ATTR_RESTOFFLOW %token TOK_ATTR_RESTOFDATA TOK_ATTR_RESTOFFLOW
%token TOK_ATTR_TRANSIENT TOK_ATTR_UNTIL %token TOK_ATTR_TRANSIENT TOK_ATTR_UNTIL
%token TOK_ANALYZER TOK_CONNECTION TOK_FLOW %token TOK_ANALYZER TOK_CONNECTION TOK_FLOW
%token TOK_STATE TOK_ACTION TOK_WHEN TOK_HELPER %token TOK_STATE TOK_ACTION TOK_WHEN TOK_HELPER
%token TOK_DATAUNIT TOK_FLOWDIR TOK_WITHCONTEXT %token TOK_DATAUNIT TOK_FLOWDIR TOK_WITHCONTEXT
%token TOK_LPB_EXTERN TOK_LPB_HEADER TOK_LPB_CODE %token TOK_LPB_EXTERN TOK_LPB_HEADER TOK_LPB_CODE
%token TOK_LPB_MEMBER TOK_LPB_INIT TOK_LPB_CLEANUP TOK_LPB_EOF %token TOK_LPB_MEMBER TOK_LPB_INIT TOK_LPB_CLEANUP TOK_LPB_EOF
%token TOK_LPB TOK_RPB %token TOK_LPB TOK_RPB
%token TOK_EMBEDDED_ATOM TOK_EMBEDDED_STRING %token TOK_EMBEDDED_ATOM TOK_EMBEDDED_STRING
%token TOK_PAC_VAL TOK_PAC_SET TOK_PAC_TYPE TOK_PAC_TYPEOF TOK_PAC_CONST_DEF %token TOK_PAC_VAL TOK_PAC_SET TOK_PAC_TYPE TOK_PAC_TYPEOF TOK_PAC_CONST_DEF
%token TOK_END_PAC %token TOK_END_PAC
%token TOK_EXTERN TOK_NULLPTR %token TOK_EXTERN TOK_NULLPTR
@ -35,7 +35,7 @@
%left TOK_AND %left TOK_AND
%nonassoc TOK_EQUAL TOK_NEQ TOK_LE TOK_GE '<' '>' %nonassoc TOK_EQUAL TOK_NEQ TOK_LE TOK_GE '<' '>'
%left '&' '|' '^' %left '&' '|' '^'
%left TOK_LSHIFT TOK_RSHIFT %left TOK_LSHIFT TOK_RSHIFT
%left '+' '-' %left '+' '-'
%left '*' '/' '%' %left '*' '/' '%'
%right '~' '!' %right '~' '!'
@ -64,14 +64,14 @@
%type <field> withinputfield letfield %type <field> withinputfield letfield
%type <fieldlist> letfieldlist %type <fieldlist> letfieldlist
%type <function> funcproto function %type <function> funcproto function
%type <id> TOK_ID tok_id optfieldid %type <id> TOK_ID tok_id optfieldid
%type <input> input %type <input> input
%type <nullp> TOK_NULLPTR %type <nullp> TOK_NULLPTR
%type <num> TOK_NUMBER %type <num> TOK_NUMBER
%type <pacprimitive> embedded_pac_primitive %type <pacprimitive> embedded_pac_primitive
%type <param> param %type <param> param
%type <paramlist> optparams paramlist %type <paramlist> optparams paramlist
%type <recordfield> recordfield recordfield0 padding %type <recordfield> recordfield recordfield0 padding
%type <recordfieldlist> recordfieldlist %type <recordfieldlist> recordfieldlist
%type <regex> regex %type <regex> regex
%type <statevar> statevar %type <statevar> statevar
@ -262,15 +262,15 @@ decl_with_attr : TOK_TYPE tok_id { current_decl_id = $2; } optparams '=' type
decl_without_attr: TOK_LPB_HEADER embedded_code TOK_RPB decl_without_attr: TOK_LPB_HEADER embedded_code TOK_RPB
{ {
$$ = new HelperDecl(HelperDecl::HEADER, 0, $2); $$ = new HelperDecl(HelperDecl::HEADER, nullptr, $2);
} }
| TOK_LPB_CODE embedded_code TOK_RPB | TOK_LPB_CODE embedded_code TOK_RPB
{ {
$$ = new HelperDecl(HelperDecl::CODE, 0, $2); $$ = new HelperDecl(HelperDecl::CODE, nullptr, $2);
} }
| TOK_LPB_EXTERN embedded_code TOK_RPB | TOK_LPB_EXTERN embedded_code TOK_RPB
{ {
$$ = new HelperDecl(HelperDecl::EXTERN, 0, $2); $$ = new HelperDecl(HelperDecl::EXTERN, nullptr, $2);
} }
| TOK_REFINE TOK_TYPEATTR tok_id TOK_PLUSEQ attrlist | TOK_REFINE TOK_TYPEATTR tok_id TOK_PLUSEQ attrlist
{ {
@ -359,11 +359,11 @@ optparams : '(' paramlist ')'
} }
| /* empty */ | /* empty */
{ {
$$ = 0; $$ = nullptr;
} }
; ;
paramlist : paramlist ',' param paramlist : paramlist ',' param
{ {
$1->push_back($3); $1->push_back($3);
$$ = $1; $$ = $1;
@ -387,7 +387,7 @@ param : tok_id ':' type2
optinit : /* nothing */ optinit : /* nothing */
{ {
$$ = 0; $$ = nullptr;
} }
| '=' expr | '=' expr
{ {
@ -397,7 +397,7 @@ optinit : /* nothing */
opttype : /* nothing */ opttype : /* nothing */
{ {
$$ = 0; $$ = nullptr;
} }
| ':' type2 | ':' type2
{ {
@ -465,7 +465,7 @@ recordfieldlist : recordfieldlist recordfield ';'
$1->push_back($2); $1->push_back($2);
$$ = $1; $$ = $1;
} }
| /* empty */ | /* empty */
{ {
$$ = new RecordFieldList(); $$ = new RecordFieldList();
} }
@ -526,7 +526,7 @@ casefieldlist : casefieldlist casefield ';'
$1->push_back($2); $1->push_back($2);
$$ = $1; $$ = $1;
} }
| /* empty */ | /* empty */
{ {
$$ = new CaseFieldList(); $$ = new CaseFieldList();
} }
@ -534,7 +534,7 @@ casefieldlist : casefieldlist casefield ';'
casefield : casefield0 optattrs casefield : casefield0 optattrs
{ {
$1->AddAttr($2); $1->AddAttr($2);
$$ = $1; $$ = $1;
} }
; ;
@ -545,13 +545,13 @@ casefield0 : exprlist TOK_RIGHTARROW tok_id ':' type2
} }
| TOK_DEFAULT TOK_RIGHTARROW tok_id ':' type2 | TOK_DEFAULT TOK_RIGHTARROW tok_id ':' type2
{ {
$$ = new CaseField(0, $3, $5); $$ = new CaseField(nullptr, $3, $5);
} }
; ;
optexprlist : /* nothing */ optexprlist : /* nothing */
{ {
$$ = 0; $$ = nullptr;
} }
| exprlist | exprlist
{ {
@ -605,8 +605,8 @@ expr : tok_id
} }
| expr '(' optexprlist ')' | expr '(' optexprlist ')'
{ {
$$ = new Expr(Expr::EXPR_CALL, $$ = new Expr(Expr::EXPR_CALL,
$1, $1,
new Expr($3)); new Expr($3));
} }
| '-' expr | '-' expr
@ -697,7 +697,7 @@ expr : tok_id
{ {
$$ = new Expr(Expr::EXPR_COND, $1, $3, $5); $$ = new Expr(Expr::EXPR_COND, $1, $3, $5);
} }
| TOK_CASE expr TOK_OF '{' caseexprlist '}' | TOK_CASE expr TOK_OF '{' caseexprlist '}'
{ {
$$ = new Expr($2, $5); $$ = new Expr($2, $5);
} }
@ -718,8 +718,8 @@ cstr : TOK_STRING
; ;
regex : TOK_BEGIN_RE TOK_REGEX TOK_END_RE regex : TOK_BEGIN_RE TOK_REGEX TOK_END_RE
{ {
$$ = new RegEx($2); $$ = new RegEx($2);
} }
; ;
@ -740,7 +740,7 @@ caseexpr : exprlist TOK_RIGHTARROW expr
} }
| TOK_DEFAULT TOK_RIGHTARROW expr | TOK_DEFAULT TOK_RIGHTARROW expr
{ {
$$ = new CaseExpr(0, $3); $$ = new CaseExpr(nullptr, $3);
} }
; ;
@ -823,8 +823,8 @@ sah : TOK_LPB_MEMBER embedded_code TOK_RPB
| TOK_DATAUNIT '=' tok_id optargs TOK_WITHCONTEXT '(' optexprlist ')' ';' | TOK_DATAUNIT '=' tok_id optargs TOK_WITHCONTEXT '(' optexprlist ')' ';'
{ {
$$ = new AnalyzerDataUnit( $$ = new AnalyzerDataUnit(
(AnalyzerDataUnit::DataUnitType) $1, (AnalyzerDataUnit::DataUnitType) $1,
$3, $3,
$4, $4,
$7); $7);
} }
@ -916,7 +916,7 @@ embedded_pac_primitive: TOK_PAC_VAL expr TOK_END_PAC
optargs : /* empty */ optargs : /* empty */
{ {
$$ = 0; $$ = nullptr;
} }
| '(' optexprlist ')' | '(' optexprlist ')'
{ {
@ -924,7 +924,7 @@ optargs : /* empty */
} }
; ;
letfieldlist : letfieldlist letfield ';' letfieldlist : letfieldlist letfield ';'
{ {
$1->push_back($2); $1->push_back($2);
$$ = $1; $$ = $1;
@ -961,9 +961,9 @@ input : expr
} }
; ;
optattrs : /* empty */ optattrs : /* empty */
{ {
$$ = 0; $$ = nullptr;
} }
| attrlist | attrlist
{ {
@ -993,7 +993,7 @@ attr : TOK_ATTR_BYTEORDER '=' expr
{ {
$$ = new Attr(ATTR_BYTEORDER, $3); $$ = new Attr(ATTR_BYTEORDER, $3);
} }
| TOK_ATTR_CHECK expr | TOK_ATTR_CHECK expr
{ {
$$ = new Attr(ATTR_CHECK, $2); $$ = new Attr(ATTR_CHECK, $2);
} }
@ -1009,7 +1009,7 @@ attr : TOK_ATTR_BYTEORDER '=' expr
{ {
$$ = new Attr(ATTR_EXPORTSOURCEDATA); $$ = new Attr(ATTR_EXPORTSOURCEDATA);
} }
| TOK_ATTR_IF expr | TOK_ATTR_IF expr
{ {
$$ = new Attr(ATTR_IF, $2); $$ = new Attr(ATTR_IF, $2);
} }
@ -1061,7 +1061,7 @@ attr : TOK_ATTR_BYTEORDER '=' expr
optlinebreaker : /* nothing */ optlinebreaker : /* nothing */
{ {
$$ = 0; $$ = nullptr;
} }
| '(' expr ')' | '(' expr ')'
{ {
@ -1071,7 +1071,7 @@ optlinebreaker : /* nothing */
%% %%
const ID* current_decl_id = 0; const ID* current_decl_id = nullptr;
int yyerror(const char msg[]) { int yyerror(const char msg[]) {
auto n = strlen(msg) + yyleng + 64; auto n = strlen(msg) + yyleng + 64;

View file

@ -9,7 +9,7 @@
string PPVal::ToCode(Env* env) { string PPVal::ToCode(Env* env) {
ASSERT(expr_); ASSERT(expr_);
return string(expr_->EvalExpr(nullptr, env)); return {expr_->EvalExpr(nullptr, env)};
} }
string PPSet::ToCode(Env* env) { string PPSet::ToCode(Env* env) {

View file

@ -3,11 +3,13 @@
#ifndef pac_primitive_h #ifndef pac_primitive_h
#define pac_primitive_h #define pac_primitive_h
#include <cstdint>
#include "pac_common.h" #include "pac_common.h"
class PacPrimitive { class PacPrimitive {
public: public:
enum PrimitiveType { VAL, SET, TYPE, CONST_DEF }; enum PrimitiveType : uint8_t { VAL, SET, TYPE, CONST_DEF };
explicit PacPrimitive(PrimitiveType type) : type_(type) {} explicit PacPrimitive(PrimitiveType type) : type_(type) {}
virtual ~PacPrimitive() {} virtual ~PacPrimitive() {}

View file

@ -135,7 +135,7 @@ protected:
bool DoTraverse(DataDepVisitor* visitor) override; bool DoTraverse(DataDepVisitor* visitor) override;
}; };
enum PaddingType { PAD_BY_LENGTH, PAD_TO_OFFSET, PAD_TO_NEXT_WORD }; enum PaddingType : uint8_t { PAD_BY_LENGTH, PAD_TO_OFFSET, PAD_TO_NEXT_WORD };
class RecordPaddingField : public RecordField { class RecordPaddingField : public RecordField {
public: public:

View file

@ -273,11 +273,7 @@ void StringType::GenDynamicSizeRegEx(Output* out_cc, Env* env, const DataPtr& da
void StringType::GenDynamicSizeAnyStr(Output* out_cc, Env* env, const DataPtr& data) { void StringType::GenDynamicSizeAnyStr(Output* out_cc, Env* env, const DataPtr& data) {
ASSERT(type_ == ANYSTR); ASSERT(type_ == ANYSTR);
if ( attr_restofdata_ || attr_oneline_ ) { if ( attr_restofdata_ || attr_oneline_ || attr_restofflow_ ) {
out_cc->println("%s = (%s) - (%s);", env->LValue(string_length_var()), env->RValue(end_of_data),
data.ptr_expr());
}
else if ( attr_restofflow_ ) {
out_cc->println("%s = (%s) - (%s);", env->LValue(string_length_var()), env->RValue(end_of_data), out_cc->println("%s = (%s) - (%s);", env->LValue(string_length_var()), env->RValue(end_of_data),
data.ptr_expr()); data.ptr_expr());
} }

View file

@ -3,12 +3,14 @@
#ifndef pac_strtype_h #ifndef pac_strtype_h
#define pac_strtype_h #define pac_strtype_h
#include <cstdint>
#include "pac_type.h" #include "pac_type.h"
// TODO: question: shall we merge it with ArrayType? // TODO: question: shall we merge it with ArrayType?
class StringType : public Type { class StringType : public Type {
public: public:
enum StringTypeEnum { CSTR, REGEX, ANYSTR }; enum StringTypeEnum : uint8_t { CSTR, REGEX, ANYSTR };
explicit StringType(StringTypeEnum anystr); explicit StringType(StringTypeEnum anystr);
explicit StringType(ConstString* str); explicit StringType(ConstString* str);

View file

@ -696,7 +696,7 @@ string Type::DataSize(Output* out_cc, Env* env, const DataPtr& data) {
} }
else { else {
if ( ! size_var() || ! env->Evaluated(size_var()) ) { if ( ! size_var() || ! env->Evaluated(size_var()) ) {
ASSERT(out_cc != 0); ASSERT(out_cc != nullptr);
GenDynamicSize(out_cc, env, data); GenDynamicSize(out_cc, env, data);
ASSERT(size_var()); ASSERT(size_var());
} }

View file

@ -303,7 +303,7 @@ public:
static Type* LookUpByID(ID* id); static Type* LookUpByID(ID* id);
protected: protected:
typedef map<string, Type*> type_map_t; using type_map_t = map<string, Type*>;
static type_map_t type_map_; static type_map_t type_map_;
}; };

View file

@ -101,7 +101,7 @@ void TypeDecl::GenCode(Output* out_h, Output* out_cc) {
AddBaseClass(&base_classes); AddBaseClass(&base_classes);
if ( type_->attr_refcount() ) if ( type_->attr_refcount() )
base_classes.push_back(kRefCountClass); base_classes.emplace_back(kRefCountClass);
// The first line of class definition // The first line of class definition
out_h->println(""); out_h->println("");
@ -232,7 +232,8 @@ string TypeDecl::ParseFuncPrototype(Env* env) {
} }
void TypeDecl::GenParsingEnd(Output* out_cc, Env* env, const DataPtr& data) { void TypeDecl::GenParsingEnd(Output* out_cc, Env* env, const DataPtr& data) {
string ret_val_0, ret_val_1; string ret_val_0;
string ret_val_1;
if ( type_->incremental_input() ) { if ( type_->incremental_input() ) {
ret_val_0 = type_->parsing_complete(env).c_str(); ret_val_0 = type_->parsing_complete(env).c_str();
@ -259,9 +260,6 @@ void TypeDecl::GenParsingEnd(Output* out_cc, Env* env, const DataPtr& data) {
out_cc->println("BINPAC_ASSERT(!(%s));", type_->parsing_complete(env).c_str()); out_cc->println("BINPAC_ASSERT(!(%s));", type_->parsing_complete(env).c_str());
out_cc->println("return %s;", ret_val_1.c_str()); out_cc->println("return %s;", ret_val_1.c_str());
} }
else if ( type_->incremental_input() ) {
out_cc->println("return %s;", ret_val_0.c_str());
}
else { else {
out_cc->println("return %s;", ret_val_0.c_str()); out_cc->println("return %s;", ret_val_0.c_str());
} }

View file

@ -2,9 +2,9 @@
#include "pac_utils.h" #include "pac_utils.h"
#include <stdarg.h> #include <cstdarg>
#include <stdio.h> #include <cstdio>
#include <string.h> #include <cstring>
char* copy_string(const char* s) { char* copy_string(const char* s) {
char* c = new char[strlen(s) + 1]; char* c = new char[strlen(s) + 1];
@ -27,7 +27,7 @@ string strfmt(const char* format, ...) {
va_start(ap, format); va_start(ap, format);
const char* r = do_fmt(format, ap); const char* r = do_fmt(format, ap);
va_end(ap); va_end(ap);
return string(r); return {r};
} }
char* nfmt(const char* format, ...) { char* nfmt(const char* format, ...) {