📄 xmlwf.c
字号:
/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file COPYING for copying permission.*/#include <stdio.h>#include <stdlib.h>#include <stddef.h>#include <string.h>#include "expat.h"#include "codepage.h"#include "xmlfile.h"#include "xmltchar.h"#ifdef _MSC_VER#include <crtdbg.h>#endif/* This ensures proper sorting. */#define NSSEP T('\001')static voidcharacterData(void *userData, const XML_Char *s, int len){ FILE *fp = userData; for (; len > 0; --len, ++s) { switch (*s) { case T('&'): fputts(T("&"), fp); break; case T('<'): fputts(T("<"), fp); break; case T('>'): fputts(T(">"), fp); break;#ifdef W3C14N case 13: fputts(T("
"), fp); break;#else case T('"'): fputts(T("""), fp); break; case 9: case 10: case 13: ftprintf(fp, T("&#%d;"), *s); break;#endif default: puttc(*s, fp); break; } }}static voidattributeValue(FILE *fp, const XML_Char *s){ puttc(T('='), fp); puttc(T('"'), fp); for (;;) { switch (*s) { case 0: case NSSEP: puttc(T('"'), fp); return; case T('&'): fputts(T("&"), fp); break; case T('<'): fputts(T("<"), fp); break; case T('"'): fputts(T("""), fp); break;#ifdef W3C14N case 9: fputts(T("	"), fp); break; case 10: fputts(T("
"), fp); break; case 13: fputts(T("
"), fp); break;#else case T('>'): fputts(T(">"), fp); break; case 9: case 10: case 13: ftprintf(fp, T("&#%d;"), *s); break;#endif default: puttc(*s, fp); break; } s++; }}/* Lexicographically comparing UTF-8 encoded attribute values,is equivalent to lexicographically comparing based on the character number. */static intattcmp(const void *att1, const void *att2){ return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2);}static voidstartElement(void *userData, const XML_Char *name, const XML_Char **atts){ int nAtts; const XML_Char **p; FILE *fp = userData; puttc(T('<'), fp); fputts(name, fp); p = atts; while (*p) ++p; nAtts = (p - atts) >> 1; if (nAtts > 1) qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp); while (*atts) { puttc(T(' '), fp); fputts(*atts++, fp); attributeValue(fp, *atts); atts++; } puttc(T('>'), fp);}static voidendElement(void *userData, const XML_Char *name){ FILE *fp = userData; puttc(T('<'), fp); puttc(T('/'), fp); fputts(name, fp); puttc(T('>'), fp);}static intnsattcmp(const void *p1, const void *p2){ const XML_Char *att1 = *(const XML_Char **)p1; const XML_Char *att2 = *(const XML_Char **)p2; int sep1 = (tcsrchr(att1, NSSEP) != 0); int sep2 = (tcsrchr(att1, NSSEP) != 0); if (sep1 != sep2) return sep1 - sep2; return tcscmp(att1, att2);}static voidstartElementNS(void *userData, const XML_Char *name, const XML_Char **atts){ int nAtts; int nsi; const XML_Char **p; FILE *fp = userData; const XML_Char *sep; puttc(T('<'), fp); sep = tcsrchr(name, NSSEP); if (sep) { fputts(T("n1:"), fp); fputts(sep + 1, fp); fputts(T(" xmlns:n1"), fp); attributeValue(fp, name); nsi = 2; } else { fputts(name, fp); nsi = 1; } p = atts; while (*p) ++p; nAtts = (p - atts) >> 1; if (nAtts > 1) qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp); while (*atts) { name = *atts++; sep = tcsrchr(name, NSSEP); puttc(T(' '), fp); if (sep) { ftprintf(fp, T("n%d:"), nsi); fputts(sep + 1, fp); } else fputts(name, fp); attributeValue(fp, *atts); if (sep) { ftprintf(fp, T(" xmlns:n%d"), nsi++); attributeValue(fp, name); } atts++; } puttc(T('>'), fp);}static voidendElementNS(void *userData, const XML_Char *name){ FILE *fp = userData; const XML_Char *sep; puttc(T('<'), fp); puttc(T('/'), fp); sep = tcsrchr(name, NSSEP); if (sep) { fputts(T("n1:"), fp); fputts(sep + 1, fp); } else fputts(name, fp); puttc(T('>'), fp);}#ifndef W3C14Nstatic voidprocessingInstruction(void *userData, const XML_Char *target, const XML_Char *data){ FILE *fp = userData; puttc(T('<'), fp); puttc(T('?'), fp); fputts(target, fp); puttc(T(' '), fp); fputts(data, fp); puttc(T('?'), fp); puttc(T('>'), fp);}#endif /* not W3C14N */static voiddefaultCharacterData(void *userData, const XML_Char *s, int len){ XML_DefaultCurrent((XML_Parser) userData);}static voiddefaultStartElement(void *userData, const XML_Char *name, const XML_Char **atts){ XML_DefaultCurrent((XML_Parser) userData);}static voiddefaultEndElement(void *userData, const XML_Char *name){ XML_DefaultCurrent((XML_Parser) userData);}static voiddefaultProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data){ XML_DefaultCurrent((XML_Parser) userData);}static voidnopCharacterData(void *userData, const XML_Char *s, int len){}static voidnopStartElement(void *userData, const XML_Char *name, const XML_Char **atts){}static voidnopEndElement(void *userData, const XML_Char *name){}static voidnopProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data){}static voidmarkup(void *userData, const XML_Char *s, int len){ FILE *fp = XML_GetUserData((XML_Parser) userData); for (; len > 0; --len, ++s) puttc(*s, fp);}static voidmetaLocation(XML_Parser parser){ const XML_Char *uri = XML_GetBase(parser); if (uri) ftprintf(XML_GetUserData(parser), T(" uri=\"%s\""), uri); ftprintf(XML_GetUserData(parser), T(" byte=\"%ld\" nbytes=\"%d\" line=\"%d\" col=\"%d\""), XML_GetCurrentByteIndex(parser), XML_GetCurrentByteCount(parser), XML_GetCurrentLineNumber(parser), XML_GetCurrentColumnNumber(parser));}static voidmetaStartDocument(void *userData){ fputts(T("<document>\n"), XML_GetUserData((XML_Parser) userData));}static voidmetaEndDocument(void *userData){ fputts(T("</document>\n"), XML_GetUserData((XML_Parser) userData));}static voidmetaStartElement(void *userData, const XML_Char *name, const XML_Char **atts){ XML_Parser parser = (XML_Parser) userData; FILE *fp = XML_GetUserData(parser); const XML_Char **specifiedAttsEnd = atts + XML_GetSpecifiedAttributeCount(parser); const XML_Char **idAttPtr; int idAttIndex = XML_GetIdAttributeIndex(parser); if (idAttIndex < 0) idAttPtr = 0; else idAttPtr = atts + idAttIndex; ftprintf(fp, T("<starttag name=\"%s\""), name); metaLocation(parser); if (*atts) { fputts(T(">\n"), fp); do { ftprintf(fp, T("<attribute name=\"%s\" value=\""), atts[0]); characterData(fp, atts[1], tcslen(atts[1])); if (atts >= specifiedAttsEnd) fputts(T("\" defaulted=\"yes\"/>\n"), fp); else if (atts == idAttPtr) fputts(T("\" id=\"yes\"/>\n"), fp); else fputts(T("\"/>\n"), fp); } while (*(atts += 2)); fputts(T("</starttag>\n"), fp); } else fputts(T("/>\n"), fp);}static voidmetaEndElement(void *userData, const XML_Char *name){ XML_Parser parser = (XML_Parser) userData; FILE *fp = XML_GetUserData(parser); ftprintf(fp, T("<endtag name=\"%s\""), name); metaLocation(parser); fputts(T("/>\n"), fp);}static voidmetaProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data){ XML_Parser parser = (XML_Parser) userData; FILE *fp = XML_GetUserData(parser); ftprintf(fp, T("<pi target=\"%s\" data=\""), target); characterData(fp, data, tcslen(data)); puttc(T('"'), fp); metaLocation(parser); fputts(T("/>\n"), fp);}static voidmetaComment(void *userData, const XML_Char *data){ XML_Parser parser = (XML_Parser) userData; FILE *fp = XML_GetUserData(parser); fputts(T("<comment data=\""), fp); characterData(fp, data, tcslen(data)); puttc(T('"'), fp); metaLocation(parser); fputts(T("/>\n"), fp);}static voidmetaStartCdataSection(void *userData){ XML_Parser parser = (XML_Parser) userData; FILE *fp = XML_GetUserData(parser); fputts(T("<startcdata"), fp); metaLocation(parser); fputts(T("/>\n"), fp);}static voidmetaEndCdataSection(void *userData){ XML_Parser parser = (XML_Parser) userData; FILE *fp = XML_GetUserData(parser); fputts(T("<endcdata"), fp); metaLocation(parser); fputts(T("/>\n"), fp);}static voidmetaCharacterData(void *userData, const XML_Char *s, int len){ XML_Parser parser = (XML_Parser) userData; FILE *fp = XML_GetUserData(parser); fputts(T("<chars str=\""), fp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -