X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_parser.hpp;h=3aaa6d3a93f16cb71c85116185cee0d4d9cba14e;hb=9b31ffcdfff1b7e8528bea8e95870a31eaaa614f;hp=962c323d4d9ef379e8a0c074bf3962fcd813fc9d;hpb=838decf2821aba49d2256f4d27a35b09394336fe;p=apitrace diff --git a/trace_parser.hpp b/trace_parser.hpp index 962c323..3aaa6d3 100644 --- a/trace_parser.hpp +++ b/trace_parser.hpp @@ -37,11 +37,25 @@ namespace Trace { + +struct ParseBookmark +{ + File::Offset offset; + unsigned next_call_no; +}; + + class Parser { protected: File *file; + enum Mode { + FULL = 0, + SCAN, + SKIP + }; + typedef std::list CallList; CallList calls; @@ -70,8 +84,6 @@ protected: EnumMap enums; BitmaskMap bitmasks; - bool m_supportsSeeking; - unsigned next_call_no; public: @@ -85,60 +97,56 @@ public: void close(void); - Call *parse_call(void); + Call *parse_call(void) { + return parse_call(FULL); + } bool supportsOffsets() const { return file->supportsOffsets(); } - File::Offset currentOffset() - { - return file->currentOffset(); - } + void getBookmark(ParseBookmark &bookmark); - void setCurrentOffset(const File::Offset &offset) - { - file->setCurrentOffset(offset); - } - - unsigned currentCallNumber() const - { - return next_call_no; - } - - void setCurrentCallNumber(unsigned num) - { - next_call_no = num; - } + void setBookmark(const ParseBookmark &bookmark); int percentRead() { return file->percentRead(); } - Call *scan_call(); + Call *scan_call() { + return parse_call(SCAN); + } protected: + Call *parse_call(Mode mode); + FunctionSig *parse_function_sig(void); StructSig *parse_struct_sig(); EnumSig *parse_enum_sig(); BitmaskSig *parse_bitmask_sig(); + + Call *parse_Call(Mode mode); - void parse_enter(void); - void scan_enter(void); + void parse_enter(Mode mode); - Call *parse_leave(void); - Call *scan_leave(void); + Call *parse_leave(Mode mode); - bool parse_call_details(Call *call); - bool scan_call_details(Call *call); + bool parse_call_details(Call *call, Mode mode); - void parse_arg(Call *call); - void scan_arg(Call *call); + void parse_arg(Call *call, Mode mode); Value *parse_value(void); void scan_value(void); + inline Value *parse_value(Mode mode) { + if (mode == FULL) { + return parse_value(); + } else { + scan_value(); + return NULL; + } + } Value *parse_sint(); void scan_sint();