⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 runtest.c

📁 xml开源解析代码.版本为libxml2-2.6.29,可支持GB3212.网络消息发送XML时很有用.
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * runtest.c: C program to run libxml2 regression tests without *            requiring make or Python, and reducing platform dependancies *            to a strict minimum. * * To compile on Unixes: * cc -o runtest `xml2-config --cflags` runtest.c `xml2-config --libs` -lpthread * * See Copyright for the status of this software. * * daniel@veillard.com */#ifdef HAVE_CONFIG_H#include "libxml.h"#else#include <stdio.h>#endif#if !defined(_WIN32) || defined(__CYGWIN__)#include <unistd.h>#endif#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <libxml/parser.h>#include <libxml/tree.h>#include <libxml/uri.h>#ifdef LIBXML_OUTPUT_ENABLED#ifdef LIBXML_READER_ENABLED#include <libxml/xmlreader.h>#endif#ifdef LIBXML_XINCLUDE_ENABLED#include <libxml/xinclude.h>#endif#ifdef LIBXML_XPATH_ENABLED#include <libxml/xpath.h>#include <libxml/xpathInternals.h>#ifdef LIBXML_XPTR_ENABLED#include <libxml/xpointer.h>#endif#endif#ifdef LIBXML_SCHEMAS_ENABLED#include <libxml/relaxng.h>#include <libxml/xmlschemas.h>#include <libxml/xmlschemastypes.h>#endif#ifdef LIBXML_PATTERN_ENABLED#include <libxml/pattern.h>#endif#ifdef LIBXML_C14N_ENABLED#include <libxml/c14n.h>#endif#ifdef LIBXML_HTML_ENABLED#include <libxml/HTMLparser.h>#include <libxml/HTMLtree.h>/* * pseudo flag for the unification of HTML and XML tests */#define XML_PARSE_HTML 1 << 24#endif#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)#include <libxml/globals.h>#include <libxml/threads.h>#include <libxml/parser.h>#include <libxml/catalog.h>#include <string.h>#endif/* * O_BINARY is just for Windows compatibility - if it isn't defined * on this system, avoid any compilation error */#ifdef	O_BINARY#define RD_FLAGS	O_RDONLY | O_BINARY#else#define	RD_FLAGS	O_RDONLY#endiftypedef int (*functest) (const char *filename, const char *result,                         const char *error, int options);typedef struct testDesc testDesc;typedef testDesc *testDescPtr;struct testDesc {    const char *desc; /* descripton of the test */    functest    func; /* function implementing the test */    const char *in;   /* glob to path for input files */    const char *out;  /* output directory */    const char *suffix;/* suffix for output files */    const char *err;  /* suffix for error output files */    int     options;  /* parser options for the test */};static int checkTestFile(const char *filename);#if defined(_WIN32) && !defined(__CYGWIN__)#include <windows.h>#include <io.h>typedef struct{      size_t gl_pathc;    /* Count of paths matched so far  */      char **gl_pathv;    /* List of matched pathnames.  */      size_t gl_offs;     /* Slots to reserve in 'gl_pathv'.  */} glob_t;#define GLOB_DOOFFS 0static int glob(const char *pattern, int flags,                int errfunc(const char *epath, int eerrno),                glob_t *pglob) {    glob_t *ret;    WIN32_FIND_DATA FindFileData;    HANDLE hFind;    unsigned int nb_paths = 0;    char directory[500];    int len;    if ((pattern == NULL) || (pglob == NULL)) return(-1);        strncpy(directory, pattern, 499);    for (len = strlen(directory);len >= 0;len--) {        if (directory[len] == '/') {	    len++;	    directory[len] = 0;	    break;	}    }    if (len <= 0)        len = 0;        ret = pglob;    memset(ret, 0, sizeof(glob_t));        hFind = FindFirstFileA(pattern, &FindFileData);    if (hFind == INVALID_HANDLE_VALUE)         return(0);    nb_paths = 20;    ret->gl_pathv = (char **) malloc(nb_paths * sizeof(char *));    if (ret->gl_pathv == NULL) {	FindClose(hFind);        return(-1);    }    strncpy(directory + len, FindFileData.cFileName, 499 - len);    ret->gl_pathv[ret->gl_pathc] = strdup(directory);    if (ret->gl_pathv[ret->gl_pathc] == NULL)        goto done;    ret->gl_pathc++;    while(FindNextFileA(hFind, &FindFileData)) {        if (FindFileData.cFileName[0] == '.')	    continue;        if (ret->gl_pathc + 2 > nb_paths) {            char **tmp = realloc(ret->gl_pathv, nb_paths * 2 * sizeof(char *));            if (tmp == NULL)                break;            ret->gl_pathv = tmp;            nb_paths *= 2;	}	strncpy(directory + len, FindFileData.cFileName, 499 - len);	ret->gl_pathv[ret->gl_pathc] = strdup(directory);        if (ret->gl_pathv[ret->gl_pathc] == NULL)            break;        ret->gl_pathc++;    }    ret->gl_pathv[ret->gl_pathc] = NULL;done:    FindClose(hFind);    return(0);} static void globfree(glob_t *pglob) {    unsigned int i;    if (pglob == NULL)        return;        for (i = 0;i < pglob->gl_pathc;i++) {         if (pglob->gl_pathv[i] != NULL)             free(pglob->gl_pathv[i]);    }}#define vsnprintf _vsnprintf#define snprintf _snprintf#else#include <glob.h>#endif/************************************************************************ *									* *		Libxml2 specific routines				* *									* ************************************************************************/static int nb_tests = 0;static int nb_errors = 0;static int nb_leaks = 0;static int extraMemoryFromResolver = 0;static intfatalError(void) {    fprintf(stderr, "Exitting tests on fatal error\n");    exit(1);}/* * We need to trap calls to the resolver to not account memory for the catalog * which is shared to the current running test. We also don't want to have * network downloads modifying tests. */static xmlParserInputPtr testExternalEntityLoader(const char *URL, const char *ID,			 xmlParserCtxtPtr ctxt) {    xmlParserInputPtr ret;    if (checkTestFile(URL)) {	ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);    } else {	int memused = xmlMemUsed();	ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);	extraMemoryFromResolver += xmlMemUsed() - memused;    }          return(ret);}/* * Trapping the error messages at the generic level to grab the equivalent of * stderr messages on CLI tools. */static char testErrors[32769];static int testErrorsSize = 0;static void XMLCDECLtestErrorHandler(void *ctx  ATTRIBUTE_UNUSED, const char *msg, ...) {    va_list args;    int res;    if (testErrorsSize >= 32768)        return;    va_start(args, msg);    res = vsnprintf(&testErrors[testErrorsSize],                    32768 - testErrorsSize,		    msg, args);    va_end(args);    if (testErrorsSize + res >= 32768) {        /* buffer is full */	testErrorsSize = 32768;	testErrors[testErrorsSize] = 0;    } else {        testErrorsSize += res;    }    testErrors[testErrorsSize] = 0;}static void XMLCDECLchannel(void *ctx  ATTRIBUTE_UNUSED, const char *msg, ...) {    va_list args;    int res;    if (testErrorsSize >= 32768)        return;    va_start(args, msg);    res = vsnprintf(&testErrors[testErrorsSize],                    32768 - testErrorsSize,		    msg, args);    va_end(args);    if (testErrorsSize + res >= 32768) {        /* buffer is full */	testErrorsSize = 32768;	testErrors[testErrorsSize] = 0;    } else {        testErrorsSize += res;    }    testErrors[testErrorsSize] = 0;}/** * xmlParserPrintFileContext: * @input:  an xmlParserInputPtr input *  * Displays current context within the input content for error tracking */static voidxmlParserPrintFileContextInternal(xmlParserInputPtr input , 		xmlGenericErrorFunc chanl, void *data ) {    const xmlChar *cur, *base;    unsigned int n, col;	/* GCC warns if signed, because compared with sizeof() */    xmlChar  content[81]; /* space for 80 chars + line terminator */    xmlChar *ctnt;    if (input == NULL) return;    cur = input->cur;    base = input->base;    /* skip backwards over any end-of-lines */    while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) {	cur--;    }    n = 0;    /* search backwards for beginning-of-line (to max buff size) */    while ((n++ < (sizeof(content)-1)) && (cur > base) &&     	   (*(cur) != '\n') && (*(cur) != '\r'))        cur--;    if ((*(cur) == '\n') || (*(cur) == '\r')) cur++;    /* calculate the error position in terms of the current position */    col = input->cur - cur;    /* search forward for end-of-line (to max buff size) */    n = 0;    ctnt = content;    /* copy selected text to our buffer */    while ((*cur != 0) && (*(cur) != '\n') &&     	   (*(cur) != '\r') && (n < sizeof(content)-1)) {		*ctnt++ = *cur++;	n++;    }    *ctnt = 0;    /* print out the selected text */    chanl(data ,"%s\n", content);    /* create blank line with problem pointer */    n = 0;    ctnt = content;    /* (leave buffer space for pointer + line terminator) */    while ((n<col) && (n++ < sizeof(content)-2) && (*ctnt != 0)) {	if (*(ctnt) != '\t')	    *(ctnt) = ' ';	ctnt++;    }    *ctnt++ = '^';    *ctnt = 0;    chanl(data ,"%s\n", content);}static voidtestStructuredErrorHandler(void *ctx  ATTRIBUTE_UNUSED, xmlErrorPtr err) {    char *file = NULL;    int line = 0;    int code = -1;    int domain;    void *data = NULL;    const char *str;    const xmlChar *name = NULL;    xmlNodePtr node;    xmlErrorLevel level;    xmlParserInputPtr input = NULL;    xmlParserInputPtr cur = NULL;    xmlParserCtxtPtr ctxt = NULL;    if (err == NULL)        return;    file = err->file;    line = err->line;    code = err->code;    domain = err->domain;    level = err->level;    node = err->node;    if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) ||        (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) ||	(domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) {	ctxt = err->ctxt;    }    str = err->message;    if (code == XML_ERR_OK)        return;    if ((node != NULL) && (node->type == XML_ELEMENT_NODE))        name = node->name;    /*     * Maintain the compatibility with the legacy error handling     */    if (ctxt != NULL) {        input = ctxt->input;        if ((input != NULL) && (input->filename == NULL) &&            (ctxt->inputNr > 1)) {            cur = input;            input = ctxt->inputTab[ctxt->inputNr - 2];        }        if (input != NULL) {            if (input->filename)                channel(data, "%s:%d: ", input->filename, input->line);            else if ((line != 0) && (domain == XML_FROM_PARSER))                channel(data, "Entity: line %d: ", input->line);        }    } else {        if (file != NULL)            channel(data, "%s:%d: ", file, line);        else if ((line != 0) && (domain == XML_FROM_PARSER))            channel(data, "Entity: line %d: ", line);    }    if (name != NULL) {        channel(data, "element %s: ", name);    }    if (code == XML_ERR_OK)        return;    switch (domain) {        case XML_FROM_PARSER:            channel(data, "parser ");            break;        case XML_FROM_NAMESPACE:            channel(data, "namespace ");            break;        case XML_FROM_DTD:        case XML_FROM_VALID:            channel(data, "validity ");            break;        case XML_FROM_HTML:            channel(data, "HTML parser ");            break;        case XML_FROM_MEMORY:            channel(data, "memory ");            break;        case XML_FROM_OUTPUT:            channel(data, "output ");            break;        case XML_FROM_IO:            channel(data, "I/O ");            break;        case XML_FROM_XINCLUDE:            channel(data, "XInclude ");            break;        case XML_FROM_XPATH:            channel(data, "XPath ");            break;        case XML_FROM_XPOINTER:            channel(data, "parser ");            break;        case XML_FROM_REGEXP:            channel(data, "regexp ");            break;        case XML_FROM_MODULE:            channel(data, "module ");            break;        case XML_FROM_SCHEMASV:            channel(data, "Schemas validity ");            break;        case XML_FROM_SCHEMASP:            channel(data, "Schemas parser ");            break;        case XML_FROM_RELAXNGP:            channel(data, "Relax-NG parser ");            break;        case XML_FROM_RELAXNGV:            channel(data, "Relax-NG validity ");            break;        case XML_FROM_CATALOG:            channel(data, "Catalog ");            break;        case XML_FROM_C14N:            channel(data, "C14N ");            break;        case XML_FROM_XSLT:            channel(data, "XSLT ");            break;        default:            break;    }    if (code == XML_ERR_OK)        return;    switch (level) {        case XML_ERR_NONE:            channel(data, ": ");            break;        case XML_ERR_WARNING:            channel(data, "warning : ");            break;        case XML_ERR_ERROR:            channel(data, "error : ");            break;        case XML_ERR_FATAL:            channel(data, "error : ");            break;    }    if (code == XML_ERR_OK)        return;    if (str != NULL) {        int len;	len = xmlStrlen((const xmlChar *)str);	if ((len > 0) && (str[len - 1] != '\n'))	    channel(data, "%s\n", str);	else	    channel(data, "%s", str);    } else {        channel(data, "%s\n", "out of memory error");    }    if (code == XML_ERR_OK)        return;    if (ctxt != NULL) {        xmlParserPrintFileContextInternal(input, channel, data);        if (cur != NULL) {            if (cur->filename)                channel(data, "%s:%d: \n", cur->filename, cur->line);            else if ((line != 0) && (domain == XML_FROM_PARSER))                channel(data, "Entity: line %d: \n", cur->line);            xmlParserPrintFileContextInternal(cur, channel, data);        }    }    if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) &&        (err->int1 < 100) &&	(err->int1 < xmlStrlen((const xmlChar *)err->str1))) {	xmlChar buf[150];	int i;	channel(data, "%s\n", err->str1);	for (i=0;i < err->int1;i++)	     buf[i] = ' ';	buf[i++] = '^';	buf[i] = 0;	channel(data, "%s\n", buf);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -