From ab94bb46f2bfac9db3754624f5a6ff5b0ea75c3b Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 19 Aug 2014 16:34:41 -0500 Subject: [PATCH 01/29] Changing iocshCmd to idealized syntax --- src/libCom/iocsh/iocsh.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index 671239781..c918d270c 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -4,7 +4,7 @@ * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* iocsh.cpp */ /* Author: Marty Kraimer Date: 27APR2000 */ @@ -201,7 +201,7 @@ void epicsShareAPI iocshRegisterVariable (const iocshVarDef *piocshVarDef) /* * Free storage created by iocshRegister/iocshRegisterVariable */ -void epicsShareAPI iocshFree(void) +void epicsShareAPI iocshFree(void) { struct iocshCommand *pc; struct iocshVariable *pv; @@ -475,7 +475,7 @@ static void helpCallFunc(const iocshArgBuf *args) * The body of the command interpreter */ static int -iocshBody (const char *pathname, const char *commandLine) +iocshBody (const char *pathname, const char *commandLine, const char* macros) { FILE *fp = NULL; const char *filename = NULL; @@ -498,7 +498,7 @@ iocshBody (const char *pathname, const char *commandLine) struct iocshCommand *found; void *readlineContext = NULL; int wasOkToBlock; - + /* * See if command interpreter is interactive */ @@ -585,7 +585,7 @@ iocshBody (const char *pathname, const char *commandLine) * Expand macros */ free(line); - if ((line = macEnvExpand(raw)) == NULL) + if ((line = macEnvExpand(raw, macros)) == NULL) continue; /* @@ -744,7 +744,7 @@ iocshBody (const char *pathname, const char *commandLine) if (openRedirect(filename, lineno, redirects) < 0) continue; startRedirect(filename, lineno, redirects); - iocshBody(commandFile, NULL); + iocshBody(commandFile, NULL, macros); stopRedirect(filename, lineno, redirects); continue; } @@ -835,15 +835,15 @@ iocsh (const char *pathname) { if (pathname) epicsEnvSet("IOCSH_STARTUP_SCRIPT", pathname); - return iocshBody(pathname, NULL); + return iocshBody(pathname, NULL, NULL); } int epicsShareAPI -iocshCmd (const char *cmd) +iocshCmd (const char *cmd, const char* macros) { if (cmd == NULL) return 0; - return iocshBody(NULL, cmd); + return iocshBody(NULL, cmd, macros); } /* @@ -919,11 +919,12 @@ static void varCallFunc(const iocshArgBuf *args) /* iocshCmd */ static const iocshArg iocshCmdArg0 = { "command",iocshArgString}; -static const iocshArg *iocshCmdArgs[1] = {&iocshCmdArg0}; -static const iocshFuncDef iocshCmdFuncDef = {"iocshCmd",1,iocshCmdArgs}; +static const iocshArg iocshCmdArg1 = { "macros", iocshArgString}; +static const iocshArg *iocshCmdArgs[2] = {&iocshCmdArg0, &iocshCmdArg1}; +static const iocshFuncDef iocshCmdFuncDef = {"iocshCmd",2,iocshCmdArgs}; static void iocshCmdCallFunc(const iocshArgBuf *args) { - iocshCmd(args[0].sval); + iocshCmd(args[0].sval, args[1].sval); } /* From 69c7f0b0652671039070568b6630a4ff748f0f2e Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 19 Aug 2014 16:40:51 -0500 Subject: [PATCH 02/29] Changing macEnvExpand to accomodate macro definitions --- src/libCom/iocsh/iocsh.h | 4 ++-- src/libCom/macLib/macEnv.c | 19 ++++++++++++++++--- src/libCom/macLib/macLib.h | 5 +++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/libCom/iocsh/iocsh.h b/src/libCom/iocsh/iocsh.h index d89991050..9000f2a4d 100644 --- a/src/libCom/iocsh/iocsh.h +++ b/src/libCom/iocsh/iocsh.h @@ -5,7 +5,7 @@ * Operator of Los Alamos National Laboratory. * EPICS BASE Versions 3.13.7 * and higher are distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* iocsh.h ioc: call registered function*/ /* Author: Marty Kraimer Date: 27APR2000 */ @@ -69,7 +69,7 @@ epicsShareFunc void epicsShareAPI iocshRegisterVariable ( epicsShareFunc void epicsShareAPI iocshFree(void); epicsShareFunc int epicsShareAPI iocsh(const char *pathname); -epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd); +epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd, const char* macros); /* 'weak' link to pdbbase */ epicsShareExtern struct dbBase **iocshPpdbbase; diff --git a/src/libCom/macLib/macEnv.c b/src/libCom/macLib/macEnv.c index 35872d14c..596133056 100644 --- a/src/libCom/macLib/macEnv.c +++ b/src/libCom/macLib/macEnv.c @@ -2,7 +2,7 @@ * Copyright (c) 2009 UChicago Argonne LLC, as Operator of Argonne * National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* $Revision-Id$ * @@ -19,11 +19,12 @@ #include "macLib.h" char * epicsShareAPI -macEnvExpand(const char *str) +macEnvExpand(const char *str, const char* macros) { MAC_HANDLE *handle; static char *pairs[] = { "", "environ", NULL, NULL }; - long destCapacity = 128; + char** defines; + long destCapacity = 128; char *dest = NULL; int n; @@ -32,6 +33,18 @@ macEnvExpand(const char *str) return NULL; } + if (macros) + { + if (macParseDefns(handle, macros, &defines) < 0) + { + cantProceed("macEnvExpand: invalid macro string"); + } + else + { + macInstallMacros(handle, defines); + } + } + do { destCapacity *= 2; /* diff --git a/src/libCom/macLib/macLib.h b/src/libCom/macLib/macLib.h index a99007e9a..bbfd44aef 100644 --- a/src/libCom/macLib/macLib.h +++ b/src/libCom/macLib/macLib.h @@ -4,7 +4,7 @@ * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* $Revision-Id$ * @@ -148,7 +148,8 @@ epicsShareAPI macInstallMacros( epicsShareFunc char * /* expanded string; NULL if any undefined macros */ epicsShareAPI macEnvExpand( - const char *str /* string to be expanded */ + const char *str, /* string to be expanded */ + const char *macros /* macro definitions in "a=xxx, b=yyy" */ ); #ifdef __cplusplus From 0cb495bdb354b49f95688c1d22c3d3863984e2ef Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 19 Aug 2014 16:44:15 -0500 Subject: [PATCH 03/29] Sidestepping testing in macEnvExpandTest --- src/libCom/test/macEnvExpandTest.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libCom/test/macEnvExpandTest.c b/src/libCom/test/macEnvExpandTest.c index b56cc366a..f3e9d924a 100644 --- a/src/libCom/test/macEnvExpandTest.c +++ b/src/libCom/test/macEnvExpandTest.c @@ -23,7 +23,7 @@ static void check(const char *str, const char *expect) { - char *got = macEnvExpand(str); + char *got = macEnvExpand(str, NULL); int pass = -1; if (expect && !got) { @@ -152,7 +152,7 @@ MAIN(macEnvExpandTest) check("${FOO,FOO=$(FOO)}", NULL); check("${FOO=$(FOO)}", NULL); check("${FOO=$(BAR),BAR=$(FOO)}", NULL); - + errlogFlush(); eltc(1); return testDone(); From 5798574d6237e5110613715ecc10985f3775803a Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 19 Aug 2014 16:50:49 -0500 Subject: [PATCH 04/29] dbLexRoutines calls macEnvExpand as well, doesn't need macros, so added NULL's --- src/ioc/dbStatic/dbLexRoutines.c | 66 ++++++++++++++++---------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index cf2406556..75453dcac 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -4,7 +4,7 @@ * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* $Revision-Id$ */ @@ -36,7 +36,7 @@ #include "dbStaticLib.h" #include "dbStaticPvt.h" - + /*global declarations*/ epicsShareDef char *makeDbdDepends=0; @@ -107,7 +107,7 @@ typedef struct tempListNode { static ELLLIST tempList = ELLLIST_INIT; static void *freeListPvt = NULL; static int duplicate = FALSE; - + static void yyerrorAbort(char *str) { yyerror(str); @@ -142,7 +142,7 @@ static void *getLastTemp(void) ptempListNode = (tempListNode *)ellLast(&tempList); return(ptempListNode->item); } - + static char *dbOpenFile(DBBASE *pdbbase,const char *filename,FILE **fp) { ELLLIST *ppathList = (ELLLIST *)pdbbase->pathPvt; @@ -160,7 +160,7 @@ static char *dbOpenFile(DBBASE *pdbbase,const char *filename,FILE **fp) } pdbPathNode = (dbPathNode *)ellFirst(ppathList); while (pdbPathNode) { - fullfilename = dbMalloc(strlen(pdbPathNode->directory) + + fullfilename = dbMalloc(strlen(pdbPathNode->directory) + strlen(filename) + 2); strcpy(fullfilename, pdbPathNode->directory); strcat(fullfilename, "/"); @@ -181,7 +181,7 @@ static void freeInputFileList(void) inputFile *pinputFileNow; while((pinputFileNow=(inputFile *)ellFirst(&inputFileList))) { - if(fclose(pinputFileNow->fp)) + if(fclose(pinputFileNow->fp)) errPrintf(0,__FILE__, __LINE__, "Closing file %s",pinputFileNow->filename); free((void *)pinputFileNow->filename); @@ -189,7 +189,7 @@ static void freeInputFileList(void) free((void *)pinputFileNow); } } - + static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, const char *path,const char *substitutions) { @@ -197,7 +197,7 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, inputFile *pinputFile = NULL; char *penv; char **macPairs; - + if(*ppdbbase == 0) *ppdbbase = dbAllocBase(); pdbbase = *ppdbbase; if(path && strlen(path)>0) { @@ -230,7 +230,7 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, } pinputFile = dbCalloc(1,sizeof(inputFile)); if(filename) { - pinputFile->filename = macEnvExpand(filename); + pinputFile->filename = macEnvExpand(filename, NULL); } if(!fp) { FILE *fp1; @@ -302,12 +302,12 @@ long dbReadDatabase(DBBASE **ppdbbase,const char *filename, long dbReadDatabaseFP(DBBASE **ppdbbase,FILE *fp, const char *path,const char *substitutions) {return (dbReadCOM(ppdbbase,0,fp,path,substitutions));} - + static int db_yyinput(char *buf, int max_size) { size_t l,n; char *fgetsRtn; - + if(yyAbort) return(0); if(*my_buffer_ptr==0) { while(TRUE) { /*until we get some input*/ @@ -327,7 +327,7 @@ static int db_yyinput(char *buf, int max_size) fgetsRtn = fgets(my_buffer,MY_BUFFER_SIZE,pinputFileNow->fp); } if(fgetsRtn) break; - if(fclose(pinputFileNow->fp)) + if(fclose(pinputFileNow->fp)) errPrintf(0,__FILE__, __LINE__, "Closing file %s",pinputFileNow->filename); free((void *)pinputFileNow->filename); @@ -382,7 +382,7 @@ static void dbIncludeNew(char *filename) FILE *fp; pinputFile = dbCalloc(1,sizeof(inputFile)); - pinputFile->filename = macEnvExpand(filename); + pinputFile->filename = macEnvExpand(filename, NULL); pinputFile->path = dbOpenFile(pdbbase, pinputFile->filename, &fp); if (!fp) { epicsPrintf("Can't open include file \"%s\"\n", filename); @@ -395,7 +395,7 @@ static void dbIncludeNew(char *filename) ellAdd(&inputFileList,&pinputFile->node); pinputFileNow = pinputFile; } - + static void dbMenuHead(char *name) { dbMenu *pdbMenu; @@ -455,7 +455,7 @@ static void dbMenuBody(void) pgphentry->userPvt = pnewMenu; } } - + static void dbRecordtypeHead(char *name) { dbRecordType *pdbRecordType; @@ -478,7 +478,7 @@ static void dbRecordtypeFieldHead(char *name,char *type) { dbFldDes *pdbFldDes; int i; - + if(duplicate) return; pdbFldDes = dbCalloc(1,sizeof(dbFldDes)); allocTemp(pdbFldDes); @@ -492,11 +492,11 @@ static void dbRecordtypeFieldHead(char *name,char *type) } yyerrorAbort("Illegal Field Type"); } - + static void dbRecordtypeFieldItem(char *name,char *value) { dbFldDes *pdbFldDes; - + if(duplicate) return; pdbFldDes = (dbFldDes *)getLastTemp(); if(strcmp(name,"asl")==0) { @@ -590,23 +590,23 @@ static void dbRecordtypeFieldItem(char *name,char *value) return; } } - + static void dbRecordtypeCdef(char *text) { dbText *pdbCdef; tempListNode *ptempListNode; dbRecordType *pdbRecordType; - + if (!pdbbase->loadCdefs || duplicate) return; ptempListNode = (tempListNode *)ellFirst(&tempList); pdbRecordType = ptempListNode->item; - + pdbCdef = dbCalloc(1,sizeof(dbText)); if (text[0] == ' ') text++; /* strip leading space if present */ pdbCdef->text = epicsStrDup(text); ellAdd(&pdbRecordType->cdefList, &pdbCdef->node); return; } - + static void dbRecordtypeBody(void) { dbRecordType *pdbRecordType; @@ -641,7 +641,7 @@ static void dbRecordtypeBody(void) if((field_type==DBF_STRING) && (pdbFldDes->size==0)) fprintf(stderr,"recordtype(%s).%s size not specified\n", pdbRecordType->name,pdbFldDes->name); - if((field_type==DBF_NOACCESS) && (pdbFldDes->extra==0)) + if((field_type==DBF_NOACCESS) && (pdbFldDes->extra==0)) fprintf(stderr,"recordtype(%s).%s extra not specified\n", pdbRecordType->name,pdbFldDes->name); } @@ -693,7 +693,7 @@ static void dbRecordtypeBody(void) } ellAdd(&pdbbase->recordTypeList,&pdbRecordType->node); } - + static void dbDevice(char *recordtype,char *linktype, char *dsetname,char *choicestring) { @@ -738,7 +738,7 @@ static void dbDevice(char *recordtype,char *linktype, } ellAdd(&pdbRecordType->devList,&pdevSup->node); } - + static void dbDriver(char *name) { drvSup *pdrvSup; @@ -753,7 +753,7 @@ static void dbDriver(char *name) pgphentry = gphAdd(pdbbase->pgpHash,pdrvSup->name,&pdbbase->drvList); if(!pgphentry) { yyerrorAbort("gphAdd failed"); - } + } pgphentry->userPvt = pdrvSup; ellAdd(&pdbbase->drvList,&pdrvSup->node); } @@ -772,7 +772,7 @@ static void dbRegistrar(char *name) pgphentry = gphAdd(pdbbase->pgpHash,ptext->text,&pdbbase->registrarList); if(!pgphentry) { yyerrorAbort("gphAdd failed"); - } + } pgphentry->userPvt = ptext; ellAdd(&pdbbase->registrarList,&ptext->node); } @@ -811,7 +811,7 @@ static void dbVariable(char *name, char *type) pgphentry = gphAdd(pdbbase->pgpHash,pvar->name,&pdbbase->variableList); if(!pgphentry) { yyerrorAbort("gphAdd failed"); - } + } pgphentry->userPvt = pvar; ellAdd(&pdbbase->variableList,&pvar->node); } @@ -841,7 +841,7 @@ static void dbBreakItem(char *value) } allocTemp(epicsStrDup(value)); } - + static void dbBreakBody(void) { brkTable *pnewbrkTable; @@ -870,11 +870,11 @@ static void dbBreakBody(void) pnewbrkTable->paBrkInt = paBrkInt = dbCalloc(number, sizeof(brkInt)); for (i=0; iuserPvt = pnewbrkTable; } - + static void dbRecordHead(char *recordType, char *name, int visible) { char *badch; @@ -995,7 +995,7 @@ static void dbRecordField(char *name,char *value) pdbentry = ptempListNode->item; status = dbFindField(pdbentry,name); if(status) { - epicsPrintf("Record \"%s\" does not have a field \"%s\"\n", + epicsPrintf("Record \"%s\" does not have a field \"%s\"\n", dbGetRecordName(pdbentry), name); yyerror(NULL); return; From 8d33108dd839af04a6da1022d102b0f4d98c7667 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Wed, 20 Aug 2014 13:28:55 -0500 Subject: [PATCH 05/29] changed msi.c's use of macEnvExpand to have NULL macros --- src/ioc/dbtemplate/msi.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/ioc/dbtemplate/msi.c b/src/ioc/dbtemplate/msi.c index 782161a7f..3884b9bc5 100644 --- a/src/ioc/dbtemplate/msi.c +++ b/src/ioc/dbtemplate/msi.c @@ -4,7 +4,7 @@ * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * EPICS Base is distributed subject to a Software License Agreement found -* in the file LICENSE that is included with this distribution. +* in the file LICENSE that is included with this distribution. \*************************************************************************/ /* msi - macro substitutions and include */ @@ -54,7 +54,7 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem /*Global variables */ static int opt_V = 0; - + int main(int argc,char **argv) { inputData *inputPvt; @@ -141,7 +141,7 @@ int main(int argc,char **argv) free(substitutionName); return opt_V & 2; } - + void usageExit(void) { fprintf(stderr,"usage: msi [options] [template]\n"); @@ -192,7 +192,7 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem char *p; char *command = 0; - p = input; + p = input; /*skip whitespace at beginning of line*/ while(*p && (isspace((int) *p))) ++p; /*Look for i or s */ @@ -203,7 +203,7 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem char *copy; int cmdind=-1; int i; - + for(i=0; i< NELEMENTS(cmdNames); i++) { if(strstr(command,cmdNames[i])) { cmdind = i; @@ -259,7 +259,7 @@ endif: } } } - + typedef struct inputFile{ ELLNODE node; char *filename; @@ -304,7 +304,7 @@ static void inputDestruct(inputData *pinputData) } free(pinputData); } - + static void inputAddPath(inputData *pinputData, char *path) { ELLLIST *ppathList = &pinputData->pathList; @@ -342,7 +342,7 @@ static void inputAddPath(inputData *pinputData, char *path) } return; } - + static void inputBegin(inputData *pinputData, char *fileName) { inputCloseAllFiles(pinputData); @@ -392,7 +392,7 @@ static void inputErrPrint(inputData *pinputData) } fprintf(stderr,"\n"); } - + static void inputOpenFile(inputData *pinputData,char *filename) { ELLLIST *ppathList = &pinputData->pathList; @@ -443,7 +443,7 @@ static void inputCloseFile(inputData *pinputData) pinputFile = (inputFile *)ellFirst(&pinputData->inputFileList); if(!pinputFile) return; ellDelete(&pinputData->inputFileList,&pinputFile->node); - if(fclose(pinputFile->fp)) + if(fclose(pinputFile->fp)) fprintf(stderr,"msi: Can't close input file '%s'\n",pinputFile->filename); free(pinputFile->filename); free(pinputFile); @@ -457,7 +457,7 @@ static void inputCloseAllFiles(inputData *pinputData) inputCloseFile(pinputData); } } - + /*start of code that handles substitution file*/ typedef enum { tokenLBrace,tokenRBrace,tokenSeparater,tokenString,tokenEOF @@ -518,7 +518,7 @@ void freePattern(subInfo *psubInfo) } psubInfo->isPattern = 0; } - + static void substituteDestruct(subInfo *psubInfo) { freeSubFile(psubInfo); @@ -582,10 +582,10 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename) free(psubInfo->filename); if(psubFile->string[0]=='"'&&psubFile->string[strlen(psubFile->string)-1]=='"') { psubFile->string[strlen(psubFile->string)-1]='\0'; - psubInfo->filename = macEnvExpand(psubFile->string+1); + psubInfo->filename = macEnvExpand(psubFile->string+1, NULL); } else { - psubInfo->filename = macEnvExpand(psubFile->string); + psubInfo->filename = macEnvExpand(psubFile->string, NULL); } while(subGetNextToken(psubFile)==tokenSeparater); if(psubFile->token!=tokenLBrace) { @@ -624,7 +624,7 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename) subGetNextToken(psubFile); return(1); } - + static char *substituteGetGlobalReplacements(subInfo *psubInfo) { subFile *psubFile = psubInfo->psubFile; @@ -727,7 +727,7 @@ static char *substituteGetReplacements(subInfo *psubInfo) } } } - + static char *subGetNextLine(subFile *psubFile) { char *pline; @@ -754,7 +754,7 @@ static void subFileErrPrint(subFile *psubFile,char * message) psubFile->lineNum,psubFile->inputBuffer); } - + static tokenType subGetNextToken(subFile *psubFile) { char *p; @@ -809,7 +809,7 @@ static tokenType subGetNextToken(subFile *psubFile) } /*Now take anything up to next non String token and not space*/ pto = &psubFile->string[0]; - while(!isspace((int) *p) && (strspn(p,"\",{}")==0)) *pto++ = *p++; + while(!isspace((int) *p) && (strspn(p,"\",{}")==0)) *pto++ = *p++; *pto = 0; psubFile->pnextChar = p; psubFile->token = tokenString; From 6ebbf0dd8ce0f3943bf751180d97a462c9fa7100 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Wed, 20 Aug 2014 16:58:50 -0500 Subject: [PATCH 06/29] Whitespace changes snuck in due to editor --- src/ioc/dbStatic/dbLexRoutines.c | 54 +++++++++++++++--------------- src/ioc/dbtemplate/msi.c | 28 ++++++++-------- src/libCom/iocsh/iocsh.cpp | 12 +++---- src/libCom/iocsh/iocsh.h | 4 +-- src/libCom/macLib/macEnv.c | 25 ++++++-------- src/libCom/macLib/macLib.h | 4 +-- src/libCom/test/macEnvExpandTest.c | 2 +- 7 files changed, 63 insertions(+), 66 deletions(-) diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index 75453dcac..162df824b 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -4,7 +4,7 @@ * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* $Revision-Id$ */ @@ -36,7 +36,7 @@ #include "dbStaticLib.h" #include "dbStaticPvt.h" - + /*global declarations*/ epicsShareDef char *makeDbdDepends=0; @@ -107,7 +107,7 @@ typedef struct tempListNode { static ELLLIST tempList = ELLLIST_INIT; static void *freeListPvt = NULL; static int duplicate = FALSE; - + static void yyerrorAbort(char *str) { yyerror(str); @@ -142,7 +142,7 @@ static void *getLastTemp(void) ptempListNode = (tempListNode *)ellLast(&tempList); return(ptempListNode->item); } - + static char *dbOpenFile(DBBASE *pdbbase,const char *filename,FILE **fp) { ELLLIST *ppathList = (ELLLIST *)pdbbase->pathPvt; @@ -160,7 +160,7 @@ static char *dbOpenFile(DBBASE *pdbbase,const char *filename,FILE **fp) } pdbPathNode = (dbPathNode *)ellFirst(ppathList); while (pdbPathNode) { - fullfilename = dbMalloc(strlen(pdbPathNode->directory) + + fullfilename = dbMalloc(strlen(pdbPathNode->directory) + strlen(filename) + 2); strcpy(fullfilename, pdbPathNode->directory); strcat(fullfilename, "/"); @@ -181,7 +181,7 @@ static void freeInputFileList(void) inputFile *pinputFileNow; while((pinputFileNow=(inputFile *)ellFirst(&inputFileList))) { - if(fclose(pinputFileNow->fp)) + if(fclose(pinputFileNow->fp)) errPrintf(0,__FILE__, __LINE__, "Closing file %s",pinputFileNow->filename); free((void *)pinputFileNow->filename); @@ -189,7 +189,7 @@ static void freeInputFileList(void) free((void *)pinputFileNow); } } - + static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, const char *path,const char *substitutions) { @@ -197,7 +197,7 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, inputFile *pinputFile = NULL; char *penv; char **macPairs; - + if(*ppdbbase == 0) *ppdbbase = dbAllocBase(); pdbbase = *ppdbbase; if(path && strlen(path)>0) { @@ -302,12 +302,12 @@ long dbReadDatabase(DBBASE **ppdbbase,const char *filename, long dbReadDatabaseFP(DBBASE **ppdbbase,FILE *fp, const char *path,const char *substitutions) {return (dbReadCOM(ppdbbase,0,fp,path,substitutions));} - + static int db_yyinput(char *buf, int max_size) { size_t l,n; char *fgetsRtn; - + if(yyAbort) return(0); if(*my_buffer_ptr==0) { while(TRUE) { /*until we get some input*/ @@ -327,7 +327,7 @@ static int db_yyinput(char *buf, int max_size) fgetsRtn = fgets(my_buffer,MY_BUFFER_SIZE,pinputFileNow->fp); } if(fgetsRtn) break; - if(fclose(pinputFileNow->fp)) + if(fclose(pinputFileNow->fp)) errPrintf(0,__FILE__, __LINE__, "Closing file %s",pinputFileNow->filename); free((void *)pinputFileNow->filename); @@ -395,7 +395,7 @@ static void dbIncludeNew(char *filename) ellAdd(&inputFileList,&pinputFile->node); pinputFileNow = pinputFile; } - + static void dbMenuHead(char *name) { dbMenu *pdbMenu; @@ -455,7 +455,7 @@ static void dbMenuBody(void) pgphentry->userPvt = pnewMenu; } } - + static void dbRecordtypeHead(char *name) { dbRecordType *pdbRecordType; @@ -478,7 +478,7 @@ static void dbRecordtypeFieldHead(char *name,char *type) { dbFldDes *pdbFldDes; int i; - + if(duplicate) return; pdbFldDes = dbCalloc(1,sizeof(dbFldDes)); allocTemp(pdbFldDes); @@ -492,11 +492,11 @@ static void dbRecordtypeFieldHead(char *name,char *type) } yyerrorAbort("Illegal Field Type"); } - + static void dbRecordtypeFieldItem(char *name,char *value) { dbFldDes *pdbFldDes; - + if(duplicate) return; pdbFldDes = (dbFldDes *)getLastTemp(); if(strcmp(name,"asl")==0) { @@ -590,23 +590,23 @@ static void dbRecordtypeFieldItem(char *name,char *value) return; } } - + static void dbRecordtypeCdef(char *text) { dbText *pdbCdef; tempListNode *ptempListNode; dbRecordType *pdbRecordType; - + if (!pdbbase->loadCdefs || duplicate) return; ptempListNode = (tempListNode *)ellFirst(&tempList); pdbRecordType = ptempListNode->item; - + pdbCdef = dbCalloc(1,sizeof(dbText)); if (text[0] == ' ') text++; /* strip leading space if present */ pdbCdef->text = epicsStrDup(text); ellAdd(&pdbRecordType->cdefList, &pdbCdef->node); return; } - + static void dbRecordtypeBody(void) { dbRecordType *pdbRecordType; @@ -753,7 +753,7 @@ static void dbDriver(char *name) pgphentry = gphAdd(pdbbase->pgpHash,pdrvSup->name,&pdbbase->drvList); if(!pgphentry) { yyerrorAbort("gphAdd failed"); - } + } pgphentry->userPvt = pdrvSup; ellAdd(&pdbbase->drvList,&pdrvSup->node); } @@ -772,7 +772,7 @@ static void dbRegistrar(char *name) pgphentry = gphAdd(pdbbase->pgpHash,ptext->text,&pdbbase->registrarList); if(!pgphentry) { yyerrorAbort("gphAdd failed"); - } + } pgphentry->userPvt = ptext; ellAdd(&pdbbase->registrarList,&ptext->node); } @@ -811,7 +811,7 @@ static void dbVariable(char *name, char *type) pgphentry = gphAdd(pdbbase->pgpHash,pvar->name,&pdbbase->variableList); if(!pgphentry) { yyerrorAbort("gphAdd failed"); - } + } pgphentry->userPvt = pvar; ellAdd(&pdbbase->variableList,&pvar->node); } @@ -870,11 +870,11 @@ static void dbBreakBody(void) pnewbrkTable->paBrkInt = paBrkInt = dbCalloc(number, sizeof(brkInt)); for (i=0; iuserPvt = pnewbrkTable; } - + static void dbRecordHead(char *recordType, char *name, int visible) { char *badch; @@ -995,7 +995,7 @@ static void dbRecordField(char *name,char *value) pdbentry = ptempListNode->item; status = dbFindField(pdbentry,name); if(status) { - epicsPrintf("Record \"%s\" does not have a field \"%s\"\n", + epicsPrintf("Record \"%s\" does not have a field \"%s\"\n", dbGetRecordName(pdbentry), name); yyerror(NULL); return; diff --git a/src/ioc/dbtemplate/msi.c b/src/ioc/dbtemplate/msi.c index 3884b9bc5..5a5baab68 100644 --- a/src/ioc/dbtemplate/msi.c +++ b/src/ioc/dbtemplate/msi.c @@ -4,7 +4,7 @@ * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * EPICS Base is distributed subject to a Software License Agreement found -* in the file LICENSE that is included with this distribution. +* in the file LICENSE that is included with this distribution. \*************************************************************************/ /* msi - macro substitutions and include */ @@ -54,7 +54,7 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem /*Global variables */ static int opt_V = 0; - + int main(int argc,char **argv) { inputData *inputPvt; @@ -141,7 +141,7 @@ int main(int argc,char **argv) free(substitutionName); return opt_V & 2; } - + void usageExit(void) { fprintf(stderr,"usage: msi [options] [template]\n"); @@ -192,7 +192,7 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem char *p; char *command = 0; - p = input; + p = input; /*skip whitespace at beginning of line*/ while(*p && (isspace((int) *p))) ++p; /*Look for i or s */ @@ -203,7 +203,7 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem char *copy; int cmdind=-1; int i; - + for(i=0; i< NELEMENTS(cmdNames); i++) { if(strstr(command,cmdNames[i])) { cmdind = i; @@ -259,7 +259,7 @@ endif: } } } - + typedef struct inputFile{ ELLNODE node; char *filename; @@ -304,7 +304,7 @@ static void inputDestruct(inputData *pinputData) } free(pinputData); } - + static void inputAddPath(inputData *pinputData, char *path) { ELLLIST *ppathList = &pinputData->pathList; @@ -443,7 +443,7 @@ static void inputCloseFile(inputData *pinputData) pinputFile = (inputFile *)ellFirst(&pinputData->inputFileList); if(!pinputFile) return; ellDelete(&pinputData->inputFileList,&pinputFile->node); - if(fclose(pinputFile->fp)) + if(fclose(pinputFile->fp)) fprintf(stderr,"msi: Can't close input file '%s'\n",pinputFile->filename); free(pinputFile->filename); free(pinputFile); @@ -457,7 +457,7 @@ static void inputCloseAllFiles(inputData *pinputData) inputCloseFile(pinputData); } } - + /*start of code that handles substitution file*/ typedef enum { tokenLBrace,tokenRBrace,tokenSeparater,tokenString,tokenEOF @@ -518,7 +518,7 @@ void freePattern(subInfo *psubInfo) } psubInfo->isPattern = 0; } - + static void substituteDestruct(subInfo *psubInfo) { freeSubFile(psubInfo); @@ -624,7 +624,7 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename) subGetNextToken(psubFile); return(1); } - + static char *substituteGetGlobalReplacements(subInfo *psubInfo) { subFile *psubFile = psubInfo->psubFile; @@ -727,7 +727,7 @@ static char *substituteGetReplacements(subInfo *psubInfo) } } } - + static char *subGetNextLine(subFile *psubFile) { char *pline; @@ -754,7 +754,7 @@ static void subFileErrPrint(subFile *psubFile,char * message) psubFile->lineNum,psubFile->inputBuffer); } - + static tokenType subGetNextToken(subFile *psubFile) { char *p; @@ -809,7 +809,7 @@ static tokenType subGetNextToken(subFile *psubFile) } /*Now take anything up to next non String token and not space*/ pto = &psubFile->string[0]; - while(!isspace((int) *p) && (strspn(p,"\",{}")==0)) *pto++ = *p++; + while(!isspace((int) *p) && (strspn(p,"\",{}")==0)) *pto++ = *p++; *pto = 0; psubFile->pnextChar = p; psubFile->token = tokenString; diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index c918d270c..1e1caa202 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -4,7 +4,7 @@ * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* iocsh.cpp */ /* Author: Marty Kraimer Date: 27APR2000 */ @@ -201,7 +201,7 @@ void epicsShareAPI iocshRegisterVariable (const iocshVarDef *piocshVarDef) /* * Free storage created by iocshRegister/iocshRegisterVariable */ -void epicsShareAPI iocshFree(void) +void epicsShareAPI iocshFree(void) { struct iocshCommand *pc; struct iocshVariable *pv; @@ -498,7 +498,7 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) struct iocshCommand *found; void *readlineContext = NULL; int wasOkToBlock; - + /* * See if command interpreter is interactive */ @@ -585,7 +585,7 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) * Expand macros */ free(line); - if ((line = macEnvExpand(raw, macros)) == NULL) + if ((line = macEnvExpand(raw)) == NULL) continue; /* @@ -831,11 +831,11 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) * External access to the command interpreter */ int epicsShareAPI -iocsh (const char *pathname) +iocsh (const char *pathname, const char* macros) { if (pathname) epicsEnvSet("IOCSH_STARTUP_SCRIPT", pathname); - return iocshBody(pathname, NULL, NULL); + return iocshBody(pathname, NULL, macros); } int epicsShareAPI diff --git a/src/libCom/iocsh/iocsh.h b/src/libCom/iocsh/iocsh.h index 9000f2a4d..c86cc81af 100644 --- a/src/libCom/iocsh/iocsh.h +++ b/src/libCom/iocsh/iocsh.h @@ -5,7 +5,7 @@ * Operator of Los Alamos National Laboratory. * EPICS BASE Versions 3.13.7 * and higher are distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* iocsh.h ioc: call registered function*/ /* Author: Marty Kraimer Date: 27APR2000 */ @@ -68,7 +68,7 @@ epicsShareFunc void epicsShareAPI iocshRegisterVariable ( /* This should only be called when iocsh is no longer needed*/ epicsShareFunc void epicsShareAPI iocshFree(void); -epicsShareFunc int epicsShareAPI iocsh(const char *pathname); +epicsShareFunc int epicsShareAPI iocsh(const char *pathname, const char* macros); epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd, const char* macros); /* 'weak' link to pdbbase */ diff --git a/src/libCom/macLib/macEnv.c b/src/libCom/macLib/macEnv.c index 596133056..fc362d953 100644 --- a/src/libCom/macLib/macEnv.c +++ b/src/libCom/macLib/macEnv.c @@ -2,7 +2,7 @@ * Copyright (c) 2009 UChicago Argonne LLC, as Operator of Argonne * National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* $Revision-Id$ * @@ -23,8 +23,8 @@ macEnvExpand(const char *str, const char* macros) { MAC_HANDLE *handle; static char *pairs[] = { "", "environ", NULL, NULL }; - char** defines; - long destCapacity = 128; + char** defines; + long destCapacity = 128; char *dest = NULL; int n; @@ -33,17 +33,14 @@ macEnvExpand(const char *str, const char* macros) return NULL; } - if (macros) - { - if (macParseDefns(handle, macros, &defines) < 0) - { - cantProceed("macEnvExpand: invalid macro string"); - } - else - { - macInstallMacros(handle, defines); - } - } + if (macros) { + if (macParseDefns(handle, macros, &defines) < 0) { + cantProceed("macEnvExpand: invalid macro string"); + } + else { + macInstallMacros(handle, defines); + } + } do { destCapacity *= 2; diff --git a/src/libCom/macLib/macLib.h b/src/libCom/macLib/macLib.h index bbfd44aef..c4fc451db 100644 --- a/src/libCom/macLib/macLib.h +++ b/src/libCom/macLib/macLib.h @@ -4,7 +4,7 @@ * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* $Revision-Id$ * @@ -149,7 +149,7 @@ epicsShareAPI macInstallMacros( epicsShareFunc char * /* expanded string; NULL if any undefined macros */ epicsShareAPI macEnvExpand( const char *str, /* string to be expanded */ - const char *macros /* macro definitions in "a=xxx, b=yyy" */ + const char *macros /* macro definitions in "a=xxx, b=yyy" */ ); #ifdef __cplusplus diff --git a/src/libCom/test/macEnvExpandTest.c b/src/libCom/test/macEnvExpandTest.c index f3e9d924a..e37af38f7 100644 --- a/src/libCom/test/macEnvExpandTest.c +++ b/src/libCom/test/macEnvExpandTest.c @@ -152,7 +152,7 @@ MAIN(macEnvExpandTest) check("${FOO,FOO=$(FOO)}", NULL); check("${FOO=$(FOO)}", NULL); check("${FOO=$(BAR),BAR=$(FOO)}", NULL); - + errlogFlush(); eltc(1); return testDone(); From 77f1fc0504349bca157b6421795a9c80193c0e45 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Wed, 20 Aug 2014 17:01:36 -0500 Subject: [PATCH 07/29] Missed a few whitespace --- src/ioc/dbStatic/dbLexRoutines.c | 8 ++++---- src/ioc/dbtemplate/msi.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index 162df824b..6f1466229 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -641,7 +641,7 @@ static void dbRecordtypeBody(void) if((field_type==DBF_STRING) && (pdbFldDes->size==0)) fprintf(stderr,"recordtype(%s).%s size not specified\n", pdbRecordType->name,pdbFldDes->name); - if((field_type==DBF_NOACCESS) && (pdbFldDes->extra==0)) + if((field_type==DBF_NOACCESS) && (pdbFldDes->extra==0)) fprintf(stderr,"recordtype(%s).%s extra not specified\n", pdbRecordType->name,pdbFldDes->name); } @@ -693,7 +693,7 @@ static void dbRecordtypeBody(void) } ellAdd(&pdbbase->recordTypeList,&pdbRecordType->node); } - + static void dbDevice(char *recordtype,char *linktype, char *dsetname,char *choicestring) { @@ -738,7 +738,7 @@ static void dbDevice(char *recordtype,char *linktype, } ellAdd(&pdbRecordType->devList,&pdevSup->node); } - + static void dbDriver(char *name) { drvSup *pdrvSup; @@ -841,7 +841,7 @@ static void dbBreakItem(char *value) } allocTemp(epicsStrDup(value)); } - + static void dbBreakBody(void) { brkTable *pnewbrkTable; diff --git a/src/ioc/dbtemplate/msi.c b/src/ioc/dbtemplate/msi.c index 5a5baab68..d3acba707 100644 --- a/src/ioc/dbtemplate/msi.c +++ b/src/ioc/dbtemplate/msi.c @@ -342,7 +342,7 @@ static void inputAddPath(inputData *pinputData, char *path) } return; } - + static void inputBegin(inputData *pinputData, char *fileName) { inputCloseAllFiles(pinputData); @@ -392,7 +392,7 @@ static void inputErrPrint(inputData *pinputData) } fprintf(stderr,"\n"); } - + static void inputOpenFile(inputData *pinputData,char *filename) { ELLLIST *ppathList = &pinputData->pathList; From 6d38cc1f764e5cbcaab996ef3f56848268202094 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Thu, 21 Aug 2014 15:19:50 -0500 Subject: [PATCH 08/29] Returned iocshCmd to it's original function signature, added iocshLoadFile instead --- src/libCom/iocsh/iocsh.cpp | 34 +++++++++++++++++++++++++--------- src/libCom/iocsh/iocsh.h | 5 +++-- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index 1e1caa202..9bb718e0c 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -585,7 +585,7 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) * Expand macros */ free(line); - if ((line = macEnvExpand(raw)) == NULL) + if ((line = macEnvExpand(raw, macros)) == NULL) continue; /* @@ -831,19 +831,25 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) * External access to the command interpreter */ int epicsShareAPI -iocsh (const char *pathname, const char* macros) +iocsh (const char *pathname) { if (pathname) epicsEnvSet("IOCSH_STARTUP_SCRIPT", pathname); - return iocshBody(pathname, NULL, macros); + return iocshBody(pathname, NULL, NULL); } int epicsShareAPI -iocshCmd (const char *cmd, const char* macros) +iocshCmd (const char *cmd) { if (cmd == NULL) return 0; - return iocshBody(NULL, cmd, macros); + return iocshBody(NULL, cmd, NULL); +} + +int epicsShareAPI +iocshLoadFile(const char *pathname, const char *macros) +{ + return iocshBody(pathname, NULL, macros); } /* @@ -919,12 +925,21 @@ static void varCallFunc(const iocshArgBuf *args) /* iocshCmd */ static const iocshArg iocshCmdArg0 = { "command",iocshArgString}; -static const iocshArg iocshCmdArg1 = { "macros", iocshArgString}; -static const iocshArg *iocshCmdArgs[2] = {&iocshCmdArg0, &iocshCmdArg1}; -static const iocshFuncDef iocshCmdFuncDef = {"iocshCmd",2,iocshCmdArgs}; +static const iocshArg *iocshCmdArgs[1] = {&iocshCmdArg0}; +static const iocshFuncDef iocshCmdFuncDef = {"iocshCmd",1,iocshCmdArgs}; static void iocshCmdCallFunc(const iocshArgBuf *args) { - iocshCmd(args[0].sval, args[1].sval); + iocshCmd(args[0].sval); +} + +/* iocshLoadFile */ +static const iocshArg iocshLoadArg0 = { "pathname",iocshArgString}; +static const iocshArg iocshLoadArg1 = { "macros", iocshArgString}; +static const iocshArg *iocshLoadArgs[2] = {&iocshLoadArg0, &iocshLoadArg1}; +static const iocshFuncDef iocshLoadFuncDef = {"iocshLoadFile",2,iocshLoadArgs}; +static void iocshLoadCallFunc(const iocshArgBuf *args) +{ + iocshLoadFile(args[0].sval, args[1].sval); } /* @@ -954,6 +969,7 @@ static void localRegister (void) iocshRegister(&exitFuncDef,exitCallFunc); iocshRegister(&helpFuncDef,helpCallFunc); iocshRegister(&iocshCmdFuncDef,iocshCmdCallFunc); + iocshRegister(&iocshLoadFuncDef,iocshLoadCallFunc); } } /* extern "C" */ diff --git a/src/libCom/iocsh/iocsh.h b/src/libCom/iocsh/iocsh.h index c86cc81af..3178eac46 100644 --- a/src/libCom/iocsh/iocsh.h +++ b/src/libCom/iocsh/iocsh.h @@ -68,8 +68,9 @@ epicsShareFunc void epicsShareAPI iocshRegisterVariable ( /* This should only be called when iocsh is no longer needed*/ epicsShareFunc void epicsShareAPI iocshFree(void); -epicsShareFunc int epicsShareAPI iocsh(const char *pathname, const char* macros); -epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd, const char* macros); +epicsShareFunc int epicsShareAPI iocsh(const char *pathname); +epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd); +epicsShareFunc int epicsShareAPI iocshLoadFile(const char *pathname, const char* macros); /* 'weak' link to pdbbase */ epicsShareExtern struct dbBase **iocshPpdbbase; From 6d3b70251ceb7e870473d79828529b04513782fe Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Thu, 21 Aug 2014 16:05:55 -0500 Subject: [PATCH 09/29] Returned macEnvExpand to original parameters, added macDefExpand --- src/libCom/macLib/macEnv.c | 14 ++++++++++---- src/libCom/macLib/macLib.h | 5 +++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/libCom/macLib/macEnv.c b/src/libCom/macLib/macEnv.c index fc362d953..d78769138 100644 --- a/src/libCom/macLib/macEnv.c +++ b/src/libCom/macLib/macEnv.c @@ -19,7 +19,13 @@ #include "macLib.h" char * epicsShareAPI -macEnvExpand(const char *str, const char* macros) +macEnvExpand(const char *str) +{ + return macDefExpand(str, NULL); +} + +char * epicsShareAPI +macDefExpand(const char *str, const char *macros) { MAC_HANDLE *handle; static char *pairs[] = { "", "environ", NULL, NULL }; @@ -29,13 +35,13 @@ macEnvExpand(const char *str, const char* macros) int n; if (macCreateHandle(&handle, pairs)){ - errlogMessage("macEnvExpand: macCreateHandle failed."); + errlogMessage("macDefExpand: macCreateHandle failed."); return NULL; } if (macros) { if (macParseDefns(handle, macros, &defines) < 0) { - cantProceed("macEnvExpand: invalid macro string"); + cantProceed("macDefExpand: invalid macro string"); } else { macInstallMacros(handle, defines); @@ -68,6 +74,6 @@ macEnvExpand(const char *str, const char* macros) done: if (macDeleteHandle(handle)) - errlogMessage("macEnvExpand: macDeleteHandle failed."); + errlogMessage("macDefExpand: macDeleteHandle failed."); return dest; } diff --git a/src/libCom/macLib/macLib.h b/src/libCom/macLib/macLib.h index c4fc451db..44970ff10 100644 --- a/src/libCom/macLib/macLib.h +++ b/src/libCom/macLib/macLib.h @@ -148,6 +148,11 @@ epicsShareAPI macInstallMacros( epicsShareFunc char * /* expanded string; NULL if any undefined macros */ epicsShareAPI macEnvExpand( + const char *str /* string to be expanded */ +); + +epicsShareFunc char * /* expanded string; NULL if any undefined macros */ +epicsShareAPI macDefExpand( const char *str, /* string to be expanded */ const char *macros /* macro definitions in "a=xxx, b=yyy" */ ); From 76bd45cb4554ad6d72a3ddd5ace037395313ac40 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Thu, 21 Aug 2014 16:09:21 -0500 Subject: [PATCH 10/29] Reverted calls that didn't need to use macDefExpand to single parameter --- src/ioc/dbStatic/dbLexRoutines.c | 4 ++-- src/ioc/dbtemplate/msi.c | 4 ++-- src/libCom/iocsh/iocsh.cpp | 2 +- src/libCom/test/macEnvExpandTest.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index 6f1466229..cf2406556 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -230,7 +230,7 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, } pinputFile = dbCalloc(1,sizeof(inputFile)); if(filename) { - pinputFile->filename = macEnvExpand(filename, NULL); + pinputFile->filename = macEnvExpand(filename); } if(!fp) { FILE *fp1; @@ -382,7 +382,7 @@ static void dbIncludeNew(char *filename) FILE *fp; pinputFile = dbCalloc(1,sizeof(inputFile)); - pinputFile->filename = macEnvExpand(filename, NULL); + pinputFile->filename = macEnvExpand(filename); pinputFile->path = dbOpenFile(pdbbase, pinputFile->filename, &fp); if (!fp) { epicsPrintf("Can't open include file \"%s\"\n", filename); diff --git a/src/ioc/dbtemplate/msi.c b/src/ioc/dbtemplate/msi.c index d3acba707..782161a7f 100644 --- a/src/ioc/dbtemplate/msi.c +++ b/src/ioc/dbtemplate/msi.c @@ -582,10 +582,10 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename) free(psubInfo->filename); if(psubFile->string[0]=='"'&&psubFile->string[strlen(psubFile->string)-1]=='"') { psubFile->string[strlen(psubFile->string)-1]='\0'; - psubInfo->filename = macEnvExpand(psubFile->string+1, NULL); + psubInfo->filename = macEnvExpand(psubFile->string+1); } else { - psubInfo->filename = macEnvExpand(psubFile->string, NULL); + psubInfo->filename = macEnvExpand(psubFile->string); } while(subGetNextToken(psubFile)==tokenSeparater); if(psubFile->token!=tokenLBrace) { diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index 9bb718e0c..a7054b33d 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -585,7 +585,7 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) * Expand macros */ free(line); - if ((line = macEnvExpand(raw, macros)) == NULL) + if ((line = macDefExpand(raw, macros)) == NULL) continue; /* diff --git a/src/libCom/test/macEnvExpandTest.c b/src/libCom/test/macEnvExpandTest.c index e37af38f7..b56cc366a 100644 --- a/src/libCom/test/macEnvExpandTest.c +++ b/src/libCom/test/macEnvExpandTest.c @@ -23,7 +23,7 @@ static void check(const char *str, const char *expect) { - char *got = macEnvExpand(str, NULL); + char *got = macEnvExpand(str); int pass = -1; if (expect && !got) { From dfe65158098fc0cd2a288466810934e6f9fb1454 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Thu, 21 Aug 2014 16:12:11 -0500 Subject: [PATCH 11/29] offset by a space --- src/libCom/macLib/macLib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libCom/macLib/macLib.h b/src/libCom/macLib/macLib.h index 44970ff10..89dccf72c 100644 --- a/src/libCom/macLib/macLib.h +++ b/src/libCom/macLib/macLib.h @@ -148,7 +148,7 @@ epicsShareAPI macInstallMacros( epicsShareFunc char * /* expanded string; NULL if any undefined macros */ epicsShareAPI macEnvExpand( - const char *str /* string to be expanded */ + const char *str /* string to be expanded */ ); epicsShareFunc char * /* expanded string; NULL if any undefined macros */ From 28a01eb5727d8e8878e533fcfc7105a72b9f33f0 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Thu, 21 Aug 2014 16:54:39 -0500 Subject: [PATCH 12/29] Added macDefExpand tests to libCom Test Harness --- src/libCom/test/Makefile | 5 +++++ src/libCom/test/epicsRunLibComTests.c | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index fd4800953..05dc4dd75 100755 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -161,6 +161,11 @@ macEnvExpandTest_SRCS += macEnvExpandTest.c testHarness_SRCS += macEnvExpandTest.c TESTS += macEnvExpandTest +TESTPROD_HOST += macDefExpandTest +macDefExpandTest_SRCS += macDefExpandTest.c +testHarness_SRCS += macDefExpandTest.c +TESTS += macDefExpandTest + TESTPROD_HOST += macLibTest macLibTest_SRCS += macLibTest.c testHarness_SRCS += macLibTest.c diff --git a/src/libCom/test/epicsRunLibComTests.c b/src/libCom/test/epicsRunLibComTests.c index a20167e17..0144dc77d 100644 --- a/src/libCom/test/epicsRunLibComTests.c +++ b/src/libCom/test/epicsRunLibComTests.c @@ -41,6 +41,7 @@ int epicsTimeTest(void); int epicsTypesTest(void); int macLibTest(void); int macEnvExpandTest(void); +int macDefExpandTest(void); int ringPointerTest(void); int ringBytesTest(void); int blockingSockTest(void); @@ -107,6 +108,8 @@ void epicsRunLibComTests(void) runTest(macLibTest); runTest(macEnvExpandTest); + + runTest(macDefExpandTest); runTest(ringPointerTest); From 8750ff880760fd3a75518d03478330be914e810e Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Thu, 21 Aug 2014 16:55:26 -0500 Subject: [PATCH 13/29] macDefExpand test file --- src/libCom/test/macDefExpandTest.c | 147 +++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 src/libCom/test/macDefExpandTest.c diff --git a/src/libCom/test/macDefExpandTest.c b/src/libCom/test/macDefExpandTest.c new file mode 100644 index 000000000..bdbf41b3e --- /dev/null +++ b/src/libCom/test/macDefExpandTest.c @@ -0,0 +1,147 @@ +/*************************************************************************\ +* Copyright (c) 2006 UChicago Argonne LLC, as Operator of Argonne +* National Laboratory. +* Copyright (c) 2002 The Regents of the University of California, as +* Operator of Los Alamos National Laboratory. +* EPICS BASE is distributed subject to a Software License Agreement found +* in file LICENSE that is included with this distribution. +\*************************************************************************/ +/* + * $Revision-Id$ + */ + +#include +#include +#include +#include + +#include "macLib.h" +#include "envDefs.h" +#include "errlog.h" +#include "epicsUnitTest.h" +#include "testMain.h" + +static void check(const char *str, const char *macros, const char *expect) +{ + char *got = macDefExpand(str, macros); + int pass = -1; + + if (expect && !got) { + testDiag("Got NULL, expected \"%s\".\n", expect); + pass = 0; + } + else if (!expect && got) { + testDiag("Got \"%s\", expected NULL.\n", got); + pass = 0; + } + else if (expect && got && strcmp(got, expect)) { + testDiag("Got \"%s\", expected \"%s\".\n", got, expect); + pass = 0; + } + testOk(pass, "%s", str); +} + +MAIN(macEnvExpandTest) +{ + eltc(0); + testPlan(71); + + check("FOO", NULL, "FOO"); + + check("${FOO}", NULL, NULL); + check("${FOO,BAR}", NULL, NULL); + check("${FOO,BAR=baz}", NULL, NULL); + check("${FOO,BAR=$(FOO)}", NULL, NULL); + check("${FOO,FOO}", NULL, NULL); + check("${FOO,FOO=$(FOO)}", NULL, NULL); + check("${FOO,BAR=baz,FUM}", NULL, NULL); + + check("${=}", NULL, ""); + check("x${=}y", NULL, "xy"); + + check("${,=}", NULL, ""); + check("x${,=}y", NULL, "xy"); + + check("${FOO=}", NULL, ""); + check("x${FOO=}y", NULL, "xy"); + + check("${FOO=,}", NULL, ""); + check("x${FOO=,}y", NULL, "xy"); + + check("${FOO,FOO=}", NULL, ""); + check("x${FOO,FOO=}y", NULL, "xy"); + + check("${FOO=,BAR}", NULL, ""); + check("x${FOO=,BAR}y", NULL, "xy"); + + check("${FOO=$(BAR=)}", NULL, ""); + check("x${FOO=$(BAR=)}y", NULL, "xy"); + + check("${FOO=,BAR=baz}", NULL, ""); + check("x${FOO=,BAR=baz}y", NULL, "xy"); + + check("${FOO=$(BAR),BAR=}", NULL, ""); + check("x${FOO=$(BAR),BAR=}y", NULL, "xy"); + + check("${=BAR}", NULL, "BAR"); + check("x${=BAR}y", NULL, "xBARy"); + + check("${FOO=BAR}", NULL, "BAR"); + check("x${FOO=BAR}y", NULL, "xBARy"); + + check("${FOO}", "FOO=BLETCH", "BLETCH"); + check("${FOO,FOO}", "FOO=BLETCH", "BLETCH"); + check("x${FOO}y", "FOO=BLETCH", "xBLETCHy"); + check("x${FOO}y${FOO}z", "FOO=BLETCH", "xBLETCHyBLETCHz"); + check("${FOO=BAR}", "FOO=BLETCH", "BLETCH"); + check("x${FOO=BAR}y", "FOO=BLETCH", "xBLETCHy"); + check("${FOO=${BAZ}}", "FOO=BLETCH", "BLETCH"); + check("${FOO=${BAZ},BAR=$(BAZ)}", "FOO=BLETCH", "BLETCH"); + check("x${FOO=${BAZ}}y", "FOO=BLETCH", "xBLETCHy"); + check("x${FOO=${BAZ},BAR=$(BAZ)}y", "FOO=BLETCH", "xBLETCHy"); + check("${BAR=${FOO}}", "FOO=BLETCH", "BLETCH"); + check("x${BAR=${FOO}}y", "FOO=BLETCH", "xBLETCHy"); + check("w${BAR=x${FOO}y}z", "FOO=BLETCH", "wxBLETCHyz"); + + check("${FOO,FOO=BAR}", "FOO=BLETCH", "BAR"); + check("x${FOO,FOO=BAR}y", "FOO=BLETCH", "xBARy"); + check("${BAR,BAR=$(FOO)}", "FOO=BLETCH", "BLETCH"); + check("x${BAR,BAR=$(FOO)}y", "FOO=BLETCH", "xBLETCHy"); + check("${BAR,BAR=$($(FOO)),BLETCH=GRIBBLE}", "FOO=BLETCH", "GRIBBLE"); + check("x${BAR,BAR=$($(FOO)),BLETCH=GRIBBLE}y", "FOO=BLETCH", "xGRIBBLEy"); + check("${$(BAR,BAR=$(FOO)),BLETCH=GRIBBLE}", "FOO=BLETCH", "GRIBBLE"); + check("x${$(BAR,BAR=$(FOO)),BLETCH=GRIBBLE}y", "FOO=BLETCH", "xGRIBBLEy"); + + check("${FOO}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); + check("x${FOO}/${BAR}y", "BAR=GLEEP,FOO=BLETCH", "xBLETCH/GLEEPy"); + check("${FOO,BAR}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); + check("${FOO,BAR=x}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); + check("${BAZ=BLETCH,BAR}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); + check("${BAZ=BLETCH,BAR=x}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); + + check("${${FOO}}", "BAR=GLEEP,FOO=BLETCH,BLETCH=BAR", "BAR"); + check("x${${FOO}}y", "BAR=GLEEP,FOO=BLETCH,BLETCH=BAR", "xBARy"); + check("${${FOO}=GRIBBLE}", "BAR=GLEEP,FOO=BLETCH,BLETCH=BAR", "BAR"); + check("x${${FOO}=GRIBBLE}y", "BAR=GLEEP,FOO=BLETCH,BLETCH=BAR", "xBARy"); + + check("${${FOO}}", "BAR=GLEEP,FOO=BLETCH,BLETCH=${BAR}", "GLEEP"); + + check("${FOO}", "BAR=GLEEP,FOO=${BAR},BLETCH=${BAR}" ,"GLEEP"); + + check("${FOO}", "BAR=${BAZ},FOO=${BAR},BLETCH=${BAR}", NULL); + + check("${FOO}", "BAR=${BAZ=GRIBBLE},FOO=${BAR},BLETCH=${BAR}", "GRIBBLE"); + + check("${FOO}", "BAR=${STR1},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", "VAL1"); + + check("${FOO}", "BAR=${STR2},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", "VAL2"); + + check("${FOO}", "BAR=${FOO},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + check("${FOO,FOO=$(FOO)}", "BAR=${FOO},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + check("${FOO=$(FOO)}", "BAR=${FOO},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + check("${FOO=$(BAR),BAR=$(FOO)}", "BAR=${FOO},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + + errlogFlush(); + eltc(1); + return testDone(); +} From 4f1f7dd83b5ab3d1ac3d76f04ad8ef963c501a9c Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Thu, 21 Aug 2014 17:13:00 -0500 Subject: [PATCH 14/29] Updated macLib documentation --- src/libCom/macLib/macLibREADME | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libCom/macLib/macLibREADME b/src/libCom/macLib/macLibREADME index ec521d8a6..95114d905 100644 --- a/src/libCom/macLib/macLibREADME +++ b/src/libCom/macLib/macLibREADME @@ -164,7 +164,14 @@ d) char *macEnvExpand( char *src ); pointer to this null-terminated string. It returns NULL if the source string contains any undefined references. -e) long macReportMacros( MAC_HANDLE *handle ); +e) char *macDefExpand( char *src, char *macros ); + + This operates in the same manner as macEnvExpand, but takes an + additonal string argument that contains a set of macro definitions in + the current macParseDefns format. These macros are appended to the set + of macros from environment variables. + +f) long macReportMacros( MAC_HANDLE *handle ); This reports details of current definitions to standard output, and is intended purely for debugging purposes. From 1ad6ff03b3f2dab48e8e8908e2d6a654cf5046f0 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Fri, 22 Aug 2014 11:50:24 -0500 Subject: [PATCH 15/29] Changed iocshLoadFile to iocshLoad and added iocshRun as the macro version of iocshCmd --- src/libCom/iocsh/iocsh.cpp | 27 +++++++++++++++++++++++---- src/libCom/iocsh/iocsh.h | 3 ++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index a7054b33d..3d0941af3 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -847,11 +847,19 @@ iocshCmd (const char *cmd) } int epicsShareAPI -iocshLoadFile(const char *pathname, const char *macros) +iocshLoad(const char *pathname, const char *macros) { return iocshBody(pathname, NULL, macros); } +int epicsShareAPI +iocshRun(const char *cmd, const char *macros) +{ + if (cmd == NULL) + return 0; + return iocshBody(NULL, cmd, macros); +} + /* * Internal commands */ @@ -932,14 +940,24 @@ static void iocshCmdCallFunc(const iocshArgBuf *args) iocshCmd(args[0].sval); } -/* iocshLoadFile */ +/* iocshLoad */ static const iocshArg iocshLoadArg0 = { "pathname",iocshArgString}; static const iocshArg iocshLoadArg1 = { "macros", iocshArgString}; static const iocshArg *iocshLoadArgs[2] = {&iocshLoadArg0, &iocshLoadArg1}; -static const iocshFuncDef iocshLoadFuncDef = {"iocshLoadFile",2,iocshLoadArgs}; +static const iocshFuncDef iocshLoadFuncDef = {"iocshLoad",2,iocshLoadArgs}; static void iocshLoadCallFunc(const iocshArgBuf *args) { - iocshLoadFile(args[0].sval, args[1].sval); + iocshLoad(args[0].sval, args[1].sval); +} + +/* iocshRun */ +static const iocshArg iocshRunArg0 = { "command",iocshArgString}; +static const iocshArg iocshRunArg1 = { "macros", iocshArgString}; +static const iocshArg *iocshRunArgs[2] = {&iocshRunArg0, &iocshRunArg1}; +static const iocshFuncDef iocshRunFuncDef = {"iocshRun",2,iocshRunArgs}; +static void iocshRunCallFunc(const iocshArgBuf *args) +{ + iocshRun(args[0].sval, args[1].sval); } /* @@ -970,6 +988,7 @@ static void localRegister (void) iocshRegister(&helpFuncDef,helpCallFunc); iocshRegister(&iocshCmdFuncDef,iocshCmdCallFunc); iocshRegister(&iocshLoadFuncDef,iocshLoadCallFunc); + iocshRegister(&iocshRunFuncDef,iocshRunCallFunc); } } /* extern "C" */ diff --git a/src/libCom/iocsh/iocsh.h b/src/libCom/iocsh/iocsh.h index 3178eac46..b696ea604 100644 --- a/src/libCom/iocsh/iocsh.h +++ b/src/libCom/iocsh/iocsh.h @@ -70,7 +70,8 @@ epicsShareFunc void epicsShareAPI iocshFree(void); epicsShareFunc int epicsShareAPI iocsh(const char *pathname); epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd); -epicsShareFunc int epicsShareAPI iocshLoadFile(const char *pathname, const char* macros); +epicsShareFunc int epicsShareAPI iocshLoad(const char *pathname, const char* macros); +epicsShareFunc int epicsShareAPI iocshRun(const char *cmd, const char* macros); /* 'weak' link to pdbbase */ epicsShareExtern struct dbBase **iocshPpdbbase; From 00bb3d1e678090bdc85fb78f5980b6e05ae22614 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Fri, 22 Aug 2014 14:25:41 -0500 Subject: [PATCH 16/29] iocshLoad now works as iocsh with no parameters --- src/libCom/iocsh/iocsh.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index 3d0941af3..3a9d459cc 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -849,6 +849,8 @@ iocshCmd (const char *cmd) int epicsShareAPI iocshLoad(const char *pathname, const char *macros) { + if (pathname) + epicsEnvSet("IOCSH_STARTUP_SCRIPT", pathname); return iocshBody(pathname, NULL, macros); } From 2d3db2036b0bb939ded466d05d5e2b6283bce2f8 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Wed, 27 Aug 2014 11:33:14 -0500 Subject: [PATCH 17/29] Updated iocshBody to keep track of macro context to allow scoping of macro variables from iocshRun/Load --- src/libCom/iocsh/iocsh.cpp | 63 ++++++++++++++++++++++++++++++++------ src/libCom/macLib/macEnv.c | 29 ++++++++---------- src/libCom/macLib/macLib.h | 3 +- 3 files changed, 69 insertions(+), 26 deletions(-) diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index 3a9d459cc..b239287c5 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -57,6 +57,9 @@ static char iocshVarID[] = "iocshVar"; extern "C" { static void varCallFunc(const iocshArgBuf *); } static epicsMutexId iocshTableMutex; static epicsThreadOnceId iocshTableOnceId = EPICS_THREAD_ONCE_INIT; +static epicsThreadOnceId iocshMacroOnceId = EPICS_THREAD_ONCE_INIT; + +static epicsThreadPrivateId iocshMacroHandleId; /* * I/O redirection @@ -78,6 +81,14 @@ static void iocshTableOnce (void *) iocshTableMutex = epicsMutexMustCreate (); } +/* + * Set up iocsh MAC_HANDLE for scoped macros + */ +static void iocshMacroOnce (void *) +{ + iocshMacroHandleId = epicsThreadPrivateCreate(); +} + /* * Lock the table mutex */ @@ -475,7 +486,7 @@ static void helpCallFunc(const iocshArgBuf *args) * The body of the command interpreter */ static int -iocshBody (const char *pathname, const char *commandLine, const char* macros) +iocshBody (const char *pathname, const char *commandLine, const char *macros) { FILE *fp = NULL; const char *filename = NULL; @@ -498,6 +509,9 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) struct iocshCommand *found; void *readlineContext = NULL; int wasOkToBlock; + static char *pairs[] = {NULL, NULL}; + MAC_HANDLE *handle; + char ** defines = NULL; /* * See if command interpreter is interactive @@ -540,7 +554,36 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) fprintf(epicsGetStderr(), "Out of memory!\n"); return -1; } - + + /* + * Parse macro definitions, this check occurs before creating the + * macro handle to simplify cleanup. + */ + + if (macros) { + if (macParseDefns(NULL, macros, &defines) < 0) { + return -1; + } + } + + /* + * Check for existing macro context or construct a new one. + */ + epicsThreadOnce (&iocshMacroOnceId, iocshMacroOnce, NULL); + handle = (MAC_HANDLE *) epicsThreadPrivateGet(iocshMacroHandleId); + + if (handle == NULL) { + if (macCreateHandle(&handle, pairs)) { + errlogMessage("iocsh: macCreateHandle failed."); + return -1; + } + + epicsThreadPrivateSet(iocshMacroHandleId, (void *) handle); + } + + macPushScope(handle); + macInstallMacros(handle, defines); + /* * Read commands till EOF or exit */ @@ -585,7 +628,7 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) * Expand macros */ free(line); - if ((line = macDefExpand(raw, macros)) == NULL) + if ((line = macDefExpand(raw, handle)) == NULL) continue; /* @@ -811,6 +854,12 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) } stopRedirect(filename, lineno, redirects); } + macPopScope(handle); + + if (handle->level == 0) { + macDeleteHandle(handle); + epicsThreadPrivateSet(iocshMacroHandleId, NULL); + } if (fp && (fp != stdin)) fclose (fp); if (redirects != NULL) { @@ -833,17 +882,13 @@ iocshBody (const char *pathname, const char *commandLine, const char* macros) int epicsShareAPI iocsh (const char *pathname) { - if (pathname) - epicsEnvSet("IOCSH_STARTUP_SCRIPT", pathname); - return iocshBody(pathname, NULL, NULL); + return iocshLoad(pathname, NULL); } int epicsShareAPI iocshCmd (const char *cmd) { - if (cmd == NULL) - return 0; - return iocshBody(NULL, cmd, NULL); + return iocshRun(cmd, NULL); } int epicsShareAPI diff --git a/src/libCom/macLib/macEnv.c b/src/libCom/macLib/macEnv.c index d78769138..019a67f5d 100644 --- a/src/libCom/macLib/macEnv.c +++ b/src/libCom/macLib/macEnv.c @@ -25,29 +25,23 @@ macEnvExpand(const char *str) } char * epicsShareAPI -macDefExpand(const char *str, const char *macros) +macDefExpand(const char *str, MAC_HANDLE *macros) { MAC_HANDLE *handle; static char *pairs[] = { "", "environ", NULL, NULL }; - char** defines; long destCapacity = 128; char *dest = NULL; int n; - - if (macCreateHandle(&handle, pairs)){ - errlogMessage("macDefExpand: macCreateHandle failed."); - return NULL; - } - + if (macros) { - if (macParseDefns(handle, macros, &defines) < 0) { - cantProceed("macDefExpand: invalid macro string"); - } - else { - macInstallMacros(handle, defines); + handle = macros; + } else { + if (macCreateHandle(&handle, pairs)){ + errlogMessage("macDefExpand: macCreateHandle failed."); + return NULL; } } - + do { destCapacity *= 2; /* @@ -73,7 +67,10 @@ macDefExpand(const char *str, const char *macros) } done: - if (macDeleteHandle(handle)) - errlogMessage("macDefExpand: macDeleteHandle failed."); + if (macros == NULL) { + if (macDeleteHandle(handle)) { + errlogMessage("macDefExpand: macDeleteHandle failed."); + } + } return dest; } diff --git a/src/libCom/macLib/macLib.h b/src/libCom/macLib/macLib.h index 89dccf72c..84339711a 100644 --- a/src/libCom/macLib/macLib.h +++ b/src/libCom/macLib/macLib.h @@ -154,7 +154,8 @@ epicsShareAPI macEnvExpand( epicsShareFunc char * /* expanded string; NULL if any undefined macros */ epicsShareAPI macDefExpand( const char *str, /* string to be expanded */ - const char *macros /* macro definitions in "a=xxx, b=yyy" */ + MAC_HANDLE *macros /* opaque handle; can be NULL if default */ + /* special characters are to be used */ ); #ifdef __cplusplus From 4497e8d5f41b14fc3444551700ab2db1a4b72d95 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Wed, 27 Aug 2014 11:41:27 -0500 Subject: [PATCH 18/29] Updated macLibREADME --- src/libCom/macLib/macLibREADME | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libCom/macLib/macLibREADME b/src/libCom/macLib/macLibREADME index 95114d905..f3cda53c2 100644 --- a/src/libCom/macLib/macLibREADME +++ b/src/libCom/macLib/macLibREADME @@ -164,12 +164,12 @@ d) char *macEnvExpand( char *src ); pointer to this null-terminated string. It returns NULL if the source string contains any undefined references. -e) char *macDefExpand( char *src, char *macros ); +e) char *macDefExpand( char *src, MAC_HANDLE *macros ); This operates in the same manner as macEnvExpand, but takes an - additonal string argument that contains a set of macro definitions in - the current macParseDefns format. These macros are appended to the set - of macros from environment variables. + optional macro handle that can contain a set of macro definitions. + These macros are appended to the set of macros from environment + variables when expanding the string. f) long macReportMacros( MAC_HANDLE *handle ); From b2c2d9b7d69f8570e70eac561d3945bfd82dc058 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Wed, 27 Aug 2014 13:17:15 -0500 Subject: [PATCH 19/29] Tests changed to accomodate macDefExpand's different args --- src/libCom/test/macDefExpandTest.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libCom/test/macDefExpandTest.c b/src/libCom/test/macDefExpandTest.c index bdbf41b3e..7940ad503 100644 --- a/src/libCom/test/macDefExpandTest.c +++ b/src/libCom/test/macDefExpandTest.c @@ -23,7 +23,13 @@ static void check(const char *str, const char *macros, const char *expect) { - char *got = macDefExpand(str, macros); + MAC_HANDLE *handle; + char **defines; + + macParseDefns(NULL, macros, &defines); + macCreateHandle(&handle, defines); + + char *got = macDefExpand(str, handle); int pass = -1; if (expect && !got) { @@ -39,6 +45,8 @@ static void check(const char *str, const char *macros, const char *expect) pass = 0; } testOk(pass, "%s", str); + + macDeleteHandle(handle); } MAIN(macEnvExpandTest) From 9d0be21cc1b2594d3113a0ea238646053430870a Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Wed, 27 Aug 2014 13:31:16 -0500 Subject: [PATCH 20/29] MAC_HANDLE's in iocshBody weren't being created with environment variables. --- src/libCom/iocsh/iocsh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index b239287c5..c8347794f 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -509,7 +509,7 @@ iocshBody (const char *pathname, const char *commandLine, const char *macros) struct iocshCommand *found; void *readlineContext = NULL; int wasOkToBlock; - static char *pairs[] = {NULL, NULL}; + static char *pairs[] = {"", "environ", NULL, NULL}; MAC_HANDLE *handle; char ** defines = NULL; From 64a98452e3183428b06df86a2668180365d7cef8 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 2 Sep 2014 16:35:32 -0500 Subject: [PATCH 21/29] epicsEnvSet clears macros before setting environment variable to ensure intuitive use of the function in nested iocsh calls. While adding this functionality, fixed a latent bug in macPutValue where if you tried to NULL a macro with the same name as an environment variable, you would go into an infinite loop. --- src/libCom/iocsh/iocsh.cpp | 31 +++++++++++++++++++++++++++++- src/libCom/iocsh/iocsh.h | 3 +++ src/libCom/macLib/macCore.c | 7 ++++++- src/libCom/osi/os/Darwin/osdEnv.c | 3 +++ src/libCom/osi/os/default/osdEnv.c | 5 ++++- src/libCom/osi/os/iOS/osdEnv.c | 4 +++- src/libCom/osi/os/vxWorks/osdEnv.c | 3 +++ src/libCom/test/macDefExpandTest.c | 2 +- 8 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index c8347794f..4be7e19db 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -570,7 +570,7 @@ iocshBody (const char *pathname, const char *commandLine, const char *macros) * Check for existing macro context or construct a new one. */ epicsThreadOnce (&iocshMacroOnceId, iocshMacroOnce, NULL); - handle = (MAC_HANDLE *) epicsThreadPrivateGet(iocshMacroHandleId); + handle = (MAC_HANDLE *) epicsThreadPrivateGet(iocshMacroHandleId); if (handle == NULL) { if (macCreateHandle(&handle, pairs)) { @@ -907,6 +907,35 @@ iocshRun(const char *cmd, const char *macros) return iocshBody(NULL, cmd, macros); } +/* + * Needed to work around the necessary limitations of macLib and + * environment variables. In every other case of macro expansion + * it is the expected outcome that defined macros override any + * environment variables. + * + * iocshLoad/Run turn this on its head as it is very likely that + * an epicsEnvSet command may be run within the context of their + * calls. Thus, it would be expected that the new value would be + * returned in any future macro expansion. + * + * To do so, the epicsEnvSet command needs to be able to access + * and update the shared MAC_HANDLE that the iocsh uses. Which is + * what this function is provided for. + */ +void epicsShareAPI +iocshEnvClear(const char *name) +{ + MAC_HANDLE *handle; + + if (iocshMacroHandleId) { + handle = (MAC_HANDLE *) epicsThreadPrivateGet(iocshMacroHandleId); + + if (handle != NULL) { + macPutValue(handle, name, NULL); + } + } +} + /* * Internal commands */ diff --git a/src/libCom/iocsh/iocsh.h b/src/libCom/iocsh/iocsh.h index b696ea604..e31756479 100644 --- a/src/libCom/iocsh/iocsh.h +++ b/src/libCom/iocsh/iocsh.h @@ -73,6 +73,9 @@ epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd); epicsShareFunc int epicsShareAPI iocshLoad(const char *pathname, const char* macros); epicsShareFunc int epicsShareAPI iocshRun(const char *cmd, const char* macros); +/* Makes macros that shadow environment variables work correctly with epicsEnvSet */ +epicsShareFunc void epicsShareAPI iocshEnvClear(const char *name); + /* 'weak' link to pdbbase */ epicsShareExtern struct dbBase **iocshPpdbbase; diff --git a/src/libCom/macLib/macCore.c b/src/libCom/macLib/macCore.c index da5244dfd..a7e5fe887 100644 --- a/src/libCom/macLib/macCore.c +++ b/src/libCom/macLib/macCore.c @@ -254,8 +254,13 @@ epicsShareAPI macPutValue( several entries at different scoping levels) */ if ( value == NULL ) { /* FIXME: shouldn't be able to delete entries from lower scopes */ - while ( ( entry = lookup( handle, name, FALSE ) ) != NULL ) + while ( ( entry = lookup( handle, name, FALSE ) ) != NULL ) { delete( handle, entry ); + + if (strcmp(entry->type, "environment variable") == 0) + break; + } + return 0; } diff --git a/src/libCom/osi/os/Darwin/osdEnv.c b/src/libCom/osi/os/Darwin/osdEnv.c index 4d957ad87..be5c63977 100644 --- a/src/libCom/osi/os/Darwin/osdEnv.c +++ b/src/libCom/osi/os/Darwin/osdEnv.c @@ -35,6 +35,7 @@ #include #include #include "epicsFindSymbol.h" +#include /* * Set the value of an environment variable @@ -45,6 +46,8 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val { char *cp; + iocshEnvClear(name); + cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet"); strcpy (cp, name); strcat (cp, "="); diff --git a/src/libCom/osi/os/default/osdEnv.c b/src/libCom/osi/os/default/osdEnv.c index ff1675fda..fcb29bf39 100644 --- a/src/libCom/osi/os/default/osdEnv.c +++ b/src/libCom/osi/os/default/osdEnv.c @@ -28,6 +28,7 @@ #include #include #include "epicsFindSymbol.h" +#include /* * Set the value of an environment variable @@ -38,10 +39,12 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val { char *cp; + iocshEnvClear(name); + cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet"); strcpy (cp, name); strcat (cp, "="); - strcat (cp, value); + strcat (cp, value); if (putenv (cp) < 0) { errPrintf( -1L, diff --git a/src/libCom/osi/os/iOS/osdEnv.c b/src/libCom/osi/os/iOS/osdEnv.c index f55b174a8..9bacc3627 100644 --- a/src/libCom/osi/os/iOS/osdEnv.c +++ b/src/libCom/osi/os/iOS/osdEnv.c @@ -28,7 +28,7 @@ #include #include #include "epicsFindSymbol.h" - +#include /* * Set the value of an environment variable @@ -39,6 +39,8 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val { char *cp; + iocshEnvClear(name); + cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet"); strcpy (cp, name); strcat (cp, "="); diff --git a/src/libCom/osi/os/vxWorks/osdEnv.c b/src/libCom/osi/os/vxWorks/osdEnv.c index e41d57440..bd491706d 100644 --- a/src/libCom/osi/os/vxWorks/osdEnv.c +++ b/src/libCom/osi/os/vxWorks/osdEnv.c @@ -29,6 +29,7 @@ #define epicsExportSharedSymbols #include "epicsFindSymbol.h" +#include /* * Set the value of an environment variable @@ -39,6 +40,8 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val { char *cp; + iocshEnvClear(name); + cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet"); strcpy (cp, name); strcat (cp, "="); diff --git a/src/libCom/test/macDefExpandTest.c b/src/libCom/test/macDefExpandTest.c index 7940ad503..59d691b45 100644 --- a/src/libCom/test/macDefExpandTest.c +++ b/src/libCom/test/macDefExpandTest.c @@ -1,5 +1,5 @@ /*************************************************************************\ -* Copyright (c) 2006 UChicago Argonne LLC, as Operator of Argonne +* Copyright (c) 2014 UChicago Argonne LLC, as Operator of Argonne * National Laboratory. * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. From ee197893e7be60730118229a71ea5acd144251e9 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 2 Sep 2014 16:44:47 -0500 Subject: [PATCH 22/29] removing some extra whitespace to cleanup the diff --- src/libCom/macLib/macEnv.c | 2 +- src/libCom/osi/os/default/osdEnv.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libCom/macLib/macEnv.c b/src/libCom/macLib/macEnv.c index 019a67f5d..da38fd248 100644 --- a/src/libCom/macLib/macEnv.c +++ b/src/libCom/macLib/macEnv.c @@ -41,7 +41,7 @@ macDefExpand(const char *str, MAC_HANDLE *macros) return NULL; } } - + do { destCapacity *= 2; /* diff --git a/src/libCom/osi/os/default/osdEnv.c b/src/libCom/osi/os/default/osdEnv.c index fcb29bf39..f85d14a8c 100644 --- a/src/libCom/osi/os/default/osdEnv.c +++ b/src/libCom/osi/os/default/osdEnv.c @@ -44,7 +44,7 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet"); strcpy (cp, name); strcat (cp, "="); - strcat (cp, value); + strcat (cp, value); if (putenv (cp) < 0) { errPrintf( -1L, From 85936ff34c06bb3b94e9c4ce432c8d4da5d33385 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 2 Sep 2014 16:55:32 -0500 Subject: [PATCH 23/29] Darwin's osdEnv.c was updated while I was working on this, changed my updated version to match. --- src/libCom/osi/os/Darwin/osdEnv.c | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/src/libCom/osi/os/Darwin/osdEnv.c b/src/libCom/osi/os/Darwin/osdEnv.c index be5c63977..7e5415d2f 100644 --- a/src/libCom/osi/os/Darwin/osdEnv.c +++ b/src/libCom/osi/os/Darwin/osdEnv.c @@ -25,44 +25,21 @@ * Starting in Mac OS X 10.5 (Leopard) shared libraries and * bundles don't have direct access to environ (man environ). */ -# include -# define environ (*_NSGetEnviron()) +#include +#define environ (*_NSGetEnviron()) #define epicsExportSharedSymbols #include "epicsStdio.h" -#include -#include #include -#include -#include "epicsFindSymbol.h" #include /* * Set the value of an environment variable - * Leaks memory, but the assumption is that this routine won't be - * called often enough for the leak to be a problem. */ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *value) { - char *cp; - iocshEnvClear(name); - - cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet"); - strcpy (cp, name); - strcat (cp, "="); - strcat (cp, value); - if (putenv (cp) < 0) { - errPrintf( - -1L, - __FILE__, - __LINE__, - "Failed to set environment parameter \"%s\" to \"%s\": %s\n", - name, - value, - strerror (errno)); - free (cp); - } + setenv(name, value, 1); } /* From 6d4e284ab199fbab2764ebb3c7d1560ac2ca2cb3 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 2 Sep 2014 17:21:42 -0500 Subject: [PATCH 24/29] Added note to fixme comment to state that a function is relying on its current setup. --- src/libCom/macLib/macCore.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libCom/macLib/macCore.c b/src/libCom/macLib/macCore.c index a7e5fe887..f6f7218b4 100644 --- a/src/libCom/macLib/macCore.c +++ b/src/libCom/macLib/macCore.c @@ -253,7 +253,11 @@ epicsShareAPI macPutValue( /* handle NULL value case: if name was found, delete entry (may be several entries at different scoping levels) */ if ( value == NULL ) { - /* FIXME: shouldn't be able to delete entries from lower scopes */ + /* + * FIXME: shouldn't be able to delete entries from lower scopes + * NOTE: when this is changed, this functionality of removing + * a macro from all scopes will still be needed by iocshEnvClear + */ while ( ( entry = lookup( handle, name, FALSE ) ) != NULL ) { delete( handle, entry ); From 4cd8a41ce5dfb2a106959921f4d3a7a66d72d328 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Mon, 15 Sep 2014 16:59:11 -0500 Subject: [PATCH 25/29] Updated macDefExpandTest to keep from dereferencing NULL --- src/libCom/test/macDefExpandTest.c | 60 +++++++++++++++--------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/libCom/test/macDefExpandTest.c b/src/libCom/test/macDefExpandTest.c index 59d691b45..48356a129 100644 --- a/src/libCom/test/macDefExpandTest.c +++ b/src/libCom/test/macDefExpandTest.c @@ -54,48 +54,48 @@ MAIN(macEnvExpandTest) eltc(0); testPlan(71); - check("FOO", NULL, "FOO"); + check("FOO", "", "FOO"); - check("${FOO}", NULL, NULL); - check("${FOO,BAR}", NULL, NULL); - check("${FOO,BAR=baz}", NULL, NULL); - check("${FOO,BAR=$(FOO)}", NULL, NULL); - check("${FOO,FOO}", NULL, NULL); - check("${FOO,FOO=$(FOO)}", NULL, NULL); - check("${FOO,BAR=baz,FUM}", NULL, NULL); + check("${FOO}", "", NULL); + check("${FOO,BAR}", "", NULL); + check("${FOO,BAR=baz}", "", NULL); + check("${FOO,BAR=$(FOO)}", "", NULL); + check("${FOO,FOO}", "", NULL); + check("${FOO,FOO=$(FOO)}", "", NULL); + check("${FOO,BAR=baz,FUM}", "", NULL); - check("${=}", NULL, ""); - check("x${=}y", NULL, "xy"); + check("${=}", "", ""); + check("x${=}y", "", "xy"); - check("${,=}", NULL, ""); - check("x${,=}y", NULL, "xy"); + check("${,=}", "", ""); + check("x${,=}y", "", "xy"); - check("${FOO=}", NULL, ""); - check("x${FOO=}y", NULL, "xy"); + check("${FOO=}", "", ""); + check("x${FOO=}y", "", "xy"); - check("${FOO=,}", NULL, ""); - check("x${FOO=,}y", NULL, "xy"); + check("${FOO=,}", "", ""); + check("x${FOO=,}y", "", "xy"); - check("${FOO,FOO=}", NULL, ""); - check("x${FOO,FOO=}y", NULL, "xy"); + check("${FOO,FOO=}", "", ""); + check("x${FOO,FOO=}y", "", "xy"); - check("${FOO=,BAR}", NULL, ""); - check("x${FOO=,BAR}y", NULL, "xy"); + check("${FOO=,BAR}", "", ""); + check("x${FOO=,BAR}y", "", "xy"); - check("${FOO=$(BAR=)}", NULL, ""); - check("x${FOO=$(BAR=)}y", NULL, "xy"); + check("${FOO=$(BAR=)}", "", ""); + check("x${FOO=$(BAR=)}y", "", "xy"); - check("${FOO=,BAR=baz}", NULL, ""); - check("x${FOO=,BAR=baz}y", NULL, "xy"); + check("${FOO=,BAR=baz}", "", ""); + check("x${FOO=,BAR=baz}y", "", "xy"); - check("${FOO=$(BAR),BAR=}", NULL, ""); - check("x${FOO=$(BAR),BAR=}y", NULL, "xy"); + check("${FOO=$(BAR),BAR=}", "", ""); + check("x${FOO=$(BAR),BAR=}y", "", "xy"); - check("${=BAR}", NULL, "BAR"); - check("x${=BAR}y", NULL, "xBARy"); + check("${=BAR}", "", "BAR"); + check("x${=BAR}y", "", "xBARy"); - check("${FOO=BAR}", NULL, "BAR"); - check("x${FOO=BAR}y", NULL, "xBARy"); + check("${FOO=BAR}", "", "BAR"); + check("x${FOO=BAR}y", "", "xBARy"); check("${FOO}", "FOO=BLETCH", "BLETCH"); check("${FOO,FOO}", "FOO=BLETCH", "BLETCH"); From 73b09f497655bb531d61b3d18d888129c7717b67 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Tue, 16 Sep 2014 13:55:40 -0500 Subject: [PATCH 26/29] Adding scoping test, combining some aspects of macEnvTest to allow removal of that test. --- src/libCom/test/Makefile | 8 +- src/libCom/test/macDefExpandTest.c | 183 ++++++++++++++++++++++------- 2 files changed, 145 insertions(+), 46 deletions(-) diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index 05dc4dd75..c73616321 100755 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -156,10 +156,10 @@ epicsExceptionTest_SRCS += epicsExceptionTest.cpp testHarness_SRCS += epicsExceptionTest.cpp TESTS += epicsExceptionTest -TESTPROD_HOST += macEnvExpandTest -macEnvExpandTest_SRCS += macEnvExpandTest.c -testHarness_SRCS += macEnvExpandTest.c -TESTS += macEnvExpandTest +#TESTPROD_HOST += macEnvExpandTest +#macEnvExpandTest_SRCS += macEnvExpandTest.c +#testHarness_SRCS += macEnvExpandTest.c +#TESTS += macEnvExpandTest TESTPROD_HOST += macDefExpandTest macDefExpandTest_SRCS += macDefExpandTest.c diff --git a/src/libCom/test/macDefExpandTest.c b/src/libCom/test/macDefExpandTest.c index 48356a129..e1698ab9d 100644 --- a/src/libCom/test/macDefExpandTest.c +++ b/src/libCom/test/macDefExpandTest.c @@ -21,6 +21,101 @@ #include "epicsUnitTest.h" #include "testMain.h" + +static void checkMac(MAC_HANDLE *handle, const char *name, const char *value) +{ + char buf[20]; + + buf[19]='\0'; + if(macGetValue(handle, name, buf, 19)<0) { + if(value) + testFail("Macro %s undefined, expected %s", name, value); + else + testPass("Macro %s undefined", name); + } else { + if(!value) + testFail("Macro %s is %s, expected undefined", name, buf); + else if(strcmp(value, buf)==0) + testPass("Macro %s is %s", name, value); + else + testFail("Macro %s is %s, expected %s", name, buf, value); + } +} + +static void macEnvScope(void) +{ + MAC_HANDLE *handle; + char **defines; + static char *pairs[] = { "", "environ", NULL, NULL }; + + epicsEnvSet("C","3"); + epicsEnvSet("D","4"); + epicsEnvSet("E","5"); + + macCreateHandle(&handle, pairs); + macParseDefns(NULL, "A=1,B=2,E=15", &defines); + macInstallMacros(handle, defines); + + checkMac(handle, "A", "1"); + checkMac(handle, "B", "2"); + checkMac(handle, "C", "3"); + checkMac(handle, "D", "4"); + checkMac(handle, "E", "15"); + checkMac(handle, "F", NULL); + + { + macPushScope(handle); + + macParseDefns(NULL, "A=11,C=13,D=14,G=7", &defines); + macInstallMacros(handle, defines); + + checkMac(handle, "A", "11"); + checkMac(handle, "B", "2"); + checkMac(handle, "C", "13"); + checkMac(handle, "D", "14"); + checkMac(handle, "E", "15"); + checkMac(handle, "F", NULL); + checkMac(handle, "G", "7"); + + epicsEnvSet("D", "24"); + macPutValue(handle, "D", NULL); /* implicit when called through in iocshBody */ + epicsEnvSet("F", "6"); + macPutValue(handle, "F", NULL); /* implicit */ + epicsEnvSet("G", "17"); + macPutValue(handle, "G", NULL); /* implicit */ + + checkMac(handle, "D", "24"); + checkMac(handle, "F", "6"); + checkMac(handle, "G", "17"); + + macPopScope(handle); + } + + checkMac(handle, "A", "1"); + checkMac(handle, "B", "2"); + checkMac(handle, "C", "3"); + checkMac(handle, "D", "24"); + checkMac(handle, "E", "15"); + checkMac(handle, "F", "6"); + checkMac(handle, "G", "17"); + + { + macPushScope(handle); + + macParseDefns(NULL, "D=34,G=27", &defines); + macInstallMacros(handle, defines); + + checkMac(handle, "D", "34"); + checkMac(handle, "G", "27"); + + macPopScope(handle); + } + + checkMac(handle, "D", "24"); + + macDeleteHandle(handle); +} + static void check(const char *str, const char *macros, const char *expect) { MAC_HANDLE *handle; @@ -49,7 +144,7 @@ static void check(const char *str, const char *macros, const char *expect) macDeleteHandle(handle); } -MAIN(macEnvExpandTest) +MAIN(macDefExpandTest) { eltc(0); testPlan(71); @@ -97,57 +192,61 @@ MAIN(macEnvExpandTest) check("${FOO=BAR}", "", "BAR"); check("x${FOO=BAR}y", "", "xBARy"); - check("${FOO}", "FOO=BLETCH", "BLETCH"); - check("${FOO,FOO}", "FOO=BLETCH", "BLETCH"); - check("x${FOO}y", "FOO=BLETCH", "xBLETCHy"); - check("x${FOO}y${FOO}z", "FOO=BLETCH", "xBLETCHyBLETCHz"); - check("${FOO=BAR}", "FOO=BLETCH", "BLETCH"); - check("x${FOO=BAR}y", "FOO=BLETCH", "xBLETCHy"); - check("${FOO=${BAZ}}", "FOO=BLETCH", "BLETCH"); - check("${FOO=${BAZ},BAR=$(BAZ)}", "FOO=BLETCH", "BLETCH"); - check("x${FOO=${BAZ}}y", "FOO=BLETCH", "xBLETCHy"); - check("x${FOO=${BAZ},BAR=$(BAZ)}y", "FOO=BLETCH", "xBLETCHy"); - check("${BAR=${FOO}}", "FOO=BLETCH", "BLETCH"); - check("x${BAR=${FOO}}y", "FOO=BLETCH", "xBLETCHy"); - check("w${BAR=x${FOO}y}z", "FOO=BLETCH", "wxBLETCHyz"); + epicsEnvSet("FOO","BLETCH"); + check("${FOO}", "", "BLETCH"); + check("${FOO,FOO}", "", "BLETCH"); + check("x${FOO}y", "", "xBLETCHy"); + check("x${FOO}y${FOO}z", "", "xBLETCHyBLETCHz"); + check("${FOO=BAR}", "", "BLETCH"); + check("x${FOO=BAR}y", "", "xBLETCHy"); + check("${FOO=${BAZ}}", "", "BLETCH"); + check("${FOO=${BAZ},BAR=$(BAZ)}", "", "BLETCH"); + check("x${FOO=${BAZ}}y", "", "xBLETCHy"); + check("x${FOO=${BAZ},BAR=$(BAZ)}y", "", "xBLETCHy"); + check("${BAR=${FOO}}", "", "BLETCH"); + check("x${BAR=${FOO}}y", "", "xBLETCHy"); + check("w${BAR=x${FOO}y}z", "", "wxBLETCHyz"); - check("${FOO,FOO=BAR}", "FOO=BLETCH", "BAR"); - check("x${FOO,FOO=BAR}y", "FOO=BLETCH", "xBARy"); - check("${BAR,BAR=$(FOO)}", "FOO=BLETCH", "BLETCH"); - check("x${BAR,BAR=$(FOO)}y", "FOO=BLETCH", "xBLETCHy"); - check("${BAR,BAR=$($(FOO)),BLETCH=GRIBBLE}", "FOO=BLETCH", "GRIBBLE"); - check("x${BAR,BAR=$($(FOO)),BLETCH=GRIBBLE}y", "FOO=BLETCH", "xGRIBBLEy"); - check("${$(BAR,BAR=$(FOO)),BLETCH=GRIBBLE}", "FOO=BLETCH", "GRIBBLE"); - check("x${$(BAR,BAR=$(FOO)),BLETCH=GRIBBLE}y", "FOO=BLETCH", "xGRIBBLEy"); + check("${FOO,FOO=BAR}", "", "BAR"); + check("x${FOO,FOO=BAR}y", "", "xBARy"); + check("${BAR,BAR=$(FOO)}", "", "BLETCH"); + check("x${BAR,BAR=$(FOO)}y", "", "xBLETCHy"); + check("${BAR,BAR=$($(FOO)),BLETCH=GRIBBLE}", "", "GRIBBLE"); + check("x${BAR,BAR=$($(FOO)),BLETCH=GRIBBLE}y", "", "xGRIBBLEy"); + check("${$(BAR,BAR=$(FOO)),BLETCH=GRIBBLE}", "", "GRIBBLE"); + check("x${$(BAR,BAR=$(FOO)),BLETCH=GRIBBLE}y", "", "xGRIBBLEy"); - check("${FOO}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); - check("x${FOO}/${BAR}y", "BAR=GLEEP,FOO=BLETCH", "xBLETCH/GLEEPy"); - check("${FOO,BAR}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); - check("${FOO,BAR=x}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); - check("${BAZ=BLETCH,BAR}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); - check("${BAZ=BLETCH,BAR=x}/${BAR}", "BAR=GLEEP,FOO=BLETCH", "BLETCH/GLEEP"); + check("${FOO}/${BAR}", "BAR=GLEEP", "BLETCH/GLEEP"); + check("x${FOO}/${BAR}y", "BAR=GLEEP", "xBLETCH/GLEEPy"); + check("${FOO,BAR}/${BAR}", "BAR=GLEEP", "BLETCH/GLEEP"); + check("${FOO,BAR=x}/${BAR}", "BAR=GLEEP", "BLETCH/GLEEP"); + check("${BAZ=BLETCH,BAR}/${BAR}", "BAR=GLEEP", "BLETCH/GLEEP"); + check("${BAZ=BLETCH,BAR=x}/${BAR}", "BAR=GLEEP", "BLETCH/GLEEP"); - check("${${FOO}}", "BAR=GLEEP,FOO=BLETCH,BLETCH=BAR", "BAR"); - check("x${${FOO}}y", "BAR=GLEEP,FOO=BLETCH,BLETCH=BAR", "xBARy"); - check("${${FOO}=GRIBBLE}", "BAR=GLEEP,FOO=BLETCH,BLETCH=BAR", "BAR"); - check("x${${FOO}=GRIBBLE}y", "BAR=GLEEP,FOO=BLETCH,BLETCH=BAR", "xBARy"); + check("${${FOO}}", "BAR=GLEEP,BLETCH=BAR", "BAR"); + check("x${${FOO}}y", "BAR=GLEEP,BLETCH=BAR", "xBARy"); + check("${${FOO}=GRIBBLE}", "BAR=GLEEP,BLETCH=BAR", "BAR"); + check("x${${FOO}=GRIBBLE}y", "BAR=GLEEP,BLETCH=BAR", "xBARy"); - check("${${FOO}}", "BAR=GLEEP,FOO=BLETCH,BLETCH=${BAR}", "GLEEP"); + check("${${FOO}}", "BAR=GLEEP,BLETCH=${BAR}", "GLEEP"); - check("${FOO}", "BAR=GLEEP,FOO=${BAR},BLETCH=${BAR}" ,"GLEEP"); + epicsEnvSet("FOO","${BAR}"); + check("${FOO}", "BAR=GLEEP,BLETCH=${BAR}" ,"GLEEP"); - check("${FOO}", "BAR=${BAZ},FOO=${BAR},BLETCH=${BAR}", NULL); + check("${FOO}", "BAR=${BAZ},BLETCH=${BAR}", NULL); - check("${FOO}", "BAR=${BAZ=GRIBBLE},FOO=${BAR},BLETCH=${BAR}", "GRIBBLE"); + check("${FOO}", "BAR=${BAZ=GRIBBLE},BLETCH=${BAR}", "GRIBBLE"); - check("${FOO}", "BAR=${STR1},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", "VAL1"); + check("${FOO}", "BAR=${STR1},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", "VAL1"); - check("${FOO}", "BAR=${STR2},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", "VAL2"); + check("${FOO}", "BAR=${STR2},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", "VAL2"); - check("${FOO}", "BAR=${FOO},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); - check("${FOO,FOO=$(FOO)}", "BAR=${FOO},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); - check("${FOO=$(FOO)}", "BAR=${FOO},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); - check("${FOO=$(BAR),BAR=$(FOO)}", "BAR=${FOO},FOO=${BAR},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + check("${FOO}", "BAR=${FOO},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + check("${FOO,FOO=$(FOO)}", "BAR=${FOO},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + check("${FOO=$(FOO)}", "BAR=${FOO},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + check("${FOO=$(BAR),BAR=$(FOO)}", "BAR=${FOO},BLETCH=${BAR},STR1=VAL1,STR2=VAL2", NULL); + + macEnvScope(); errlogFlush(); eltc(1); From 79cb473b6afdb65259d693232b1d20493d43f2b9 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Wed, 17 Sep 2014 17:22:04 -0500 Subject: [PATCH 27/29] tests all pass now. --- src/libCom/test/Makefile | 5 - src/libCom/test/macDefExpandTest.c | 6 +- src/libCom/test/macEnvExpandTest.c | 159 ----------------------------- 3 files changed, 4 insertions(+), 166 deletions(-) delete mode 100644 src/libCom/test/macEnvExpandTest.c diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index c73616321..994147cea 100755 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -156,11 +156,6 @@ epicsExceptionTest_SRCS += epicsExceptionTest.cpp testHarness_SRCS += epicsExceptionTest.cpp TESTS += epicsExceptionTest -#TESTPROD_HOST += macEnvExpandTest -#macEnvExpandTest_SRCS += macEnvExpandTest.c -#testHarness_SRCS += macEnvExpandTest.c -#TESTS += macEnvExpandTest - TESTPROD_HOST += macDefExpandTest macDefExpandTest_SRCS += macDefExpandTest.c testHarness_SRCS += macDefExpandTest.c diff --git a/src/libCom/test/macDefExpandTest.c b/src/libCom/test/macDefExpandTest.c index e1698ab9d..be6395dc5 100644 --- a/src/libCom/test/macDefExpandTest.c +++ b/src/libCom/test/macDefExpandTest.c @@ -120,9 +120,11 @@ static void check(const char *str, const char *macros, const char *expect) { MAC_HANDLE *handle; char **defines; + static char *pairs[] = { "", "environ", NULL, NULL }; + macCreateHandle(&handle, pairs); macParseDefns(NULL, macros, &defines); - macCreateHandle(&handle, defines); + macInstallMacros(handle, defines); char *got = macDefExpand(str, handle); int pass = -1; @@ -147,7 +149,7 @@ static void check(const char *str, const char *macros, const char *expect) MAIN(macDefExpandTest) { eltc(0); - testPlan(71); + testPlan(97); check("FOO", "", "FOO"); diff --git a/src/libCom/test/macEnvExpandTest.c b/src/libCom/test/macEnvExpandTest.c deleted file mode 100644 index b56cc366a..000000000 --- a/src/libCom/test/macEnvExpandTest.c +++ /dev/null @@ -1,159 +0,0 @@ -/*************************************************************************\ -* Copyright (c) 2006 UChicago Argonne LLC, as Operator of Argonne -* National Laboratory. -* Copyright (c) 2002 The Regents of the University of California, as -* Operator of Los Alamos National Laboratory. -* EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. -\*************************************************************************/ -/* - * $Revision-Id$ - */ - -#include -#include -#include -#include - -#include "macLib.h" -#include "envDefs.h" -#include "errlog.h" -#include "epicsUnitTest.h" -#include "testMain.h" - -static void check(const char *str, const char *expect) -{ - char *got = macEnvExpand(str); - int pass = -1; - - if (expect && !got) { - testDiag("Got NULL, expected \"%s\".\n", expect); - pass = 0; - } - else if (!expect && got) { - testDiag("Got \"%s\", expected NULL.\n", got); - pass = 0; - } - else if (expect && got && strcmp(got, expect)) { - testDiag("Got \"%s\", expected \"%s\".\n", got, expect); - pass = 0; - } - testOk(pass, "%s", str); -} - -MAIN(macEnvExpandTest) -{ - eltc(0); - testPlan(71); - - check("FOO", "FOO"); - - check("${FOO}", NULL); - check("${FOO,BAR}", NULL); - check("${FOO,BAR=baz}", NULL); - check("${FOO,BAR=$(FOO)}", NULL); - check("${FOO,FOO}", NULL); - check("${FOO,FOO=$(FOO)}", NULL); - check("${FOO,BAR=baz,FUM}", NULL); - - check("${=}", ""); - check("x${=}y", "xy"); - - check("${,=}", ""); - check("x${,=}y", "xy"); - - check("${FOO=}", ""); - check("x${FOO=}y", "xy"); - - check("${FOO=,}", ""); - check("x${FOO=,}y", "xy"); - - check("${FOO,FOO=}", ""); - check("x${FOO,FOO=}y", "xy"); - - check("${FOO=,BAR}", ""); - check("x${FOO=,BAR}y", "xy"); - - check("${FOO=$(BAR=)}", ""); - check("x${FOO=$(BAR=)}y", "xy"); - - check("${FOO=,BAR=baz}", ""); - check("x${FOO=,BAR=baz}y", "xy"); - - check("${FOO=$(BAR),BAR=}", ""); - check("x${FOO=$(BAR),BAR=}y", "xy"); - - check("${=BAR}", "BAR"); - check("x${=BAR}y", "xBARy"); - - check("${FOO=BAR}", "BAR"); - check("x${FOO=BAR}y", "xBARy"); - - epicsEnvSet("FOO","BLETCH"); - check("${FOO}", "BLETCH"); - check("${FOO,FOO}", "BLETCH"); - check("x${FOO}y", "xBLETCHy"); - check("x${FOO}y${FOO}z", "xBLETCHyBLETCHz"); - check("${FOO=BAR}", "BLETCH"); - check("x${FOO=BAR}y", "xBLETCHy"); - check("${FOO=${BAZ}}", "BLETCH"); - check("${FOO=${BAZ},BAR=$(BAZ)}", "BLETCH"); - check("x${FOO=${BAZ}}y", "xBLETCHy"); - check("x${FOO=${BAZ},BAR=$(BAZ)}y", "xBLETCHy"); - check("${BAR=${FOO}}", "BLETCH"); - check("x${BAR=${FOO}}y", "xBLETCHy"); - check("w${BAR=x${FOO}y}z", "wxBLETCHyz"); - - check("${FOO,FOO=BAR}", "BAR"); - check("x${FOO,FOO=BAR}y", "xBARy"); - check("${BAR,BAR=$(FOO)}", "BLETCH"); - check("x${BAR,BAR=$(FOO)}y", "xBLETCHy"); - check("${BAR,BAR=$($(FOO)),BLETCH=GRIBBLE}", "GRIBBLE"); - check("x${BAR,BAR=$($(FOO)),BLETCH=GRIBBLE}y", "xGRIBBLEy"); - check("${$(BAR,BAR=$(FOO)),BLETCH=GRIBBLE}", "GRIBBLE"); - check("x${$(BAR,BAR=$(FOO)),BLETCH=GRIBBLE}y", "xGRIBBLEy"); - - epicsEnvSet("BAR","GLEEP"); - check("${FOO}/${BAR}", "BLETCH/GLEEP"); - check("x${FOO}/${BAR}y", "xBLETCH/GLEEPy"); - check("${FOO,BAR}/${BAR}", "BLETCH/GLEEP"); - check("${FOO,BAR=x}/${BAR}", "BLETCH/GLEEP"); - check("${BAZ=BLETCH,BAR}/${BAR}", "BLETCH/GLEEP"); - check("${BAZ=BLETCH,BAR=x}/${BAR}", "BLETCH/GLEEP"); - - epicsEnvSet("BLETCH","BAR"); - check("${${FOO}}", "BAR"); - check("x${${FOO}}y", "xBARy"); - check("${${FOO}=GRIBBLE}", "BAR"); - check("x${${FOO}=GRIBBLE}y", "xBARy"); - - epicsEnvSet("BLETCH","${BAR}"); - check("${${FOO}}", "GLEEP"); - - epicsEnvSet("FOO","${BAR}"); - check("${FOO}","GLEEP"); - - epicsEnvSet("BAR","${BAZ}"); - check("${FOO}", NULL); - - epicsEnvSet("BAR","${BAZ=GRIBBLE}"); - check("${FOO}", "GRIBBLE"); - - epicsEnvSet("BAR","${STR1}"); - epicsEnvSet("STR1","VAL1"); - epicsEnvSet("STR2","VAL2"); - check("${FOO}", "VAL1"); - - epicsEnvSet("BAR","${STR2}"); - check("${FOO}", "VAL2"); - - epicsEnvSet("BAR","${FOO}"); - check("${FOO}", NULL); - check("${FOO,FOO=$(FOO)}", NULL); - check("${FOO=$(FOO)}", NULL); - check("${FOO=$(BAR),BAR=$(FOO)}", NULL); - - errlogFlush(); - eltc(1); - return testDone(); -} From 688e821f3a50014ff26e50d0a719ecbf19075559 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Fri, 19 Sep 2014 13:21:43 -0500 Subject: [PATCH 28/29] remove macEnvExpandTest from epicsRunLibComTests.c --- src/libCom/test/epicsRunLibComTests.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libCom/test/epicsRunLibComTests.c b/src/libCom/test/epicsRunLibComTests.c index 0144dc77d..73bc4eabf 100644 --- a/src/libCom/test/epicsRunLibComTests.c +++ b/src/libCom/test/epicsRunLibComTests.c @@ -106,8 +106,6 @@ void epicsRunLibComTests(void) runTest(epicsTypesTest); runTest(macLibTest); - - runTest(macEnvExpandTest); runTest(macDefExpandTest); From bd3a030da8eb284b32ff2a9dbfde804494be12b0 Mon Sep 17 00:00:00 2001 From: Keenan Lang Date: Fri, 19 Sep 2014 13:24:15 -0500 Subject: [PATCH 29/29] remove unneeded forward declaration --- src/libCom/test/epicsRunLibComTests.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libCom/test/epicsRunLibComTests.c b/src/libCom/test/epicsRunLibComTests.c index 73bc4eabf..5decbf3f2 100644 --- a/src/libCom/test/epicsRunLibComTests.c +++ b/src/libCom/test/epicsRunLibComTests.c @@ -40,7 +40,6 @@ int epicsThreadPoolTest(void); int epicsTimeTest(void); int epicsTypesTest(void); int macLibTest(void); -int macEnvExpandTest(void); int macDefExpandTest(void); int ringPointerTest(void); int ringBytesTest(void);