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

📄 runtest.c

📁 xml开源解析代码.版本为libxml2-2.6.29,可支持GB3212.网络消息发送XML时很有用.
💻 C
📖 第 1 页 / 共 5 页
字号:
static voidinitializeLibxml2(void) {    xmlGetWarningsDefaultValue = 0;    xmlPedanticParserDefault(0);    xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);    xmlInitParser();    xmlSetExternalEntityLoader(testExternalEntityLoader);    xmlSetStructuredErrorFunc(NULL, testStructuredErrorHandler);#ifdef LIBXML_SCHEMAS_ENABLED    xmlSchemaInitTypes();    xmlRelaxNGInitTypes();#endif}/************************************************************************ *									* *		File name and path utilities				* *									* ************************************************************************/static const char *baseFilename(const char *filename) {    const char *cur;    if (filename == NULL)        return(NULL);    cur = &filename[strlen(filename)];    while ((cur > filename) && (*cur != '/'))        cur--;    if (*cur == '/')        return(cur + 1);    return(cur);}static char *resultFilename(const char *filename, const char *out,                            const char *suffix) {    const char *base;    char res[500];    char suffixbuff[500];/*************    if ((filename[0] == 't') && (filename[1] == 'e') &&        (filename[2] == 's') && (filename[3] == 't') &&	(filename[4] == '/'))	filename = &filename[5]; *************/        base = baseFilename(filename);    if (suffix == NULL)        suffix = ".tmp";    if (out == NULL)        out = "";    strncpy(suffixbuff,suffix,499);#ifdef VMS    if(strstr(base,".") && suffixbuff[0]=='.')      suffixbuff[0]='_';#endif    snprintf(res, 499, "%s%s%s", out, base, suffixbuff);    res[499] = 0;    return(strdup(res));}static int checkTestFile(const char *filename) {    struct stat buf;    if (stat(filename, &buf) == -1)        return(0);#if defined(_WIN32) && !defined(__CYGWIN__)    if (!(buf.st_mode & _S_IFREG))        return(0);#else    if (!S_ISREG(buf.st_mode))        return(0);#endif    return(1);}static int compareFiles(const char *r1, const char *r2) {    int res1, res2;    int fd1, fd2;    char bytes1[4096];    char bytes2[4096];    fd1 = open(r1, RD_FLAGS);    if (fd1 < 0)        return(-1);    fd2 = open(r2, RD_FLAGS);    if (fd2 < 0) {        close(fd1);        return(-1);    }    while (1) {        res1 = read(fd1, bytes1, 4096);        res2 = read(fd2, bytes2, 4096);	if ((res1 != res2) || (res1 < 0)) {	    close(fd1);	    close(fd2);	    return(1);	}	if (res1 == 0)	    break;	if (memcmp(bytes1, bytes2, res1) != 0) {	    close(fd1);	    close(fd2);	    return(1);	}    }    close(fd1);    close(fd2);    return(0);}static int compareFileMem(const char *filename, const char *mem, int size) {    int res;    int fd;    char bytes[4096];    int idx = 0;    struct stat info;    if (stat(filename, &info) < 0) 	return(-1);    if (info.st_size != size)        return(-1);    fd = open(filename, RD_FLAGS);    if (fd < 0)        return(-1);    while (idx < size) {        res = read(fd, bytes, 4096);	if (res <= 0)	    break;	if (res + idx > size) 	    break;	if (memcmp(bytes, &mem[idx], res) != 0) {	    int ix;	    for (ix=0; ix<res; ix++)		if (bytes[ix] != mem[idx+ix])			break;	    fprintf(stderr,"Compare error at position %d\n", idx+ix);	    close(fd);	    return(1);	}	idx += res;    }    close(fd);    return(idx != size);}static int loadMem(const char *filename, const char **mem, int *size) {    int fd, res;    struct stat info;    char *base;    int siz = 0;    if (stat(filename, &info) < 0) 	return(-1);    base = malloc(info.st_size + 1);    if (base == NULL)	return(-1);    if ((fd = open(filename, RD_FLAGS)) < 0) {        free(base);	return(-1);    }    while ((res = read(fd, &base[siz], info.st_size - siz)) > 0) {        siz += res;    }    close(fd);#if !defined(_WIN32)    if (siz != info.st_size) {        free(base);	return(-1);    }#endif    base[siz] = 0;    *mem = base;    *size = siz;    return(0);}static int unloadMem(const char *mem) {    free((char *)mem);    return(0);}/************************************************************************ *									* *		Tests implementations					* *									* ************************************************************************//************************************************************************ *									* *		Parse to SAX based tests				* *									* ************************************************************************/static FILE *SAXdebug = NULL;/* * empty SAX block */static xmlSAXHandler emptySAXHandlerStruct = {    NULL, /* internalSubset */    NULL, /* isStandalone */    NULL, /* hasInternalSubset */    NULL, /* hasExternalSubset */    NULL, /* resolveEntity */    NULL, /* getEntity */    NULL, /* entityDecl */    NULL, /* notationDecl */    NULL, /* attributeDecl */    NULL, /* elementDecl */    NULL, /* unparsedEntityDecl */    NULL, /* setDocumentLocator */    NULL, /* startDocument */    NULL, /* endDocument */    NULL, /* startElement */    NULL, /* endElement */    NULL, /* reference */    NULL, /* characters */    NULL, /* ignorableWhitespace */    NULL, /* processingInstruction */    NULL, /* comment */    NULL, /* xmlParserWarning */    NULL, /* xmlParserError */    NULL, /* xmlParserError */    NULL, /* getParameterEntity */    NULL, /* cdataBlock; */    NULL, /* externalSubset; */    1,    NULL,    NULL, /* startElementNs */    NULL, /* endElementNs */    NULL  /* xmlStructuredErrorFunc */};static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;static int callbacks = 0;static int quiet = 0;/** * isStandaloneDebug: * @ctxt:  An XML parser context * * Is this document tagged standalone ? * * Returns 1 if true */static intisStandaloneDebug(void *ctx ATTRIBUTE_UNUSED){    callbacks++;    if (quiet)	return(0);    fprintf(SAXdebug, "SAX.isStandalone()\n");    return(0);}/** * hasInternalSubsetDebug: * @ctxt:  An XML parser context * * Does this document has an internal subset * * Returns 1 if true */static inthasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED){    callbacks++;    if (quiet)	return(0);    fprintf(SAXdebug, "SAX.hasInternalSubset()\n");    return(0);}/** * hasExternalSubsetDebug: * @ctxt:  An XML parser context * * Does this document has an external subset * * Returns 1 if true */static inthasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED){    callbacks++;    if (quiet)	return(0);    fprintf(SAXdebug, "SAX.hasExternalSubset()\n");    return(0);}/** * internalSubsetDebug: * @ctxt:  An XML parser context * * Does this document has an internal subset */static voidinternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,	       const xmlChar *ExternalID, const xmlChar *SystemID){    callbacks++;    if (quiet)	return;    fprintf(SAXdebug, "SAX.internalSubset(%s,", name);    if (ExternalID == NULL)	fprintf(SAXdebug, " ,");    else	fprintf(SAXdebug, " %s,", ExternalID);    if (SystemID == NULL)	fprintf(SAXdebug, " )\n");    else	fprintf(SAXdebug, " %s)\n", SystemID);}/** * externalSubsetDebug: * @ctxt:  An XML parser context * * Does this document has an external subset */static voidexternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,	       const xmlChar *ExternalID, const xmlChar *SystemID){    callbacks++;    if (quiet)	return;    fprintf(SAXdebug, "SAX.externalSubset(%s,", name);    if (ExternalID == NULL)	fprintf(SAXdebug, " ,");    else	fprintf(SAXdebug, " %s,", ExternalID);    if (SystemID == NULL)	fprintf(SAXdebug, " )\n");    else	fprintf(SAXdebug, " %s)\n", SystemID);}/** * resolveEntityDebug: * @ctxt:  An XML parser context * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * Special entity resolver, better left to the parser, it has * more context than the application layer. * The default behaviour is to NOT resolve the entities, in that case * the ENTITY_REF nodes are built in the structure (and the parameter * values). * * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. */static xmlParserInputPtrresolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId){    callbacks++;    if (quiet)	return(NULL);    /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */        fprintf(SAXdebug, "SAX.resolveEntity(");    if (publicId != NULL)	fprintf(SAXdebug, "%s", (char *)publicId);    else	fprintf(SAXdebug, " ");    if (systemId != NULL)	fprintf(SAXdebug, ", %s)\n", (char *)systemId);    else	fprintf(SAXdebug, ", )\n");/*********    if (systemId != NULL) {        return(xmlNewInputFromFile(ctxt, (char *) systemId));    } *********/    return(NULL);}/** * getEntityDebug: * @ctxt:  An XML parser context * @name: The entity name * * Get an entity by name * * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. */static xmlEntityPtrgetEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name){    callbacks++;    if (quiet)	return(NULL);    fprintf(SAXdebug, "SAX.getEntity(%s)\n", name);    return(NULL);}/** * getParameterEntityDebug: * @ctxt:  An XML parser context * @name: The entity name * * Get a parameter entity by name * * Returns the xmlParserInputPtr */static xmlEntityPtrgetParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name){    callbacks++;    if (quiet)	return(NULL);    fprintf(SAXdebug, "SAX.getParameterEntity(%s)\n", name);    return(NULL);}/** * entityDeclDebug: * @ctxt:  An XML parser context * @name:  the entity name  * @type:  the entity type  * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @content: the entity value (without processing). * * An entity definition has been parsed */static voidentityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,          const xmlChar *publicId, const xmlChar *systemId, xmlChar *content){const xmlChar *nullstr = BAD_CAST "(null)";    /* not all libraries handle printing null pointers nicely */    if (publicId == NULL)        publicId = nullstr;    if (systemId == NULL)        systemId = nullstr;    if (content == NULL)        content = (xmlChar *)nullstr;    callbacks++;    if (quiet)	return;    fprintf(SAXdebug, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",            name, type, publicId, systemId, content);}/** * attributeDeclDebug: * @ctxt:  An XML parser context * @name:  the attribute name  * @type:  the attribute type  * * An attribute definition has been parsed */static voidattributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,                   const xmlChar * name, int type, int def,                   const xmlChar * defaultValue, xmlEnumerationPtr tree){    callbacks++;    if (quiet)        return;    if (defaultValue == NULL)        fprintf(SAXdebug, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",                elem, name, type, def);    else        fprintf(SAXdebug, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",                elem, name, type, def, defaultValue);    xmlFreeEnumeration(tree);}/** * elementDeclDebug: * @ctxt:  An XML parser context * @name:  the element name  * @type:  the element type  * @content: the element value (without processing). * * An element definition has been parsed */static voidelementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,	    xmlElementContentPtr content ATTRIBUTE_UNUSED){    callbacks++;    if (quiet)	return;    fprintf(SAXdebug, "SAX.elementDecl(%s, %d, ...)\n",            name, type);}/** * notationDeclDebug: * @ctxt:  An XML parser context * @name: The name of the notation * @publicId: The public ID of the entity * @systemId: The system ID of the entity * * What to do when a notation declaration has been parsed. */static voidnotationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,	     const xmlChar *publicId, const xmlChar *systemId){    callbacks++;    if (quiet)	return;    fprintf(SAXdebug, "SAX.notationDecl(%s, %s, %s)\n",            (char *) name, (char *) publicId, (char *) systemId);}/** * unparsedEntityDeclDebug: * @ctxt:  An XML parser context * @name: The name of the entity * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @notationName: the name of the notation * * What to do when an unparsed entity declaration is parsed */static void

⌨️ 快捷键说明

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