diff --git a/src/dbStatic/dbBase.h b/src/dbStatic/dbBase.h index 841339e65..c09f6290c 100644 --- a/src/dbStatic/dbBase.h +++ b/src/dbStatic/dbBase.h @@ -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*/ diff --git a/src/dbStatic/dbExpand.c b/src/dbStatic/dbExpand.c index 214aaf2c6..78fc5a942 100644 --- a/src/dbStatic/dbExpand.c +++ b/src/dbStatic/dbExpand.c @@ -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); diff --git a/src/dbStatic/dbLex.l b/src/dbStatic/dbLex.l index 89764aa9c..551f9757a 100644 --- a/src/dbStatic/dbLex.l +++ b/src/dbStatic/dbLex.l @@ -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); diff --git a/src/dbStatic/dbLexRoutines.c b/src/dbStatic/dbLexRoutines.c index 1a5b90ec0..c2ca90f19 100644 --- a/src/dbStatic/dbLexRoutines.c +++ b/src/dbStatic/dbLexRoutines.c @@ -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; diff --git a/src/dbStatic/dbStaticLib.c b/src/dbStatic/dbStaticLib.c index 3b39773b4..ded42ada2 100644 --- a/src/dbStatic/dbStaticLib.c +++ b/src/dbStatic/dbStaticLib.c @@ -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; diff --git a/src/dbStatic/dbStaticLib.h b/src/dbStatic/dbStaticLib.h index dec693d14..7bf5ce46b 100644 --- a/src/dbStatic/dbStaticLib.h +++ b/src/dbStatic/dbStaticLib.h @@ -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); diff --git a/src/dbStatic/dbToRecordtypeH.c b/src/dbStatic/dbToRecordtypeH.c index 7061edf9a..c79e9efa4 100644 --- a/src/dbStatic/dbToRecordtypeH.c +++ b/src/dbStatic/dbToRecordtypeH.c @@ -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); diff --git a/src/dbStatic/dbYacc.y b/src/dbStatic/dbYacc.y index 5731b3881..d9f122f54 100644 --- a/src/dbStatic/dbYacc.y +++ b/src/dbStatic/dbYacc.y @@ -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 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);