#include <iostream>
#include <list>
-#include <set>
#include "trace_file.hpp"
#include "trace_format.hpp"
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<Call *> CallList;
CallList calls;
- typedef std::vector<FunctionSig *> 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<FunctionSig> FunctionSigState;
+ typedef SigState<StructSig> StructSigState;
+ typedef SigState<EnumSig> EnumSigState;
+ typedef SigState<BitmaskSig> BitmaskSigState;
+
+ typedef std::vector<FunctionSigState *> FunctionMap;
+ typedef std::vector<StructSigState *> StructMap;
+ typedef std::vector<EnumSigState *> EnumMap;
+ typedef std::vector<BitmaskSigState *> BitmaskMap;
- typedef std::vector<StructSig *> StructMap;
+ FunctionMap functions;
StructMap structs;
-
- typedef std::vector<EnumSig *> EnumMap;
EnumMap enums;
-
- typedef std::vector<BitmaskSig *> BitmaskMap;
BitmaskMap bitmasks;
- typedef std::set<File::Offset> TraceOffsets;
- TraceOffsets m_callSigOffsets;
- TraceOffsets m_structSigOffsets;
- TraceOffsets m_enumSigOffsets;
- TraceOffsets m_bitmaskSigOffsets;
-
- typedef std::map<File::Offset, unsigned> CallNumOffsets;
- CallNumOffsets m_callNumOffsets;
-
- bool m_supportsSeeking;
-
unsigned next_call_no;
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 setCurrentOffset(const File::Offset &offset)
- {
- file->setCurrentOffset(offset);
- }
-
- 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
- {
- return next_call_no;
- }
+ void getBookmark(ParseBookmark &bookmark);
- 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:
- 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();
+ Call *parse_call(Mode mode);
- Value *parse_double();
-
- Value *parse_string();
-
- Value *parse_enum();
-
- Value *parse_bitmask();
-
- Value *parse_array(void);
-
- Value *parse_blob(void);
-
- Value *parse_struct();
-
- Value *parse_opaque();
-
- const char * read_string(void);
-
- unsigned long long read_uint(void);
+ FunctionSig *parse_function_sig(void);
+ StructSig *parse_struct_sig();
+ EnumSig *parse_enum_sig();
+ BitmaskSig *parse_bitmask_sig();
+
+ Call *parse_Call(Mode mode);
- inline int read_byte(void);
-
-protected:
- void scan_enter(void);
+ void parse_enter(Mode mode);
- Call *scan_leave(void);
+ Call *parse_leave(Mode mode);
- bool scan_call_details(Call *call);
+ bool parse_call_details(Call *call, Mode mode);
- 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);
};