gjobread.c revision 5aac4e490df7e8a71c168b3eb80b401e3e418577
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * gjobread.c : a small test program for gnome jobs XML format 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * See Copyright for the status of this software. 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Daniel.Veillard@w3.org 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <stdio.h> 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <string.h> 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <stdlib.h> 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * This example should compile and run indifferently with libxml-1.8.8 + 153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and libxml2-2.1.0 + 163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Check the COMPAT comments below 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * COMPAT using xml-config --cflags to get the include path this will 213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * work with both 223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <libxml/xmlmemory.h> 243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <libxml/parser.h> 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DEBUG(x) printf(x) 273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * A person record 303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * an xmlChar * is really an UTF8 encoded char string (0 terminated) 313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 323ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct person { 333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *name; 343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *email; 353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *company; 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *organisation; 373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *smail; 383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *webPage; 393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *phone; 403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} person, *personPtr; 413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * And the code needed to parse it 443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 453ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic personPtr 463ed852eea50f9d4cd633efb8c2b054b8e33c253cristyparsePerson(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { 473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy personPtr ret = NULL; 483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 493ed852eea50f9d4cd633efb8c2b054b8e33c253cristyDEBUG("parsePerson\n"); 503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * allocate the struct 523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret = (personPtr) malloc(sizeof(person)); 543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ret == NULL) { 553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr,"out of memory\n"); 563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(NULL); 573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy memset(ret, 0, sizeof(person)); 593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* We don't care what the top level element name is */ 613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* COMPAT xmlChildrenNode is a macro unifying libxml1 and libxml2 names */ 623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = cur->xmlChildrenNode; 633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (cur != NULL) { 643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!xmlStrcmp(cur->name, (const xmlChar *)"Person")) && 653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (cur->ns == ns)) 663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret->name = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!xmlStrcmp(cur->name, (const xmlChar *)"Email")) && 683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (cur->ns == ns)) 693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret->email = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = cur->next; 713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(ret); 743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and to print it 783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 793ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void 803ed852eea50f9d4cd633efb8c2b054b8e33c253cristyprintPerson(personPtr cur) { 813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur == NULL) return; 823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("------ Person\n"); 833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->name) printf(" name: %s\n", cur->name); 843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->email) printf(" email: %s\n", cur->email); 853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->company) printf(" company: %s\n", cur->company); 863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->organisation) printf(" organisation: %s\n", cur->organisation); 873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->smail) printf(" smail: %s\n", cur->smail); 883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->webPage) printf(" Web: %s\n", cur->webPage); 893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->phone) printf(" phone: %s\n", cur->phone); 903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("------\n"); 913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * a Description for a Job 953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 963ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct job { 973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *projectID; 983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *application; 993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlChar *category; 1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy personPtr contact; 1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int nbDevelopers; 1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy personPtr developers[100]; /* using dynamic alloc is left as an exercise */ 1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} job, *jobPtr; 1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * And the code needed to parse it 1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic jobPtr 1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristyparseJob(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { 1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jobPtr ret = NULL; 1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristyDEBUG("parseJob\n"); 1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * allocate the struct 1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret = (jobPtr) malloc(sizeof(job)); 1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ret == NULL) { 1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr,"out of memory\n"); 1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(NULL); 1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy memset(ret, 0, sizeof(job)); 1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* We don't care what the top level element name is */ 1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = cur->xmlChildrenNode; 1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (cur != NULL) { 1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!xmlStrcmp(cur->name, (const xmlChar *) "Project")) && 1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (cur->ns == ns)) { 1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret->projectID = xmlGetProp(cur, (const xmlChar *) "ID"); 1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ret->projectID == NULL) { 1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr, "Project has no ID\n"); 1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!xmlStrcmp(cur->name, (const xmlChar *) "Application")) && 1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (cur->ns == ns)) 1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret->application = 1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!xmlStrcmp(cur->name, (const xmlChar *) "Category")) && 1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (cur->ns == ns)) 1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret->category = 1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!xmlStrcmp(cur->name, (const xmlChar *) "Contact")) && 1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (cur->ns == ns)) 1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret->contact = parsePerson(doc, ns, cur); 1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = cur->next; 1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(ret); 1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and to print it 1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void 1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristyprintJob(jobPtr cur) { 1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int i; 1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur == NULL) return; 1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("======= Job\n"); 1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->projectID != NULL) printf("projectID: %s\n", cur->projectID); 1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->application != NULL) printf("application: %s\n", cur->application); 1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->category != NULL) printf("category: %s\n", cur->category); 1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur->contact != NULL) printPerson(cur->contact); 1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("%d developers\n", cur->nbDevelopers); 1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i = 0;i < cur->nbDevelopers;i++) printPerson(cur->developers[i]); 1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("======= \n"); 1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * A pool of Gnome Jobs 1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct gjob { 1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int nbJobs; 1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jobPtr jobs[500]; /* using dynamic alloc is left as an exercise */ 1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} gJob, *gJobPtr; 1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic gJobPtr 1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristyparseGjobFile(char *filename) { 1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlDocPtr doc; 1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy gJobPtr ret; 1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jobPtr curjob; 1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlNsPtr ns; 1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlNodePtr cur; 1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * build an XML tree from a the file; 1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy doc = xmlParseFile(filename); 1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (doc == NULL) return(NULL); 1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Check the document is of the right kind 1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = xmlDocGetRootElement(doc); 1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (cur == NULL) { 1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr,"empty document\n"); 2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlFreeDoc(doc); 2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(NULL); 2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ns = xmlSearchNsByHref(doc, cur, 2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (const xmlChar *) "http://www.gnome.org/some-location"); 2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ns == NULL) { 2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr, 2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "document of the wrong type, GJob Namespace not found\n"); 2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlFreeDoc(doc); 2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(NULL); 2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (xmlStrcmp(cur->name, (const xmlChar *) "Helping")) { 2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr,"document of the wrong type, root node != Helping"); 2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlFreeDoc(doc); 2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(NULL); 2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Allocate the structure to be returned. 2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret = (gJobPtr) malloc(sizeof(gJob)); 2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ret == NULL) { 2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr,"out of memory\n"); 2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlFreeDoc(doc); 2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(NULL); 2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy memset(ret, 0, sizeof(gJob)); 2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Now, walk the tree. 2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* First level we expect just Jobs */ 2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = cur->xmlChildrenNode; 2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while ( cur && xmlIsBlankNode ( cur ) ) 2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = cur -> next; 2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ( cur == 0 ) 2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return ( NULL ); 2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((xmlStrcmp(cur->name, (const xmlChar *) "Jobs")) || (cur->ns != ns)) { 2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr,"document of the wrong type, was '%s', Jobs expected", 2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur->name); 2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr,"xmlDocDump follows\n"); 2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlDocDump ( stderr, doc ); 2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf(stderr,"xmlDocDump finished\n"); 2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlFreeDoc(doc); 2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy free(ret); 2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(NULL); 2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Second level is a list of Job, but be laxist */ 2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = cur->xmlChildrenNode; 2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (cur != NULL) { 2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!xmlStrcmp(cur->name, (const xmlChar *) "Job")) && 2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (cur->ns == ns)) { 2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy curjob = parseJob(doc, ns, cur); 2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (curjob != NULL) 2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret->jobs[ret->nbJobs++] = curjob; 2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ret->nbJobs >= 500) break; 2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = cur->next; 2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(ret); 2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void 2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristyhandleGjob(gJobPtr cur) { 2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int i; 2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Do whatever you want and free the structure. 2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("%d Jobs registered\n", cur->nbJobs); 2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i = 0; i < cur->nbJobs; i++) printJob(cur->jobs[i]); 2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristyint main(int argc, char **argv) { 2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int i; 2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy gJobPtr cur; 2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* COMPAT: Do not genrate nodes for formatting spaces */ 2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LIBXML_TEST_VERSION 2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlKeepBlanksDefault(0); 2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i = 1; i < argc ; i++) { 2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy cur = parseGjobFile(argv[i]); 2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ( cur ) 2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy handleGjob(cur); 2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fprintf( stderr, "Error parsing file '%s'\n", argv[i]); 2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Clean up everything else before quitting. */ 2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy xmlCleanupParser(); 2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); 2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy