root/third_party/libxml/src/testReader.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. usage
  2. processNode
  3. handleFile
  4. main
  5. main

/*
 * testSAX.c : a small tester program for parsing using the SAX API.
 *
 * See Copyright for the status of this software.
 *
 * daniel@veillard.com
 */

#include "libxml.h"

#ifdef LIBXML_READER_ENABLED
#include <string.h>
#include <stdarg.h>

#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif


#include <libxml/xmlreader.h>

static int debug = 0;
static int dump = 0;
static int noent = 0;
static int count = 0;
static int valid = 0;
static int consumed = 0;

static void usage(const char *progname) {
    printf("Usage : %s [options] XMLfiles ...\n", progname);
    printf("\tParse the XML files using the xmlTextReader API\n");
    printf("\t --count: count the number of attribute and elements\n");
    printf("\t --valid: validate the document\n");
    printf("\t --consumed: count the number of bytes consumed\n");
    exit(1);
}
static int elem, attrs;

static void processNode(xmlTextReaderPtr reader) {
    int type;

    type = xmlTextReaderNodeType(reader);
    if (count) {
        if (type == 1) {
            elem++;
            attrs += xmlTextReaderAttributeCount(reader);
        }
    }
}

static void handleFile(const char *filename) {
    xmlTextReaderPtr reader;
    int ret;

    if (count) {
        elem = 0;
        attrs = 0;
    }

    reader = xmlNewTextReaderFilename(filename);
    if (reader != NULL) {
        if (valid)
            xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);

        /*
         * Process all nodes in sequence
         */
        ret = xmlTextReaderRead(reader);
        while (ret == 1) {
            processNode(reader);
            ret = xmlTextReaderRead(reader);
        }

        /*
         * Done, cleanup and status
         */
        if (consumed)
                printf("%ld bytes consumed by parser\n", xmlTextReaderByteConsumed(reader));
        xmlFreeTextReader(reader);
        if (ret != 0) {
            printf("%s : failed to parse\n", filename);
        } else if (count)
            printf("%s : %d elements, %d attributes\n", filename, elem, attrs);
    } else {
        fprintf(stderr, "Unable to open %s\n", filename);
    }
}

int main(int argc, char **argv) {
    int i;
    int files = 0;

    if (argc <= 1) {
        usage(argv[0]);
        return(1);
    }
    LIBXML_TEST_VERSION
    for (i = 1; i < argc ; i++) {
        if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
            debug++;
        else if ((!strcmp(argv[i], "-dump")) || (!strcmp(argv[i], "--dump")))
            dump++;
        else if ((!strcmp(argv[i], "-count")) || (!strcmp(argv[i], "--count")))
            count++;
        else if ((!strcmp(argv[i], "-consumed")) || (!strcmp(argv[i], "--consumed")))
            consumed++;
        else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid")))
            valid++;
        else if ((!strcmp(argv[i], "-noent")) ||
                 (!strcmp(argv[i], "--noent")))
            noent++;
    }
    if (noent != 0) xmlSubstituteEntitiesDefault(1);
    for (i = 1; i < argc ; i++) {
        if (argv[i][0] != '-') {
            handleFile(argv[i]);
            files ++;
        }
    }
    xmlCleanupParser();
    xmlMemoryDump();

    return(0);
}
#else
int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
    printf("%s : xmlReader parser support not compiled in\n", argv[0]);
    return(0);
}
#endif /* LIBXML_READER_ENABLED */

/* [<][>][^][v][top][bottom][index][help] */