#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;
EnumMap enums;
BitmaskMap bitmasks;
- 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);
- }
-
- 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:
+ 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 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);
-
- 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);
-
- Value *parse_struct();
-
- Value *parse_opaque();
-
- const char * read_string(void);
-
- unsigned long long read_uint(void);
-
- inline int read_byte(void);
-
-protected:
- void scan_enter(void);
-
- Call *scan_leave(void);
-
- bool scan_call_details(Call *call);
-
- void scan_arg(Call *call);
-
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);
};