]> git.cworth.org Git - apitrace/blobdiff - trace_parser.hpp
Cleanup some of the code.
[apitrace] / trace_parser.hpp
index d76ffb49868e208b21a59890cd5109c2905e6c58..3aaa6d3a93f16cb71c85116185cee0d4d9cba14e 100644 (file)
@@ -50,6 +50,12 @@ class Parser
 protected:
     File *file;
 
+    enum Mode {
+        FULL = 0,
+        SCAN,
+        SKIP
+    };
+
     typedef std::list<Call *> CallList;
     CallList calls;
 
@@ -78,8 +84,6 @@ protected:
     EnumMap enums;
     BitmaskMap bitmasks;
 
-    bool m_supportsSeeking;
-
     unsigned next_call_no;
 
 public:
@@ -93,50 +97,56 @@ 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) {
-        bookmark.offset = file->currentOffset();
-        bookmark.next_call_no = next_call_no;
-    }
+    void getBookmark(ParseBookmark &bookmark);
 
-    void setBookmark(const ParseBookmark &bookmark) {
-        file->setCurrentOffset(bookmark.offset);
-        next_call_no = bookmark.next_call_no;
-    }
+    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();