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