Annotation of embedaddon/libxml2/testXPath.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * testXPath.c : a small tester program for XPath.
        !             3:  *
        !             4:  * See Copyright for the status of this software.
        !             5:  *
        !             6:  * daniel@veillard.com
        !             7:  */
        !             8: 
        !             9: #include "libxml.h"
        !            10: #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED)
        !            11: 
        !            12: #include <string.h>
        !            13: 
        !            14: #ifdef HAVE_SYS_TYPES_H
        !            15: #include <sys/types.h>
        !            16: #endif
        !            17: #ifdef HAVE_SYS_STAT_H
        !            18: #include <sys/stat.h>
        !            19: #endif
        !            20: #ifdef HAVE_FCNTL_H
        !            21: #include <fcntl.h>
        !            22: #endif
        !            23: #ifdef HAVE_UNISTD_H
        !            24: #include <unistd.h>
        !            25: #endif
        !            26: #ifdef HAVE_STDLIB_H
        !            27: #include <stdlib.h>
        !            28: #endif
        !            29: 
        !            30: 
        !            31: #include <libxml/xpath.h>
        !            32: #include <libxml/tree.h>
        !            33: #include <libxml/parser.h>
        !            34: #include <libxml/debugXML.h>
        !            35: #include <libxml/xmlmemory.h>
        !            36: #include <libxml/parserInternals.h>
        !            37: #include <libxml/xpathInternals.h>
        !            38: #include <libxml/xmlerror.h>
        !            39: #include <libxml/globals.h>
        !            40: #if defined(LIBXML_XPTR_ENABLED)
        !            41: #include <libxml/xpointer.h>
        !            42: static int xptr = 0;
        !            43: #endif
        !            44: static int debug = 0;
        !            45: static int valid = 0;
        !            46: static int expr = 0;
        !            47: static int tree = 0;
        !            48: static int nocdata = 0;
        !            49: static xmlDocPtr document = NULL;
        !            50: 
        !            51: /*
        !            52:  * Default document
        !            53:  */
        !            54: static xmlChar buffer[] = 
        !            55: "<?xml version=\"1.0\"?>\n\
        !            56: <EXAMPLE prop1=\"gnome is great\" prop2=\"&amp; linux too\">\n\
        !            57:   <head>\n\
        !            58:    <title>Welcome to Gnome</title>\n\
        !            59:   </head>\n\
        !            60:   <chapter>\n\
        !            61:    <title>The Linux adventure</title>\n\
        !            62:    <p>bla bla bla ...</p>\n\
        !            63:    <image href=\"linus.gif\"/>\n\
        !            64:    <p>...</p>\n\
        !            65:   </chapter>\n\
        !            66:   <chapter>\n\
        !            67:    <title>Chapter 2</title>\n\
        !            68:    <p>this is chapter 2 ...</p>\n\
        !            69:   </chapter>\n\
        !            70:   <chapter>\n\
        !            71:    <title>Chapter 3</title>\n\
        !            72:    <p>this is chapter 3 ...</p>\n\
        !            73:   </chapter>\n\
        !            74: </EXAMPLE>\n\
        !            75: ";
        !            76: 
        !            77: 
        !            78: static void
        !            79: testXPath(const char *str) {
        !            80:     xmlXPathObjectPtr res;
        !            81:     xmlXPathContextPtr ctxt;
        !            82:     
        !            83: #if defined(LIBXML_XPTR_ENABLED)
        !            84:     if (xptr) {
        !            85:        ctxt = xmlXPtrNewContext(document, NULL, NULL);
        !            86:        res = xmlXPtrEval(BAD_CAST str, ctxt);
        !            87:     } else {
        !            88: #endif
        !            89:        ctxt = xmlXPathNewContext(document);
        !            90:        ctxt->node = xmlDocGetRootElement(document);
        !            91:        if (expr)
        !            92:            res = xmlXPathEvalExpression(BAD_CAST str, ctxt);
        !            93:        else {
        !            94:            /* res = xmlXPathEval(BAD_CAST str, ctxt); */
        !            95:            xmlXPathCompExprPtr comp;
        !            96: 
        !            97:            comp = xmlXPathCompile(BAD_CAST str);
        !            98:            if (comp != NULL) {
        !            99:                if (tree) 
        !           100:                    xmlXPathDebugDumpCompExpr(stdout, comp, 0);
        !           101: 
        !           102:                res = xmlXPathCompiledEval(comp, ctxt);
        !           103:                xmlXPathFreeCompExpr(comp);
        !           104:            } else
        !           105:                res = NULL;
        !           106:        }
        !           107: #if defined(LIBXML_XPTR_ENABLED)
        !           108:     }
        !           109: #endif
        !           110:     xmlXPathDebugDumpObject(stdout, res, 0);
        !           111:     xmlXPathFreeObject(res);
        !           112:     xmlXPathFreeContext(ctxt);
        !           113: }
        !           114: 
        !           115: static void
        !           116: testXPathFile(const char *filename) {
        !           117:     FILE *input;
        !           118:     char expression[5000];
        !           119:     int len;
        !           120: 
        !           121:     input = fopen(filename, "r");
        !           122:     if (input == NULL) {
        !           123:         xmlGenericError(xmlGenericErrorContext,
        !           124:                "Cannot open %s for reading\n", filename);
        !           125:        return;
        !           126:     }
        !           127:     while (fgets(expression, 4500, input) != NULL) {
        !           128:        len = strlen(expression);
        !           129:        len--;
        !           130:        while ((len >= 0) && 
        !           131:               ((expression[len] == '\n') || (expression[len] == '\t') ||
        !           132:                (expression[len] == '\r') || (expression[len] == ' '))) len--;
        !           133:        expression[len + 1] = 0;      
        !           134:        if (len >= 0) {
        !           135:            printf("\n========================\nExpression: %s\n", expression) ;
        !           136:            testXPath(expression);
        !           137:        }
        !           138:     }
        !           139: 
        !           140:     fclose(input);
        !           141: }
        !           142: 
        !           143: int main(int argc, char **argv) {
        !           144:     int i;
        !           145:     int strings = 0;
        !           146:     int usefile = 0;
        !           147:     char *filename = NULL;
        !           148: 
        !           149:     for (i = 1; i < argc ; i++) {
        !           150: #if defined(LIBXML_XPTR_ENABLED)
        !           151:        if ((!strcmp(argv[i], "-xptr")) || (!strcmp(argv[i], "--xptr")))
        !           152:            xptr++;
        !           153:        else 
        !           154: #endif
        !           155:        if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
        !           156:            debug++;
        !           157:        else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid")))
        !           158:            valid++;
        !           159:        else if ((!strcmp(argv[i], "-expr")) || (!strcmp(argv[i], "--expr")))
        !           160:            expr++;
        !           161:        else if ((!strcmp(argv[i], "-tree")) || (!strcmp(argv[i], "--tree")))
        !           162:            tree++;
        !           163:        else if ((!strcmp(argv[i], "-nocdata")) ||
        !           164:                 (!strcmp(argv[i], "--nocdata")))
        !           165:            nocdata++;
        !           166:        else if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input")))
        !           167:            filename = argv[++i];
        !           168:        else if ((!strcmp(argv[i], "-f")) || (!strcmp(argv[i], "--file")))
        !           169:            usefile++;
        !           170:     }
        !           171:     if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
        !           172:     xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
        !           173:     xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
        !           174:     xmlSubstituteEntitiesDefaultValue = 1;
        !           175:     if (nocdata != 0) {
        !           176:        xmlDefaultSAXHandlerInit();
        !           177:        xmlDefaultSAXHandler.cdataBlock = NULL;
        !           178:     }
        !           179:     if (document == NULL) {
        !           180:         if (filename == NULL)
        !           181:            document = xmlReadDoc(buffer,NULL,NULL,XML_PARSE_COMPACT);
        !           182:        else
        !           183:            document = xmlReadFile(filename,NULL,XML_PARSE_COMPACT);
        !           184:     }
        !           185:     for (i = 1; i < argc ; i++) {
        !           186:        if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input"))) {
        !           187:            i++; continue;
        !           188:        }
        !           189:        if (argv[i][0] != '-') {
        !           190:            if (usefile)
        !           191:                testXPathFile(argv[i]);
        !           192:            else
        !           193:                testXPath(argv[i]);
        !           194:            strings ++;
        !           195:        }
        !           196:     }
        !           197:     if (strings == 0) {
        !           198:        printf("Usage : %s [--debug] [--copy] stringsorfiles ...\n",
        !           199:               argv[0]);
        !           200:        printf("\tParse the XPath strings and output the result of the parsing\n");
        !           201:        printf("\t--debug : dump a debug version of the result\n");
        !           202:        printf("\t--valid : switch on DTD support in the parser\n");
        !           203: #if defined(LIBXML_XPTR_ENABLED)
        !           204:        printf("\t--xptr : expressions are XPointer expressions\n");
        !           205: #endif
        !           206:        printf("\t--expr : debug XPath expressions only\n");
        !           207:        printf("\t--tree : show the compiled XPath tree\n");
        !           208:        printf("\t--nocdata : do not generate CDATA nodes\n");
        !           209:        printf("\t--input filename : or\n");
        !           210:        printf("\t-i filename      : read the document from filename\n");
        !           211:        printf("\t--file : or\n");
        !           212:        printf("\t-f     : read queries from files, args\n");
        !           213:     }
        !           214:     if (document != NULL) 
        !           215:        xmlFreeDoc(document);
        !           216:     xmlCleanupParser();
        !           217:     xmlMemoryDump();
        !           218: 
        !           219:     return(0);
        !           220: }
        !           221: #else
        !           222: #include <stdio.h>
        !           223: int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
        !           224:     printf("%s : XPath/Debug support not compiled in\n", argv[0]);
        !           225:     return(0);
        !           226: }
        !           227: #endif /* LIBXML_XPATH_ENABLED */

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