1bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard/* 2bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * gjobread.c : a small test program for gnome jobs XML format 3bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * 4bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * See Copyright for the status of this software. 5bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * 6bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * Daniel.Veillard@w3.org 7bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 8bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 9bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard#include <stdio.h> 10bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard#include <string.h> 11bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard#include <stdlib.h> 12bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 13be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard/* 14be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard * This example should compile and run indifferently with libxml-1.8.8 + 15be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard * and libxml2-2.1.0 + 16be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard * Check the COMPAT comments below 17be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard */ 18be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard 19be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard/* 20be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard * COMPAT using xml-config --cflags to get the include path this will 21be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard * work with both 22be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard */ 23be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard#include <libxml/xmlmemory.h> 24f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard#include <libxml/parser.h> 25bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 26bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard#define DEBUG(x) printf(x) 27bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 28bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard/* 29bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * A person record 30f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard * an xmlChar * is really an UTF8 encoded char string (0 terminated) 31bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 32bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillardtypedef struct person { 33f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *name; 34f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *email; 35f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *company; 36f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *organisation; 37f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *smail; 38f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *webPage; 39f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *phone; 40bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} person, *personPtr; 41bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 42bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard/* 43bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * And the code needed to parse it 44bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 4556a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic personPtr 4656a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel VeillardparsePerson(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { 47bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard personPtr ret = NULL; 48bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 49bb2da58013b25100e1b1db738f520f20c23163fbDaniel VeillardDEBUG("parsePerson\n"); 50bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* 51bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * allocate the struct 52bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 53bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard ret = (personPtr) malloc(sizeof(person)); 54bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (ret == NULL) { 55bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard fprintf(stderr,"out of memory\n"); 56bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(NULL); 57bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 58bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard memset(ret, 0, sizeof(person)); 59bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 60bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* We don't care what the top level element name is */ 61be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard /* COMPAT xmlChildrenNode is a macro unifying libxml1 and libxml2 names */ 62be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard cur = cur->xmlChildrenNode; 63bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard while (cur != NULL) { 64f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if ((!xmlStrcmp(cur->name, (const xmlChar *)"Person")) && 65f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard (cur->ns == ns)) 66be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard ret->name = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 67f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if ((!xmlStrcmp(cur->name, (const xmlChar *)"Email")) && 68f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard (cur->ns == ns)) 69be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard ret->email = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 70bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard cur = cur->next; 71bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 72bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 73bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(ret); 74bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} 75bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 76bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard/* 77bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * and to print it 78bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 7956a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic void 8056a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel VeillardprintPerson(personPtr cur) { 81bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur == NULL) return; 82bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard printf("------ Person\n"); 83bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->name) printf(" name: %s\n", cur->name); 84bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->email) printf(" email: %s\n", cur->email); 85bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->company) printf(" company: %s\n", cur->company); 86bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->organisation) printf(" organisation: %s\n", cur->organisation); 87bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->smail) printf(" smail: %s\n", cur->smail); 88bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->webPage) printf(" Web: %s\n", cur->webPage); 89bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->phone) printf(" phone: %s\n", cur->phone); 90bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard printf("------\n"); 91bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} 92bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 93bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard/* 94bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * a Description for a Job 95bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 96bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillardtypedef struct job { 97f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *projectID; 98f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *application; 99f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlChar *category; 100bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard personPtr contact; 101bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard int nbDevelopers; 102bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard personPtr developers[100]; /* using dynamic alloc is left as an exercise */ 103bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} job, *jobPtr; 104bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 105bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard/* 106bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * And the code needed to parse it 107bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 10856a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic jobPtr 10956a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel VeillardparseJob(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) { 110bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard jobPtr ret = NULL; 111bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 112bb2da58013b25100e1b1db738f520f20c23163fbDaniel VeillardDEBUG("parseJob\n"); 113bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* 114bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * allocate the struct 115bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 116bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard ret = (jobPtr) malloc(sizeof(job)); 117bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (ret == NULL) { 118bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard fprintf(stderr,"out of memory\n"); 119bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(NULL); 120bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 121bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard memset(ret, 0, sizeof(job)); 122bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 123bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* We don't care what the top level element name is */ 124be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard cur = cur->xmlChildrenNode; 125bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard while (cur != NULL) { 126bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 127f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if ((!xmlStrcmp(cur->name, (const xmlChar *) "Project")) && 128f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard (cur->ns == ns)) { 129f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard ret->projectID = xmlGetProp(cur, (const xmlChar *) "ID"); 130bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (ret->projectID == NULL) { 131bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard fprintf(stderr, "Project has no ID\n"); 132bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 133bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 134f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if ((!xmlStrcmp(cur->name, (const xmlChar *) "Application")) && 135f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard (cur->ns == ns)) 136f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard ret->application = 137f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 138f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if ((!xmlStrcmp(cur->name, (const xmlChar *) "Category")) && 139f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard (cur->ns == ns)) 140f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard ret->category = 141f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 142f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if ((!xmlStrcmp(cur->name, (const xmlChar *) "Contact")) && 143f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard (cur->ns == ns)) 144bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard ret->contact = parsePerson(doc, ns, cur); 145bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard cur = cur->next; 146bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 147bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 148bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(ret); 149bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} 150bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 151bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard/* 152bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * and to print it 153bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 15456a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic void 15556a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel VeillardprintJob(jobPtr cur) { 156bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard int i; 157bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 158bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur == NULL) return; 159bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard printf("======= Job\n"); 160bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->projectID != NULL) printf("projectID: %s\n", cur->projectID); 161bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->application != NULL) printf("application: %s\n", cur->application); 162bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->category != NULL) printf("category: %s\n", cur->category); 163bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur->contact != NULL) printPerson(cur->contact); 164bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard printf("%d developers\n", cur->nbDevelopers); 165bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 166bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard for (i = 0;i < cur->nbDevelopers;i++) printPerson(cur->developers[i]); 167bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard printf("======= \n"); 168bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} 169bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 170bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard/* 171bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * A pool of Gnome Jobs 172bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 173bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillardtypedef struct gjob { 174bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard int nbJobs; 175bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard jobPtr jobs[500]; /* using dynamic alloc is left as an exercise */ 176bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} gJob, *gJobPtr; 177bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 178bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 17956a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic gJobPtr 18081c01ee9ff1493a92dfb3e679a0d6f45d59622aaNick WellnhoferparseGjobFile(char *filename ATTRIBUTE_UNUSED) { 181bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard xmlDocPtr doc; 182bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard gJobPtr ret; 18356a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard jobPtr curjob; 184bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard xmlNsPtr ns; 185bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard xmlNodePtr cur; 186bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 1878127390f0332ddf545fe59e406996deaedfee964Daniel Veillard#ifdef LIBXML_SAX1_ENABLED 188bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* 189bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * build an XML tree from a the file; 190bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 191bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard doc = xmlParseFile(filename); 192bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (doc == NULL) return(NULL); 1938127390f0332ddf545fe59e406996deaedfee964Daniel Veillard#else 1948127390f0332ddf545fe59e406996deaedfee964Daniel Veillard /* 1958127390f0332ddf545fe59e406996deaedfee964Daniel Veillard * the library has been compiled without some of the old interfaces 1968127390f0332ddf545fe59e406996deaedfee964Daniel Veillard */ 1978127390f0332ddf545fe59e406996deaedfee964Daniel Veillard return(NULL); 1988127390f0332ddf545fe59e406996deaedfee964Daniel Veillard#endif /* LIBXML_SAX1_ENABLED */ 199bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 200bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* 201bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * Check the document is of the right kind 202bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 203f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard 204f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard cur = xmlDocGetRootElement(doc); 205bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (cur == NULL) { 206bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard fprintf(stderr,"empty document\n"); 207bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard xmlFreeDoc(doc); 208bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(NULL); 209bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 210f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard ns = xmlSearchNsByHref(doc, cur, 211f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard (const xmlChar *) "http://www.gnome.org/some-location"); 212bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (ns == NULL) { 213bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard fprintf(stderr, 214bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard "document of the wrong type, GJob Namespace not found\n"); 215bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard xmlFreeDoc(doc); 216bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(NULL); 217bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 218f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if (xmlStrcmp(cur->name, (const xmlChar *) "Helping")) { 219bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard fprintf(stderr,"document of the wrong type, root node != Helping"); 220bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard xmlFreeDoc(doc); 221bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(NULL); 222bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 223bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 224bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* 225bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * Allocate the structure to be returned. 226bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 227bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard ret = (gJobPtr) malloc(sizeof(gJob)); 228bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (ret == NULL) { 229bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard fprintf(stderr,"out of memory\n"); 230bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard xmlFreeDoc(doc); 231bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(NULL); 232bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 233bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard memset(ret, 0, sizeof(gJob)); 234bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 235bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* 236bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * Now, walk the tree. 237bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 238bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* First level we expect just Jobs */ 239be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard cur = cur->xmlChildrenNode; 2402728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard while ( cur && xmlIsBlankNode ( cur ) ) { 241f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard cur = cur -> next; 2422728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard } 2432728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard if ( cur == 0 ) { 2442728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard xmlFreeDoc(doc); 2452728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard free(ret); 2462728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard return ( NULL ); 2472728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard } 248f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if ((xmlStrcmp(cur->name, (const xmlChar *) "Jobs")) || (cur->ns != ns)) { 249f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard fprintf(stderr,"document of the wrong type, was '%s', Jobs expected", 250f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard cur->name); 251f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard fprintf(stderr,"xmlDocDump follows\n"); 252a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 253f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard xmlDocDump ( stderr, doc ); 254f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard fprintf(stderr,"xmlDocDump finished\n"); 255a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 256bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard xmlFreeDoc(doc); 257bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard free(ret); 258bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(NULL); 259bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 260bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 261bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* Second level is a list of Job, but be laxist */ 262be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard cur = cur->xmlChildrenNode; 263bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard while (cur != NULL) { 264f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard if ((!xmlStrcmp(cur->name, (const xmlChar *) "Job")) && 265f17e09bcc8e69f124b4571309f7fa3785550d269Daniel Veillard (cur->ns == ns)) { 26656a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard curjob = parseJob(doc, ns, cur); 26756a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard if (curjob != NULL) 26856a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard ret->jobs[ret->nbJobs++] = curjob; 269bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard if (ret->nbJobs >= 500) break; 270bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 271bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard cur = cur->next; 272bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 273bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 274bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(ret); 275bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} 276bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 27756a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic void 27856a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel VeillardhandleGjob(gJobPtr cur) { 279bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard int i; 280bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 281bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard /* 282bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard * Do whatever you want and free the structure. 283bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard */ 284bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard printf("%d Jobs registered\n", cur->nbJobs); 285bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard for (i = 0; i < cur->nbJobs; i++) printJob(cur->jobs[i]); 286bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} 287bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 288bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillardint main(int argc, char **argv) { 289bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard int i; 290bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard gJobPtr cur; 291bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard 292be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard /* COMPAT: Do not genrate nodes for formatting spaces */ 293c230410eadbada15092c04f92d01068af8a19f8dDaniel Veillard LIBXML_TEST_VERSION 294be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard xmlKeepBlanksDefault(0); 295be803967dbecb5534c7c7fbc1a17157ba43366b5Daniel Veillard 296bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard for (i = 1; i < argc ; i++) { 297bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard cur = parseGjobFile(argv[i]); 298f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard if ( cur ) 299f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard handleGjob(cur); 300f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard else 301f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard fprintf( stderr, "Error parsing file '%s'\n", argv[i]); 302f302982d37171c71358523255b79ad806f0ea6ceDaniel Veillard 303bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard } 3045aac4e490df7e8a71c168b3eb80b401e3e418577Daniel Veillard 3055aac4e490df7e8a71c168b3eb80b401e3e418577Daniel Veillard /* Clean up everything else before quitting. */ 3065aac4e490df7e8a71c168b3eb80b401e3e418577Daniel Veillard xmlCleanupParser(); 3075aac4e490df7e8a71c168b3eb80b401e3e418577Daniel Veillard 308bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard return(0); 309bb2da58013b25100e1b1db738f520f20c23163fbDaniel Veillard} 310