]> git.cworth.org Git - apitrace/blob - trace_parser.hpp
Parse the signatures only once.
[apitrace] / trace_parser.hpp
1 /**************************************************************************
2  *
3  * Copyright 2010 VMware, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26 #ifndef _TRACE_PARSER_HPP_
27 #define _TRACE_PARSER_HPP_
28
29
30 #include <iostream>
31 #include <list>
32 #include <set>
33
34 #include "trace_file.hpp"
35 #include "trace_format.hpp"
36 #include "trace_model.hpp"
37
38
39 namespace Trace {
40
41 class Parser
42 {
43 protected:
44     File *file;
45
46     typedef std::list<Call *> CallList;
47     CallList calls;
48
49     // Helper template that extends a base signature structure, with additional
50     // parsing information.
51     template< class T >
52     struct SigState : public T {
53         // Offset in the file of where signature was defined.  It is used when
54         // reparsing to determine whether the signature definition is to be
55         // expected next or not.
56         File::Offset offset;
57     };
58
59     typedef SigState<FunctionSig> FunctionSigState;
60     typedef SigState<StructSig> StructSigState;
61     typedef SigState<EnumSig> EnumSigState;
62     typedef SigState<BitmaskSig> BitmaskSigState;
63
64     typedef std::vector<FunctionSigState *> FunctionMap;
65     typedef std::vector<StructSigState *> StructMap;
66     typedef std::vector<EnumSigState *> EnumMap;
67     typedef std::vector<BitmaskSigState *> BitmaskMap;
68
69     FunctionMap functions;
70     StructMap structs;
71     EnumMap enums;
72     BitmaskMap bitmasks;
73
74     bool m_supportsSeeking;
75
76     unsigned next_call_no;
77
78 public:
79     unsigned long long version;
80
81     Parser();
82
83     ~Parser();
84
85     bool open(const char *filename);
86
87     void close(void);
88
89     Call *parse_call(void);
90
91     bool supportsOffsets() const
92     {
93         return file->supportsOffsets();
94     }
95
96     File::Offset currentOffset()
97     {
98         return file->currentOffset();
99     }
100
101     void setCurrentOffset(const File::Offset &offset)
102     {
103         file->setCurrentOffset(offset);
104     }
105
106     unsigned currentCallNumber() const
107     {
108         return next_call_no;
109     }
110
111     void setCurrentCallNumber(unsigned num)
112     {
113         next_call_no = num;
114     }
115
116     int percentRead()
117     {
118         return file->percentRead();
119     }
120
121     Call *scan_call();
122
123 protected:
124     FunctionSig *parse_function_sig(void);
125     StructSig *parse_struct_sig();
126     EnumSig *parse_enum_sig();
127     BitmaskSig *parse_bitmask_sig();
128
129     void parse_enter(void);
130
131     Call *parse_leave(void);
132
133     bool parse_call_details(Call *call);
134
135     void parse_arg(Call *call);
136
137     Value *parse_value(void);
138
139     Value *parse_sint();
140
141     Value *parse_uint();
142
143     Value *parse_float();
144
145     Value *parse_double();
146
147     Value *parse_string();
148
149     Value *parse_enum();
150
151     Value *parse_bitmask();
152
153     Value *parse_array(void);
154
155     Value *parse_blob(void);
156
157     Value *parse_struct();
158
159     Value *parse_opaque();
160
161     const char * read_string(void);
162
163     unsigned long long read_uint(void);
164
165     inline int read_byte(void);
166
167 protected:
168     void scan_enter(void);
169
170     Call *scan_leave(void);
171
172     bool scan_call_details(Call *call);
173
174     void scan_arg(Call *call);
175
176     void scan_value(void);
177
178     void scan_sint();
179
180     void scan_uint();
181
182     void scan_float();
183
184     void scan_double();
185
186     void scan_string();
187
188     void scan_enum();
189
190     void scan_bitmask();
191
192     void scan_array(void);
193
194     void scan_blob(void);
195
196     void scan_struct();
197
198     void scan_opaque();
199
200     void skip_string(void);
201
202     void skip_uint(void);
203
204     inline void skip_byte(void);
205 };
206
207
208 } /* namespace Trace */
209
210 #endif /* _TRACE_PARSER_HPP_ */