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