added support for macro substitution

This commit is contained in:
Marty Kraimer
1996-07-10 14:46:49 +00:00
parent b1450980b5
commit 01402c6bbd
9 changed files with 169 additions and 83 deletions
-1
View File
@@ -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
View File
@@ -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*/
+51 -7
View File
@@ -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
View File
@@ -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 = &sub;
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");
+29 -1
View File
@@ -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)
{
+4 -2
View File
@@ -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,
+1
View File
@@ -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
View File
@@ -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 = &sub;
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);
+25 -20
View File
@@ -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 = &sub;
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);