X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Fparser.c;h=1ab1b73bf7bf256ac23f468d95482c31584cfc33;hb=01e5c8ac303294105046b1383fe923ae28bd4890;hp=8e409aa927736ac2f9334a58d14e55e23f928626;hpb=4e4d11b3b1db254446f6cad04b3c3fa9b574851f;p=lttv.git diff --git a/ltt/branches/poly/ltt/parser.c b/ltt/branches/poly/ltt/parser.c index 8e409aa9..1ab1b73b 100644 --- a/ltt/branches/poly/ltt/parser.c +++ b/ltt/branches/poly/ltt/parser.c @@ -3,16 +3,15 @@ parser.c: Generate helper declarations and functions to trace events from an event description file. -Copyright (C) 2002, Xianxiu Yang -Copyright (C) 2002, Michel Dagenais -Copyright (C) 2005, Mathieu Desnoyers - -This program is free software; you can redistribute it and/or modify + Copyright (C) 2005, Mathieu Desnoyers + Copyright (C) 2002, Xianxiu Yang + 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. + the Free Software Foundation; version 2 of the License. -This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -34,21 +33,58 @@ This program is distributed in the hope that it will be useful, all types is maintained to facilitate the freeing of all type information when the processing of an ".xml" file is finished. */ -#ifdef HAVE_CONFIG_H -#include -#endif - #include #include #include #include +#include +#include #include -#include -#include - #include "parser.h" + +char *intOutputTypes[] = { + "int8_t", "int16_t", "int32_t", "int64_t" }; + +char *uintOutputTypes[] = { + "uint8_t", "uint16_t", "uint32_t", "uint64_t" }; + +char *floatOutputTypes[] = { + "undef", "undef", "float", "double" }; + + + + +/* helper function */ +void strupper(char *string) +{ + char *ptr = string; + + while(*ptr != '\0') { + *ptr = toupper(*ptr); + ptr++; + } +} + + +int getSizeindex(unsigned int value) +{ + switch(value) { + case 1: + return 0; + case 2: + return 1; + case 4: + return 2; + case 8: + return 3; + default: + printf("Error : unknown value size %d\n", value); + exit(-1); + } +} + /***************************************************************************** *Function name * getSize : translate from string to integer @@ -58,22 +94,33 @@ This program is distributed in the hope that it will be useful, * size *****************************************************************************/ -int getSize(parse_file *in) +unsigned long long int getSize(parse_file_t *in) { - gchar *token; + char *token, *token2; + unsigned long long int ret; token = getToken(in); - if(in->type == NUMBER) { - if(g_ascii_strcasecmp(token,"1") == 0) return 0; - else if(g_ascii_strcasecmp(token,"2") == 0) return 1; - else if(g_ascii_strcasecmp(token,"4") == 0) return 2; - else if(g_ascii_strcasecmp(token,"8") == 0) return 3; - } - else if(in->type == NAME) { - if(g_ascii_strcasecmp(token,"short") == 0) return 4; - else if(g_ascii_strcasecmp(token,"medium") == 0) return 5; - else if(g_ascii_strcasecmp(token,"long") == 0) return 6; + + + if(in->type == QUOTEDSTRING) { + in->type = NUMBER; + token2 = token; + do { + if (!isdigit(*token2)) { + in->type = QUOTEDSTRING; + break; + } + } while (*(++token2) != '\0'); } + + if(in->type == NUMBER) { + ret = strtoull(token, NULL, 0); + } else { + goto error; + } + + return ret; +error: in->error(in,"incorrect size specification"); return -1; } @@ -86,131 +133,347 @@ int getSize(parse_file *in) * msg : message to be printed ****************************************************************************/ -void error_callback(parse_file *in, char *msg) +void error_callback(parse_file_t *in, char *msg) { if(in) - g_printf("Error in file %s, line %d: %s\n", in->name, in->lineno, msg); + printf("Error in file %s, line %d: %s\n", in->name, in->lineno, msg); else printf("%s\n",msg); + assert(0); + exit(1); +} + +/***************************************************************************** + *Function name + * memAlloc : allocate memory + *Input params + * size : required memory size + *return value + * void * : pointer to allocate memory or NULL + ****************************************************************************/ + +void * memAlloc(int size) +{ + void * addr; + if(size == 0) return NULL; + addr = malloc(size); + if(!addr){ + printf("Failed to allocate memory"); + exit(1); + } + return addr; +} + +/***************************************************************************** + *Function name + * allocAndCopy : allocate memory and initialize it + *Input params + * str : string to be put in memory + *return value + * char * : pointer to allocate memory or NULL + ****************************************************************************/ + +char *allocAndCopy(char *str) +{ + char * addr; + if(str == NULL) return NULL; + addr = (char *)memAlloc(strlen(str)+1); + strcpy(addr,str); + return addr; } /************************************************************************** * Function : - * getNameAttribute,getFormatAttribute,getSizeAttribute,getValueAttribute - * getValueStrAttribute + * getTypeAttributes * Description : * Read the attribute from the input file. * * Parameters : * in , input file handle. - * - * Return values : - * address of the attribute. + * t , the type descriptor to fill. * **************************************************************************/ -gchar * getNameAttribute(parse_file *in) +void getTypeAttributes(parse_file_t *in, type_descriptor_t *t, + sequence_t * unnamed_types, table_t * named_types) { - gchar * token; - gunichar car; - GIOStatus status; - - token = getName(in); - if(g_ascii_strcasecmp("name",token))in->error(in,"name was expected"); - getEqual(in); + char * token; + char car; + + t->fmt = NULL; + t->size = 0; + t->custom_write = 0; + t->network = 0; - status = seekNextChar(in, &car); - if(status == G_IO_STATUS_EOF || status == G_IO_STATUS_ERROR) - in->error(in,"name was expected"); - else if(car == '\"') token = getQuotedString(in); - else token = getName(in); - return token; + while(1) { + token = getToken(in); + if(strcmp("/",token) == 0 || strcmp(">",token) == 0){ + ungetToken(in); + break; + } + + if(!strcmp("format",token)) { + getEqual(in); + t->fmt = allocAndCopy(getQuotedString(in)); + //} else if(!strcmp("name",token)) { + // getEqual(in); + // car = seekNextChar(in); + // if(car == EOF) in->error(in,"name was expected"); + // else if(car == '\"') t->type_name = allocAndCopy(getQuotedString(in)); + // else t->type_name = allocAndCopy(getName(in)); + } else if(!strcmp("size",token)) { + getEqual(in); + t->size = getSize(in); + } 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; + } + } 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; + } + } + } } -char * getFormatAttribute(parse_file *in) +/************************************************************************** + * Function : + * getEventAttributes + * Description : + * Read the attribute from the input file. + * + * Parameters : + * in , input file handle. + * ev , the event to fill. + * + **************************************************************************/ + +void getEventAttributes(parse_file_t *in, event_t *ev) { char * token; + char car; + + ev->name = NULL; + ev->per_trace = 0; + ev->per_tracefile = 0; + ev->param_buffer = 0; + ev->no_instrument_function = 0; + + while(1) { + token = getToken(in); + if(strcmp("/",token) == 0 || strcmp(">",token) == 0){ + ungetToken(in); + break; + } - //format is an option - token = getToken(in); - if(g_ascii_strcasecmp("/",token) == 0 || g_ascii_strcasecmp(">",token) == 0){ - ungetToken(in); - return NULL; + if(!strcmp("name",token)) { + getEqual(in); + car = seekNextChar(in); + if(car == EOF) in->error(in,"name was expected"); + else if(car == '\"') ev->name = allocAndCopy(getQuotedString(in)); + else ev->name = allocAndCopy(getName(in)); + } else if(!strcmp("scope", token)) { + getEqual(in); + car = seekNextChar(in); + if(car == EOF) in->error(in,"scope was expected"); + else if(car == '\"') token = getQuotedString(in); + else token = getName(in); + if(!strcmp(token, "trace")) ev->per_trace = 1; + else if(!strcmp(token, "tracefile")) ev->per_tracefile = 1; + } else if(!strcmp("param", token)) { + getEqual(in); + car = seekNextChar(in); + if(car == EOF) in->error(in,"parameter type was expected"); + else if(car == '\"') token = getQuotedString(in); + else token = getName(in); + if(!strcmp(token, "buffer")) ev->param_buffer = 1; + } else if(!strcmp("attribute", token)) { + getEqual(in); + car = seekNextChar(in); + if(car == EOF) in->error(in,"attribute was expected"); + else if(car == '\"') token = getQuotedString(in); + else token = getName(in); + if(!strcmp(token, "no_instrument_function")) + ev->no_instrument_function = 1; + } } +} - if(g_ascii_strcasecmp("format",token))in->error(in,"format was expected"); - getEqual(in); - token = getQuotedString(in); - return token; +/************************************************************************** + * Function : + * getFacilityAttributes + * Description : + * Read the attribute from the input file. + * + * Parameters : + * in , input file handle. + * fac , the facility to fill. + * + **************************************************************************/ + +void getFacilityAttributes(parse_file_t *in, facility_t *fac) +{ + char * token; + char car; + + fac->name = NULL; + fac->arch = NULL; + fac->user = 0; + + while(1) { + token = getToken(in); + if(strcmp("/",token) == 0 || strcmp(">",token) == 0){ + ungetToken(in); + break; + } + + if(!strcmp("name",token)) { + getEqual(in); + car = seekNextChar(in); + 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; + } else if(!strcmp("arch", token)) { + getEqual(in); + car = seekNextChar(in); + if(car == '\"') fac->arch = allocAndCopy(getQuotedString(in)); + else fac->arch = allocAndCopy(getName(in)); + } + } } -int getSizeAttribute(parse_file *in) +/************************************************************************** + * Function : + * getFieldAttributes + * Description : + * Read the attribute from the input file. + * + * Parameters : + * in , input file handle. + * f , the field to fill. + * + **************************************************************************/ + +void getFieldAttributes(parse_file_t *in, field_t *f) { - /* skip name and equal */ - getName(in); - getEqual(in); + char * token; + char car; + + f->name = NULL; + + while(1) { + token = getToken(in); + if(strcmp("/",token) == 0 || strcmp(">",token) == 0){ + ungetToken(in); + break; + } - return getSize(in); + if(!strcmp("name",token)) { + getEqual(in); + car = seekNextChar(in); + if(car == EOF) in->error(in,"name was expected"); + else if(car == '\"') f->name = allocAndCopy(getQuotedString(in)); + else f->name = allocAndCopy(getName(in)); + } + } } -int getValueAttribute(parse_file *in) +char *getNameAttribute(parse_file_t *in) { - /* skip name and equal */ - getName(in); - getEqual(in); + char * token; + char *name = NULL; + char car; - return getNumber(in); + while(1) { + token = getToken(in); + if(!strcmp("name",token)) { + getEqual(in); + car = seekNextChar(in); + if(car == EOF) in->error(in,"name was expected"); + else if(car == '\"') name = allocAndCopy(getQuotedString(in)); + else name = allocAndCopy(getName(in)); + } else { + ungetToken(in); + break; + } + + } + if(name == NULL) in->error(in, "Name was expected"); + return name; } -//for