added support for macro substitution
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
LOBOBJS += seq
|
||||
#LIBOBJS += $(EPICS_BASE_BIN)/aaiRecord.o
|
||||
#LIBOBJS += $(EPICS_BASE_BIN)/aaoRecord.o
|
||||
LIBOBJS += $(EPICS_BASE_BIN)/aiRecord.o
|
||||
|
||||
+2
-2
@@ -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*/
|
||||
|
||||
@@ -39,6 +39,7 @@ of this distribution.
|
||||
#include <guigroup.h>
|
||||
#include <special.h>
|
||||
#include <link.h>
|
||||
#include <macLib.h>
|
||||
|
||||
/*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);
|
||||
|
||||
+32
-28
@@ -27,45 +27,49 @@ of this distribution.
|
||||
#include <gpHash.h>
|
||||
|
||||
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; i<argc; i++) argv[i] = argv[i + strip];
|
||||
/*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) {
|
||||
dbCatString(pstr,len,argv[2],psep);
|
||||
strip = 2;
|
||||
} else {
|
||||
dbCatString(pstr,len,argv[1]+2,psep);
|
||||
strip = 1;
|
||||
}
|
||||
argc -= strip;
|
||||
for(i=1; i<argc; i++) argv[i] = argv[i + strip];
|
||||
}
|
||||
if(argc<2 || (strncmp(argv[1],"-",1)==0)) {
|
||||
printf("usage: dbReadTest -Idir -Idir file.dbd file.dbd \n");
|
||||
exit(0);
|
||||
}
|
||||
for(i=1; i<argc; i++) {
|
||||
status = dbReadDatabase(&pdbbase,argv[i],path);
|
||||
status = dbReadDatabase(&pdbbase,argv[i],path,sub);
|
||||
if(!status) continue;
|
||||
fprintf(stderr,"For input file %s",argv[i]);
|
||||
errMessage(status,"from dbReadDatabase");
|
||||
|
||||
@@ -145,7 +145,7 @@ static int formlines[OUTLINK+1];
|
||||
/*Following are obsolete. Will go away next release*/
|
||||
long dbRead(DBBASE *pdbbase,FILE *fp)
|
||||
{
|
||||
return(dbReadDatabaseFP(&pdbbase,fp,0));
|
||||
return(dbReadDatabaseFP(&pdbbase,fp,0,0));
|
||||
}
|
||||
long dbWrite(DBBASE *pdbbase,FILE *fpdctsdr,FILE *fp)
|
||||
{
|
||||
@@ -254,6 +254,34 @@ void dbFreePath(DBBASE *pdbbase)
|
||||
pdbbase->pathPvt = 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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
+25
-22
@@ -27,40 +27,43 @@ of this distribution.
|
||||
#include <gpHash.h>
|
||||
|
||||
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);
|
||||
|
||||
@@ -27,24 +27,10 @@ of this distribution.
|
||||
#include <gpHash.h>
|
||||
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user