X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_parser.hpp;h=3aaa6d3a93f16cb71c85116185cee0d4d9cba14e;hb=9d50fbb84f9b3086aa8e985e32534961336563b2;hp=1f87b6fed185c8959dd112a2aa4d2c3dce99f702;hpb=2257168033b52be3094efdbd7eadff8eb77a4c4e;p=apitrace diff --git a/trace_parser.hpp b/trace_parser.hpp index 1f87b6f..3aaa6d3 100644 --- a/trace_parser.hpp +++ b/trace_parser.hpp @@ -29,7 +29,6 @@ #include #include -#include #include "trace_file.hpp" #include "trace_format.hpp" @@ -38,35 +37,53 @@ 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; - 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; - typedef std::set TraceOffsets; - TraceOffsets m_callSigOffsets; - TraceOffsets m_structSigOffsets; - TraceOffsets m_enumSigOffsets; - TraceOffsets m_bitmaskSigOffsets; - - typedef std::map CallNumOffsets; - CallNumOffsets m_callNumOffsets; - unsigned next_call_no; public: @@ -80,116 +97,97 @@ 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); - } + void setBookmark(const ParseBookmark &bookmark); - bool callWithSignature(const File::Offset &offset) const; - bool structWithSignature(const File::Offset &offset) const; - bool enumWithSignature(const File::Offset &offset) const; - bool bitmaskWithSignature(const File::Offset &offset) const; - - unsigned currentCallNumber() const + int percentRead() { - return next_call_no; + return file->percentRead(); } - void setCurrentCallNumber(unsigned num) - { - next_call_no = num; + Call *scan_call() { + return parse_call(SCAN); } - Call *scan_call(); - protected: - void parse_enter(void); - - Call *parse_leave(void); - - bool parse_call_details(Call *call); - - void parse_arg(Call *call); - - Value *parse_value(void); - - Value *parse_sint(); - - Value *parse_uint(); - - Value *parse_float(); - - Value *parse_double(); - - Value *parse_string(); - - Value *parse_enum(); - - Value *parse_bitmask(); - - Value *parse_array(void); - - Value *parse_blob(void); + Call *parse_call(Mode mode); - Value *parse_struct(); + FunctionSig *parse_function_sig(void); + StructSig *parse_struct_sig(); + EnumSig *parse_enum_sig(); + BitmaskSig *parse_bitmask_sig(); + + Call *parse_Call(Mode mode); - Value *parse_opaque(); + void parse_enter(Mode mode); - const char * read_string(void); - - unsigned long long read_uint(void); - - inline int read_byte(void); - -protected: - void scan_enter(void); + Call *parse_leave(Mode mode); - Call *scan_leave(void); + bool parse_call_details(Call *call, Mode mode); - bool scan_call_details(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(); + 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); };