diff --git a/src/db/baseLIBOBJS b/src/db/baseLIBOBJS index c82b224a2..84f40b7e3 100644 --- a/src/db/baseLIBOBJS +++ b/src/db/baseLIBOBJS @@ -1,4 +1,3 @@ -LOBOBJS += seq #LIBOBJS += $(EPICS_BASE_BIN)/aaiRecord.o #LIBOBJS += $(EPICS_BASE_BIN)/aaoRecord.o LIBOBJS += $(EPICS_BASE_BIN)/aiRecord.o diff --git a/src/db/iocInit.c b/src/db/iocInit.c index c495c96c2..ef2351ea0 100644 --- a/src/db/iocInit.c +++ b/src/db/iocInit.c @@ -530,9 +530,9 @@ LOCAL long initialProcess(void) -int dbLoadDatabase(char *filename,char *path) +int dbLoadDatabase(char *filename,char *path,char *substitutions) { - return(dbReadDatabase(&pdbbase,filename,path)); + return(dbReadDatabase(&pdbbase,filename,path,substitutions)); } /*Remaining code supplied by Bob Zieman*/ diff --git a/src/dbStatic/dbLexRoutines.c b/src/dbStatic/dbLexRoutines.c index 8a74bde13..b19d23d7c 100644 --- a/src/dbStatic/dbLexRoutines.c +++ b/src/dbStatic/dbLexRoutines.c @@ -39,6 +39,7 @@ of this distribution. #include #include #include +#include /*private routines */ static void yyerrorAbort(char *str); @@ -74,7 +75,9 @@ static void dbRecordBody(void); /*private declarations*/ #define MY_BUFFER_SIZE 1024 static char *my_buffer=NULL; +static char *mac_input_buffer=NULL; static char *my_buffer_ptr=NULL; +static MAC_HANDLE *macHandle = NULL; typedef struct inputFile{ ELLNODE node; char *path; @@ -174,11 +177,12 @@ static void freeInputFileList(void) } static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, - const char *path) + const char *path,const char *substitutions) { long status; inputFile *pinputFile; char *penv; + char **pairs; if(*ppdbbase == 0) *ppdbbase = dbAllocBase(); pdbbase = *ppdbbase; @@ -193,6 +197,22 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, } } my_buffer = dbCalloc(MY_BUFFER_SIZE,sizeof(char)); + macHandle = NULL; + if(substitutions) { + if(macCreateHandle(&macHandle,NULL)) { + epicsPrintf("macCreateHandle error\n"); + return(-1); + } + macParseDefns(macHandle,(char *)substitutions,&pairs); + if(pairs ==NULL) { + macDeleteHandle(macHandle); + macHandle = NULL; + } else { + macInstallMacros(macHandle,pairs); + free((void *)pairs); + mac_input_buffer = dbCalloc(MY_BUFFER_SIZE,sizeof(char)); + } + } ellInit(&inputFileList); ellInit(&tempList); freeListInitPvt(&freeListPvt,sizeof(tempListNode),5); @@ -226,6 +246,11 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, if(status) { fprintf(stderr,"db_parse returned %d\n",status); } + if(macHandle) { + macDeleteHandle(macHandle); + macHandle = NULL; + free((void *)mac_input_buffer); + } freeListCleanup(freeListPvt); free((void *)my_buffer); freeInputFileList(); @@ -233,19 +258,38 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, return(status); } -long dbReadDatabase(DBBASE **ppdbbase,const char *filename,const char *path) -{return (dbReadCOM(ppdbbase,filename,0,path));} +long dbReadDatabase(DBBASE **ppdbbase,const char *filename, + const char *path,const char *substitutions) +{return (dbReadCOM(ppdbbase,filename,0,path,substitutions));} -long dbReadDatabaseFP(DBBASE **ppdbbase,FILE *fp,const char *path) -{return (dbReadCOM(ppdbbase,0,fp,path));} +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) { - int l,n; + int l,n; + char *fgetsRtn; if(yyAbort) return(0); if(*my_buffer_ptr==0) { - while(fgets(my_buffer,MY_BUFFER_SIZE,pinputFileNow->fp)==NULL) { + while(TRUE) { /*until we get some input*/ + if(macHandle) { + fgetsRtn = fgets(mac_input_buffer,MY_BUFFER_SIZE, + pinputFileNow->fp); + if(fgetsRtn) { + n = macExpandString(macHandle,mac_input_buffer, + my_buffer,MY_BUFFER_SIZE-1); + if(n<0) { + errPrintf(0,__FILE__, __LINE__, + "macExpandString failed for file %s", + pinputFileNow->filename); + } + } + } else { + fgetsRtn = fgets(my_buffer,MY_BUFFER_SIZE,pinputFileNow->fp); + } + if(fgetsRtn) break; if(fclose(pinputFileNow->fp)) errPrintf(0,__FILE__, __LINE__, "Closing file %s",pinputFileNow->filename); diff --git a/src/dbStatic/dbReadTest.c b/src/dbStatic/dbReadTest.c index d49a42912..04fb5656a 100644 --- a/src/dbStatic/dbReadTest.c +++ b/src/dbStatic/dbReadTest.c @@ -27,45 +27,49 @@ of this distribution. #include DBBASE *pdbbase = NULL; -#define MAX_PATH_LENGTH 256 -static void addPath(char *path,char *newdir) -{ - if((strlen(path)+strlen(newdir)+2) > (size_t)MAX_PATH_LENGTH) { - fprintf(stderr,"path > 256 characters\n"); - exit(-1); - } - if(strlen(path) > (size_t)0) strcat(path,":"); - strcat(path,newdir); -} - - int main(int argc,char **argv) { - long status; - int strip; - char path[MAX_PATH_LENGTH]; int i; + int strip; + char *path = NULL; + char *sub = NULL; + int pathLength = 0; + int subLength = 0; + char **pstr; + char *psep; + int *len; + long status; + static char *pathSep = ":"; + static char *subSep = ","; - /*Look for path, i.e. -I dir or -Idir*/ - path[0] = 0; - while(strncmp(argv[1],"-I",2)==0) { - if(strlen(argv[1])==2) { - addPath(path,argv[2]); - strip = 2; - } else { - addPath(path,argv[1]+2); - strip = 1; - } - argc -= strip; - for(i=1; ipathPvt = 0; return; } + +#define INC_SIZE 256 +void dbCatString(char **string,int *stringLength,char *new, + char *separator) +{ + if((*string==NULL) + || ((strlen(*string)+strlen(new)+2) > (size_t)*stringLength)) { + char *newString; + int size; + + size = strlen(new); + if(*string) size += strlen(*string); + /*Make size multiple of INC_SIZE*/ + size = ((size + 2 + INC_SIZE)/INC_SIZE) * INC_SIZE; + newString = dbCalloc(1,(size_t)size); + if(*string) { + strcpy(newString,*string); + free((void *)(*string)); + } + *string = newString; + } + if(*stringLength>0) { + strcat(*string,separator); + *stringLength += strlen(separator); + } + strcat(*string,new); + *stringLength += strlen(new); +} static void initForms(void) { diff --git a/src/dbStatic/dbStaticLib.h b/src/dbStatic/dbStaticLib.h index 29ae635be..36cb8bceb 100644 --- a/src/dbStatic/dbStaticLib.h +++ b/src/dbStatic/dbStaticLib.h @@ -84,8 +84,10 @@ void dbInitEntry(DBBASE *pdbbase,DBENTRY *pdbentry); void dbFinishEntry(DBENTRY *pdbentry); DBENTRY *dbCopyEntry(DBENTRY *pdbentry); -long dbReadDatabase(DBBASE **ppdbbase,const char *filename,const char *path); -long dbReadDatabaseFP(DBBASE **ppdbbase,FILE *fp,const char *path); +long dbReadDatabase(DBBASE **ppdbbase,const char *filename, + const char *path,const char *substitutions); +long dbReadDatabaseFP(DBBASE **ppdbbase,FILE *fp, + const char *path,const char *substitutions); long dbPath(DBBASE *pdbbase,const char *path); long dbAddPath(DBBASE *pdbbase,const char *path); long dbWriteRecord(DBBASE *ppdbbase,const char *filename, diff --git a/src/dbStatic/dbStaticPvt.h b/src/dbStatic/dbStaticPvt.h index 3c15cd115..cefd47dbe 100644 --- a/src/dbStatic/dbStaticPvt.h +++ b/src/dbStatic/dbStaticPvt.h @@ -36,6 +36,7 @@ void dbInitDeviceMenu(DBENTRY *pdbentry); void dbFreeParmString(char **pparm); void dbFreePath(DBBASE *pdbbase); +void dbCatString(char **string,int *stringLength,char *new,char *separator); /*The following routines have different versions for run-time no-run-time*/ long dbAllocRecord(DBENTRY *pdbentry,char *precordName); diff --git a/src/dbStatic/dbToMenuH.c b/src/dbStatic/dbToMenuH.c index 4d7eb48c4..2932e4a93 100644 --- a/src/dbStatic/dbToMenuH.c +++ b/src/dbStatic/dbToMenuH.c @@ -27,40 +27,43 @@ of this distribution. #include DBBASE *pdbbase = NULL; - -#define MAX_PATH_LENGTH 256 -static void addPath(char *path,char *newdir) -{ - if((strlen(path)+strlen(newdir)+2) > (size_t)MAX_PATH_LENGTH) { - fprintf(stderr,"path > 256 characters\n"); - exit(-1); - } - if(strlen(path) > (size_t)0) strcat(path,":"); - strcat(path,newdir); -} - int main(int argc,char **argv) { - long status; dbMenu *pdbMenu; char *outFilename; char *pext; FILE *outFile; char *plastSlash; - - int strip; - char path[MAX_PATH_LENGTH]; int i; + int strip; + char *path = NULL; + char *sub = NULL; + int pathLength = 0; + int subLength = 0; + char **pstr; + char *psep; + int *len; + long status; + static char *pathSep = ":"; + static char *subSep = ","; - /*Look for path, i.e. -I dir or -Idir*/ - path[0] = 0; - while(strncmp(argv[1],"-I",2)==0) { + /*Look for options*/ + while((strncmp(argv[1],"-I",2)==0)||(strncmp(argv[1],"-S",2)==0)) { + if(strncmp(argv[1],"-I",2)==0) { + pstr = &path; + psep = pathSep; + len = &pathLength; + } else { + pstr = ⊂ + psep = subSep; + len = &subLength; + } if(strlen(argv[1])==2) { - addPath(path,argv[2]); + dbCatString(pstr,len,argv[2],psep); strip = 2; } else { - addPath(path,argv[1]+2); + dbCatString(pstr,len,argv[1]+2,psep); strip = 1; } argc -= strip; @@ -88,7 +91,7 @@ int main(int argc,char **argv) } pdbbase = dbAllocBase(); pdbbase->ignoreMissingMenus = TRUE; - status = dbReadDatabase(&pdbbase,argv[1],path); + status = dbReadDatabase(&pdbbase,argv[1],path,sub); if(status) { fprintf(stderr,"Terminal error For input file %s\n",argv[1]); exit(-1); diff --git a/src/dbStatic/dbToRecordtypeH.c b/src/dbStatic/dbToRecordtypeH.c index 52de14305..beabc8144 100644 --- a/src/dbStatic/dbToRecordtypeH.c +++ b/src/dbStatic/dbToRecordtypeH.c @@ -27,24 +27,10 @@ of this distribution. #include DBBASE *pdbbase = NULL; -#define MAX_PATH_LENGTH 256 -static void addPath(char *path,char *newdir) -{ - if((strlen(path)+strlen(newdir)+2) > (size_t)MAX_PATH_LENGTH) { - fprintf(stderr,"path > 256 characters\n"); - exit(-1); - } - if(strlen(path) > (size_t)0) strcat(path,":"); - strcat(path,newdir); -} - int main(int argc,char **argv) { - int strip; - char path[MAX_PATH_LENGTH]; int i; - long status; char *outFilename; char *pext; FILE *outFile; @@ -53,15 +39,34 @@ int main(int argc,char **argv) dbFldDes *pdbFldDes; int isdbCommonRecord = FALSE; char *plastSlash; + int strip; + char *path = NULL; + char *sub = NULL; + int pathLength = 0; + int subLength = 0; + char **pstr; + char *psep; + int *len; + long status; + static char *pathSep = ":"; + static char *subSep = ","; - /*Look for path, i.e. -I dir or -Idir*/ - path[0] = 0; - while(strncmp(argv[1],"-I",2)==0) { + /*Look for options*/ + while((strncmp(argv[1],"-I",2)==0)||(strncmp(argv[1],"-S",2)==0)) { + if(strncmp(argv[1],"-I",2)==0) { + pstr = &path; + psep = pathSep; + len = &pathLength; + } else { + pstr = ⊂ + psep = subSep; + len = &subLength; + } if(strlen(argv[1])==2) { - addPath(path,argv[2]); + dbCatString(pstr,len,argv[2],psep); strip = 2; } else { - addPath(path,argv[1]+2); + dbCatString(pstr,len,argv[1]+2,psep); strip = 1; } argc -= strip; @@ -93,7 +98,7 @@ int main(int argc,char **argv) } pdbbase = dbAllocBase(); pdbbase->ignoreMissingMenus = TRUE; - status = dbReadDatabase(&pdbbase,argv[1],path); + status = dbReadDatabase(&pdbbase,argv[1],path,sub); if(status) { fprintf(stderr,"Terminal error For input file %s\n",argv[1]); exit(-1);