update freq scale
[lttv.git] / genevent / parser.h
CommitLineData
3583026d 1#ifndef PARSER_H
2#define PARSER_H
3
4/* Extensible array container */
5
6typedef struct _sequence {
7 int size;
8 int position;
9 void **array;
10} sequence_t;
11
12void sequence_init(sequence_t *t);
13void sequence_dispose(sequence_t *t);
14void sequence_push(sequence_t *t, void *elem);
15void *sequence_pop(sequence_t *t);
16
17
18/* Hash table */
19
20typedef struct _table {
21 sequence_t keys;
22 sequence_t values;
23} table_t;
24
25void table_init(table_t *t);
26void table_dispose(table_t *t);
27void table_insert(table_t *t, char *key, void *value);
28void *table_find(table_t *t, char *key);
29void table_insert_int(table_t *t, int *key, void *value);
30void *table_find_int(table_t *t, int *key);
31
32
33/* Token types */
34
35typedef enum _token_type {
36 ENDFILE,
37 FORWARDSLASH,
38 LANGLEBRACKET,
39 RANGLEBRACKET,
40 EQUAL,
41 QUOTEDSTRING,
42 NUMBER,
43 NAME
44} token_type_t;
45
46
47/* State associated with a file being parsed */
48typedef struct _parse_file {
49 char *name;
50 FILE * fp;
51 int lineno;
52 char *buffer;
53 token_type_t type;
54 int unget;
55 void (*error) (struct _parse_file *, char *);
56} parse_file_t;
57
58void ungetToken(parse_file_t * in);
59char *getToken(parse_file_t *in);
60char *getForwardslash(parse_file_t *in);
61char *getLAnglebracket(parse_file_t *in);
62char *getRAnglebracket(parse_file_t *in);
63char *getQuotedString(parse_file_t *in);
64char *getName(parse_file_t *in);
65int getNumber(parse_file_t *in);
66char *getEqual(parse_file_t *in);
67char seekNextChar(parse_file_t *in);
68
69void skipComment(parse_file_t * in);
70void skipEOL(parse_file_t * in);
71
72/* Some constants */
73
74static const int BUFFER_SIZE = 1024;
75
76
77/* Events data types */
78
79typedef enum _data_type {
2d2d14a7 80 INT_FIXED,
81 UINT_FIXED,
82 POINTER,
83 CHAR,
84 UCHAR,
85 SHORT,
86 USHORT,
3583026d 87 INT,
88 UINT,
3583026d 89 LONG,
90 ULONG,
91 SIZE_T,
92 SSIZE_T,
93 OFF_T,
94 FLOAT,
95 STRING,
96 ENUM,
97 ARRAY,
98 SEQUENCE,
99 STRUCT,
100 UNION,
101 NONE
102} data_type_t;
103
3583026d 104typedef struct _type_descriptor {
105 char * type_name; //used for named type
106 data_type_t type;
107 char *fmt;
a67cd958 108 size_t size;
3583026d 109 sequence_t labels; // for enumeration
70f46ac3 110 sequence_t labels_values; // for enumeration
3583026d 111 sequence_t labels_description;
112 int already_printed;
bf6349fa 113 sequence_t fields; // for structure, array and sequence (field_t type)
7479dd85 114 int custom_write; /* Should we use a custom write function ? */
115 int network; /* Is the type a in network byte order ? */
3583026d 116} type_descriptor_t;
117
118
3583026d 119
a67cd958 120/* Fields within types or events */
3583026d 121typedef struct _field{
122 char *name;
123 char *description;
124 type_descriptor_t *type;
125} field_t;
126
127
128/* Events definitions */
129
130typedef struct _event {
131 char *name;
132 char *description;
47299663 133 //type_descriptor_t *type;
134 sequence_t fields; /* event fields */
3583026d 135 int per_trace; /* Is the event able to be logged to a specific trace ? */
136 int per_tracefile; /* Must we log this event in a specific tracefile ? */
1e08067e 137 int param_buffer; /* For userspace tracing : takes a buffer as parameter? */
4a6829e2 138 int no_instrument_function;
3583026d 139} event_t;
140
141typedef struct _facility {
142 char * name;
143 char * capname;
ffaf5031 144 char * arch;
3583026d 145 char * description;
146 sequence_t events;
70f46ac3 147 sequence_t unnamed_types; //FIXME : remove
3583026d 148 table_t named_types;
30d72138 149 unsigned int checksum;
bd7b8ca6 150 int user; /* Is this a userspace facility ? */
3583026d 151} facility_t;
152
2d2d14a7 153int getSizeindex(unsigned int value);
154unsigned long long int getSize(parse_file_t *in);
3583026d 155unsigned long getTypeChecksum(unsigned long aCrc, type_descriptor_t * type);
156
157void parseFacility(parse_file_t *in, facility_t * fac);
158void parseEvent(parse_file_t *in, event_t *ev, sequence_t * unnamed_types,
159 table_t * named_types);
160void parseTypeDefinition(parse_file_t *in,
161 sequence_t * unnamed_types, table_t * named_types);
162type_descriptor_t *parseType(parse_file_t *in,
163 type_descriptor_t *t, sequence_t * unnamed_types, table_t * named_types);
47299663 164void parseFields(parse_file_t *in, field_t *f,
2e415130 165 sequence_t * unnamed_types,
166 table_t * named_types,
167 int tag);
3583026d 168void checkNamedTypesImplemented(table_t * namedTypes);
169type_descriptor_t * find_named_type(char *name, table_t * named_types);
170void generateChecksum(char * facName,
30d72138 171 unsigned int * checksum, sequence_t * events);
3583026d 172
173
174/* get attributes */
175char * getNameAttribute(parse_file_t *in);
176char * getFormatAttribute(parse_file_t *in);
177int getSizeAttribute(parse_file_t *in);
bb9014e6 178int getValueAttribute(parse_file_t *in, long long *value);
3583026d 179
180char * getDescription(parse_file_t *in);
181
182
183/* Dynamic memory allocation and freeing */
184
185void * memAlloc(int size);
186char *allocAndCopy(char * str);
187char *appendString(char *s, char *suffix);
188void freeTypes(sequence_t *t);
189void freeType(type_descriptor_t * td);
190void freeEvents(sequence_t *t);
191void freeNamedType(table_t * t);
192void error_callback(parse_file_t *in, char *msg);
193
194
195//checksum part
196static const unsigned int crctab32[] =
197{
198#include "crc32.tab"
199};
200
201static inline unsigned long
202partial_crc32_one(unsigned char c, unsigned long crc)
203{
204 return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8);
205}
206
207static inline unsigned long
208partial_crc32(const char *s, unsigned long crc)
209{
210 while (*s)
211 crc = partial_crc32_one(*s++, crc);
212 return crc;
213}
214
215static inline unsigned long
216crc32(const char *s)
217{
218 return partial_crc32(s, 0xffffffff) ^ 0xffffffff;
219}
220
221
2d2d14a7 222extern char *intOutputTypes[];
223
224extern char *uintOutputTypes[];
225
226extern char *floatOutputTypes[];
227
228
229
230
3583026d 231#endif // PARSER_H
This page took 0.034292 seconds and 4 git commands to generate.