4 /* Extensible array container */
6 typedef struct _sequence
{
12 void sequence_init(sequence_t
*t
);
13 void sequence_dispose(sequence_t
*t
);
14 void sequence_push(sequence_t
*t
, void *elem
);
15 void *sequence_pop(sequence_t
*t
);
20 typedef struct _table
{
25 void table_init(table_t
*t
);
26 void table_dispose(table_t
*t
);
27 void table_insert(table_t
*t
, char *key
, void *value
);
28 void *table_find(table_t
*t
, char *key
);
29 void table_insert_int(table_t
*t
, int *key
, void *value
);
30 void *table_find_int(table_t
*t
, int *key
);
35 typedef enum _token_type
{
47 /* State associated with a file being parsed */
48 typedef struct _parse_file
{
55 void (*error
) (struct _parse_file
*, char *);
58 void ungetToken(parse_file_t
* in
);
59 char *getToken(parse_file_t
*in
);
60 char *getForwardslash(parse_file_t
*in
);
61 char *getLAnglebracket(parse_file_t
*in
);
62 char *getRAnglebracket(parse_file_t
*in
);
63 char *getQuotedString(parse_file_t
*in
);
64 char *getName(parse_file_t
*in
);
65 int getNumber(parse_file_t
*in
);
66 char *getEqual(parse_file_t
*in
);
67 int seekNextChar(parse_file_t
*in
);
69 void skipComment(parse_file_t
* in
);
70 void skipEOL(parse_file_t
* in
);
74 static const int BUFFER_SIZE
= 1024;
77 /* Events data types */
79 typedef enum _data_type
{
104 typedef struct _facility facility_t
;
105 typedef struct _event event_t
;
107 typedef struct _type_descriptor
{
109 char * type_name
; //used for named type
113 sequence_t labels
; // for enumeration
114 sequence_t labels_values
; // for enumeration
115 sequence_t labels_description
;
117 sequence_t fields
; // for structure, array and sequence (field_t type)
118 int custom_write
; /* Should we use a custom write function ? */
119 int network
; /* Is the type a in network byte order ? */
123 /* Fields within types or events */
124 typedef struct _field
{
128 type_descriptor_t
*type
;
132 /* Events definitions */
138 //type_descriptor_t *type;
139 sequence_t fields
; /* event fields */
140 int per_trace
; /* Is the event able to be logged to a specific trace ? */
141 int per_tracefile
; /* Must we log this event in a specific tracefile ? */
142 int param_buffer
; /* For userspace tracing : takes a buffer as parameter? */
143 int no_instrument_function
;
153 int align
; /* Alignment : default 1, 0 no alignment. */
156 sequence_t unnamed_types
; //FIXME : remove
158 unsigned int checksum
;
159 int user
; /* Is this a userspace facility ? */
162 int getSizeindex(unsigned int value
);
163 unsigned long long int getSize(parse_file_t
*in
);
164 unsigned long getTypeChecksum(unsigned long aCrc
, type_descriptor_t
* type
);
166 void parseFacility(parse_file_t
*in
, facility_t
* fac
);
167 void parseEvent(facility_t
*fac
, parse_file_t
*in
, event_t
*ev
, sequence_t
* unnamed_types
,
168 table_t
* named_types
);
169 void parseTypeDefinition(facility_t
*fac
, parse_file_t
*in
,
170 sequence_t
* unnamed_types
, table_t
* named_types
);
171 type_descriptor_t
*parseType(facility_t
*fac
, parse_file_t
*in
,
172 type_descriptor_t
*t
, sequence_t
* unnamed_types
, table_t
* named_types
);
173 void parseFields(facility_t
*fac
, parse_file_t
*in
, field_t
*f
,
174 sequence_t
* unnamed_types
,
175 table_t
* named_types
,
177 void checkNamedTypesImplemented(table_t
* namedTypes
);
178 type_descriptor_t
* find_named_type(char *name
, table_t
* named_types
);
179 void generateChecksum(char * facName
,
180 unsigned int * checksum
, sequence_t
* events
);
184 char * getNameAttribute(parse_file_t
*in
);
185 char * getFormatAttribute(parse_file_t
*in
);
186 int getSizeAttribute(parse_file_t
*in
);
187 int getValueAttribute(parse_file_t
*in
, long long *value
);
189 char * getDescription(parse_file_t
*in
);
192 /* Dynamic memory allocation and freeing */
194 void * memAlloc(int size
);
195 char *allocAndCopy(char * str
);
196 char *appendString(char *s
, char *suffix
);
197 void freeTypes(sequence_t
*t
);
198 void freeType(type_descriptor_t
* td
);
199 void freeEvents(sequence_t
*t
);
200 void freeNamedType(table_t
* t
);
201 void error_callback(parse_file_t
*in
, char *msg
);
205 static const unsigned int crctab32
[] =
210 static inline unsigned long
211 partial_crc32_one(unsigned char c
, unsigned long crc
)
213 return crctab32
[(crc
^ c
) & 0xff] ^ (crc
>> 8);
216 static inline unsigned long
217 partial_crc32(const char *s
, unsigned long crc
)
220 crc
= partial_crc32_one(*s
++, crc
);
224 static inline unsigned long
227 return partial_crc32(s
, 0xffffffff) ^ 0xffffffff;
231 extern char *intOutputTypes
[];
233 extern char *uintOutputTypes
[];
235 extern char *floatOutputTypes
[];