genevent xml std
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Mon, 27 Feb 2006 21:41:24 +0000 (21:41 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Mon, 27 Feb 2006 21:41:24 +0000 (21:41 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@1560 04897980-b3bd-0310-b5e0-8ef037075253

genevent-new/parser.c
genevent-new/parser.h

index 2d8c9c4ae2f992d4f4252181caeb11747b140bd9..bcae82e1a4ab89e62948c998a6d7d088bf88c22f 100644 (file)
@@ -97,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;
 }
@@ -360,21 +375,40 @@ char *getNameAttribute(parse_file_t *in)
 
 
 //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)
@@ -732,7 +766,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));
@@ -752,13 +786,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;
index c3a0c5eec7efcedd4f5174ad874270535f0f4224..70e89cb0ffc33064879442073937d8366e471c6b 100644 (file)
@@ -172,8 +172,7 @@ void generateChecksum(char * facName,
 char * getNameAttribute(parse_file_t *in);
 char * getFormatAttribute(parse_file_t *in);
 int    getSizeAttribute(parse_file_t *in);
-int    getValueAttribute(parse_file_t *in);
-char * getValueStrAttribute(parse_file_t *in);
+int    getValueAttribute(parse_file_t *in, long long *value);
 
 char * getDescription(parse_file_t *in);
 
This page took 0.02566 seconds and 4 git commands to generate.