From 59d81f517d8cf2fbf5b3649405434615ebd5bad5 Mon Sep 17 00:00:00 2001 From: Rhodri James Date: Mon, 21 Aug 2017 17:21:22 +0100 Subject: [PATCH] Move static variables into a userdata structure --- expat/xmlwf/xmlwf.c | 190 +++++++++++++++++++++++++------------------- 1 file changed, 108 insertions(+), 82 deletions(-) diff --git a/expat/xmlwf/xmlwf.c b/expat/xmlwf/xmlwf.c index 68acfd10..ba09c781 100644 --- a/expat/xmlwf/xmlwf.c +++ b/expat/xmlwf/xmlwf.c @@ -45,6 +45,21 @@ #include #endif +/* Structures for handler user data */ +typedef struct NotationList { + struct NotationList *next; + const XML_Char *notationName; + const XML_Char *systemId; + const XML_Char *publicId; +} NotationList; + +typedef struct xmlwfUserData { + FILE *fp; + NotationList *notationListHead; + const XML_Char *currentDoctypeName; +} XmlwfUserData; + + /* This ensures proper sorting. */ #define NSSEP T('\001') @@ -52,7 +67,7 @@ static void XMLCALL characterData(void *userData, const XML_Char *s, int len) { - FILE *fp = (FILE *)userData; + FILE *fp = ((XmlwfUserData *)userData)->fp; for (; len > 0; --len, ++s) { switch (*s) { case T('&'): @@ -147,7 +162,7 @@ startElement(void *userData, const XML_Char *name, const XML_Char **atts) { int nAtts; const XML_Char **p; - FILE *fp = (FILE *)userData; + FILE *fp = ((XmlwfUserData *)userData)->fp; puttc(T('<'), fp); fputts(name, fp); @@ -169,7 +184,7 @@ startElement(void *userData, const XML_Char *name, const XML_Char **atts) static void XMLCALL endElement(void *userData, const XML_Char *name) { - FILE *fp = (FILE *)userData; + FILE *fp = ((XmlwfUserData *)userData)->fp; puttc(T('<'), fp); puttc(T('/'), fp); fputts(name, fp); @@ -194,7 +209,7 @@ startElementNS(void *userData, const XML_Char *name, const XML_Char **atts) int nAtts; int nsi; const XML_Char **p; - FILE *fp = (FILE *)userData; + FILE *fp = ((XmlwfUserData *)userData)->fp; const XML_Char *sep; puttc(T('<'), fp); @@ -240,7 +255,7 @@ startElementNS(void *userData, const XML_Char *name, const XML_Char **atts) static void XMLCALL endElementNS(void *userData, const XML_Char *name) { - FILE *fp = (FILE *)userData; + FILE *fp = ((XmlwfUserData *)userData)->fp; const XML_Char *sep; puttc(T('<'), fp); puttc(T('/'), fp); @@ -260,7 +275,7 @@ static void XMLCALL processingInstruction(void *userData, const XML_Char *target, const XML_Char *data) { - FILE *fp = (FILE *)userData; + FILE *fp = ((XmlwfUserData *)userData)->fp; puttc(T('<'), fp); puttc(T('?'), fp); fputts(target, fp); @@ -271,16 +286,6 @@ processingInstruction(void *userData, const XML_Char *target, } -typedef struct NotationList { - struct NotationList *next; - const XML_Char *notationName; - const XML_Char *systemId; - const XML_Char *publicId; -} NotationList; - -static NotationList *notationListHead = NULL; -static const XML_Char *currentDoctypeName = NULL; - static XML_Char *xmlCharDup(const XML_Char *s) { XML_Char *result; @@ -298,18 +303,21 @@ static XML_Char *xmlCharDup(const XML_Char *s) } static void XMLCALL -startDoctypeDecl(void *UNUSED_P(userData), +startDoctypeDecl(void *userData, const XML_Char *doctypeName, const XML_Char *UNUSED_P(sysid), const XML_Char *UNUSED_P(publid), int has_internal_subset) { - currentDoctypeName = xmlCharDup(doctypeName); + XmlwfUserData *data = (XmlwfUserData *)userData; + data->currentDoctypeName = xmlCharDup(doctypeName); } static void -freeNotations(void) +freeNotations(XmlwfUserData *data) { + NotationList *notationListHead = data->notationListHead; + while (notationListHead != NULL) { NotationList *next = notationListHead->next; free((void *)notationListHead->notationName); @@ -318,6 +326,7 @@ freeNotations(void) free(notationListHead); notationListHead = next; } + data->notationListHead = NULL; } static int xcscmp(const XML_Char *xs, const XML_Char *xt) @@ -349,14 +358,14 @@ notationCmp(const void *a, const void *b) static void XMLCALL endDoctypeDecl(void *userData) { - FILE *fp = (FILE *)userData; + XmlwfUserData *data = (XmlwfUserData *)userData; NotationList **notations; int notationCount = 0; NotationList *p; int i; /* How many notations do we have? */ - for (p = notationListHead; p != NULL; p = p->next) + for (p = data->notationListHead; p != NULL; p = p->next) notationCount++; if (notationCount == 0) return; /* Nothing to report */ @@ -364,11 +373,11 @@ endDoctypeDecl(void *userData) notations = malloc(notationCount * sizeof(NotationList *)); if (notations == NULL) { fprintf(stderr, "Unable to sort notations"); - freeNotations(); + freeNotations(data); return; } - for (p = notationListHead, i = 0; + for (p = data->notationListHead, i = 0; i < notationCount; p = p->next, i++) { notations[i] = p; @@ -376,50 +385,51 @@ endDoctypeDecl(void *userData) qsort(notations, notationCount, sizeof(NotationList *), notationCmp); /* Output the DOCTYPE header */ - fputts(T("fp); + fputts(data->currentDoctypeName, data->fp); + fputts(T(" [\n"), data->fp); /* Now the NOTATIONs */ for (i = 0; i < notationCount; i++) { - fputts(T("notationName, fp); + fputts(T("fp); + fputts(notations[i]->notationName, data->fp); if (notations[i]->publicId != NULL) { - fputts(T(" PUBLIC '"), fp); - fputts(notations[i]->publicId, fp); - puttc(T('\''), fp); + fputts(T(" PUBLIC '"), data->fp); + fputts(notations[i]->publicId, data->fp); + puttc(T('\''), data->fp); if (notations[i]->systemId != NULL) { - puttc(T(' '), fp); - puttc(T('\''), fp); - fputts(notations[i]->systemId, fp); - puttc(T('\''), fp); + puttc(T(' '), data->fp); + puttc(T('\''), data->fp); + fputts(notations[i]->systemId, data->fp); + puttc(T('\''), data->fp); } } else if (notations[i]->systemId != NULL) { - fputts(T(" SYSTEM '"), fp); - fputts(notations[i]->systemId, fp); - puttc(T('\''), fp); + fputts(T(" SYSTEM '"), data->fp); + fputts(notations[i]->systemId, data->fp); + puttc(T('\''), data->fp); } - puttc(T('>'), fp); - puttc(T('\n'), fp); + puttc(T('>'), data->fp); + puttc(T('\n'), data->fp); } /* Finally end the DOCTYPE */ - fputts(T("]>\n"), fp); + fputts(T("]>\n"), data->fp); free(notations); - freeNotations(); - free((void *)currentDoctypeName); - currentDoctypeName = NULL; + freeNotations(data); + free((void *)data->currentDoctypeName); + data->currentDoctypeName = NULL; } static void XMLCALL -notationDecl(void *UNUSED_P(userData), +notationDecl(void *userData, const XML_Char *notationName, const XML_Char *UNUSED_P(base), const XML_Char *systemId, const XML_Char *publicId) { + XmlwfUserData *data = (XmlwfUserData *)userData; NotationList *entry = malloc(sizeof(NotationList)); if (entry == NULL) { @@ -458,8 +468,8 @@ notationDecl(void *UNUSED_P(userData), entry->publicId = NULL; } - entry->next = notationListHead; - notationListHead = entry; + entry->next = data->notationListHead; + data->notationListHead = entry; } #endif /* not W3C14N */ @@ -514,7 +524,7 @@ nopProcessingInstruction(void *UNUSED_P(userData), const XML_Char *UNUSED_P(targ static void XMLCALL markup(void *userData, const XML_Char *s, int len) { - FILE *fp = (FILE *)XML_GetUserData((XML_Parser) userData); + FILE *fp = ((XmlwfUserData *)XML_GetUserData((XML_Parser) userData))->fp; for (; len > 0; --len, ++s) puttc(*s, fp); } @@ -523,9 +533,10 @@ static void metaLocation(XML_Parser parser) { const XML_Char *uri = XML_GetBase(parser); + FILE *fp = ((XmlwfUserData *)XML_GetUserData(parser))->fp; if (uri) - ftprintf((FILE *)XML_GetUserData(parser), T(" uri=\"%s\""), uri); - ftprintf((FILE *)XML_GetUserData(parser), + ftprintf(fp, T(" uri=\"%s\""), uri); + ftprintf(fp, T(" byte=\"%" XML_FMT_INT_MOD "d\" nbytes=\"%d\" \ line=\"%" XML_FMT_INT_MOD "u\" col=\"%" XML_FMT_INT_MOD "u\""), XML_GetCurrentByteIndex(parser), @@ -537,13 +548,15 @@ metaLocation(XML_Parser parser) static void metaStartDocument(void *userData) { - fputts(T("\n"), (FILE *)XML_GetUserData((XML_Parser) userData)); + fputts(T("\n"), + ((XmlwfUserData *)XML_GetUserData((XML_Parser) userData))->fp); } static void metaEndDocument(void *userData) { - fputts(T("\n"), (FILE *)XML_GetUserData((XML_Parser) userData)); + fputts(T("\n"), + ((XmlwfUserData *)XML_GetUserData((XML_Parser) userData))->fp); } static void XMLCALL @@ -551,7 +564,8 @@ metaStartElement(void *userData, const XML_Char *name, const XML_Char **atts) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; const XML_Char **specifiedAttsEnd = atts + XML_GetSpecifiedAttributeCount(parser); const XML_Char **idAttPtr; @@ -560,14 +574,14 @@ metaStartElement(void *userData, const XML_Char *name, idAttPtr = 0; else idAttPtr = atts + idAttIndex; - + ftprintf(fp, T("\n"), fp); do { ftprintf(fp, T("= specifiedAttsEnd) fputts(T("\" defaulted=\"yes\"/>\n"), fp); else if (atts == idAttPtr) @@ -585,7 +599,8 @@ static void XMLCALL metaEndElement(void *userData, const XML_Char *name) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; ftprintf(fp, T("\n"), fp); @@ -596,9 +611,10 @@ metaProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *usrData = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = usrData->fp; ftprintf(fp, T("\n"), fp); @@ -608,9 +624,10 @@ static void XMLCALL metaComment(void *userData, const XML_Char *data) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *usrData = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = usrData->fp; fputts(T("\n"), fp); @@ -620,7 +637,8 @@ static void XMLCALL metaStartCdataSection(void *userData) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; fputts(T("\n"), fp); @@ -630,7 +648,8 @@ static void XMLCALL metaEndCdataSection(void *userData) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; fputts(T("\n"), fp); @@ -640,9 +659,10 @@ static void XMLCALL metaCharacterData(void *userData, const XML_Char *s, int len) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; fputts(T("\n"), fp); @@ -656,7 +676,8 @@ metaStartDoctypeDecl(void *userData, int UNUSED_P(has_internal_subset)) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; ftprintf(fp, T("\n"), fp); @@ -666,7 +687,8 @@ static void XMLCALL metaEndDoctypeDecl(void *userData) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; fputts(T("\n"), fp); @@ -680,13 +702,14 @@ metaNotationDecl(void *userData, const XML_Char *publicId) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; ftprintf(fp, T("fp; if (value) { ftprintf(fp, T("'), fp); - characterData(fp, value, value_length); + characterData(data, value, value_length); fputts(T("\n"), fp); } else if (notationName) { @@ -720,7 +744,7 @@ metaEntityDecl(void *userData, if (publicId) ftprintf(fp, T(" public=\"%s\""), publicId); fputts(T(" system=\""), fp); - characterData(fp, systemId, (int)tcslen(systemId)); + characterData(data, systemId, (int)tcslen(systemId)); puttc(T('"'), fp); ftprintf(fp, T(" notation=\"%s\""), notationName); metaLocation(parser); @@ -731,7 +755,7 @@ metaEntityDecl(void *userData, if (publicId) ftprintf(fp, T(" public=\"%s\""), publicId); fputts(T(" system=\""), fp); - characterData(fp, systemId, (int)tcslen(systemId)); + characterData(data, systemId, (int)tcslen(systemId)); puttc(T('"'), fp); metaLocation(parser); fputts(T("/>\n"), fp); @@ -744,13 +768,14 @@ metaStartNamespaceDecl(void *userData, const XML_Char *uri) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; fputts(T("\n"), fp); } else @@ -761,7 +786,8 @@ static void XMLCALL metaEndNamespaceDecl(void *userData, const XML_Char *prefix) { XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); + XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser); + FILE *fp = data->fp; if (!prefix) fputts(T("\n"), fp); else @@ -870,6 +896,7 @@ tmain(int argc, XML_Char **argv) enum XML_ParamEntityParsing paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; int useStdin = 0; + XmlwfUserData userData = { NULL, NULL, NULL }; #ifdef _MSC_VER _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); @@ -973,7 +1000,6 @@ tmain(int argc, XML_Char **argv) i--; } for (; i < argc; i++) { - FILE *fp = 0; XML_Char *outName = 0; int result; XML_Parser parser; @@ -1022,16 +1048,16 @@ tmain(int argc, XML_Char **argv) tcscpy(outName, outputDir); tcscat(outName, delim); tcscat(outName, file); - fp = tfopen(outName, T("wb")); - if (!fp) { + userData.fp = tfopen(outName, T("wb")); + if (!userData.fp) { tperror(outName); exit(1); } - setvbuf(fp, NULL, _IOFBF, 16384); + setvbuf(userData.fp, NULL, _IOFBF, 16384); #ifdef XML_UNICODE - puttc(0xFEFF, fp); + puttc(0xFEFF, userData.fp); #endif - XML_SetUserData(parser, fp); + XML_SetUserData(parser, &userData); switch (outputType) { case 'm': XML_UseParserAsHandlerArg(parser); @@ -1079,7 +1105,7 @@ tmain(int argc, XML_Char **argv) if (outputDir) { if (outputType == 'm') metaEndDocument(parser); - fclose(fp); + fclose(userData.fp); if (!result) { tremove(outName); exit(2); -- 2.49.0