add func instrumentation
[lttv.git] / ltt / branches / poly / ltt / parser.c
index 492f766724f9aaa38c5eb3be12194af3d6bbcb95..28ebaeea9dba2e5a99eac16c404be0f62d81d000 100644 (file)
@@ -1,25 +1,24 @@
 /*
- * parser.c: Generate helper declarations and functions to trace events
- * from an event description file.
- *
- *    Copyright (C) 2005, Mathieu Desnoyers
- *    Copyright (C) 2002, Xianxiu Yang
- *    Copyright (C) 2002, Michel Dagenais 
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License Version 2.1 as published by the Free Software Foundation.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
+
+parser.c: Generate helper declarations and functions to trace events
+  from an event description file.
+
+           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.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+*/
 
 /* This program reads the ".xml" event definitions input files 
    and constructs structure for each event.
@@ -98,11 +97,26 @@ int getSizeindex(unsigned int value)
 unsigned long long int getSize(parse_file_t *in)
 {
   char *token;
+       int has_quotes = 0;
+       unsigned long long int ret;
 
   token = getToken(in);
+       if(token[0] == '"') {
+               has_quotes = 1;
+               token = getToken(in);
+       }
   if(in->type == NUMBER) {
-               return strtoull(token, NULL, 0);
-  }
+               ret = strtoull(token, NULL, 0);
+  } else {
+               goto error;
+       }
+       if(has_quotes) {
+               token = getToken(in);
+               if(token[0] != '"') goto error;
+       }
+               
+       return ret;
+error:
   in->error(in,"incorrect size specification");
   return -1;
 }
@@ -184,6 +198,7 @@ void getTypeAttributes(parse_file_t *in, type_descriptor_t *t,
   t->fmt = NULL;
   t->size = 0;
   t->custom_write = 0;
+       t->network = 0;
   
   while(1) {
     token = getToken(in); 
@@ -206,7 +221,9 @@ void getTypeAttributes(parse_file_t *in, type_descriptor_t *t,
       t->size = getSize(in);
     } else if(!strcmp("custom_write", token)) {
       t->custom_write = 1;
-    }
+    } else if(!strcmp("network", token)) {
+                       t->network = 1;
+               }
   }
 }
 
@@ -230,6 +247,8 @@ void getEventAttributes(parse_file_t *in, event_t *ev)
   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); 
@@ -248,7 +267,11 @@ void getEventAttributes(parse_file_t *in, event_t *ev)
       ev->per_trace = 1;
     } else if(!strcmp("per_tracefile", token)) {
       ev->per_tracefile = 1;
-    }
+    } else if(!strcmp("param_buffer", token)) {
+                       ev->param_buffer = 1;
+               } else if(!strcmp("no_instrument_function", token)) {
+                       ev->no_instrument_function = 1;
+               }
 
   }
 }
@@ -272,6 +295,7 @@ void getFacilityAttributes(parse_file_t *in, facility_t *fac)
   
   fac->name = NULL;
   fac->arch = NULL;
+       fac->user = 0;
 
   while(1) {
     token = getToken(in); 
@@ -286,6 +310,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_")) == 0)
+                               fac->user = 1;
     } else if(!strcmp("arch", token)) {
       getEqual(in);
       car = seekNextChar(in);
@@ -328,7 +354,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)
@@ -339,42 +365,59 @@ char *getNameAttribute(parse_file_t *in)
   
   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 == '\"') 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 <label name=label_name value=n format="..."/>, value is an option
-char * getValueStrAttribute(parse_file_t *in)
+//Return value : 0 : no value,   1 : has a value
+int getValueAttribute(parse_file_t *in, long long *value)
 {
   char * token;
+       int has_quotes = 0;
 
   token = getToken(in); 
   if(strcmp("/",token) == 0){
     ungetToken(in);
-    return NULL;
+    return 0;
   }
   
   if(strcmp("value",token))in->error(in,"value was expected");
   getEqual(in);
   token = getToken(in);
-  if(in->type != NUMBER) in->error(in,"number was expected");
-  return token;  
+
+       if(token[0] == '"') {
+               has_quotes = 1;
+               token = getToken(in);
+       }
+  if(in->type == NUMBER) {
+               *value = strtoll(token, NULL, 0);
+  } else {
+               goto error;
+       }
+       if(has_quotes) {
+               token = getToken(in);
+               if(token[0] != '"') goto error;
+       }
+  return 1;
+
+error:
+  in->error(in,"incorrect size specification");
+  return 0;
 }
 
 char * getDescription(parse_file_t *in)
@@ -558,6 +601,8 @@ void parseFields(parse_file_t *in, field_t *f,
                getRAnglebracket(in);
 
                f->description = getDescription(in);
+       } else {
+               f->description = NULL;
        }
 
   //<int size=...>
@@ -730,7 +775,7 @@ type_descriptor_t *parseType(parse_file_t *in, type_descriptor_t *inType,
   }
   else if(strcmp(token,"enum") == 0) {
     char * str;
-    int value = -1;
+    long long value = -1;
 
     t->type = ENUM;
     sequence_init(&(t->labels));
@@ -750,13 +795,15 @@ type_descriptor_t *parseType(parse_file_t *in, type_descriptor_t *inType,
     token = getToken(in); //"label" or "/"
     while(strcmp("label",token) == 0){
       int *label_value = malloc(sizeof(int));
+                       int has_value = 0;
+                       long long loc_value;
       
       str   = allocAndCopy(getNameAttribute(in));
-      token = getValueStrAttribute(in);
+      has_value = getValueAttribute(in, &loc_value);
       
        sequence_push(&(t->labels),str);
 
-      if(token) value = strtol(token, NULL, 0);
+      if(has_value) value = loc_value;
       else value++;
 
       *label_value = value;
@@ -1498,7 +1545,8 @@ void sequence_push(sequence_t *t, void *elem)
 
 void *sequence_pop(sequence_t *t) 
 {
-  return t->array[t->position--];
+       if(t->position == 0) printf("Error : trying to pop an empty sequence");
+  return t->array[--t->position];
 }
 
 
This page took 0.026064 seconds and 4 git commands to generate.