use glib xml parser to parse system.xml
authoryangxx <yangxx@04897980-b3bd-0310-b5e0-8ef037075253>
Fri, 12 Dec 2003 19:22:08 +0000 (19:22 +0000)
committeryangxx <yangxx@04897980-b3bd-0310-b5e0-8ef037075253>
Fri, 12 Dec 2003 19:22:08 +0000 (19:22 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@344 04897980-b3bd-0310-b5e0-8ef037075253

ltt/branches/poly/ltt/convert/convert.c
ltt/branches/poly/ltt/tracefile.c

index ccec523fc029da3683718b65adfa8660eacc0f1d..e02944efb120e2360a6bcaa23c70c7c274c80858 100644 (file)
@@ -618,22 +618,22 @@ int main(int argc, char ** argv){
 
 
   //write to system.xml
-  fprintf(fp,"<system\n");
-  fprintf(fp,"node_name=\"%s\"\n", node_name);
-  fprintf(fp,"domainname=\"%s\"\n", domainname);
-  fprintf(fp,"cpu=%d\n", cpu);
-  fprintf(fp,"arch_size=\"%s\"\n", arch_size);
-  fprintf(fp,"endian=\"%s\"\n",endian);
-  fprintf(fp,"kernel_name=\"%s\"\n",kernel_name);
-  fprintf(fp,"kernel_release=\"%s\"\n",kernel_release);
-  fprintf(fp,"kernel_version=\"%s\"\n",kernel_version);
-  fprintf(fp,"machine=\"%s\"\n",machine);
-  fprintf(fp,"processor=\"%s\"\n",processor);
-  fprintf(fp,"hardware_platform=\"%s\"\n",hardware_platform);
-  fprintf(fp,"operating_system=\"%s\"\n",operating_system);
-  fprintf(fp,"ltt_major_version=%d\n",ltt_major_version);
-  fprintf(fp,"ltt_minor_version=%d\n",ltt_minor_version);
-  fprintf(fp,"ltt_block_size=%d\n",ltt_block_size);
+  fprintf(fp,"<system \n");
+  fprintf(fp,"node_name=\"%s\" \n", node_name);
+  fprintf(fp,"domainname=\"%s\" \n", domainname);
+  fprintf(fp,"cpu=\"%d\" \n", cpu);
+  fprintf(fp,"arch_size=\"%s\" \n", arch_size);
+  fprintf(fp,"endian=\"%s\" \n",endian);
+  fprintf(fp,"kernel_name=\"%s\" \n",kernel_name);
+  fprintf(fp,"kernel_release=\"%s\" \n",kernel_release);
+  fprintf(fp,"kernel_version=\"%s\" \n",kernel_version);
+  fprintf(fp,"machine=\"%s\" \n",machine);
+  fprintf(fp,"processor=\"%s\" \n",processor);
+  fprintf(fp,"hardware_platform=\"%s\" \n",hardware_platform);
+  fprintf(fp,"operating_system=\"%s\" \n",operating_system);
+  fprintf(fp,"ltt_major_version=\"%d\" \n",ltt_major_version);
+  fprintf(fp,"ltt_minor_version=\"%d\" \n",ltt_minor_version);
+  fprintf(fp,"ltt_block_size=\"%d\" \n",ltt_block_size);
   fprintf(fp,">\n");
   fprintf(fp,"This is just a test\n");
   fprintf(fp,"</system>\n");
index 82ccda5bf68d2336c8138916bbe9bced855b2172..d752962acc61b1864b030e767a4315cf7e5663d7 100644 (file)
@@ -36,6 +36,85 @@ void updateTracefile(LttTracefile * tf);
 int skipEvent(LttTracefile * t);
 
 
+/* Functions to parse system.xml file (using glib xml parser) */
+static void parser_start_element (GMarkupParseContext  *context,
+                                 const gchar          *element_name,
+                                 const gchar         **attribute_names,
+                                 const gchar         **attribute_values,
+                                 gpointer              user_data,
+                                 GError              **error)
+{
+  int i=0;
+  LttSystemDescription* des = (LttSystemDescription* )user_data;
+  if(strcmp("system", element_name)){
+    g_warning("This is not system.xml file\n");
+    exit(1);
+  }
+  
+  while(attribute_names[i]){
+    if(strcmp("node_name", attribute_names[i])==0){
+       des->node_name = g_strdup(attribute_values[i]);      
+    }else if(strcmp("domainname", attribute_names[i])==0){
+       des->domain_name = g_strdup(attribute_values[i]);      
+    }else if(strcmp("cpu", attribute_names[i])==0){
+       des->nb_cpu = atoi(attribute_values[i]);      
+    }else if(strcmp("arch_size", attribute_names[i])==0){
+       if(strcmp(attribute_values[i],"LP32") == 0) des->size = LTT_LP32;
+       else if(strcmp(attribute_values[i],"ILP32") == 0) des->size = LTT_ILP32;
+       else if(strcmp(attribute_values[i],"LP64") == 0) des->size = LTT_LP64;
+       else if(strcmp(attribute_values[i],"ILP64") == 0) des->size = LTT_ILP64;
+       else if(strcmp(attribute_values[i],"UNKNOWN") == 0) des->size = LTT_UNKNOWN;
+    }else if(strcmp("endian", attribute_names[i])==0){
+       if(strcmp(attribute_values[i],"LITTLE_ENDIAN") == 0)
+         des->endian = LTT_LITTLE_ENDIAN;
+       else if(strcmp(attribute_values[i],"BIG_ENDIAN") == 0) 
+         des->endian = LTT_BIG_ENDIAN;
+    }else if(strcmp("kernel_name", attribute_names[i])==0){
+       des->kernel_name = g_strdup(attribute_values[i]);      
+    }else if(strcmp("kernel_release", attribute_names[i])==0){
+       des->kernel_release = g_strdup(attribute_values[i]);      
+    }else if(strcmp("kernel_version", attribute_names[i])==0){
+       des->kernel_version = g_strdup(attribute_values[i]);      
+    }else if(strcmp("machine", attribute_names[i])==0){
+       des->machine = g_strdup(attribute_values[i]);      
+    }else if(strcmp("processor", attribute_names[i])==0){
+       des->processor = g_strdup(attribute_values[i]);      
+    }else if(strcmp("hardware_platform", attribute_names[i])==0){
+       des->hardware_platform = g_strdup(attribute_values[i]);      
+    }else if(strcmp("operating_system", attribute_names[i])==0){
+       des->operating_system = g_strdup(attribute_values[i]);      
+    }else if(strcmp("ltt_major_version", attribute_names[i])==0){
+       des->ltt_major_version = atoi(attribute_values[i]);      
+    }else if(strcmp("ltt_minor_version", attribute_names[i])==0){
+       des->ltt_minor_version = atoi(attribute_values[i]);      
+    }else if(strcmp("ltt_block_size", attribute_names[i])==0){
+       des->ltt_block_size = atoi(attribute_values[i]);      
+    }else{
+      g_warning("Not a valid attribute\n");
+      exit(1);      
+    }
+    i++;
+  }
+}
+
+static void parser_end_element   (GMarkupParseContext  *context,
+                                 const gchar          *element_name,
+                                 gpointer              user_data,
+                                 GError              **error)
+{
+}
+
+static void  parser_characters   (GMarkupParseContext  *context,
+                                 const gchar          *text,
+                                 gsize                 text_len,
+                                 gpointer              user_data,
+                                 GError              **error)
+{
+  LttSystemDescription* des = (LttSystemDescription* )user_data;
+  des->description = g_strdup(text);
+}
+
+
 /*****************************************************************************
  *Function name
  *    ltt_tracefile_open : open a trace file, construct a LttTracefile
@@ -173,147 +252,33 @@ void ltt_tracefile_close(LttTracefile *t)
 void getSystemInfo(LttSystemDescription* des, char * pathname)
 {
   FILE * fp;
-  int i;
-  int entry_number = 15;
   char buf[DIR_NAME_SIZE];
   char description[4*DIR_NAME_SIZE];
-  char * ptr;
+
+  GMarkupParseContext * context;
+  GError * error;
+  GMarkupParser markup_parser =
+    {
+      parser_start_element,
+      parser_end_element,
+      parser_characters,
+      NULL,  /*  passthrough  */
+      NULL   /*  error        */
+    };
 
   fp = fopen(pathname,"r");
   if(!fp){
     g_error("Can not open file : %s\n", pathname);
   }
   
-  while(fgets(buf,DIR_NAME_SIZE, fp)!= NULL){
-    ptr = buf;
-    while(isspace(*ptr)) ptr++;
-    if(strlen(ptr) == 0) continue;     
-    break;
-  }
+  context = g_markup_parse_context_new(&markup_parser, 0, des,NULL);
   
-  if(strlen(ptr) == 0) g_error("Not a valid file: %s\n", pathname);
-  if(strncmp("<system",ptr,7) !=0)g_error("Not a valid file: %s\n", pathname);
-
-  for(i=0;i<entry_number;i++){
-    if(fgets(buf,DIR_NAME_SIZE, fp)== NULL)
-      g_error("Not a valid file: %s\n", pathname);
-    buf[strlen(buf)-1] = '\0';
-    ptr = buf;
-    while(isspace(*ptr)) ptr++;
-    switch(i){
-      case 0:
-       if(strncmp("node_name=",ptr,10)!=0)
-         g_error("Not a valid file: %s\n", pathname);
-       des->node_name = g_strdup(ptr+10);
-        break;
-      case 1:
-       if(strncmp("domainname=",ptr,11)!=0)
-         g_error("Not a valid file: %s\n", pathname);
-       des->domain_name = g_strdup(ptr+11);
-        break;
-      case 2:
-       if(strncmp("cpu=",ptr,4)!=0)
-         g_error("Not a valid file: %s\n", pathname);
-       des->nb_cpu = (unsigned)atoi(ptr+4);
-        break;
-      case 3:
-       if(strncmp("arch_size=",ptr,10)!=0)
-         g_error("Not a valid file: %s\n", pathname);
-       if(strcmp(ptr+10,"\"LP32\"") == 0) des->size = LTT_LP32;
-       else if(strcmp(ptr+10,"\"ILP32\"") == 0) des->size = LTT_ILP32;
-       else if(strcmp(ptr+10,"\"LP64\"") == 0) des->size = LTT_LP64;
-       else if(strcmp(ptr+10,"\"ILP64\"") == 0) des->size = LTT_ILP64;
-       else if(strcmp(ptr+10,"\"UNKNOWN\"") == 0) des->size = LTT_UNKNOWN;
-        break;
-      case 4:
-       if(strncmp("endian=",ptr,7)!=0)
-         g_error("Not a valid file: %s\n", pathname);
-       if(strcmp(ptr+7,"\"LITTLE_ENDIAN\"") == 0)
-         des->endian = LTT_LITTLE_ENDIAN;
-       else if(strcmp(ptr+7,"\"BIG_ENDIAN\"") == 0) 
-         des->endian = LTT_BIG_ENDIAN;
-        break;
-      case 5:
-       if(strncmp("kernel_name=",ptr,12)!=0)
-         g_error("Not a valid file: %s\n", pathname);
-       des->kernel_name = g_strdup(ptr+12);
-        break;
-      case 6:
-       if(strncmp("kernel_release=",ptr,15)!=0)
-         g_error("Not a valid file: %s\n", pathname);
-       des->kernel_release = g_strdup(ptr+15);
-        break;
-       case 7:
-        if(strncmp("kernel_version=",ptr,15)!=0)
-          g_error("Not a valid file: %s\n", pathname);
-        des->kernel_version = g_strdup(ptr+15);
-        break;
-       case 8:
-        if(strncmp("machine=",ptr,8)!=0)
-          g_error("Not a valid file: %s\n", pathname);
-        des->machine = g_strdup(ptr+8);
-        break;
-       case 9:
-        if(strncmp("processor=",ptr,10)!=0)
-          g_error("Not a valid file: %s\n", pathname);
-        des->processor = g_strdup(ptr+10);
-        break;
-       case 10:
-        if(strncmp("hardware_platform=",ptr,18)!=0)
-          g_error("Not a valid file: %s\n", pathname);
-        des->hardware_platform = g_strdup(ptr+18);
-        break;
-       case 11:
-        if(strncmp("operating_system=",ptr,17)!=0)
-          g_error("Not a valid file: %s\n", pathname);
-        des->operating_system = g_strdup(ptr+17);
-        break;
-       case 12:
-        if(strncmp("ltt_major_version=",ptr,18)!=0)
-          g_error("Not a valid file: %s\n", pathname);
-        ptr += 18; 
-        //      ptr++;//skip begining "
-        //      ptr[strlen(ptr)-1] = '\0'; //get rid of the ending "
-        des->ltt_major_version = (unsigned)atoi(ptr);
-        break;
-       case 13:
-        if(strncmp("ltt_minor_version=",ptr,18)!=0)
-          g_error("Not a valid file: %s\n", pathname);
-        ptr += 18; 
-        //      ptr++;//skip begining "
-        //      ptr[strlen(ptr)-1] = '\0'; //get rid of the ending "
-        des->ltt_minor_version = (unsigned)atoi(ptr);
-        break;
-       case 14:
-        if(strncmp("ltt_block_size=",ptr,15)!=0)
-          g_error("Not a valid file: %s\n", pathname);
-        ptr += 15; 
-        //      ptr++;//skip begining "
-        //      ptr[strlen(ptr)-1] = '\0'; //get rid of the ending "
-        des->ltt_block_size = (unsigned)atoi(ptr);
-        break;
-       default:
-        g_error("Not a valid file: %s\n", pathname);      
-   }
-  }
-
-  //get description
-  description[0] = '\0';
-  if(fgets(buf,DIR_NAME_SIZE, fp)== NULL)
-    g_error("Not a valid file: %s\n", pathname);
-  ptr = buf;
-  while(isspace(*ptr)) ptr++;
-  if(*ptr != '>') g_error("Not a valid file: %s\n", pathname);
-  while((ptr=fgets(buf,DIR_NAME_SIZE, fp))!= NULL){
-    ptr = buf;
-    while(isspace(*ptr)) ptr++;
-    if(strncmp("</system>",ptr,9) == 0 )break;
-    strcat(description, buf);
+  while(fgets(buf,DIR_NAME_SIZE, fp) != NULL){
+    if(!g_markup_parse_context_parse(context, buf, DIR_NAME_SIZE, &error)){
+      g_warning("Can not parse xml file: \n%s\n", error->message);
+      exit(1);
+    }
   }
-  if(!ptr)g_error("Not a valid file: %s\n", pathname);
-  if(description[0] = '\0')des->description = NULL;
-  des->description = g_strdup(description);  
-
   fclose(fp);
 }
 
This page took 0.029054 seconds and 4 git commands to generate.