From 0c1874bbfe7ecf389f5929750a5d3f0e79a27c68 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Tue, 4 Dec 2018 16:53:47 -0500 Subject: [PATCH 01/40] Test expansion of empty patterns with MSI This was subject to a regression in 3.15.6. See lp:1810946. --- src/ioc/dbtemplate/test/msi.plt | 8 +++++++- src/ioc/dbtemplate/test/t10-result.txt | 4 ++++ src/ioc/dbtemplate/test/t10-substitute.txt | 8 ++++++++ src/ioc/dbtemplate/test/t10-template.txt | 2 ++ src/ioc/dbtemplate/test/t11-result.txt | 4 ++++ src/ioc/dbtemplate/test/t11-substitute.txt | 10 ++++++++++ src/ioc/dbtemplate/test/t11-template.txt | 2 ++ 7 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/ioc/dbtemplate/test/t10-result.txt create mode 100644 src/ioc/dbtemplate/test/t10-substitute.txt create mode 100644 src/ioc/dbtemplate/test/t10-template.txt create mode 100644 src/ioc/dbtemplate/test/t11-result.txt create mode 100644 src/ioc/dbtemplate/test/t11-substitute.txt create mode 100644 src/ioc/dbtemplate/test/t11-template.txt diff --git a/src/ioc/dbtemplate/test/msi.plt b/src/ioc/dbtemplate/test/msi.plt index 414912583..332defb13 100644 --- a/src/ioc/dbtemplate/test/msi.plt +++ b/src/ioc/dbtemplate/test/msi.plt @@ -11,7 +11,7 @@ use strict; use Test; -BEGIN {plan tests => 9} +BEGIN {plan tests => 11} # Check include/substitute command model ok(msi('-I .. ../t1-template.txt'), slurp('../t1-result.txt')); @@ -50,6 +50,12 @@ ok(msi('-I.. -D -o t8.txt ../t1-template.txt'), slurp('../t8-result.txt')); # Dependency generation, dbLoadTemplate format ok(msi('-I.. -D -ot9.txt -S ../t2-substitution.txt'), slurp('../t9-result.txt')); +# Substitution file, variable format, with 0 variable definitions +ok(msi('-I. -I.. -S ../t10-substitute.txt'), slurp('../t10-result.txt')); + +# Substitution file, pattern format, with 0 pattern definitions +ok(msi('-I. -I.. -S ../t11-substitute.txt'), slurp('../t11-result.txt')); + # Test support routines diff --git a/src/ioc/dbtemplate/test/t10-result.txt b/src/ioc/dbtemplate/test/t10-result.txt new file mode 100644 index 000000000..47b594ecb --- /dev/null +++ b/src/ioc/dbtemplate/test/t10-result.txt @@ -0,0 +1,4 @@ +# comment line +a=$(a) +# comment line +a=gbl diff --git a/src/ioc/dbtemplate/test/t10-substitute.txt b/src/ioc/dbtemplate/test/t10-substitute.txt new file mode 100644 index 000000000..aec88bb6c --- /dev/null +++ b/src/ioc/dbtemplate/test/t10-substitute.txt @@ -0,0 +1,8 @@ +file t10-template.txt { + {} +} + +global { a=gbl } +file t10-template.txt { + {} +} diff --git a/src/ioc/dbtemplate/test/t10-template.txt b/src/ioc/dbtemplate/test/t10-template.txt new file mode 100644 index 000000000..7958885a7 --- /dev/null +++ b/src/ioc/dbtemplate/test/t10-template.txt @@ -0,0 +1,2 @@ +# comment line +a=$(a) diff --git a/src/ioc/dbtemplate/test/t11-result.txt b/src/ioc/dbtemplate/test/t11-result.txt new file mode 100644 index 000000000..47b594ecb --- /dev/null +++ b/src/ioc/dbtemplate/test/t11-result.txt @@ -0,0 +1,4 @@ +# comment line +a=$(a) +# comment line +a=gbl diff --git a/src/ioc/dbtemplate/test/t11-substitute.txt b/src/ioc/dbtemplate/test/t11-substitute.txt new file mode 100644 index 000000000..94dcdbc12 --- /dev/null +++ b/src/ioc/dbtemplate/test/t11-substitute.txt @@ -0,0 +1,10 @@ +file t11-template.txt { + pattern {} + {} +} + +global { a=gbl } +file t11-template.txt { + pattern {} + {} +} diff --git a/src/ioc/dbtemplate/test/t11-template.txt b/src/ioc/dbtemplate/test/t11-template.txt new file mode 100644 index 000000000..7958885a7 --- /dev/null +++ b/src/ioc/dbtemplate/test/t11-template.txt @@ -0,0 +1,2 @@ +# comment line +a=$(a) From 801c01b9b670d5072433f66cae7c052b6119da6e Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Thu, 3 Jan 2019 14:33:46 -0500 Subject: [PATCH 02/40] Convert MSI to C++ --- src/ioc/dbtemplate/Makefile | 2 +- src/ioc/dbtemplate/{msi.c => msi.cpp} | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) rename src/ioc/dbtemplate/{msi.c => msi.cpp} (97%) diff --git a/src/ioc/dbtemplate/Makefile b/src/ioc/dbtemplate/Makefile index 2aa5a0c78..13b4f11fb 100644 --- a/src/ioc/dbtemplate/Makefile +++ b/src/ioc/dbtemplate/Makefile @@ -13,7 +13,7 @@ SRC_DIRS += $(IOCDIR)/dbtemplate PROD_HOST += msi -msi_SRCS = msi.c +msi_SRCS = msi.cpp msi_LIBS += Com HTMLS += msi.html diff --git a/src/ioc/dbtemplate/msi.c b/src/ioc/dbtemplate/msi.cpp similarity index 97% rename from src/ioc/dbtemplate/msi.c rename to src/ioc/dbtemplate/msi.cpp index 69680e17e..59d2418d8 100644 --- a/src/ioc/dbtemplate/msi.c +++ b/src/ioc/dbtemplate/msi.cpp @@ -325,7 +325,7 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem /*skip quote and any trailing blanks*/ while (*++p == ' ') ; if (*p != '\n' && *p != 0) goto endcmd; - copy = calloc(pend-pstart + 1, sizeof(char)); + copy = static_cast(calloc(pend-pstart + 1, sizeof(char))); strncpy(copy, pstart, pend-pstart); switch(cmdind) { @@ -386,7 +386,7 @@ static void inputConstruct(inputData **ppvt) { inputData *pinputData; - pinputData = calloc(1, sizeof(inputData)); + pinputData = static_cast(calloc(1, sizeof(inputData))); ellInit(&pinputData->inputFileList); ellInit(&pinputData->pathList); *ppvt = pinputData; @@ -531,8 +531,8 @@ static void inputOpenFile(inputData *pinputData,char *filename) else { ppathNode = (pathNode *) ellFirst(ppathList); while (ppathNode) { - fullname = calloc(strlen(filename) + strlen(ppathNode->directory) + 2, - sizeof(char)); + fullname = static_cast(calloc(strlen(filename) + strlen(ppathNode->directory) + 2, + sizeof(char))); strcpy(fullname, ppathNode->directory); strcat(fullname, "/"); strcat(fullname, filename); @@ -552,7 +552,7 @@ static void inputOpenFile(inputData *pinputData,char *filename) } STEP("File opened"); - pinputFile = calloc(1, sizeof(inputFile)); + pinputFile = static_cast(calloc(1, sizeof(inputFile))); if (ppathNode) { pinputFile->filename = fullname; @@ -654,7 +654,7 @@ struct subInfo { static char *subGetNextLine(subFile *psubFile); static tokenType subGetNextToken(subFile *psubFile); -static void subFileErrPrint(subFile *psubFile,char * message); +static void subFileErrPrint(subFile *psubFile, const char * message); static void freeSubFile(subInfo *psubInfo); static void freePattern(subInfo *psubInfo); static void catMacroReplacements(subInfo *psubInfo,const char *value); @@ -704,9 +704,9 @@ static void substituteOpen(subInfo **ppvt, char *substitutionName) FILE *fp; ENTER; - psubInfo = calloc(1, sizeof(subInfo)); + psubInfo = static_cast(calloc(1, sizeof(subInfo))); *ppvt = psubInfo; - psubFile = calloc(1, sizeof(subFile)); + psubFile = static_cast(calloc(1, sizeof(subFile))); psubInfo->psubFile = psubFile; ellInit(&psubInfo->patternList); @@ -831,7 +831,7 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename) if (psubFile->token != tokenString) break; - ppatternNode = calloc(1, sizeof(patternNode)); + ppatternNode = static_cast(calloc(1, sizeof(patternNode))); ellAdd(&psubInfo->patternList, &ppatternNode->node); ppatternNode->var = epicsStrDup(psubFile->string); } @@ -1017,7 +1017,7 @@ static char *subGetNextLine(subFile *psubFile) return &psubFile->inputBuffer[0]; } -static void subFileErrPrint(subFile *psubFile,char * message) +static void subFileErrPrint(subFile *psubFile, const char * message) { fprintf(stderr, "msi: %s\n",message); fprintf(stderr, " in substitution file '%s' at line %d:\n %s", @@ -1117,7 +1117,7 @@ static void catMacroReplacements(subInfo *psubInfo, const char *value) STEP("Enlarging buffer"); if (newsize <= psubInfo->curLength + len) newsize = psubInfo->curLength + len + 1; - newbuf = calloc(1, newsize); + newbuf = static_cast(calloc(1, newsize)); if (!newbuf) { fprintf(stderr, "calloc failed for size %lu\n", (unsigned long) newsize); From d8f18c27f49a37678faa68c8d1722c3faa858ad8 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Fri, 4 Jan 2019 09:36:20 -0500 Subject: [PATCH 03/40] Add some const keywords --- src/ioc/dbtemplate/msi.cpp | 86 +++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 59d2418d8..5e67342d4 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -56,28 +56,31 @@ int din = 0; typedef struct inputData inputData; static void inputConstruct(inputData **ppvt); -static void inputDestruct(inputData *pvt); -static void inputAddPath(inputData *pvt, char *pval); -static void inputBegin(inputData *pvt, char *fileName); -static char *inputNextLine(inputData *pvt); -static void inputNewIncludeFile(inputData *pvt, char *name); -static void inputErrPrint(inputData *pvt); +static void inputDestruct(inputData * const pvt); +static void inputAddPath(inputData * const pvt, const char * const pval); +static void inputBegin(inputData * const pvt, const char * const fileName); +static char *inputNextLine(inputData * const pvt); +static void inputNewIncludeFile(inputData * const pvt, const char * const name); +static void inputErrPrint(const inputData * const pvt); /* Module to read the substitution file */ typedef struct subInfo subInfo; -static void substituteOpen(subInfo **ppvt, char *substitutionName); -static void substituteDestruct(subInfo *pvt); -static int substituteGetNextSet(subInfo *pvt, char **filename); -static int substituteGetGlobalSet(subInfo *pvt); -static char *substituteGetReplacements(subInfo *pvt); -static char *substituteGetGlobalReplacements(subInfo *pvt); +static void substituteOpen(subInfo **ppvt, char * const substitutionName); +static void substituteDestruct(subInfo * const pvt); +static int substituteGetNextSet(subInfo * const pvt, char **filename); +static int substituteGetGlobalSet(subInfo * const pvt); +static const char *substituteGetReplacements(subInfo * const pvt); +static const char *substituteGetGlobalReplacements(subInfo * const pvt); /* Forward references to local routines */ -static void usageExit(int status); -static void abortExit(int status); -static void addMacroReplacements(MAC_HANDLE *macPvt, char *pval); -static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *templateName); +static void usageExit(const int status); +static void abortExit(const int status); +static void addMacroReplacements(MAC_HANDLE * const macPvt, + const char * const pval); +static void makeSubstitutions(inputData * const inputPvt, + MAC_HANDLE * const macPvt, + const char * const templateName); /*Global variables */ static int opt_V = 0; @@ -180,9 +183,9 @@ int main(int argc,char **argv) isGlobal = substituteGetGlobalSet(substitutePvt); if (isGlobal) { STEP("Handling global macros"); - pval = substituteGetGlobalReplacements(substitutePvt); - if (pval) - addMacroReplacements(macPvt, pval); + const char *macStr = substituteGetGlobalReplacements(substitutePvt); + if (macStr) + addMacroReplacements(macPvt, macStr); } else if ((isFile = substituteGetNextSet(substitutePvt, &filename))) { if (templateName) @@ -193,11 +196,12 @@ int main(int argc,char **argv) } STEPS("Handling template file", filename); - while ((pval = substituteGetReplacements(substitutePvt))) { + const char *macStr; + while ((macStr = substituteGetReplacements(substitutePvt))) { if (localScope) macPushScope(macPvt); - addMacroReplacements(macPvt, pval); + addMacroReplacements(macPvt, macStr); makeSubstitutions(inputPvt, macPvt, filename); if (localScope) @@ -218,7 +222,7 @@ int main(int argc,char **argv) return opt_V & 2; } -void usageExit(int status) +void usageExit(const int status) { fprintf(stderr, "Usage: msi [options] [template]\n" @@ -236,7 +240,7 @@ void usageExit(int status) exit(status); } -void abortExit(int status) +void abortExit(const int status) { if (outFile) { fclose(stdout); @@ -245,7 +249,8 @@ void abortExit(int status) exit(status); } -static void addMacroReplacements(MAC_HANDLE *macPvt, char *pval) +static void addMacroReplacements(MAC_HANDLE * const macPvt, + const char * const pval) { char **pairs; long status; @@ -268,7 +273,9 @@ static void addMacroReplacements(MAC_HANDLE *macPvt, char *pval) typedef enum {cmdInclude,cmdSubstitute} cmdType; static const char *cmdNames[] = {"include","substitute"}; -static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *templateName) +static void makeSubstitutions(inputData * const inputPvt, + MAC_HANDLE * const macPvt, + const char * const templateName) { char *input; static char buffer[MAX_BUFFER_SIZE]; @@ -378,7 +385,7 @@ struct inputData { char inputBuffer[MAX_BUFFER_SIZE]; }; -static void inputOpenFile(inputData *pinputData, char *filename); +static void inputOpenFile(inputData *pinputData, const char * const filename); static void inputCloseFile(inputData *pinputData); static void inputCloseAllFiles(inputData *pinputData); @@ -392,7 +399,7 @@ static void inputConstruct(inputData **ppvt) *ppvt = pinputData; } -static void inputDestruct(inputData *pinputData) +static void inputDestruct(inputData * const pinputData) { pathNode *ppathNode; @@ -405,7 +412,7 @@ static void inputDestruct(inputData *pinputData) free(pinputData); } -static void inputAddPath(inputData *pinputData, char *path) +static void inputAddPath(inputData * const pinputData, const char * const path) { ELLLIST *ppathList = &pinputData->pathList; pathNode *ppathNode; @@ -448,7 +455,7 @@ static void inputAddPath(inputData *pinputData, char *path) EXIT; } -static void inputBegin(inputData *pinputData, char *fileName) +static void inputBegin(inputData * const pinputData, const char * const fileName) { ENTER; inputCloseAllFiles(pinputData); @@ -456,7 +463,7 @@ static void inputBegin(inputData *pinputData, char *fileName) EXIT; } -static char *inputNextLine(inputData *pinputData) +static char *inputNextLine(inputData * const pinputData) { inputFile *pinputFile; char *pline; @@ -475,14 +482,15 @@ static char *inputNextLine(inputData *pinputData) return 0; } -static void inputNewIncludeFile(inputData *pinputData, char *name) +static void inputNewIncludeFile(inputData * const pinputData, + const char * const name) { ENTER; inputOpenFile(pinputData,name); EXIT; } -static void inputErrPrint(inputData *pinputData) +static void inputErrPrint(const inputData *const pinputData) { inputFile *pinputFile; @@ -511,7 +519,7 @@ static void inputErrPrint(inputData *pinputData) EXIT; } -static void inputOpenFile(inputData *pinputData,char *filename) +static void inputOpenFile(inputData *pinputData, const char * const filename) { ELLLIST *ppathList = &pinputData->pathList; pathNode *ppathNode = 0; @@ -688,7 +696,7 @@ void freePattern(subInfo *psubInfo) EXIT; } -static void substituteDestruct(subInfo *psubInfo) +static void substituteDestruct(subInfo * const psubInfo) { ENTER; freeSubFile(psubInfo); @@ -697,7 +705,7 @@ static void substituteDestruct(subInfo *psubInfo) EXIT; } -static void substituteOpen(subInfo **ppvt, char *substitutionName) +static void substituteOpen(subInfo **ppvt, char * const substitutionName) { subInfo *psubInfo; subFile *psubFile; @@ -725,7 +733,7 @@ static void substituteOpen(subInfo **ppvt, char *substitutionName) EXIT; } -static int substituteGetGlobalSet(subInfo *psubInfo) +static int substituteGetGlobalSet(subInfo * const psubInfo) { subFile *psubFile = psubInfo->psubFile; @@ -744,7 +752,7 @@ static int substituteGetGlobalSet(subInfo *psubInfo) return 0; } -static int substituteGetNextSet(subInfo *psubInfo,char **filename) +static int substituteGetNextSet(subInfo * const psubInfo,char **filename) { subFile *psubFile = psubInfo->psubFile; patternNode *ppatternNode; @@ -846,7 +854,7 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename) return 1; } -static char *substituteGetGlobalReplacements(subInfo *psubInfo) +static const char *substituteGetGlobalReplacements(subInfo * const psubInfo) { subFile *psubFile = psubInfo->psubFile; @@ -902,7 +910,7 @@ static char *substituteGetGlobalReplacements(subInfo *psubInfo) } } -static char *substituteGetReplacements(subInfo *psubInfo) +static const char *substituteGetReplacements(subInfo * const psubInfo) { subFile *psubFile = psubInfo->psubFile; patternNode *ppatternNode; From 3e8b0028dc790912e6663a0cdd8a6536d2d46a4c Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Fri, 4 Jan 2019 13:53:07 -0500 Subject: [PATCH 04/40] Constructor for struct subInfo --- src/ioc/dbtemplate/msi.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 5e67342d4..21957768e 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -658,6 +658,8 @@ struct subInfo { size_t size; size_t curLength; char *macroReplacements; + subInfo() : psubFile(nullptr), isFile(0), filename(nullptr), isPattern(0), + size(0), curLength(0), macroReplacements(nullptr) {}; }; static char *subGetNextLine(subFile *psubFile); @@ -701,7 +703,7 @@ static void substituteDestruct(subInfo * const psubInfo) ENTER; freeSubFile(psubInfo); freePattern(psubInfo); - free(psubInfo); + delete(psubInfo); EXIT; } @@ -712,7 +714,7 @@ static void substituteOpen(subInfo **ppvt, char * const substitutionName) FILE *fp; ENTER; - psubInfo = static_cast(calloc(1, sizeof(subInfo))); + psubInfo = new subInfo; *ppvt = psubInfo; psubFile = static_cast(calloc(1, sizeof(subFile))); psubInfo->psubFile = psubFile; From 1cf3fa9ba989632bf31d38e51cc9fd80657ce541 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Fri, 4 Jan 2019 14:01:55 -0500 Subject: [PATCH 05/40] Simplify catMacroReplacements() This fixes lp:1810946 and lp:1810949. --- src/ioc/dbtemplate/msi.cpp | 55 +++++++++----------------------------- 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 21957768e..9a370e8b5 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -9,6 +9,8 @@ /* msi - macro substitutions and include */ +#include + #include #include #include @@ -655,11 +657,8 @@ struct subInfo { char *filename; int isPattern; ELLLIST patternList; - size_t size; - size_t curLength; - char *macroReplacements; - subInfo() : psubFile(nullptr), isFile(0), filename(nullptr), isPattern(0), - size(0), curLength(0), macroReplacements(nullptr) {}; + std::string macroReplacements; + subInfo() : psubFile(NULL), isFile(0), filename(NULL), isPattern(0) {}; }; static char *subGetNextLine(subFile *psubFile); @@ -861,9 +860,7 @@ static const char *substituteGetGlobalReplacements(subInfo * const psubInfo) subFile *psubFile = psubInfo->psubFile; ENTER; - if (psubInfo->macroReplacements) - psubInfo->macroReplacements[0] = 0; - psubInfo->curLength = 0; + psubInfo->macroReplacements.clear(); while (psubFile->token == tokenSeparator) subGetNextToken(psubFile); @@ -891,8 +888,8 @@ static const char *substituteGetGlobalReplacements(subInfo * const psubInfo) switch(subGetNextToken(psubFile)) { case tokenRBrace: subGetNextToken(psubFile); - EXITS(psubInfo->macroReplacements); - return psubInfo->macroReplacements; + EXITS(psubInfo->macroReplacements.c_str()); + return psubInfo->macroReplacements.c_str(); case tokenSeparator: catMacroReplacements(psubInfo, ","); @@ -918,9 +915,7 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) patternNode *ppatternNode; ENTER; - if (psubInfo->macroReplacements) - psubInfo->macroReplacements[0] = 0; - psubInfo->curLength = 0; + psubInfo->macroReplacements.clear(); while (psubFile->token == tokenSeparator) subGetNextToken(psubFile); @@ -953,8 +948,8 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) while (1) { if (psubFile->token == tokenRBrace) { subGetNextToken(psubFile); - EXITS(psubInfo->macroReplacements); - return psubInfo->macroReplacements; + EXITS(psubInfo->macroReplacements.c_str()); + return psubInfo->macroReplacements.c_str(); } if (psubFile->token != tokenString) { @@ -983,8 +978,8 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) switch(subGetNextToken(psubFile)) { case tokenRBrace: subGetNextToken(psubFile); - EXITS(psubInfo->macroReplacements); - return psubInfo->macroReplacements; + EXITS(psubInfo->macroReplacements.c_str()); + return psubInfo->macroReplacements.c_str(); case tokenSeparator: catMacroReplacements(psubInfo, ","); @@ -1117,32 +1112,8 @@ done: static void catMacroReplacements(subInfo *psubInfo, const char *value) { - size_t len = strlen(value); - ENTER; - if (psubInfo->size <= (psubInfo->curLength + len)) { - size_t newsize = psubInfo->size + MAX_BUFFER_SIZE; - char *newbuf; - - STEP("Enlarging buffer"); - if (newsize <= psubInfo->curLength + len) - newsize = psubInfo->curLength + len + 1; - newbuf = static_cast(calloc(1, newsize)); - if (!newbuf) { - fprintf(stderr, "calloc failed for size %lu\n", - (unsigned long) newsize); - abortExit(1); - } - if (psubInfo->macroReplacements) { - memcpy(newbuf, psubInfo->macroReplacements, psubInfo->curLength); - free(psubInfo->macroReplacements); - } - psubInfo->size = newsize; - psubInfo->macroReplacements = newbuf; - } - STEPS("Appending", value); - strcat(psubInfo->macroReplacements, value); - psubInfo->curLength += len; + psubInfo->macroReplacements += value; EXIT; } From db9267bbd52bbc1c47f711a2608c191c1e28e723 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Fri, 4 Jan 2019 14:48:46 -0500 Subject: [PATCH 06/40] Constructor for struct inputData --- src/ioc/dbtemplate/msi.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 9a370e8b5..7891aa53c 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -385,6 +385,7 @@ struct inputData { ELLLIST inputFileList; ELLLIST pathList; char inputBuffer[MAX_BUFFER_SIZE]; + inputData() { memset(inputBuffer, 0, sizeof(inputBuffer) * sizeof(inputBuffer[0])); }; }; static void inputOpenFile(inputData *pinputData, const char * const filename); @@ -395,7 +396,7 @@ static void inputConstruct(inputData **ppvt) { inputData *pinputData; - pinputData = static_cast(calloc(1, sizeof(inputData))); + pinputData = new inputData; ellInit(&pinputData->inputFileList); ellInit(&pinputData->pathList); *ppvt = pinputData; @@ -411,7 +412,7 @@ static void inputDestruct(inputData * const pinputData) free(ppathNode->directory); free(ppathNode); } - free(pinputData); + delete(pinputData); } static void inputAddPath(inputData * const pinputData, const char * const path) From 265d4962a494c284cdba4a445bc2bc23ba3fee1a Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Fri, 4 Jan 2019 16:42:03 -0500 Subject: [PATCH 07/40] Use std::list for inputFileList This improves type safety and readability. --- src/ioc/dbtemplate/msi.cpp | 68 +++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 7891aa53c..919894760 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -10,6 +10,7 @@ /* msi - macro substitutions and include */ #include +#include #include #include @@ -370,7 +371,6 @@ endcmd: } typedef struct inputFile { - ELLNODE node; char *filename; FILE *fp; int lineNum; @@ -382,7 +382,7 @@ typedef struct pathNode { } pathNode; struct inputData { - ELLLIST inputFileList; + std::list inputFileList; ELLLIST pathList; char inputBuffer[MAX_BUFFER_SIZE]; inputData() { memset(inputBuffer, 0, sizeof(inputBuffer) * sizeof(inputBuffer[0])); }; @@ -397,7 +397,6 @@ static void inputConstruct(inputData **ppvt) inputData *pinputData; pinputData = new inputData; - ellInit(&pinputData->inputFileList); ellInit(&pinputData->pathList); *ppvt = pinputData; } @@ -468,14 +467,15 @@ static void inputBegin(inputData * const pinputData, const char * const fileName static char *inputNextLine(inputData * const pinputData) { - inputFile *pinputFile; + std::list& inFileList = pinputData->inputFileList; char *pline; ENTER; - while ((pinputFile = (inputFile *) ellFirst(&pinputData->inputFileList))) { - pline = fgets(pinputData->inputBuffer, MAX_BUFFER_SIZE, pinputFile->fp); + while (!inFileList.empty()) { + inputFile& inFile = inFileList.front(); + pline = fgets(pinputData->inputBuffer, MAX_BUFFER_SIZE, inFile.fp); if (pline) { - ++pinputFile->lineNum; + ++inFile.lineNum; EXITS(pline); return pline; } @@ -495,23 +495,21 @@ static void inputNewIncludeFile(inputData * const pinputData, static void inputErrPrint(const inputData *const pinputData) { - inputFile *pinputFile; - ENTER; fprintf(stderr, "input: '%s' at ", pinputData->inputBuffer); - pinputFile = (inputFile *) ellFirst(&pinputData->inputFileList); - while (pinputFile) { - fprintf(stderr, "line %d of ", pinputFile->lineNum); + const std::list& inFileList = pinputData->inputFileList; + std::list::const_iterator inFileIt = inFileList.begin(); + while (inFileIt != inFileList.end()) { + fprintf(stderr, "line %d of ", inFileIt->lineNum); - if (pinputFile->filename) { - fprintf(stderr, " file %s\n", pinputFile->filename); + if (inFileIt->filename) { + fprintf(stderr, " file %s\n", inFileIt->filename); } else { fprintf(stderr, "stdin:\n"); } - pinputFile = (inputFile *) ellNext(&pinputFile->node); - if (pinputFile) { + if (++inFileIt != inFileList.end()) { fprintf(stderr, " included from "); } else { @@ -526,7 +524,6 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) { ELLLIST *ppathList = &pinputData->pathList; pathNode *ppathNode = 0; - inputFile *pinputFile; char *fullname = 0; FILE *fp = 0; @@ -563,20 +560,20 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) } STEP("File opened"); - pinputFile = static_cast(calloc(1, sizeof(inputFile))); + inputFile inFile = inputFile(); if (ppathNode) { - pinputFile->filename = fullname; + inFile.filename = fullname; } else if (filename) { - pinputFile->filename = epicsStrDup(filename); + inFile.filename = epicsStrDup(filename); } else { - pinputFile->filename = epicsStrDup("stdin"); + inFile.filename = epicsStrDup("stdin"); } if (opt_D) { - int hash = epicsStrHash(pinputFile->filename, 12345); + int hash = epicsStrHash(inFile.filename, 12345); int i = 0; int match = 0; @@ -589,7 +586,7 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) if (!match) { const char *wrap = numDeps ? " \\\n" : ""; - printf("%s %s", wrap, pinputFile->filename); + printf("%s %s", wrap, inFile.filename); if (numDeps < MAX_DEPS) { depHashes[numDeps++] = hash; } @@ -600,33 +597,30 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) } } - pinputFile->fp = fp; - ellInsert(&pinputData->inputFileList, 0, &pinputFile->node); + inFile.fp = fp; + pinputData->inputFileList.push_front(inFile); EXIT; } static void inputCloseFile(inputData *pinputData) { - inputFile *pinputFile; - + std::list& inFileList = pinputData->inputFileList; ENTER; - pinputFile = (inputFile *) ellFirst(&pinputData->inputFileList); - if (pinputFile) { - ellDelete(&pinputData->inputFileList, &pinputFile->node); - if (fclose(pinputFile->fp)) - fprintf(stderr, "msi: Can't close input file '%s'\n", pinputFile->filename); - free(pinputFile->filename); - free(pinputFile); + if(!inFileList.empty()) { + inputFile& inFile = inFileList.front(); + if (fclose(inFile.fp)) + fprintf(stderr, "msi: Can't close input file '%s'\n", inFile.filename); + free(inFile.filename); + inFileList.erase(inFileList.begin()); } EXIT; } static void inputCloseAllFiles(inputData *pinputData) { - inputFile *pinputFile; - ENTER; - while ((pinputFile = (inputFile *) ellFirst(&pinputData->inputFileList))) { + const std::list& inFileList = pinputData->inputFileList; + while(!inFileList.empty()) { inputCloseFile(pinputData); } EXIT; From ef2a381e92d7aa6f09ffe7b6289f1999e33277d2 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sat, 5 Jan 2019 12:33:11 -0500 Subject: [PATCH 08/40] Use std::list for pathList This improves type safety and readability. --- src/ioc/dbtemplate/msi.cpp | 47 ++++++++++++-------------------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 919894760..ab69b0cc4 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -376,14 +376,9 @@ typedef struct inputFile { int lineNum; } inputFile; -typedef struct pathNode { - ELLNODE node; - char *directory; -} pathNode; - struct inputData { std::list inputFileList; - ELLLIST pathList; + std::list pathList; char inputBuffer[MAX_BUFFER_SIZE]; inputData() { memset(inputBuffer, 0, sizeof(inputBuffer) * sizeof(inputBuffer[0])); }; }; @@ -397,27 +392,17 @@ static void inputConstruct(inputData **ppvt) inputData *pinputData; pinputData = new inputData; - ellInit(&pinputData->pathList); *ppvt = pinputData; } static void inputDestruct(inputData * const pinputData) { - pathNode *ppathNode; - inputCloseAllFiles(pinputData); - while ((ppathNode = (pathNode *) ellFirst(&pinputData->pathList))) { - ellDelete(&pinputData->pathList, &ppathNode->node); - free(ppathNode->directory); - free(ppathNode); - } delete(pinputData); } static void inputAddPath(inputData * const pinputData, const char * const path) { - ELLLIST *ppathList = &pinputData->pathList; - pathNode *ppathNode; const char *pcolon; const char *pdir; size_t len; @@ -431,15 +416,12 @@ static void inputAddPath(inputData * const pinputData, const char * const path) emptyName = ((*pdir == sep) ? 1 : 0); if (emptyName) ++pdir; - ppathNode = (pathNode *) calloc(1, sizeof(pathNode)); - ellAdd(ppathList, &ppathNode->node); - + std::string directory; if (!emptyName) { pcolon = strchr(pdir, sep); len = (pcolon ? (pcolon - pdir) : strlen(pdir)); if (len > 0) { - ppathNode->directory = (char *) calloc(len + 1, sizeof(char)); - strncpy(ppathNode->directory, pdir, len); + directory = std::string(pdir, len); pdir = pcolon; /*unless at end skip past first colon*/ if (pdir && *(pdir + 1) != 0) ++pdir; @@ -450,9 +432,10 @@ static void inputAddPath(inputData * const pinputData, const char * const path) } if (emptyName) { - ppathNode->directory = (char *) calloc(2, sizeof(char)); - strcpy(ppathNode->directory, "."); + directory = "."; } + + pinputData->pathList.push_back(directory); } EXIT; } @@ -522,8 +505,8 @@ static void inputErrPrint(const inputData *const pinputData) static void inputOpenFile(inputData *pinputData, const char * const filename) { - ELLLIST *ppathList = &pinputData->pathList; - pathNode *ppathNode = 0; + std::list& pathList = pinputData->pathList; + std::list::iterator pathIt = pathList.end(); char *fullname = 0; FILE *fp = 0; @@ -532,16 +515,16 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) STEP("Using stdin"); fp = stdin; } - else if ((ellCount(ppathList) == 0) || strchr(filename, '/')){ + else if (pathList.empty() || strchr(filename, '/')){ STEPS("Opening ", filename); fp = fopen(filename, "r"); } else { - ppathNode = (pathNode *) ellFirst(ppathList); - while (ppathNode) { - fullname = static_cast(calloc(strlen(filename) + strlen(ppathNode->directory) + 2, + pathIt = pathList.begin(); + while(pathIt != pathList.end()) { + fullname = static_cast(calloc(strlen(filename) + pathIt->length() + 2, sizeof(char))); - strcpy(fullname, ppathNode->directory); + strcpy(fullname, pathIt->c_str()); strcat(fullname, "/"); strcat(fullname, filename); STEPS("Trying", filename); @@ -549,7 +532,7 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) if (fp) break; free(fullname); - ppathNode = (pathNode *) ellNext(&ppathNode->node); + ++pathIt; } } @@ -562,7 +545,7 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) STEP("File opened"); inputFile inFile = inputFile(); - if (ppathNode) { + if (pathIt != pathList.end()) { inFile.filename = fullname; } else if (filename) { From e461d782f41930a367f09bd8581c1a7f17286e23 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sat, 5 Jan 2019 12:57:26 -0500 Subject: [PATCH 09/40] Simplify inputConstruct() --- src/ioc/dbtemplate/msi.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index ab69b0cc4..a48e8ff08 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -389,10 +389,7 @@ static void inputCloseAllFiles(inputData *pinputData); static void inputConstruct(inputData **ppvt) { - inputData *pinputData; - - pinputData = new inputData; - *ppvt = pinputData; + *ppvt = new inputData; } static void inputDestruct(inputData * const pinputData) From b518ebe85bc615583d46ab4f2ed0d30c9748e744 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sat, 5 Jan 2019 16:08:55 -0500 Subject: [PATCH 10/40] Convert inputFile.filename to std::string --- src/ioc/dbtemplate/msi.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index a48e8ff08..70e0f1ff6 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -371,7 +371,7 @@ endcmd: } typedef struct inputFile { - char *filename; + std::string filename; FILE *fp; int lineNum; } inputFile; @@ -482,8 +482,8 @@ static void inputErrPrint(const inputData *const pinputData) while (inFileIt != inFileList.end()) { fprintf(stderr, "line %d of ", inFileIt->lineNum); - if (inFileIt->filename) { - fprintf(stderr, " file %s\n", inFileIt->filename); + if (!inFileIt->filename.empty()) { + fprintf(stderr, " file %s\n", inFileIt->filename.c_str()); } else { fprintf(stderr, "stdin:\n"); @@ -546,14 +546,15 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) inFile.filename = fullname; } else if (filename) { - inFile.filename = epicsStrDup(filename); + inFile.filename = filename; } else { - inFile.filename = epicsStrDup("stdin"); + inFile.filename = "stdin"; } + free(fullname); if (opt_D) { - int hash = epicsStrHash(inFile.filename, 12345); + int hash = epicsStrHash(inFile.filename.c_str(), 12345); int i = 0; int match = 0; @@ -566,7 +567,7 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) if (!match) { const char *wrap = numDeps ? " \\\n" : ""; - printf("%s %s", wrap, inFile.filename); + printf("%s %s", wrap, inFile.filename.c_str()); if (numDeps < MAX_DEPS) { depHashes[numDeps++] = hash; } @@ -589,8 +590,7 @@ static void inputCloseFile(inputData *pinputData) if(!inFileList.empty()) { inputFile& inFile = inFileList.front(); if (fclose(inFile.fp)) - fprintf(stderr, "msi: Can't close input file '%s'\n", inFile.filename); - free(inFile.filename); + fprintf(stderr, "msi: Can't close input file '%s'\n", inFile.filename.c_str()); inFileList.erase(inFileList.begin()); } EXIT; From b4f4fb853dd59cd94e5d06f25ca985d220733fa0 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sat, 5 Jan 2019 16:15:40 -0500 Subject: [PATCH 11/40] Convert fullname to std::string --- src/ioc/dbtemplate/msi.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 70e0f1ff6..c52a02b7f 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -504,7 +504,7 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) { std::list& pathList = pinputData->pathList; std::list::iterator pathIt = pathList.end(); - char *fullname = 0; + std::string fullname; FILE *fp = 0; ENTER; @@ -519,16 +519,11 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) else { pathIt = pathList.begin(); while(pathIt != pathList.end()) { - fullname = static_cast(calloc(strlen(filename) + pathIt->length() + 2, - sizeof(char))); - strcpy(fullname, pathIt->c_str()); - strcat(fullname, "/"); - strcat(fullname, filename); + fullname = *pathIt + "/" + filename; STEPS("Trying", filename); - fp = fopen(fullname, "r"); + fp = fopen(fullname.c_str(), "r"); if (fp) break; - free(fullname); ++pathIt; } } @@ -551,7 +546,6 @@ static void inputOpenFile(inputData *pinputData, const char * const filename) else { inFile.filename = "stdin"; } - free(fullname); if (opt_D) { int hash = epicsStrHash(inFile.filename.c_str(), 12345); From f03f10e6643e122f455f5a30974d9b958dc8388d Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sat, 5 Jan 2019 17:28:52 -0500 Subject: [PATCH 12/40] Convert patternNode.var to std::string --- src/ioc/dbtemplate/msi.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index c52a02b7f..bafa49ff8 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -617,7 +617,7 @@ typedef struct subFile { typedef struct patternNode { ELLNODE node; - char *var; + std::string var; } patternNode; struct subInfo { @@ -659,7 +659,6 @@ void freePattern(subInfo *psubInfo) ENTER; while ((ppatternNode = (patternNode *) ellFirst(&psubInfo->patternList))) { ellDelete(&psubInfo->patternList, &ppatternNode->node); - free(ppatternNode->var); free(ppatternNode); } psubInfo->isPattern = 0; @@ -811,7 +810,7 @@ static int substituteGetNextSet(subInfo * const psubInfo,char **filename) ppatternNode = static_cast(calloc(1, sizeof(patternNode))); ellAdd(&psubInfo->patternList, &ppatternNode->node); - ppatternNode->var = epicsStrDup(psubFile->string); + ppatternNode->var = psubFile->string; } if (psubFile->token != tokenRBrace) { @@ -931,7 +930,7 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) gotFirstPattern = 1; if (ppatternNode) { - catMacroReplacements(psubInfo, ppatternNode->var); + catMacroReplacements(psubInfo, ppatternNode->var.c_str()); catMacroReplacements(psubInfo, "="); catMacroReplacements(psubInfo, psubFile->string); ppatternNode = (patternNode *) ellNext(&ppatternNode->node); From ce38caf41b488ead6bb966472b84b1e927ad9910 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sat, 5 Jan 2019 18:00:11 -0500 Subject: [PATCH 13/40] Use std::list for patternList This improves type safety and readability. --- src/ioc/dbtemplate/msi.cpp | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index bafa49ff8..66a5761b1 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -21,7 +21,6 @@ #include #include -#include #include #include #include @@ -615,17 +614,12 @@ typedef struct subFile { char string[MAX_BUFFER_SIZE]; } subFile; -typedef struct patternNode { - ELLNODE node; - std::string var; -} patternNode; - struct subInfo { subFile *psubFile; int isFile; char *filename; int isPattern; - ELLLIST patternList; + std::list patternList; std::string macroReplacements; subInfo() : psubFile(NULL), isFile(0), filename(NULL), isPattern(0) {}; }; @@ -654,13 +648,8 @@ void freeSubFile(subInfo *psubInfo) void freePattern(subInfo *psubInfo) { - patternNode *ppatternNode; - ENTER; - while ((ppatternNode = (patternNode *) ellFirst(&psubInfo->patternList))) { - ellDelete(&psubInfo->patternList, &ppatternNode->node); - free(ppatternNode); - } + psubInfo->patternList.clear(); psubInfo->isPattern = 0; EXIT; } @@ -685,7 +674,6 @@ static void substituteOpen(subInfo **ppvt, char * const substitutionName) *ppvt = psubInfo; psubFile = static_cast(calloc(1, sizeof(subFile))); psubInfo->psubFile = psubFile; - ellInit(&psubInfo->patternList); fp = fopen(substitutionName, "r"); if (!fp) { @@ -724,7 +712,6 @@ static int substituteGetGlobalSet(subInfo * const psubInfo) static int substituteGetNextSet(subInfo * const psubInfo,char **filename) { subFile *psubFile = psubInfo->psubFile; - patternNode *ppatternNode; ENTER; *filename = 0; @@ -808,9 +795,7 @@ static int substituteGetNextSet(subInfo * const psubInfo,char **filename) if (psubFile->token != tokenString) break; - ppatternNode = static_cast(calloc(1, sizeof(patternNode))); - ellAdd(&psubInfo->patternList, &ppatternNode->node); - ppatternNode->var = psubFile->string; + psubInfo->patternList.push_back(psubFile->string); } if (psubFile->token != tokenRBrace) { @@ -880,7 +865,6 @@ static const char *substituteGetGlobalReplacements(subInfo * const psubInfo) static const char *substituteGetReplacements(subInfo * const psubInfo) { subFile *psubFile = psubInfo->psubFile; - patternNode *ppatternNode; ENTER; psubInfo->macroReplacements.clear(); @@ -912,7 +896,8 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) int gotFirstPattern = 0; while (subGetNextToken(psubFile) == tokenSeparator); - ppatternNode = (patternNode *) ellFirst(&psubInfo->patternList); + std::list& patternList = psubInfo->patternList; + std::list::iterator patternIt = patternList.begin(); while (1) { if (psubFile->token == tokenRBrace) { subGetNextToken(psubFile); @@ -929,11 +914,11 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) catMacroReplacements(psubInfo, ","); gotFirstPattern = 1; - if (ppatternNode) { - catMacroReplacements(psubInfo, ppatternNode->var.c_str()); + if (patternIt != patternList.end()) { + catMacroReplacements(psubInfo, patternIt->c_str()); catMacroReplacements(psubInfo, "="); catMacroReplacements(psubInfo, psubFile->string); - ppatternNode = (patternNode *) ellNext(&ppatternNode->node); + ++patternIt; } else { subFileErrPrint(psubFile, "Warning, too many values given"); From 68a1a529b26079d6c61377137de068929a8316d5 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sat, 5 Jan 2019 18:51:16 -0500 Subject: [PATCH 14/40] Convert copy to std::string --- src/ioc/dbtemplate/msi.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 66a5761b1..ba3c4aed9 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -301,7 +301,6 @@ static void makeSubstitutions(inputData * const inputPvt, if (command) { char *pstart; char *pend; - char *copy; int cmdind=-1; int i; @@ -334,16 +333,15 @@ static void makeSubstitutions(inputData * const inputPvt, /*skip quote and any trailing blanks*/ while (*++p == ' ') ; if (*p != '\n' && *p != 0) goto endcmd; - copy = static_cast(calloc(pend-pstart + 1, sizeof(char))); - strncpy(copy, pstart, pend-pstart); + std::string copy = std::string(pstart, pend); switch(cmdind) { case cmdInclude: - inputNewIncludeFile(inputPvt,copy); + inputNewIncludeFile(inputPvt, copy.c_str()); break; case cmdSubstitute: - addMacroReplacements(macPvt,copy); + addMacroReplacements(macPvt, copy.c_str()); break; default: @@ -351,7 +349,6 @@ static void makeSubstitutions(inputData * const inputPvt, inputErrPrint(inputPvt); abortExit(1); } - free(copy); expand = 0; } From 940814becfa5a1cd5abaeb98920364682442fb8d Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sat, 5 Jan 2019 20:46:37 -0500 Subject: [PATCH 15/40] Manage psubFile with new/delete --- src/ioc/dbtemplate/msi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index ba3c4aed9..4aa433c5d 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -637,7 +637,7 @@ void freeSubFile(subInfo *psubInfo) if (fclose(psubFile->fp)) fprintf(stderr, "msi: Can't close substitution file\n"); } - free(psubFile); + delete(psubFile); free(psubInfo->filename); psubInfo->psubFile = 0; EXIT; @@ -669,7 +669,7 @@ static void substituteOpen(subInfo **ppvt, char * const substitutionName) ENTER; psubInfo = new subInfo; *ppvt = psubInfo; - psubFile = static_cast(calloc(1, sizeof(subFile))); + psubFile = new subFile; psubInfo->psubFile = psubFile; fp = fopen(substitutionName, "r"); From 87f6c3dec94279b890fe04dc102ddbf3f143473a Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sun, 6 Jan 2019 00:07:23 -0500 Subject: [PATCH 16/40] Remove unneeded errlogFlush() --- src/ioc/dbtemplate/msi.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 4aa433c5d..fe18b0ea9 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -21,7 +21,6 @@ #include #include -#include #include #include #include @@ -213,7 +212,6 @@ int main(int argc,char **argv) } while (isGlobal || isFile); substituteDestruct(substitutePvt); } - errlogFlush(); macDeleteHandle(macPvt); inputDestruct(inputPvt); if (opt_D) { From 84dba0d2b702091900d2f2ed2f6296f8935172b5 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Sun, 6 Jan 2019 00:20:46 -0500 Subject: [PATCH 17/40] Use bool for more clarity --- src/ioc/dbtemplate/msi.cpp | 63 +++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index fe18b0ea9..2c5277811 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -69,8 +69,8 @@ typedef struct subInfo subInfo; static void substituteOpen(subInfo **ppvt, char * const substitutionName); static void substituteDestruct(subInfo * const pvt); -static int substituteGetNextSet(subInfo * const pvt, char **filename); -static int substituteGetGlobalSet(subInfo * const pvt); +static bool substituteGetNextSet(subInfo * const pvt, char **filename); +static bool substituteGetGlobalSet(subInfo * const pvt); static const char *substituteGetReplacements(subInfo * const pvt); static const char *substituteGetGlobalReplacements(subInfo * const pvt); @@ -85,7 +85,7 @@ static void makeSubstitutions(inputData * const inputPvt, /*Global variables */ static int opt_V = 0; -static int opt_D = 0; +static bool opt_D = false; static char *outFile = 0; static int numDeps = 0, depHashes[MAX_DEPS]; @@ -100,7 +100,7 @@ int main(int argc,char **argv) char *substitutionName = 0; char *templateName = 0; int i; - int localScope = 1; + bool localScope = true; inputConstruct(&inputPvt); macCreateHandle(&macPvt, 0); @@ -112,7 +112,7 @@ int main(int argc,char **argv) inputAddPath(inputPvt, pval); } else if (strcmp(argv[1], "-D") == 0) { - opt_D = 1; + opt_D = true; narg = 1; /* no argument for this option */ } else if(strncmp(argv[1], "-o", 2) == 0) { @@ -129,7 +129,7 @@ int main(int argc,char **argv) narg = 1; /* no argument for this option */ } else if (strcmp(argv[1], "-g") == 0) { - localScope = 0; + localScope = false; narg = 1; /* no argument for this option */ } else if (strcmp(argv[1], "-h") == 0) { @@ -176,7 +176,7 @@ int main(int argc,char **argv) else { subInfo *substitutePvt; char *filename = 0; - int isGlobal, isFile; + bool isGlobal, isFile; STEPS("Substitutions from file", substitutionName); substituteOpen(&substitutePvt, substitutionName); @@ -397,14 +397,14 @@ static void inputAddPath(inputData * const pinputData, const char * const path) const char *pcolon; const char *pdir; size_t len; - int emptyName; + bool emptyName; const char sep = *OSI_PATH_LIST_SEPARATOR; ENTER; pdir = path; /*an empty name at beginning, middle, or end means current directory*/ while (pdir && *pdir) { - emptyName = ((*pdir == sep) ? 1 : 0); + emptyName = (*pdir == sep); if (emptyName) ++pdir; std::string directory; @@ -418,7 +418,7 @@ static void inputAddPath(inputData * const pinputData, const char * const path) if (pdir && *(pdir + 1) != 0) ++pdir; } else { /*must have been trailing : */ - emptyName = 1; + emptyName = true; } } @@ -611,12 +611,13 @@ typedef struct subFile { struct subInfo { subFile *psubFile; - int isFile; + bool isFile; char *filename; - int isPattern; + bool isPattern; std::list patternList; std::string macroReplacements; - subInfo() : psubFile(NULL), isFile(0), filename(NULL), isPattern(0) {}; + subInfo() : psubFile(NULL), isFile(false), filename(NULL), + isPattern(false) {}; }; static char *subGetNextLine(subFile *psubFile); @@ -645,7 +646,7 @@ void freePattern(subInfo *psubInfo) { ENTER; psubInfo->patternList.clear(); - psubInfo->isPattern = 0; + psubInfo->isPattern = false; EXIT; } @@ -685,7 +686,7 @@ static void substituteOpen(subInfo **ppvt, char * const substitutionName) EXIT; } -static int substituteGetGlobalSet(subInfo * const psubInfo) +static bool substituteGetGlobalSet(subInfo * const psubInfo) { subFile *psubFile = psubInfo->psubFile; @@ -697,14 +698,14 @@ static int substituteGetGlobalSet(subInfo * const psubInfo) strcmp(psubFile->string, "global") == 0) { subGetNextToken(psubFile); EXITD(1); - return 1; + return true; } EXITD(0); - return 0; + return false; } -static int substituteGetNextSet(subInfo * const psubInfo,char **filename) +static bool substituteGetNextSet(subInfo * const psubInfo,char **filename) { subFile *psubFile = psubInfo->psubFile; @@ -715,7 +716,7 @@ static int substituteGetNextSet(subInfo * const psubInfo,char **filename) if (psubFile->token == tokenEOF) { EXITD(0); - return 0; + return false; } if (psubFile->token == tokenString && @@ -723,7 +724,7 @@ static int substituteGetNextSet(subInfo * const psubInfo,char **filename) size_t len; STEP("Parsed 'file'"); - psubInfo->isFile = 1; + psubInfo->isFile = true; if (subGetNextToken(psubFile) != tokenString) { subFileErrPrint(psubFile, "Parse error, expecting a filename"); abortExit(1); @@ -758,7 +759,7 @@ static int substituteGetNextSet(subInfo * const psubInfo,char **filename) if (psubFile->token == tokenLBrace) { EXITD(1); - return 1; + return true; } if (psubFile->token == tokenRBrace) { @@ -774,7 +775,7 @@ static int substituteGetNextSet(subInfo * const psubInfo,char **filename) STEP("Parsed 'pattern'"); freePattern(psubInfo); - psubInfo->isPattern = 1; + psubInfo->isPattern = true; while (subGetNextToken(psubFile) == tokenSeparator); @@ -784,7 +785,7 @@ static int substituteGetNextSet(subInfo * const psubInfo,char **filename) } STEP("Parsed '{'"); - while (1) { + while (true) { while (subGetNextToken(psubFile) == tokenSeparator); if (psubFile->token != tokenString) @@ -800,7 +801,7 @@ static int substituteGetNextSet(subInfo * const psubInfo,char **filename) subGetNextToken(psubFile); EXITD(1); - return 1; + return true; } static const char *substituteGetGlobalReplacements(subInfo * const psubInfo) @@ -814,7 +815,7 @@ static const char *substituteGetGlobalReplacements(subInfo * const psubInfo) subGetNextToken(psubFile); if (psubFile->token == tokenRBrace && psubInfo->isFile) { - psubInfo->isFile = 0; + psubInfo->isFile = false; free(psubInfo->filename); psubInfo->filename = 0; freePattern(psubInfo); @@ -832,7 +833,7 @@ static const char *substituteGetGlobalReplacements(subInfo * const psubInfo) return 0; } - while (1) { + while (true) { switch(subGetNextToken(psubFile)) { case tokenRBrace: subGetNextToken(psubFile); @@ -868,7 +869,7 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) subGetNextToken(psubFile); if (psubFile->token==tokenRBrace && psubInfo->isFile) { - psubInfo->isFile = 0; + psubInfo->isFile = false; free(psubInfo->filename); psubInfo->filename = 0; freePattern(psubInfo); @@ -888,12 +889,12 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) } if (psubInfo->isPattern) { - int gotFirstPattern = 0; + bool gotFirstPattern = false; while (subGetNextToken(psubFile) == tokenSeparator); std::list& patternList = psubInfo->patternList; std::list::iterator patternIt = patternList.begin(); - while (1) { + while (true) { if (psubFile->token == tokenRBrace) { subGetNextToken(psubFile); EXITS(psubInfo->macroReplacements.c_str()); @@ -907,7 +908,7 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) if (gotFirstPattern) catMacroReplacements(psubInfo, ","); - gotFirstPattern = 1; + gotFirstPattern = true; if (patternIt != patternList.end()) { catMacroReplacements(psubInfo, patternIt->c_str()); @@ -922,7 +923,7 @@ static const char *substituteGetReplacements(subInfo * const psubInfo) while (subGetNextToken(psubFile) == tokenSeparator); } } - else while(1) { + else while(true) { switch(subGetNextToken(psubFile)) { case tokenRBrace: subGetNextToken(psubFile); From 9a4787155cdaba3fa8c455b54aae984575a8b87f Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Mon, 7 Jan 2019 08:56:07 -0500 Subject: [PATCH 18/40] Convert substitutionName to std::string --- src/ioc/dbtemplate/msi.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 2c5277811..257b1e89e 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -67,7 +67,7 @@ static void inputErrPrint(const inputData * const pvt); /* Module to read the substitution file */ typedef struct subInfo subInfo; -static void substituteOpen(subInfo **ppvt, char * const substitutionName); +static void substituteOpen(subInfo **ppvt, const std::string& substitutionName); static void substituteDestruct(subInfo * const pvt); static bool substituteGetNextSet(subInfo * const pvt, char **filename); static bool substituteGetGlobalSet(subInfo * const pvt); @@ -97,7 +97,7 @@ int main(int argc,char **argv) MAC_HANDLE *macPvt; char *pval; int narg; - char *substitutionName = 0; + std::string substitutionName; char *templateName = 0; int i; bool localScope = true; @@ -122,7 +122,7 @@ int main(int argc,char **argv) addMacroReplacements(macPvt, pval); } else if(strncmp(argv[1], "-S", 2) == 0) { - substitutionName = epicsStrDup(pval); + substitutionName = pval; } else if (strcmp(argv[1], "-V") == 0) { opt_V = 1; @@ -169,7 +169,7 @@ int main(int argc,char **argv) if (argc == 2) templateName = epicsStrDup(argv[1]); - if (!substitutionName) { + if (substitutionName.empty()) { STEP("Single template+substitutions file"); makeSubstitutions(inputPvt, macPvt, templateName); } @@ -178,7 +178,7 @@ int main(int argc,char **argv) char *filename = 0; bool isGlobal, isFile; - STEPS("Substitutions from file", substitutionName); + STEPS("Substitutions from file", substitutionName.c_str()); substituteOpen(&substitutePvt, substitutionName); do { isGlobal = substituteGetGlobalSet(substitutePvt); @@ -218,7 +218,6 @@ int main(int argc,char **argv) printf("\n"); } free(templateName); - free(substitutionName); return opt_V & 2; } @@ -600,7 +599,7 @@ typedef enum { } tokenType; typedef struct subFile { - char *substitutionName; + std::string substitutionName; FILE *fp; int lineNum; char inputBuffer[MAX_BUFFER_SIZE]; @@ -659,7 +658,7 @@ static void substituteDestruct(subInfo * const psubInfo) EXIT; } -static void substituteOpen(subInfo **ppvt, char * const substitutionName) +static void substituteOpen(subInfo **ppvt, const std::string& substitutionName) { subInfo *psubInfo; subFile *psubFile; @@ -671,9 +670,9 @@ static void substituteOpen(subInfo **ppvt, char * const substitutionName) psubFile = new subFile; psubInfo->psubFile = psubFile; - fp = fopen(substitutionName, "r"); + fp = fopen(substitutionName.c_str(), "r"); if (!fp) { - fprintf(stderr, "msi: Can't open file '%s'\n", substitutionName); + fprintf(stderr, "msi: Can't open file '%s'\n", substitutionName.c_str()); abortExit(1); } @@ -975,7 +974,8 @@ static void subFileErrPrint(subFile *psubFile, const char * message) { fprintf(stderr, "msi: %s\n",message); fprintf(stderr, " in substitution file '%s' at line %d:\n %s", - psubFile->substitutionName, psubFile->lineNum, psubFile->inputBuffer); + psubFile->substitutionName.c_str(), psubFile->lineNum, + psubFile->inputBuffer); } From 409ee26fae2f465b7455b767f228c8333ac052f0 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Mon, 7 Jan 2019 10:00:08 -0500 Subject: [PATCH 19/40] Reduce scope of some variables --- src/ioc/dbtemplate/msi.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 257b1e89e..49d8611b9 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -96,16 +96,14 @@ int main(int argc,char **argv) inputData *inputPvt; MAC_HANDLE *macPvt; char *pval; - int narg; std::string substitutionName; char *templateName = 0; - int i; bool localScope = true; inputConstruct(&inputPvt); macCreateHandle(&macPvt, 0); while ((argc > 1) && (argv[1][0] == '-')) { - narg = (strlen(argv[1]) == 2) ? 2 : 1; + int narg = (strlen(argv[1]) == 2) ? 2 : 1; pval = (narg == 1) ? (argv[1] + 2) : argv[2]; if (strncmp(argv[1], "-I", 2) == 0) { @@ -141,7 +139,7 @@ int main(int argc,char **argv) } argc -= narg; - for (i = 1; i < argc; i++) + for (int i = 1; i < argc; i++) argv[i] = argv[i + narg]; } @@ -396,14 +394,13 @@ static void inputAddPath(inputData * const pinputData, const char * const path) const char *pcolon; const char *pdir; size_t len; - bool emptyName; const char sep = *OSI_PATH_LIST_SEPARATOR; ENTER; pdir = path; /*an empty name at beginning, middle, or end means current directory*/ while (pdir && *pdir) { - emptyName = (*pdir == sep); + bool emptyName = (*pdir == sep); if (emptyName) ++pdir; std::string directory; @@ -441,12 +438,11 @@ static void inputBegin(inputData * const pinputData, const char * const fileName static char *inputNextLine(inputData * const pinputData) { std::list& inFileList = pinputData->inputFileList; - char *pline; ENTER; while (!inFileList.empty()) { inputFile& inFile = inFileList.front(); - pline = fgets(pinputData->inputBuffer, MAX_BUFFER_SIZE, inFile.fp); + char *pline = fgets(pinputData->inputBuffer, MAX_BUFFER_SIZE, inFile.fp); if (pline) { ++inFile.lineNum; EXITS(pline); From a9606dbf6ef07f444c2149afd441d0b62dc0c482 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Mon, 7 Jan 2019 14:55:12 -0500 Subject: [PATCH 20/40] Add test for macro expansion in file names --- src/ioc/dbtemplate/test/msi.plt | 17 +++++++++++++++-- src/ioc/dbtemplate/test/t12-result.txt | 2 ++ src/ioc/dbtemplate/test/t12-substitute.txt | 3 +++ src/ioc/dbtemplate/test/t12-template.txt | 2 ++ 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/ioc/dbtemplate/test/t12-result.txt create mode 100644 src/ioc/dbtemplate/test/t12-substitute.txt create mode 100644 src/ioc/dbtemplate/test/t12-template.txt diff --git a/src/ioc/dbtemplate/test/msi.plt b/src/ioc/dbtemplate/test/msi.plt index 332defb13..ca87ca1fe 100644 --- a/src/ioc/dbtemplate/test/msi.plt +++ b/src/ioc/dbtemplate/test/msi.plt @@ -11,7 +11,7 @@ use strict; use Test; -BEGIN {plan tests => 11} +BEGIN {plan tests => 12} # Check include/substitute command model ok(msi('-I .. ../t1-template.txt'), slurp('../t1-result.txt')); @@ -56,6 +56,8 @@ ok(msi('-I. -I.. -S ../t10-substitute.txt'), slurp('../t10-result.txt')); # Substitution file, pattern format, with 0 pattern definitions ok(msi('-I. -I.. -S ../t11-substitute.txt'), slurp('../t11-result.txt')); +# Macros in template-file name populated from environment variable +ok(msi('-I. -I.. -S ../t12-substitute.txt', 'TEST_NO=12,PREFIX=t'), slurp('../t12-result.txt')); # Test support routines @@ -68,10 +70,16 @@ sub slurp { } sub msi { - my ($args) = @_; + my ($args, $envstr) = @_; my $exe = ($^O eq 'MSWin32') || ($^O eq 'cygwin') ? '.exe' : ''; my $msi = "./msi-copy$exe"; my $result; + my @envs = split(/,/, $envstr); + foreach (@envs) + { + my ($var, $value) = split /=/, $_; + $ENV{$var} = $value; + } if ($args =~ m/-o / && $args !~ m/-D/) { # An empty result is expected $result = `$msi $args`; @@ -85,5 +93,10 @@ sub msi { if $result eq ''; } while ($result eq '') && (--$count > 0); } + foreach (@envs) + { + my ($var, $value) = split /=/, $_; + delete $ENV{$var}; + } return $result; } diff --git a/src/ioc/dbtemplate/test/t12-result.txt b/src/ioc/dbtemplate/test/t12-result.txt new file mode 100644 index 000000000..6cfcc57da --- /dev/null +++ b/src/ioc/dbtemplate/test/t12-result.txt @@ -0,0 +1,2 @@ +# comment line +a=foo diff --git a/src/ioc/dbtemplate/test/t12-substitute.txt b/src/ioc/dbtemplate/test/t12-substitute.txt new file mode 100644 index 000000000..7a26b6fea --- /dev/null +++ b/src/ioc/dbtemplate/test/t12-substitute.txt @@ -0,0 +1,3 @@ +file $(PREFIX)$(TEST_NO)-template.txt { + { a=foo } +} diff --git a/src/ioc/dbtemplate/test/t12-template.txt b/src/ioc/dbtemplate/test/t12-template.txt new file mode 100644 index 000000000..7958885a7 --- /dev/null +++ b/src/ioc/dbtemplate/test/t12-template.txt @@ -0,0 +1,2 @@ +# comment line +a=$(a) From 630663caa8dc94b777edfa1e21f02e568a221bc7 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Wed, 24 Apr 2019 18:07:23 -0400 Subject: [PATCH 21/40] Fix weird use of strncpy Note: The old code was correct. This change just gets rid of a bunch of warnings. --- src/std/rec/boRecord.c | 4 ++-- src/std/rec/stateRecord.c | 2 +- src/std/rec/stringinRecord.c | 4 ++-- src/std/rec/stringoutRecord.c | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/std/rec/boRecord.c b/src/std/rec/boRecord.c index 88184555e..48cc4846a 100644 --- a/src/std/rec/boRecord.c +++ b/src/std/rec/boRecord.c @@ -329,9 +329,9 @@ static long get_enum_strs(DBADDR *paddr,struct dbr_enumStrs *pes) /*SETTING no_str=0 breaks channel access clients*/ pes->no_str = 2; memset(pes->strs,'\0',sizeof(pes->strs)); - strncpy(pes->strs[0],prec->znam,sizeof(prec->znam)); + strncpy(pes->strs[0],prec->znam,sizeof(pes->strs[0])); if(*prec->znam!=0) pes->no_str=1; - strncpy(pes->strs[1],prec->onam,sizeof(prec->onam)); + strncpy(pes->strs[1],prec->onam,sizeof(pes->strs[1])); if(*prec->onam!=0) pes->no_str=2; return(0); } diff --git a/src/std/rec/stateRecord.c b/src/std/rec/stateRecord.c index a052b0728..8170de7e9 100644 --- a/src/std/rec/stateRecord.c +++ b/src/std/rec/stateRecord.c @@ -98,7 +98,7 @@ static void monitor(stateRecord *prec) monitor_mask = recGblResetAlarms(prec); if(strncmp(prec->oval,prec->val,sizeof(prec->val))) { db_post_events(prec,&(prec->val[0]),monitor_mask|DBE_VALUE|DBE_LOG); - strncpy(prec->oval,prec->val,sizeof(prec->val)); + strncpy(prec->oval,prec->val,sizeof(prec->oval)); } return; } diff --git a/src/std/rec/stringinRecord.c b/src/std/rec/stringinRecord.c index db2f626f1..aac7d4e0f 100644 --- a/src/std/rec/stringinRecord.c +++ b/src/std/rec/stringinRecord.c @@ -120,7 +120,7 @@ static long init_record(stringinRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } - strncpy(prec->oval, prec->val, sizeof(prec->val)); + strncpy(prec->oval, prec->val, sizeof(prec->oval)); return(0); } @@ -160,7 +160,7 @@ static void monitor(stringinRecord *prec) if (strncmp(prec->oval, prec->val, sizeof(prec->val))) { monitor_mask |= DBE_VALUE | DBE_LOG; - strncpy(prec->oval, prec->val, sizeof(prec->val)); + strncpy(prec->oval, prec->val, sizeof(prec->oval)); } if (prec->mpst == stringinPOST_Always) diff --git a/src/std/rec/stringoutRecord.c b/src/std/rec/stringoutRecord.c index 2bca3228c..61d88f60f 100644 --- a/src/std/rec/stringoutRecord.c +++ b/src/std/rec/stringoutRecord.c @@ -122,7 +122,7 @@ static long init_record(stringoutRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } - strncpy(prec->oval, prec->val, sizeof(prec->val)); + strncpy(prec->oval, prec->val, sizeof(prec->oval)); return(0); } @@ -188,7 +188,7 @@ static void monitor(stringoutRecord *prec) if (strncmp(prec->oval, prec->val, sizeof(prec->val))) { monitor_mask |= DBE_VALUE | DBE_LOG; - strncpy(prec->oval, prec->val, sizeof(prec->val)); + strncpy(prec->oval, prec->val, sizeof(prec->oval)); } if (prec->mpst == stringoutPOST_Always) From 8e9d75ad712d7e6464b7f5ea66cab1359812e8f6 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Wed, 24 Apr 2019 18:51:50 -0400 Subject: [PATCH 22/40] Fix potential buffer overflow in iocLogServer --- src/libCom/log/iocLogServer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libCom/log/iocLogServer.c b/src/libCom/log/iocLogServer.c index f42aa4563..67bcf1bd3 100644 --- a/src/libCom/log/iocLogServer.c +++ b/src/libCom/log/iocLogServer.c @@ -37,7 +37,7 @@ static unsigned short ioc_log_port; static long ioc_log_file_limit; -static char ioc_log_file_name[256]; +static char ioc_log_file_name[512]; static char ioc_log_file_command[256]; From e02c5c3026b8eafd7a17269558371b754f90744a Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Wed, 24 Apr 2019 22:06:29 -0400 Subject: [PATCH 23/40] iocLogServer: check return values No serious issues here just fixing some warnings. --- src/libCom/log/iocLogServer.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libCom/log/iocLogServer.c b/src/libCom/log/iocLogServer.c index 67bcf1bd3..e707185ae 100644 --- a/src/libCom/log/iocLogServer.c +++ b/src/libCom/log/iocLogServer.c @@ -866,7 +866,12 @@ static int setupSIGHUP(struct ioc_log_server *pserver) */ static void sighupHandler(int signo) { - (void) write(sighupPipe[1], "SIGHUP\n", 7); + const char msg[] = "SIGHUP\n"; + const ssize_t bytesWritten = write(sighupPipe[1], msg, sizeof(msg)); + if (bytesWritten != sizeof(msg)) { + fprintf(stderr, "iocLogServer: failed to write to SIGHUP pipe because " + "`%s'\n", strerror(errno)); + } } @@ -884,7 +889,10 @@ static void serviceSighupRequest(void *pParam) /* * Read and discard message from pipe. */ - (void) read(sighupPipe[0], buff, sizeof buff); + if (read(sighupPipe[0], buff, sizeof buff) <= 0) { + fprintf(stderr, "iocLogServer: failed to read from SIGHUP pipe because " + "`%s'\n", strerror(errno)); + }; /* * Determine new log file name. From 1f95d0db127c5cf1ea077b48be43103cf1309f8c Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Thu, 25 Apr 2019 11:00:39 -0400 Subject: [PATCH 24/40] epicsTime: rely on implicit copy constructor When a custom copy constructor is defined the assignment operator also needs to be defined explicitly. For this simple class the implicit copy ctor/assignment operator are sufficient, though. This fixes a warning emitted by GCC9. --- src/libCom/osi/epicsTime.cpp | 3 --- src/libCom/osi/epicsTime.h | 1 - 2 files changed, 4 deletions(-) diff --git a/src/libCom/osi/epicsTime.cpp b/src/libCom/osi/epicsTime.cpp index af4fae25d..ef43e0ad2 100644 --- a/src/libCom/osi/epicsTime.cpp +++ b/src/libCom/osi/epicsTime.cpp @@ -205,9 +205,6 @@ epicsTime::epicsTime (const epicsTimeStamp &ts) epicsTime::epicsTime () : secPastEpoch(0u), nSec(0u) {} -epicsTime::epicsTime (const epicsTime &t) : - secPastEpoch (t.secPastEpoch), nSec (t.nSec) {} - epicsTime epicsTime::getCurrent () { epicsTimeStamp current; diff --git a/src/libCom/osi/epicsTime.h b/src/libCom/osi/epicsTime.h index 1cb3733bc..d8b266346 100644 --- a/src/libCom/osi/epicsTime.h +++ b/src/libCom/osi/epicsTime.h @@ -81,7 +81,6 @@ public: class formatProblemWithStructTM {}; epicsTime (); - epicsTime ( const epicsTime & t ); static epicsTime getEvent ( const epicsTimeEvent & ); static epicsTime getCurrent (); From ec7193d0be9934412b3e61138b1be1c71d9d83b7 Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Tue, 30 Apr 2019 15:53:50 +0200 Subject: [PATCH 25/40] appveyor-ci: exclude some cygwin builds (broken compiler) appveyor-ci: remove slack, add email and GitHub notifications (cherry-picked from branch 7.0) --- appveyor.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index dbbd7a908..6c21f03a4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -60,6 +60,10 @@ matrix: # VS Express installs don't have the 64 bit compiler - platform: x64 TOOLCHAIN: 10.0 + # Cygwin static-debug has compiler problems + - configuration: static-debug + TOOLCHAIN: cygwin + #---------------------------------# # building & testing # @@ -80,6 +84,9 @@ test_script: notifications: - - provider: Slack - incoming_webhook: - secure: RYOm3FIUYeZGjWKaeTVKwq+C3fzK54AKwbmAoECED45mex3lN+8HmrC845a6mg9xPUJ/ND51RopWVaKDD9/UzaM0SO195RQLKqUTIUafiuM= + - provider: Email + to: + - core-talk@aps.anl.gov + on_build_success: false + + - provider: GitHubPullRequest From 63bf8a821971d83955f17e86110b88726559d10f Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Thu, 2 May 2019 11:39:04 +0200 Subject: [PATCH 26/40] appveyor-ci: use choco MinGW 5.3.0 to work around build problem (fixes lp:1827225) --- ci/appveyor-prepare.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/appveyor-prepare.bat b/ci/appveyor-prepare.bat index 26ca8118a..c1d0e5d9a 100644 --- a/ci/appveyor-prepare.bat +++ b/ci/appveyor-prepare.bat @@ -57,10 +57,10 @@ if "%TOOLCHAIN%"=="mingw" ( ) if "%OS%"=="64BIT" ( echo [INFO] Installing MinGW 64bit - cinst mingw || cinst mingw + cinst mingw --version="5.3.0" || cinst mingw --version="5.3.0" ) else ( echo [INFO] Installing MinGW 32bit - cinst mingw --x86 || cinst mingw --x86 + cinst mingw --x86 --version="5.3.0" || cinst mingw --x86 --version="5.3.0" ) ) From 297206e247c9847f238d5ede3d01134f3c9375ce Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Fri, 3 May 2019 15:29:07 +0200 Subject: [PATCH 27/40] appveyor-ci: use pre-installed AppVeyor MinGW --- appveyor.yml | 1 + ci/appveyor-make.bat | 8 ++++---- ci/appveyor-prepare.bat | 7 ------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 6c21f03a4..b6fb2f2ae 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -48,6 +48,7 @@ environment: TOOLCHAIN: 2017 - TOOLCHAIN: cygwin - TOOLCHAIN: mingw + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 # Platform: architecture platform: diff --git a/ci/appveyor-make.bat b/ci/appveyor-make.bat index a489d80ee..9cd8fe684 100644 --- a/ci/appveyor-make.bat +++ b/ci/appveyor-make.bat @@ -42,13 +42,13 @@ if "%TOOLCHAIN%"=="mingw" ( set "MAKE=mingw32-make" if "%OS%"=="64BIT" ( set "EPICS_HOST_ARCH=windows-x64-mingw" - set "INCLUDE=C:\tools\mingw64\include;%INCLUDE%" - set "PATH=C:\tools\mingw64\bin;%PATH%" + set "INCLUDE=C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\include;%INCLUDE%" + set "PATH=C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;%PATH%" echo [INFO] MinGW Toolchain 64bit ) else ( set "EPICS_HOST_ARCH=win32-x86-mingw" - set "INCLUDE=C:\tools\mingw32\include;%INCLUDE%" - set "PATH=C:\tools\mingw32\bin;%PATH%" + set "INCLUDE=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\include;%INCLUDE%" + set "PATH=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin;%PATH%" echo [INFO] MinGW Toolchain 32bit ) echo [INFO] Compiler Version diff --git a/ci/appveyor-prepare.bat b/ci/appveyor-prepare.bat index c1d0e5d9a..9e116354a 100644 --- a/ci/appveyor-prepare.bat +++ b/ci/appveyor-prepare.bat @@ -55,13 +55,6 @@ if "%TOOLCHAIN%"=="mingw" ( ) || ( echo [INFO] EPICS set up for optimized build ) - if "%OS%"=="64BIT" ( - echo [INFO] Installing MinGW 64bit - cinst mingw --version="5.3.0" || cinst mingw --version="5.3.0" - ) else ( - echo [INFO] Installing MinGW 32bit - cinst mingw --x86 --version="5.3.0" || cinst mingw --x86 --version="5.3.0" - ) ) echo [INFO] Installing Make 4.1 From 16ddcaeaed34b8b306cd558ce80b5c815406d313 Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Fri, 3 May 2019 15:30:59 +0200 Subject: [PATCH 28/40] appveyor-ci: ANL Make install 4.1 -> 4.2.1 --- ci/appveyor-prepare.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/appveyor-prepare.bat b/ci/appveyor-prepare.bat index 9e116354a..9f105ee96 100644 --- a/ci/appveyor-prepare.bat +++ b/ci/appveyor-prepare.bat @@ -57,7 +57,7 @@ if "%TOOLCHAIN%"=="mingw" ( ) ) -echo [INFO] Installing Make 4.1 -curl -fsS --retry 3 -o C:\tools\make-4.1.zip https://epics.anl.gov/download/tools/make-4.1-win64.zip +echo [INFO] Installing Make 4.2.1 from ANL web site +curl -fsS --retry 3 -o C:\tools\make-4.2.1.zip https://epics.anl.gov/download/tools/make-4.2.1-win64.zip cd \tools -"C:\Program Files\7-Zip\7z" e make-4.1.zip +"C:\Program Files\7-Zip\7z" e make-4.2.1.zip From 2d3de1916be3a42155dda0749a52a7b4bfe804e0 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 6 May 2019 12:22:34 -0500 Subject: [PATCH 29/40] Don't clear caClientCallbackThreadId in CA's exit handler --- documentation/RELEASE_NOTES.html | 9 +++++++++ src/ca/client/ca_client_context.cpp | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index c47dc2d5b..8ed4e04bf 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -16,6 +16,15 @@ +

Cleaning up with Multiple CA contexts in a Process

+ +

Bruno Martins reported a problem with the CA client library at shutdown in a +process that uses multiple CA client contexts. The first context that triggers +the CA client exit handler prevents any others from being able to clean up +because it resets the ID of an internal epicsThreadPrivate variable which is +shared by all clients. This action has been removed from the client library, +which makes cleanup of clients like this possible.

+

Perl CA bindings fixed for macOS Mojave

Apple removed some Perl header files from macOS Mojave that were available diff --git a/src/ca/client/ca_client_context.cpp b/src/ca/client/ca_client_context.cpp index 20a6e84c8..95cd6cb59 100644 --- a/src/ca/client/ca_client_context.cpp +++ b/src/ca/client/ca_client_context.cpp @@ -48,7 +48,6 @@ const unsigned ca_client_context :: flushBlockThreshold = 0x58000; extern "C" void cacExitHandler ( void *) { epicsThreadPrivateDelete ( caClientCallbackThreadId ); - caClientCallbackThreadId = 0; delete ca_client_context::pDefaultServiceInstallMutex; } From 25576c316ac1212dc7b3703d5d5ab36a43608050 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Mon, 6 May 2019 14:56:45 -0400 Subject: [PATCH 30/40] Remove cacExitHandler We need to ensure the allocated resources stick around until the last instance using them doesn't need them anymore. Sharing a raw pointer by exporting it as a global variable is not compatible with cleaning up at all. For now we remove the clean-up code. Note: This fixes a segfault during IOC shutdown when using both pyDevSup and pyepics. See the discussion on https://epics.anl.gov/tech-talk/2019/msg00778.php for details. --- src/ca/client/ca_client_context.cpp | 7 ------- src/ca/client/oldAccess.h | 2 -- 2 files changed, 9 deletions(-) diff --git a/src/ca/client/ca_client_context.cpp b/src/ca/client/ca_client_context.cpp index 95cd6cb59..ce8de1ecb 100644 --- a/src/ca/client/ca_client_context.cpp +++ b/src/ca/client/ca_client_context.cpp @@ -45,19 +45,12 @@ static epicsThreadOnceId cacOnce = EPICS_THREAD_ONCE_INIT; const unsigned ca_client_context :: flushBlockThreshold = 0x58000; -extern "C" void cacExitHandler ( void *) -{ - epicsThreadPrivateDelete ( caClientCallbackThreadId ); - delete ca_client_context::pDefaultServiceInstallMutex; -} - // runs once only for each process extern "C" void cacOnceFunc ( void * ) { caClientCallbackThreadId = epicsThreadPrivateCreate (); assert ( caClientCallbackThreadId ); ca_client_context::pDefaultServiceInstallMutex = newEpicsMutex; - epicsAtExit ( cacExitHandler,0 ); } extern epicsThreadPrivateId caClientContextId; diff --git a/src/ca/client/oldAccess.h b/src/ca/client/oldAccess.h index 04f551839..daa4cc912 100644 --- a/src/ca/client/oldAccess.h +++ b/src/ca/client/oldAccess.h @@ -288,7 +288,6 @@ private: }; extern "C" void cacOnceFunc ( void * ); -extern "C" void cacExitHandler ( void *); struct ca_client_context : public cacContextNotify { @@ -428,7 +427,6 @@ private: ca_client_context & operator = ( const ca_client_context & ); friend void cacOnceFunc ( void * ); - friend void cacExitHandler ( void *); static cacService * pDefaultService; static epicsMutex * pDefaultServiceInstallMutex; static const unsigned flushBlockThreshold; From 96259b7bdc3f06f51589fbbb002a3d6fd2c52408 Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Thu, 9 May 2019 17:28:36 +0200 Subject: [PATCH 31/40] doc/ca: clarify variable size array subscription --- src/ca/client/CAref.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ca/client/CAref.html b/src/ca/client/CAref.html index 81e2eb664..ef4df758e 100644 --- a/src/ca/client/CAref.html +++ b/src/ca/client/CAref.html @@ -3137,7 +3137,8 @@ indicating the current state of the channel.

COUNT
The element count to be read from the specified channel. A count of - zero means use the current element count from the server.
+ zero means use the current element count from the server, effectively + resulting in a variable size array subscription.
CHID
From 345cfcffa8a1dabb9c8f1e65021f840d49da7a61 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 4 Jun 2019 12:53:41 -0500 Subject: [PATCH 32/40] Fix sync filter example in dbd.pod --- src/std/filters/filters.dbd.pod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/std/filters/filters.dbd.pod b/src/std/filters/filters.dbd.pod index f1a848469..d7ab785f5 100644 --- a/src/std/filters/filters.dbd.pod +++ b/src/std/filters/filters.dbd.pod @@ -241,7 +241,7 @@ Assuming there is a system state called "blue", that is being controlled by some other facility such as a timing system, updates could be restricted to periods only when "blue" is true by using - Hal$ camonitor 'test:channel' 'test:channel.{"while":"blue"}' + Hal$ camonitor 'test:channel' 'test:channel.{"sync":{"while":"blue"}}' ... =cut From 33e099a51b653ce1ebc97a8f885a98ab3583fe38 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 7 Jun 2019 17:21:18 -0500 Subject: [PATCH 33/40] Fix VxWorks osiSockOptMcastLoop_t => char Repairs osiSockTest --- src/libCom/osi/os/vxWorks/osdSock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libCom/osi/os/vxWorks/osdSock.h b/src/libCom/osi/os/vxWorks/osdSock.h index d949b25f1..848f1d430 100644 --- a/src/libCom/osi/os/vxWorks/osdSock.h +++ b/src/libCom/osi/os/vxWorks/osdSock.h @@ -65,7 +65,7 @@ typedef int SOCKET; #define socket_ioctl(A,B,C) ioctl(A,B,(int)C) typedef int osiSockIoctl_t; typedef int osiSocklen_t; -typedef int osiSockOptMcastLoop_t; +typedef char osiSockOptMcastLoop_t; #define FD_IN_FDSET(FD) ((FD)=0) From e75a72ef76fe6ae5d396ae2a51f0d1830c9c12b9 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 7 Jun 2019 17:22:40 -0500 Subject: [PATCH 34/40] VxWorks: Mark undetected underflow parse test as ToDo --- src/libCom/test/epicsStdlibTest.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libCom/test/epicsStdlibTest.c b/src/libCom/test/epicsStdlibTest.c index a55453ad1..9a178f6bc 100644 --- a/src/libCom/test/epicsStdlibTest.c +++ b/src/libCom/test/epicsStdlibTest.c @@ -381,8 +381,14 @@ MAIN(epicsStdlibTest) testOk(epicsParseFloat("1e-40", &f, NULL) == S_stdlib_underflow, "Float '1e-40' => underflow"); +#ifdef vxWorks + testTodoBegin("Not detected on VxWorks"); +#endif testOk(epicsParseDouble("1e-330", &d, NULL) == S_stdlib_underflow, "Double '1e-330' => underflow"); +#ifdef vxWorks + testTodoEnd(); +#endif testOk(epicsScanFloat("1e30", &f) && fabs(f - 1e30) < 1e24, "Float '1e30'"); From b2285bb8aa54f2e164ad4d5be55a267af38a0150 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 27 Jun 2019 12:01:42 -0500 Subject: [PATCH 35/40] Redirect msi's STDERR to /dev/null (NUL on Windows) during tests Also moves the environment variable handling code out to the only test that needs it and simplifies it; some Perl versions were giving warnings from splitting an undef value. --- src/ioc/dbtemplate/test/msi.plt | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/ioc/dbtemplate/test/msi.plt b/src/ioc/dbtemplate/test/msi.plt index ca87ca1fe..a235484a6 100644 --- a/src/ioc/dbtemplate/test/msi.plt +++ b/src/ioc/dbtemplate/test/msi.plt @@ -56,8 +56,11 @@ ok(msi('-I. -I.. -S ../t10-substitute.txt'), slurp('../t10-result.txt')); # Substitution file, pattern format, with 0 pattern definitions ok(msi('-I. -I.. -S ../t11-substitute.txt'), slurp('../t11-result.txt')); -# Macros in template-file name populated from environment variable -ok(msi('-I. -I.. -S ../t12-substitute.txt', 'TEST_NO=12,PREFIX=t'), slurp('../t12-result.txt')); +# Substitution file, environment variable macros in template filename +my %envs = (TEST_NO => 12, PREFIX => 't'); +@ENV{ keys %envs } = values %envs; +ok(msi('-I. -I.. -S ../t12-substitute.txt'), slurp('../t12-result.txt')); +delete @ENV{ keys %envs }; # Not really needed # Test support routines @@ -70,33 +73,23 @@ sub slurp { } sub msi { - my ($args, $envstr) = @_; + my ($args) = @_; my $exe = ($^O eq 'MSWin32') || ($^O eq 'cygwin') ? '.exe' : ''; + my $nul = ($^O eq 'MSWin32') ? 'NUL' : '/dev/null'; my $msi = "./msi-copy$exe"; my $result; - my @envs = split(/,/, $envstr); - foreach (@envs) - { - my ($var, $value) = split /=/, $_; - $ENV{$var} = $value; - } if ($args =~ m/-o / && $args !~ m/-D/) { # An empty result is expected - $result = `$msi $args`; + $result = `$msi $args 2>$nul`; } else { # Try up to 5 times, sometimes msi fails on Windows my $count = 5; do { - $result = `$msi $args`; + $result = `$msi $args 2>$nul`; print "# result of '$msi $args' empty, retrying\n" if $result eq ''; } while ($result eq '') && (--$count > 0); } - foreach (@envs) - { - my ($var, $value) = split /=/, $_; - delete $ENV{$var}; - } return $result; } From 78ce2dac05c60df5e2f91b390335c9f3b4b9d0a0 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 27 Jun 2019 13:28:56 -0500 Subject: [PATCH 36/40] Don't use / in Windows program paths Fixing Windows msi.t script failures... --- src/ioc/dbtemplate/test/msi.plt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ioc/dbtemplate/test/msi.plt b/src/ioc/dbtemplate/test/msi.plt index a235484a6..420846649 100644 --- a/src/ioc/dbtemplate/test/msi.plt +++ b/src/ioc/dbtemplate/test/msi.plt @@ -76,7 +76,7 @@ sub msi { my ($args) = @_; my $exe = ($^O eq 'MSWin32') || ($^O eq 'cygwin') ? '.exe' : ''; my $nul = ($^O eq 'MSWin32') ? 'NUL' : '/dev/null'; - my $msi = "./msi-copy$exe"; + my $msi = "msi-copy$exe"; my $result; if ($args =~ m/-o / && $args !~ m/-D/) { # An empty result is expected From c9c4eea0f80a2f4810bce4801cea2b8b1a3ef450 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 27 Jun 2019 15:21:41 -0500 Subject: [PATCH 37/40] Now fix the non-windows systems --- src/ioc/dbtemplate/test/msi.plt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ioc/dbtemplate/test/msi.plt b/src/ioc/dbtemplate/test/msi.plt index 420846649..4db5a9a41 100644 --- a/src/ioc/dbtemplate/test/msi.plt +++ b/src/ioc/dbtemplate/test/msi.plt @@ -74,9 +74,8 @@ sub slurp { sub msi { my ($args) = @_; - my $exe = ($^O eq 'MSWin32') || ($^O eq 'cygwin') ? '.exe' : ''; my $nul = ($^O eq 'MSWin32') ? 'NUL' : '/dev/null'; - my $msi = "msi-copy$exe"; + my $msi = ($^O eq 'MSWin32') ? 'msi-copy.exe' : './msi-copy'; my $result; if ($args =~ m/-o / && $args !~ m/-D/) { # An empty result is expected From 771ad6a44264385d9282b9ca04435973e5266183 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Fri, 5 Jul 2019 12:44:05 +0100 Subject: [PATCH 38/40] msi: Flush stdout on program exit On WIN32 if the reopen()ed stdout is not closed it can occasionally result in missing lines in the output file --- src/ioc/dbtemplate/msi.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ioc/dbtemplate/msi.cpp b/src/ioc/dbtemplate/msi.cpp index 49d8611b9..70623419a 100644 --- a/src/ioc/dbtemplate/msi.cpp +++ b/src/ioc/dbtemplate/msi.cpp @@ -215,6 +215,7 @@ int main(int argc,char **argv) if (opt_D) { printf("\n"); } + fflush(stdout); free(templateName); return opt_V & 2; } From b89494a840e62953471c7cce7b134849cf750bdd Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 17 Jul 2019 11:20:03 -0700 Subject: [PATCH 39/40] Revert "Testing msi: Add retries if necessary" This reverts commit 29c069db3dcb78e77c03bb18153eec21456585c4. # Conflicts: # src/ioc/dbtemplate/test/msi.plt --- src/ioc/dbtemplate/test/msi.plt | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/ioc/dbtemplate/test/msi.plt b/src/ioc/dbtemplate/test/msi.plt index 4db5a9a41..f0d66565e 100644 --- a/src/ioc/dbtemplate/test/msi.plt +++ b/src/ioc/dbtemplate/test/msi.plt @@ -76,19 +76,5 @@ sub msi { my ($args) = @_; my $nul = ($^O eq 'MSWin32') ? 'NUL' : '/dev/null'; my $msi = ($^O eq 'MSWin32') ? 'msi-copy.exe' : './msi-copy'; - my $result; - if ($args =~ m/-o / && $args !~ m/-D/) { - # An empty result is expected - $result = `$msi $args 2>$nul`; - } - else { - # Try up to 5 times, sometimes msi fails on Windows - my $count = 5; - do { - $result = `$msi $args 2>$nul`; - print "# result of '$msi $args' empty, retrying\n" - if $result eq ''; - } while ($result eq '') && (--$count > 0); - } - return $result; + return `$msi $args 2>$nul`; } From a6812c586928ce71d548f37e092cb3a98859ff1a Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 17 Jul 2019 16:19:37 -0500 Subject: [PATCH 40/40] Revert "More msi.plt retries for Jenkins builds on Windows" This reverts commit a69bd833fc6e29a145c7475c72bea85a32897385. --- src/ioc/dbtemplate/test/msi.plt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/ioc/dbtemplate/test/msi.plt b/src/ioc/dbtemplate/test/msi.plt index f0d66565e..414e10961 100644 --- a/src/ioc/dbtemplate/test/msi.plt +++ b/src/ioc/dbtemplate/test/msi.plt @@ -33,16 +33,9 @@ ok(msi('-S../t6-substitute.txt ../t6-template.txt'), slurp('../t6-result.txt')); # Output option -o and verbose option -V my $out = 't7-output.txt'; -my $count = 5; # Try up to 5 times... -my $result; -do { - unlink $out; - msi("-I.. -V -o $out ../t1-template.txt"); - $result = slurp($out); - print "# msi output file empty, retrying\n" - if $result eq ''; -} while ($result eq '') && (--$count > 0); -ok($result, slurp('../t7-result.txt')); +unlink $out; +msi("-I.. -V -o $out ../t1-template.txt"); +ok(slurp($out), slurp('../t7-result.txt')); # Dependency generation, include/substitute model ok(msi('-I.. -D -o t8.txt ../t1-template.txt'), slurp('../t8-result.txt'));