X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_parser.hpp;h=3aaa6d3a93f16cb71c85116185cee0d4d9cba14e;hb=353f0535f43b54d04cc9c8080790ffac606e5b0b;hp=4fff9ad1157129e0da8458f8cca87e68687197ec;hpb=5ce45e7f614c7540f4d3d4f86db7a499f138d01e;p=apitrace diff --git a/trace_parser.hpp b/trace_parser.hpp index 4fff9ad..3aaa6d3 100644 --- a/trace_parser.hpp +++ b/trace_parser.hpp @@ -30,32 +30,58 @@ #include #include +#include "trace_file.hpp" #include "trace_format.hpp" #include "trace_model.hpp" namespace Trace { -class File; + +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; - typedef std::vector FunctionMap; - FunctionMap functions; + // Helper template that extends a base signature structure, with additional + // parsing information. + template< class T > + struct SigState : public T { + // Offset in the file of where signature was defined. It is used when + // reparsing to determine whether the signature definition is to be + // expected next or not. + File::Offset offset; + }; + + typedef SigState FunctionSigState; + typedef SigState StructSigState; + typedef SigState EnumSigState; + typedef SigState BitmaskSigState; + + typedef std::vector FunctionMap; + typedef std::vector StructMap; + typedef std::vector EnumMap; + typedef std::vector BitmaskMap; - typedef std::vector StructMap; + FunctionMap functions; StructMap structs; - - typedef std::vector EnumMap; EnumMap enums; - - typedef std::vector BitmaskMap; BitmaskMap bitmasks; unsigned next_call_no; @@ -71,46 +97,98 @@ public: void close(void); - Call *parse_call(void); + Call *parse_call(void) { + return parse_call(FULL); + } + + bool supportsOffsets() const + { + return file->supportsOffsets(); + } + + void getBookmark(ParseBookmark &bookmark); + + void setBookmark(const ParseBookmark &bookmark); + + int percentRead() + { + return file->percentRead(); + } + + Call *scan_call() { + return parse_call(SCAN); + } protected: - void parse_enter(void); + 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(Mode mode); - Call *parse_leave(void); + Call *parse_leave(Mode mode); - bool parse_call_details(Call *call); + bool parse_call_details(Call *call, Mode mode); - void parse_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(); Value *parse_uint(); + void scan_uint(); Value *parse_float(); + void scan_float(); Value *parse_double(); + void scan_double(); Value *parse_string(); + void scan_string(); Value *parse_enum(); + void scan_enum(); Value *parse_bitmask(); + void scan_bitmask(); Value *parse_array(void); + void scan_array(void); Value *parse_blob(void); + void scan_blob(void); Value *parse_struct(); + void scan_struct(); Value *parse_opaque(); + void scan_opaque(); const char * read_string(void); + void skip_string(void); unsigned long long read_uint(void); + void skip_uint(void); inline int read_byte(void); + inline void skip_byte(void); };