Annotation of embedaddon/libxml2/example/gjobread.c, revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>