Added support for function() statement in .dbd files
This commit is contained in:
@@ -114,10 +114,10 @@ typedef struct dbRecordAttribute {
|
||||
char value[MAX_STRING_SIZE];
|
||||
}dbRecordAttribute;
|
||||
|
||||
typedef struct dbCdefText {
|
||||
typedef struct dbText {
|
||||
ELLNODE node;
|
||||
char *text;
|
||||
}dbCdefText;
|
||||
}dbText;
|
||||
|
||||
typedef struct dbRecordType {
|
||||
ELLNODE node;
|
||||
@@ -144,6 +144,7 @@ typedef struct dbBase {
|
||||
ELLLIST menuList;
|
||||
ELLLIST recordTypeList;
|
||||
ELLLIST drvList;
|
||||
ELLLIST funcList;
|
||||
ELLLIST bptList; /*Break Point Table Head*/
|
||||
void *pathPvt;
|
||||
void *ppvd; /* pointer to process variable directory*/
|
||||
|
||||
@@ -88,6 +88,7 @@ int main(int argc,char **argv)
|
||||
dbWriteRecordTypeFP(pdbbase,stdout,0);
|
||||
dbWriteDeviceFP(pdbbase,stdout);
|
||||
dbWriteDriverFP(pdbbase,stdout);
|
||||
dbWriteFunctionFP(pdbbase,stdout);
|
||||
dbWriteBreaktableFP(pdbbase,stdout);
|
||||
dbWriteRecordFP(pdbbase,stdout,0,0);
|
||||
free((void *)path);
|
||||
|
||||
@@ -31,6 +31,7 @@ static int yyreset(void)
|
||||
"record" return(tokenRECORD);
|
||||
"grecord" return(tokenGRECORD);
|
||||
"info" return(tokenINFO);
|
||||
"function" return(tokenFUNCTION);
|
||||
|
||||
[0-9]+ { /*integer number*/
|
||||
yylval.Str = (char *)dbmfMalloc(strlen(yytext)+1);
|
||||
|
||||
@@ -583,7 +583,7 @@ static void dbRecordtypeFieldItem(char *name,char *value)
|
||||
}
|
||||
|
||||
static void dbRecordtypeCdef(char *text) {
|
||||
dbCdefText *pdbCdef;
|
||||
dbText *pdbCdef;
|
||||
tempListNode *ptempListNode;
|
||||
dbRecordType *pdbRecordType;
|
||||
|
||||
@@ -591,7 +591,7 @@ static void dbRecordtypeCdef(char *text) {
|
||||
ptempListNode = (tempListNode *)ellFirst(&tempList);
|
||||
pdbRecordType = ptempListNode->item;
|
||||
|
||||
pdbCdef = dbCalloc(1,sizeof(dbCdefText));
|
||||
pdbCdef = dbCalloc(1,sizeof(dbText));
|
||||
if (text[0] == ' ') text++; /* strip leading space if present */
|
||||
pdbCdef->text = strduplicate(text);
|
||||
ellAdd(&pdbRecordType->cdefList, &pdbCdef->node);
|
||||
@@ -744,6 +744,25 @@ static void dbDriver(char *name)
|
||||
ellAdd(&pdbbase->drvList,&pdrvSup->node);
|
||||
}
|
||||
|
||||
static void dbFunction(char *name)
|
||||
{
|
||||
dbText *ptext;
|
||||
GPHENTRY *pgphentry;
|
||||
|
||||
pgphentry = gphFind(pdbbase->pgpHash,name,&pdbbase->funcList);
|
||||
if(pgphentry) {
|
||||
return;
|
||||
}
|
||||
ptext = dbCalloc(1,sizeof(dbText));
|
||||
ptext->text = strduplicate(name);
|
||||
pgphentry = gphAdd(pdbbase->pgpHash,ptext->text,&pdbbase->funcList);
|
||||
if(!pgphentry) {
|
||||
yyerrorAbort("gphAdd failed");
|
||||
}
|
||||
pgphentry->userPvt = ptext;
|
||||
ellAdd(&pdbbase->funcList,&ptext->node);
|
||||
}
|
||||
|
||||
static void dbBreakHead(char *name)
|
||||
{
|
||||
brkTable *pbrkTable;
|
||||
|
||||
@@ -545,6 +545,7 @@ dbBase * epicsShareAPI dbAllocBase(void)
|
||||
ellInit(&pdbbase->menuList);
|
||||
ellInit(&pdbbase->recordTypeList);
|
||||
ellInit(&pdbbase->drvList);
|
||||
ellInit(&pdbbase->funcList);
|
||||
ellInit(&pdbbase->bptList);
|
||||
gphInitPvt(&pdbbase->pgpHash,256);
|
||||
dbPvdInitPvt(pdbbase);
|
||||
@@ -563,6 +564,8 @@ void epicsShareAPI dbFreeBase(dbBase *pdbbase)
|
||||
dbRecordAttribute *pAttributeNext;
|
||||
devSup *pdevSup;
|
||||
devSup *pdevSupNext;
|
||||
dbText *ptext;
|
||||
dbText *ptextNext;
|
||||
drvSup *pdrvSup;
|
||||
drvSup *pdrvSupNext;
|
||||
brkTable *pbrkTable;
|
||||
@@ -611,6 +614,14 @@ void epicsShareAPI dbFreeBase(dbBase *pdbbase)
|
||||
free((void *)pdevSup);
|
||||
pdevSup = pdevSupNext;
|
||||
}
|
||||
ptext = (dbText *)ellFirst(&pdbRecordType->cdefList);
|
||||
while(ptext) {
|
||||
ptextNext = (dbText *)ellNext(&ptext->node);
|
||||
ellDelete(&pdbRecordType->cdefList,&ptext->node);
|
||||
free((void *)ptext->text);
|
||||
free((void *)ptext);
|
||||
ptext = ptextNext;
|
||||
}
|
||||
pAttribute =
|
||||
(dbRecordAttribute *)ellFirst(&pdbRecordType->attributeList);
|
||||
while(pAttribute) {
|
||||
@@ -654,6 +665,14 @@ void epicsShareAPI dbFreeBase(dbBase *pdbbase)
|
||||
free((void *)pdrvSup);
|
||||
pdrvSup = pdrvSupNext;
|
||||
}
|
||||
ptext = (dbText *)ellFirst(&pdbbase->funcList);
|
||||
while(ptext) {
|
||||
ptextNext = (dbText *)ellNext(&ptext->node);
|
||||
ellDelete(&pdbbase->funcList,&ptext->node);
|
||||
free((void *)ptext->text);
|
||||
free((void *)ptext);
|
||||
ptext = ptextNext;
|
||||
}
|
||||
pbrkTable = (brkTable *)ellFirst(&pdbbase->bptList);
|
||||
while(pbrkTable) {
|
||||
pbrkTableNext = (brkTable *)ellNext(&pbrkTable->node);
|
||||
@@ -1129,6 +1148,21 @@ long epicsShareAPI dbWriteDriverFP(DBBASE *pdbbase,FILE *fp)
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
long epicsShareAPI dbWriteFunctionFP(DBBASE *pdbbase,FILE *fp)
|
||||
{
|
||||
dbText *ptext;
|
||||
|
||||
if(!pdbbase) {
|
||||
fprintf(stderr,"pdbbase not specified\n");
|
||||
return(-1);
|
||||
}
|
||||
for(ptext = (dbText *)ellFirst(&pdbbase->funcList);
|
||||
ptext; ptext = (dbText *)ellNext(&ptext->node)) {
|
||||
fprintf(fp,"function(%s)\n",ptext->text);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
long epicsShareAPI dbWriteBreaktable(DBBASE *pdbbase,const char *filename)
|
||||
{
|
||||
@@ -3726,6 +3760,15 @@ void epicsShareAPI dbDumpDriver(DBBASE *pdbbase)
|
||||
dbWriteDriverFP(pdbbase,stdout);
|
||||
}
|
||||
|
||||
void epicsShareAPI dbDumpFunction(DBBASE *pdbbase)
|
||||
{
|
||||
if(!pdbbase) {
|
||||
printf("pdbbase not specified\n");
|
||||
return;
|
||||
}
|
||||
dbWriteFunctionFP(pdbbase,stdout);
|
||||
}
|
||||
|
||||
void epicsShareAPI dbDumpBreaktable(DBBASE *pdbbase,const char *name)
|
||||
{
|
||||
brkTable *pbrkTable;
|
||||
|
||||
@@ -96,6 +96,7 @@ epicsShareFunc long epicsShareAPI dbWriteDeviceFP(DBBASE *pdbbase,FILE *fp);
|
||||
epicsShareFunc long epicsShareAPI dbWriteDriver(
|
||||
DBBASE *pdbbase,const char *filename);
|
||||
epicsShareFunc long epicsShareAPI dbWriteDriverFP(DBBASE *pdbbase,FILE *fp);
|
||||
epicsShareFunc long epicsShareAPI dbWriteFunctionFP(DBBASE *pdbbase,FILE *fp);
|
||||
epicsShareFunc long epicsShareAPI dbWriteBreaktable(
|
||||
DBBASE *pdbbase,const char *filename);
|
||||
epicsShareFunc long epicsShareAPI dbWriteBreaktableFP(DBBASE *pdbbase,FILE *fp);
|
||||
@@ -210,6 +211,7 @@ epicsShareFunc void epicsShareAPI dbDumpField(
|
||||
epicsShareFunc void epicsShareAPI dbDumpDevice(
|
||||
DBBASE *pdbbase,const char *recordTypeName);
|
||||
epicsShareFunc void epicsShareAPI dbDumpDriver(DBBASE *pdbbase);
|
||||
epicsShareFunc void epicsShareAPI dbDumpFunction(DBBASE *pdbbase);
|
||||
epicsShareFunc void epicsShareAPI dbDumpBreaktable(
|
||||
DBBASE *pdbbase,const char *name);
|
||||
epicsShareFunc void epicsShareAPI dbPvdDump(DBBASE *pdbbase,int verbose);
|
||||
|
||||
@@ -36,7 +36,7 @@ int main(int argc,char **argv)
|
||||
dbMenu *pdbMenu;
|
||||
dbRecordType *pdbRecordType;
|
||||
dbFldDes *pdbFldDes;
|
||||
dbCdefText *pdbCdef;
|
||||
dbText *pdbCdef;
|
||||
int isdbCommonRecord = FALSE;
|
||||
char *plastSlash;
|
||||
int strip;
|
||||
@@ -216,10 +216,10 @@ int main(int argc,char **argv)
|
||||
fprintf(outFile,"#define %sRecord%s\t%d\n",
|
||||
pdbRecordType->name,pdbFldDes->name,pdbFldDes->indRecordType);
|
||||
}
|
||||
pdbCdef = (dbCdefText *)ellFirst(&pdbRecordType->cdefList);
|
||||
pdbCdef = (dbText *)ellFirst(&pdbRecordType->cdefList);
|
||||
while (pdbCdef) {
|
||||
fprintf(outFile,"%s\n",pdbCdef->text);
|
||||
pdbCdef = (dbCdefText *)ellNext(&pdbCdef->node);
|
||||
pdbCdef = (dbText *)ellNext(&pdbCdef->node);
|
||||
}
|
||||
}
|
||||
fprintf(outFile,"#endif /*INC%sH*/\n",pdbRecordType->name);
|
||||
|
||||
@@ -11,7 +11,7 @@ static int yyAbort = 0;
|
||||
|
||||
%token tokenINCLUDE tokenPATH tokenADDPATH
|
||||
%token tokenMENU tokenCHOICE tokenRECORDTYPE
|
||||
%token tokenFIELD tokenINFO
|
||||
%token tokenFIELD tokenINFO tokenFUNCTION
|
||||
%token tokenDEVICE tokenDRIVER tokenBREAKTABLE
|
||||
%token tokenRECORD tokenGRECORD
|
||||
%token <Str> tokenSTRING tokenCDEFS
|
||||
@@ -32,6 +32,7 @@ database_item: include
|
||||
| tokenRECORDTYPE recordtype_head recordtype_body
|
||||
| device
|
||||
| driver
|
||||
| function
|
||||
| tokenBREAKTABLE break_head break_body
|
||||
| tokenRECORD record_head record_body
|
||||
| tokenGRECORD grecord_head record_body
|
||||
@@ -139,6 +140,12 @@ driver: tokenDRIVER '(' tokenSTRING ')'
|
||||
dbDriver($3); dbmfFree($3);
|
||||
};
|
||||
|
||||
function: tokenFUNCTION '(' tokenSTRING ')'
|
||||
{
|
||||
if(dbStaticDebug>2) printf("function %s\n",$3);
|
||||
dbFunction($3); dbmfFree($3);
|
||||
};
|
||||
|
||||
break_head: '(' tokenSTRING ')'
|
||||
{
|
||||
if(dbStaticDebug>2) printf("break_head %s\n",$2);
|
||||
|
||||
Reference in New Issue
Block a user