X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Fparser.c;fp=ltt%2Fbranches%2Fpoly%2Fltt%2Fparser.c;h=25fabab5e98245b59b2704f25d8e80659e1f5b24;hb=2d1580e7d355e380bfb61abf108c55c3fbb76a9d;hp=2a7dd1e532311351baee1c0ed8577c61444283d2;hpb=3295df23e59a1a7fd4daf32af8ecbf594567b64e;p=lttv.git diff --git a/ltt/branches/poly/ltt/parser.c b/ltt/branches/poly/ltt/parser.c index 2a7dd1e5..25fabab5 100644 --- a/ltt/branches/poly/ltt/parser.c +++ b/ltt/branches/poly/ltt/parser.c @@ -3,9 +3,9 @@ parser.c: Generate helper declarations and functions to trace events from an event description file. - Copyright (C) 2005, Mathieu Desnoyers + Copyright (C) 2005, Mathieu Desnoyers Copyright (C) 2002, Xianxiu Yang - Copyright (C) 2002, Michel Dagenais + Copyright (C) 2002, Michel Dagenais This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. @@ -20,9 +20,9 @@ parser.c: Generate helper declarations and functions to trace events Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* This program reads the ".xml" event definitions input files +/* This program reads the ".xml" event definitions input files and constructs structure for each event. - + The program uses a very simple tokenizer, called from a hand written recursive descent parser to fill a data structure describing the events. The result is a sequence of events definitions which refer to type @@ -30,14 +30,14 @@ parser.c: Generate helper declarations and functions to trace events A table of named types is maintained to allow refering to types by name when the same type is used at several places. Finally a sequence of - all types is maintained to facilitate the freeing of all type + all types is maintained to facilitate the freeing of all type information when the processing of an ".xml" file is finished. */ -#include +#include #include #include #include -#include +#include #include #include @@ -60,16 +60,16 @@ char *floatOutputTypes[] = { void strupper(char *string) { char *ptr = string; - + while(*ptr != '\0') { *ptr = toupper(*ptr); - ptr++; + ptr++; } } int getSizeindex(unsigned int value) -{ +{ switch(value) { case 1: return 0; @@ -88,10 +88,10 @@ int getSizeindex(unsigned int value) /***************************************************************************** *Function name * getSize : translate from string to integer - *Input params + *Input params * in : input file handle - *Return values - * size + *Return values + * size *****************************************************************************/ unsigned long long int getSize(parse_file_t *in) @@ -106,20 +106,20 @@ unsigned long long int getSize(parse_file_t *in) in->type = NUMBER; token2 = token; do { - if (!isdigit(*token2)) { - in->type = QUOTEDSTRING; - break; - } + if (!isdigit(*token2)) { + in->type = QUOTEDSTRING; + break; + } } while (*(++token2) != '\0'); } if(in->type == NUMBER) { - ret = strtoull(token, NULL, 0); + ret = strtoull(token, NULL, 0); } else { - goto error; - } - - return ret; + goto error; + } + + return ret; error: in->error(in,"incorrect size specification"); return -1; @@ -130,7 +130,7 @@ error: * error_callback : print out error info *Input params * in : input file handle - * msg : message to be printed + * msg : message to be printed ****************************************************************************/ void error_callback(parse_file_t *in, char *msg) @@ -145,11 +145,11 @@ void error_callback(parse_file_t *in, char *msg) /***************************************************************************** *Function name - * memAlloc : allocate memory - *Input params - * size : required memory size - *return value - * void * : pointer to allocate memory or NULL + * memAlloc : allocate memory + *Input params + * size : required memory size + *return value + * void * : pointer to allocate memory or NULL ****************************************************************************/ void * memAlloc(int size) @@ -158,18 +158,18 @@ void * memAlloc(int size) if(size == 0) return NULL; addr = malloc(size); if(!addr){ - printf("Failed to allocate memory"); + printf("Failed to allocate memory"); exit(1); } - return addr; + return addr; } /***************************************************************************** *Function name - * allocAndCopy : allocate memory and initialize it - *Input params - * str : string to be put in memory - *return value + * allocAndCopy : allocate memory and initialize it + *Input params + * str : string to be put in memory + *return value * char * : pointer to allocate memory or NULL ****************************************************************************/ @@ -195,7 +195,7 @@ char *allocAndCopy(char *str) **************************************************************************/ void getTypeAttributes(parse_file_t *in, type_descriptor_t *t, - sequence_t * unnamed_types, table_t * named_types) + sequence_t * unnamed_types, table_t * named_types) { char * token; int car; @@ -204,14 +204,14 @@ void getTypeAttributes(parse_file_t *in, type_descriptor_t *t, t->size = 0; t->custom_write = 0; t->network = 0; - + while(1) { - token = getToken(in); + token = getToken(in); if(strcmp("/",token) == 0 || strcmp(">",token) == 0){ ungetToken(in); break; } - + if(!strcmp("format",token)) { getEqual(in); t->fmt = allocAndCopy(getQuotedString(in)); @@ -227,23 +227,23 @@ void getTypeAttributes(parse_file_t *in, type_descriptor_t *t, } else if(!strcmp("custom_write", token)) { t->custom_write = 1; } else if(!strcmp("byte_order",token)) { - getEqual(in); - car = seekNextChar(in); - if(car == EOF) in->error(in,"byte order was expected (network?)"); - else if(car == '\"') token = getQuotedString(in); - else token = getName(in); - if(!strcmp("network", token)) { - t->network = 1; - } + getEqual(in); + car = seekNextChar(in); + if(car == EOF) in->error(in,"byte order was expected (network?)"); + else if(car == '\"') token = getQuotedString(in); + else token = getName(in); + if(!strcmp("network", token)) { + t->network = 1; + } } else if(!strcmp("write",token)) { - getEqual(in); - car = seekNextChar(in); - if(car == EOF) in->error(in,"write type was expected (custom?)"); - else if(car == '\"') token = getQuotedString(in); - else token = getName(in); - if(!strcmp("custom", token)) { - t->custom_write = 1; - } + getEqual(in); + car = seekNextChar(in); + if(car == EOF) in->error(in,"write type was expected (custom?)"); + else if(car == '\"') token = getQuotedString(in); + else token = getName(in); + if(!strcmp("custom", token)) { + t->custom_write = 1; + } } } } @@ -264,7 +264,7 @@ void getEventAttributes(parse_file_t *in, event_t *ev) { char * token; int car; - + ev->name = NULL; ev->per_trace = 0; ev->per_tracefile = 0; @@ -275,7 +275,7 @@ void getEventAttributes(parse_file_t *in, event_t *ev) ev->compact_data = 0; while(1) { - token = getToken(in); + token = getToken(in); if(strcmp("/",token) == 0 || strcmp(">",token) == 0){ ungetToken(in); break; @@ -336,14 +336,14 @@ void getFacilityAttributes(parse_file_t *in, facility_t *fac) { char * token; int car; - + fac->name = NULL; fac->arch = NULL; fac->align = 1; fac->user = 0; while(1) { - token = getToken(in); + token = getToken(in); if(strcmp("/",token) == 0 || strcmp(">",token) == 0){ ungetToken(in); break; @@ -355,8 +355,8 @@ void getFacilityAttributes(parse_file_t *in, facility_t *fac) if(car == EOF) in->error(in,"name was expected"); else if(car == '\"') fac->name = allocAndCopy(getQuotedString(in)); else fac->name = allocAndCopy(getName(in)); - if(!strncmp(fac->name, "user_", sizeof("user_")-1)) - fac->user = 1; + if(!strncmp(fac->name, "user_", sizeof("user_")-1)) + fac->user = 1; } else if(!strcmp("arch", token)) { getEqual(in); car = seekNextChar(in); @@ -390,7 +390,7 @@ void getFieldAttributes(parse_file_t *in, field_t *f) f->name = NULL; while(1) { - token = getToken(in); + token = getToken(in); if(strcmp("/",token) == 0 || strcmp(">",token) == 0){ ungetToken(in); break; @@ -403,7 +403,7 @@ void getFieldAttributes(parse_file_t *in, field_t *f) else if(car == '\"') f->name = allocAndCopy(getQuotedString(in)); else f->name = allocAndCopy(getName(in)); } - } + } } char *getNameAttribute(parse_file_t *in) @@ -411,9 +411,9 @@ char *getNameAttribute(parse_file_t *in) char * token; char *name = NULL; int car; - + while(1) { - token = getToken(in); + token = getToken(in); if(!strcmp("name",token)) { getEqual(in); car = seekNextChar(in); @@ -439,13 +439,13 @@ int getValueAttribute(parse_file_t *in, long long *value) char * token, *token2; token = getToken(in); - + if(strcmp("/",token) == 0 || strcmp(">", token) == 0){ ungetToken(in); return 0; } if(strcmp("value",token))in->error(in,"value was expected"); - + getEqual(in); token = getToken(in); @@ -453,17 +453,17 @@ int getValueAttribute(parse_file_t *in, long long *value) in->type = NUMBER; token2 = token; do { - if (!isdigit(*token2)) { + if (!isdigit(*token2)) { in->type = QUOTEDSTRING; break; - } + } } while (*(++token2) != '\0'); } if(in->type == NUMBER) - *value = strtoll(token, NULL, 0); - else - goto error; + *value = strtoll(token, NULL, 0); + else + goto error; return 1; error: in->error(in,"incorrect size specification"); @@ -484,7 +484,7 @@ char * getDescription(parse_file_t *in) fseek(in->fp, pos, SEEK_SET); return NULL; } - + getRAnglebracket(in); pos = 0; @@ -509,9 +509,9 @@ char * getDescription(parse_file_t *in) /***************************************************************************** *Function name - * parseFacility : generate event list - *Input params - * in : input file handle + * parseFacility : generate event list + *Input params + * in : input file handle * fac : empty facility *Output params * fac : facility filled with event list @@ -521,18 +521,18 @@ void parseFacility(parse_file_t *in, facility_t * fac) { char * token; event_t *ev; - + getFacilityAttributes(in, fac); if(fac->name == NULL) in->error(in, "Attribute not named"); - + fac->capname = allocAndCopy(fac->name); - strupper(fac->capname); - getRAnglebracket(in); - + strupper(fac->capname); + getRAnglebracket(in); + fac->description = getDescription(in); - + while(1){ - getLAnglebracket(in); + getLAnglebracket(in); token = getToken(in); if(in->type == ENDFILE) @@ -541,7 +541,7 @@ void parseFacility(parse_file_t *in, facility_t * fac) if(strcmp("event",token) == 0){ ev = (event_t*) memAlloc(sizeof(event_t)); sequence_push(&(fac->events),ev); - parseEvent(fac, in, ev, &(fac->unnamed_types), &(fac->named_types)); + parseEvent(fac, in, ev, &(fac->unnamed_types), &(fac->named_types)); }else if(strcmp("type",token) == 0){ parseTypeDefinition(fac, in, &(fac->unnamed_types), &(fac->named_types)); }else if(in->type == FORWARDSLASH){ @@ -556,151 +556,151 @@ void parseFacility(parse_file_t *in, facility_t * fac) /***************************************************************************** *Function name - * parseEvent : generate event from event definition + * parseEvent : generate event from event definition *Input params * fac : facility holding the event - * in : input file handle - * ev : new event + * in : input file handle + * ev : new event * unnamed_types : array of unamed types * named_types : array of named types - *Output params - * ev : new event (parameters are passed to it) + *Output params + * ev : new event (parameters are passed to it) ****************************************************************************/ -void parseEvent(facility_t *fac, parse_file_t *in, event_t * ev, sequence_t * unnamed_types, - table_t * named_types) +void parseEvent(facility_t *fac, parse_file_t *in, event_t * ev, sequence_t * unnamed_types, + table_t * named_types) { char *token; - field_t *f; + field_t *f; ev->fac = fac; - sequence_init(&(ev->fields)); + sequence_init(&(ev->fields)); // getEventAttributes(in, ev); if(ev->name == NULL) in->error(in, "Event not named"); - getRAnglebracket(in); + getRAnglebracket(in); //... - ev->description = getDescription(in); - - int got_end = 0; - /* Events can have multiple fields. each field form at least a function - * parameter of the logging function. */ - while(!got_end) { - getLAnglebracket(in); - token = getToken(in); - - switch(in->type) { - case FORWARDSLASH: /* */ - token = getName(in); - if(strcmp("event",token))in->error(in,"not an event definition"); - getRAnglebracket(in); // - got_end = 1; - break; - case NAME: /* a field */ - if(strcmp("field",token))in->error(in,"expecting a field"); - f = (field_t *)memAlloc(sizeof(field_t)); - sequence_push(&(ev->fields),f); - parseFields(fac, in, f, unnamed_types, named_types, 1); - break; - default: - in->error(in, "expecting or "); - break; - } - } + ev->description = getDescription(in); + + int got_end = 0; + /* Events can have multiple fields. each field form at least a function + * parameter of the logging function. */ + while(!got_end) { + getLAnglebracket(in); + token = getToken(in); + + switch(in->type) { + case FORWARDSLASH: /* */ + token = getName(in); + if(strcmp("event",token))in->error(in,"not an event definition"); + getRAnglebracket(in); // + got_end = 1; + break; + case NAME: /* a field */ + if(strcmp("field",token))in->error(in,"expecting a field"); + f = (field_t *)memAlloc(sizeof(field_t)); + sequence_push(&(ev->fields),f); + parseFields(fac, in, f, unnamed_types, named_types, 1); + break; + default: + in->error(in, "expecting or "); + break; + } + } #if 0 - if(in->type == FORWARDSLASH){ // NOTHING - ev->type = NULL; - }else if(in->type == NAME){ - if(strcmp("struct",token)==0 || strcmp("typeref",token)==0){ - ungetToken(in); - ev->type = parseType(in,NULL, unnamed_types, named_types); - if(ev->type->type != STRUCT && ev->type->type != NONE) - in->error(in,"type must be a struct"); - }else in->error(in, "not a valid type"); - - getLAnglebracket(in); - getForwardslash(in); - }else in->error(in,"not a struct type"); - getLAnglebracket(in); - getForwardslash(in); - token = getName(in); - if(strcmp("event",token))in->error(in,"not an event definition"); - getRAnglebracket(in); // + if(in->type == FORWARDSLASH){ // NOTHING + ev->type = NULL; + }else if(in->type == NAME){ + if(strcmp("struct",token)==0 || strcmp("typeref",token)==0){ + ungetToken(in); + ev->type = parseType(in,NULL, unnamed_types, named_types); + if(ev->type->type != STRUCT && ev->type->type != NONE) + in->error(in,"type must be a struct"); + }else in->error(in, "not a valid type"); + + getLAnglebracket(in); + getForwardslash(in); + }else in->error(in,"not a struct type"); + getLAnglebracket(in); + getForwardslash(in); + token = getName(in); + if(strcmp("event",token))in->error(in,"not an event definition"); + getRAnglebracket(in); // #endif //0 } /***************************************************************************** *Function name - * parseField : get field infomation from buffer - *Input params + * parseField : get field infomation from buffer + *Input params * fac : facility holding the field * in : input file handle * f : field * unnamed_types : array of unamed types * named_types : array of named types - * tag : is field surrounded by a tag ? + * tag : is field surrounded by a tag ? ****************************************************************************/ void parseFields(facility_t *fac, parse_file_t *in, field_t *f, sequence_t * unnamed_types, - table_t * named_types, - int tag) + table_t * named_types, + int tag) { char * token; f->fac = fac; - if(tag) { - // - getFieldAttributes(in, f); - if(f->name == NULL) in->error(in, "Field not named"); - getRAnglebracket(in); + if(tag) { + // + getFieldAttributes(in, f); + if(f->name == NULL) in->error(in, "Field not named"); + getRAnglebracket(in); - f->description = getDescription(in); - } else { - f->description = NULL; - } + f->description = getDescription(in); + } else { + f->description = NULL; + } // getLAnglebracket(in); f->type = parseType(fac, in,NULL, unnamed_types, named_types); - if(tag) { - getLAnglebracket(in); - getForwardslash(in); - token = getName(in); - if(strcmp("field",token))in->error(in,"not a valid field definition"); - getRAnglebracket(in); // - } + if(tag) { + getLAnglebracket(in); + getForwardslash(in); + token = getName(in); + if(strcmp("field",token))in->error(in,"not a valid field definition"); + getRAnglebracket(in); // + } } /***************************************************************************** *Function name - * parseType : get type information, type can be : + * parseType : get type information, type can be : * Primitive: - * int(size,fmt); uint(size,fmt); float(size,fmt); + * int(size,fmt); uint(size,fmt); float(size,fmt); * string(fmt); enum(size,fmt,(label1,label2...)) * Compound: * array(arraySize, type); sequence(lengthSize,type) - * struct(field(name,type,description)...) + * struct(field(name,type,description)...) * type name: * type(name,type) - *Input params + *Input params * fac : facility * in : input file handle - * inType : a type descriptor + * inType : a type descriptor * unnamed_types : array of unamed types * named_types : array of named types - *Return values - * type_descriptor* : a type descriptor + *Return values + * type_descriptor* : a type descriptor ****************************************************************************/ -type_descriptor_t *parseType(facility_t *fac, parse_file_t *in, type_descriptor_t *inType, - sequence_t * unnamed_types, table_t * named_types) +type_descriptor_t *parseType(facility_t *fac, parse_file_t *in, type_descriptor_t *inType, + sequence_t * unnamed_types, table_t * named_types) { char *token; type_descriptor_t *t; - field_t *f; + field_t *f; if(inType == NULL) { t = (type_descriptor_t *) memAlloc(sizeof(type_descriptor_t)); @@ -722,14 +722,14 @@ type_descriptor_t *parseType(facility_t *fac, parse_file_t *in, type_descriptor_ token = getToken(in); sequence_init(&(t->fields)); while(strcmp("field",token) == 0){ - f = (field_t *)memAlloc(sizeof(field_t)); - sequence_push(&(t->fields),f); + f = (field_t *)memAlloc(sizeof(field_t)); + sequence_push(&(t->fields),f); parseFields(fac, in, f, unnamed_types, named_types, 1); - + //next field getLAnglebracket(in); - token = getToken(in); + token = getToken(in); } if(strcmp("/",token))in->error(in,"not a valid structure definition"); token = getName(in); @@ -746,18 +746,18 @@ type_descriptor_t *parseType(facility_t *fac, parse_file_t *in, type_descriptor_ token = getToken(in); sequence_init(&(t->fields)); while(strcmp("field",token) == 0){ - f = (field_t *)memAlloc(sizeof(field_t)); - sequence_push(&(t->fields),f); + f = (field_t *)memAlloc(sizeof(field_t)); + sequence_push(&(t->fields),f); parseFields(fac, in, f, unnamed_types, named_types, 1); - + //next field getLAnglebracket(in); - token = getToken(in); + token = getToken(in); } if(strcmp("/",token))in->error(in,"not a valid union definition"); token = getName(in); if(strcmp("union",token)!=0) - in->error(in,"not a valid union definition"); + in->error(in,"not a valid union definition"); getRAnglebracket(in); // } else if(strcmp(token,"array") == 0) { @@ -768,15 +768,15 @@ type_descriptor_t *parseType(facility_t *fac, parse_file_t *in, type_descriptor_ getForwardslash(in); getRAnglebracket(in); // - //getLAnglebracket(in); // - /* subfield */ + //getLAnglebracket(in); // + /* subfield */ f = (field_t *)memAlloc(sizeof(field_t)); - + f->name = NULL; sequence_push(&(t->fields),f); parseFields(fac, in, f, unnamed_types, named_types, 0); - //getLAnglebracket(in); // + //getLAnglebracket(in); // //t->nested_type = parseType(in, NULL, unnamed_types, named_types); getLAnglebracket(in); // @@ -792,41 +792,41 @@ type_descriptor_t *parseType(facility_t *fac, parse_file_t *in, type_descriptor_ getForwardslash(in); getRAnglebracket(in); // - //getLAnglebracket(in); // - /* subfield */ + //getLAnglebracket(in); // + /* subfield */ f = (field_t *)memAlloc(sizeof(field_t)); f->name = NULL; sequence_push(&(t->fields),f); parseFields(fac, in, f, unnamed_types, named_types, 0); - //getLAnglebracket(in); // - /* subfield */ + //getLAnglebracket(in); // + /* subfield */ f = (field_t *)memAlloc(sizeof(field_t)); f->name = NULL; sequence_push(&(t->fields),f); parseFields(fac, in, f, unnamed_types, named_types, 0); - //getLAnglebracket(in); // + //getLAnglebracket(in); // //t->length_type = parseType(in, NULL, unnamed_types, named_types); - //getLAnglebracket(in); // + //getLAnglebracket(in); // //t->nested_type = parseType(in, NULL, unnamed_types, named_types); if(t->fields.position < 1) in->error(in, "Sequence has no length type"); if(t->fields.position < 2) in->error(in, "Sequence has no subtype"); - switch(((field_t*)t->fields.array[0])->type->type) { - case UINT_FIXED : - case UCHAR : - case USHORT : - case UINT : - case ULONG : - case SIZE_T : - case OFF_T : - break; - default: - in->error(in, "Wrong length type for sequence"); - } + switch(((field_t*)t->fields.array[0])->type->type) { + case UINT_FIXED : + case UCHAR : + case USHORT : + case UINT : + case ULONG : + case SIZE_T : + case OFF_T : + break; + default: + in->error(in, "Wrong length type for sequence"); + } getLAnglebracket(in); // getForwardslash(in); @@ -842,13 +842,13 @@ type_descriptor_t *parseType(facility_t *fac, parse_file_t *in, type_descriptor_ sequence_init(&(t->labels)); sequence_init(&(t->labels_values)); sequence_init(&(t->labels_description)); - t->already_printed = 0; + t->already_printed = 0; getTypeAttributes(in, t, unnamed_types, named_types); //if(t->size == 0) in->error(in, "Sequence has empty size"); - //Mathieu : we fix enum size to target int size. GCC is always like this. - //fox copy optimisation. + //Mathieu : we fix enum size to target int size. GCC is always like this. + //fox copy optimisation. if(t->size != 0) in->error(in, "Enum has fixed size of target int."); - t->size = 0; + t->size = 0; getRAnglebracket(in); //