-Wall -Wformat fixes
[lttv.git] / ltt / branches / poly / ltt / parser.h
CommitLineData
90395b4b 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;
90699b2b 10} sequence_t;
90395b4b 11
90699b2b 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);
90395b4b 16
17
18/* Hash table */
19
20typedef struct _table {
90699b2b 21 sequence_t keys;
22 sequence_t values;
23} table_t;
90395b4b 24
90699b2b 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);
90395b4b 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
90699b2b 44} token_type_t;
90395b4b 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;
90699b2b 53 token_type_t type;
90395b4b 54 int unget;
55 void (*error) (struct _parse_file *, char *);
90699b2b 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);
90395b4b 71
72/* Some constants */
73
74static const int BUFFER_SIZE = 1024;
75
76
77/* Events data types */
78
79typedef enum _data_type {
80 INT,
81 UINT,
82 POINTER,
83 LONG,
84 ULONG,
85 SIZE_T,
86 SSIZE_T,
87 OFF_T,
88 FLOAT,
89 STRING,
90 ENUM,
91 ARRAY,
92 SEQUENCE,
93 STRUCT,
94 UNION,
95 NONE
90699b2b 96} data_type_t;
90395b4b 97
98/* Event type descriptors */
99
100typedef struct _type_descriptor {
101 char * type_name; //used for named type
90699b2b 102 data_type_t type;
90395b4b 103 char *fmt;
104 int size;
90699b2b 105 sequence_t labels; // for enumeration
106 sequence_t labels_description;
90395b4b 107 int already_printed;
90699b2b 108 sequence_t fields; // for structure
90395b4b 109 struct _type_descriptor *nested_type; // for array and sequence
110 int alignment;
90699b2b 111} type_descriptor_t;
90395b4b 112
113
114/* Fields within types */
115
116typedef struct _field{
117 char *name;
118 char *description;
90699b2b 119 type_descriptor_t *type;
120} field_t;
90395b4b 121
122
123/* Events definitions */
124
125typedef struct _event {
126 char *name;
127 char *description;
90699b2b 128 type_descriptor_t *type;
90395b4b 129 int per_trace; /* Is the event able to be logged to a specific trace ? */
130 int per_tracefile; /* Must we log this event in a specific tracefile ? */
90699b2b 131} event_t;
90395b4b 132
133typedef struct _facility {
134 char * name;
135 char * capname;
136 char * description;
90699b2b 137 sequence_t events;
138 sequence_t unnamed_types;
139 table_t named_types;
140} facility_t;
141
142int getSize(parse_file_t *in);
143unsigned long getTypeChecksum(unsigned long aCrc, type_descriptor_t * type);
144
145void parseFacility(parse_file_t *in, facility_t * fac);
146void parseEvent(parse_file_t *in, event_t *ev, sequence_t * unnamed_types,
147 table_t * named_types);
148void parseTypeDefinition(parse_file_t *in,
149 sequence_t * unnamed_types, table_t * named_types);
150type_descriptor_t *parseType(parse_file_t *in,
151 type_descriptor_t *t, sequence_t * unnamed_types, table_t * named_types);
152void parseFields(parse_file_t *in, type_descriptor_t *t,
153 sequence_t * unnamed_types, table_t * named_types);
154void checkNamedTypesImplemented(table_t * namedTypes);
155type_descriptor_t * find_named_type(char *name, table_t * named_types);
156void generateChecksum(char * facName,
157 unsigned long * checksum, sequence_t * events);
90395b4b 158
159
160/* get attributes */
90699b2b 161char * getNameAttribute(parse_file_t *in);
162char * getFormatAttribute(parse_file_t *in);
163int getSizeAttribute(parse_file_t *in);
164int getValueAttribute(parse_file_t *in);
165char * getValueStrAttribute(parse_file_t *in);
90395b4b 166
90699b2b 167char * getDescription(parse_file_t *in);
90395b4b 168
169
90395b4b 170/* Dynamic memory allocation and freeing */
171
172void * memAlloc(int size);
173char *allocAndCopy(char * str);
174char *appendString(char *s, char *suffix);
90699b2b 175void freeTypes(sequence_t *t);
176void freeType(type_descriptor_t * td);
177void freeEvents(sequence_t *t);
178void freeNamedType(table_t * t);
179void error_callback(parse_file_t *in, char *msg);
90395b4b 180
181
182//checksum part
183static const unsigned int crctab32[] =
184{
185#include "crc32.tab"
186};
187
188static inline unsigned long
189partial_crc32_one(unsigned char c, unsigned long crc)
190{
191 return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8);
192}
193
194static inline unsigned long
195partial_crc32(const char *s, unsigned long crc)
196{
197 while (*s)
198 crc = partial_crc32_one(*s++, crc);
199 return crc;
200}
201
202static inline unsigned long
203crc32(const char *s)
204{
205 return partial_crc32(s, 0xffffffff) ^ 0xffffffff;
206}
207
208
209#endif // PARSER_H
This page took 0.034165 seconds and 4 git commands to generate.