diff --git a/src/dbStatic/dbBase.h b/src/dbStatic/dbBase.h index ec7ff8425..87ff3b85a 100644 --- a/src/dbStatic/dbBase.h +++ b/src/dbStatic/dbBase.h @@ -145,6 +145,7 @@ typedef struct dbBase { ELLLIST recordTypeList; ELLLIST drvList; ELLLIST registrarList; + ELLLIST variableList; 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 6ae3c6c6b..02cb448cd 100644 --- a/src/dbStatic/dbExpand.c +++ b/src/dbStatic/dbExpand.c @@ -91,6 +91,7 @@ int main(int argc,char **argv) dbWriteDeviceFP(pdbbase,stdout); dbWriteDriverFP(pdbbase,stdout); dbWriteRegistrarFP(pdbbase,stdout); + dbWriteVariableFP(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 dc6b2caf6..be679a7fe 100644 --- a/src/dbStatic/dbLex.l +++ b/src/dbStatic/dbLex.l @@ -31,7 +31,8 @@ static int yyreset(void) "record" return(tokenRECORD); "grecord" return(tokenGRECORD); "info" return(tokenINFO); -"registrar" return(tokenREGISTRAR); +"registrar" return(tokenREGISTRAR); +"variable" return(tokenVARIABLE); [0-9]+ { /*integer number*/ yylval.Str = (char *)dbmfMalloc(strlen(yytext)+1); diff --git a/src/dbStatic/dbLexRoutines.c b/src/dbStatic/dbLexRoutines.c index 51ea35c13..a412d59f9 100644 --- a/src/dbStatic/dbLexRoutines.c +++ b/src/dbStatic/dbLexRoutines.c @@ -64,6 +64,7 @@ static void dbDevice(char *recordtype,char *linktype, char *dsetname,char *choicestring); static void dbDriver(char *name); static void dbRegistrar(char *name); +static void dbVariable(char *name); static void dbBreakHead(char *name); static void dbBreakItem(char *value); @@ -757,6 +758,25 @@ static void dbRegistrar(char *name) ellAdd(&pdbbase->registrarList,&ptext->node); } +static void dbVariable(char *name) +{ + dbText *ptext; + GPHENTRY *pgphentry; + + pgphentry = gphFind(pdbbase->pgpHash,name,&pdbbase->variableList); + if(pgphentry) { + return; + } + ptext = dbCalloc(1,sizeof(dbText)); + ptext->text = epicsStrDup(name); + pgphentry = gphAdd(pdbbase->pgpHash,ptext->text,&pdbbase->variableList); + if(!pgphentry) { + yyerrorAbort("gphAdd failed"); + } + pgphentry->userPvt = ptext; + ellAdd(&pdbbase->variableList,&ptext->node); +} + static void dbBreakHead(char *name) { brkTable *pbrkTable; diff --git a/src/dbStatic/dbStaticLib.c b/src/dbStatic/dbStaticLib.c index fd0b35a54..ea630795f 100644 --- a/src/dbStatic/dbStaticLib.c +++ b/src/dbStatic/dbStaticLib.c @@ -546,6 +546,7 @@ dbBase * epicsShareAPI dbAllocBase(void) ellInit(&pdbbase->recordTypeList); ellInit(&pdbbase->drvList); ellInit(&pdbbase->registrarList); + ellInit(&pdbbase->variableList); ellInit(&pdbbase->bptList); gphInitPvt(&pdbbase->pgpHash,256); dbPvdInitPvt(pdbbase); @@ -673,6 +674,14 @@ void epicsShareAPI dbFreeBase(dbBase *pdbbase) free((void *)ptext); ptext = ptextNext; } + ptext = (dbText *)ellFirst(&pdbbase->variableList); + while(ptext) { + ptextNext = (dbText *)ellNext(&ptext->node); + ellDelete(&pdbbase->variableList,&ptext->node); + free((void *)ptext->text); + free((void *)ptext); + ptext = ptextNext; + } pbrkTable = (brkTable *)ellFirst(&pdbbase->bptList); while(pbrkTable) { pbrkTableNext = (brkTable *)ellNext(&pbrkTable->node); @@ -1163,6 +1172,21 @@ long epicsShareAPI dbWriteRegistrarFP(DBBASE *pdbbase,FILE *fp) } return(0); } + +long epicsShareAPI dbWriteVariableFP(DBBASE *pdbbase,FILE *fp) +{ + dbText *ptext; + + if(!pdbbase) { + fprintf(stderr,"pdbbase not specified\n"); + return(-1); + } + for(ptext = (dbText *)ellFirst(&pdbbase->variableList); + ptext; ptext = (dbText *)ellNext(&ptext->node)) { + fprintf(fp,"variable(%s)\n",ptext->text); + } + return(0); +} long epicsShareAPI dbWriteBreaktable(DBBASE *pdbbase,const char *filename) { @@ -3778,6 +3802,15 @@ void epicsShareAPI dbDumpRegistrar(DBBASE *pdbbase) dbWriteRegistrarFP(pdbbase,stdout); } +void epicsShareAPI dbDumpVariable(DBBASE *pdbbase) +{ + if(!pdbbase) { + printf("pdbbase not specified\n"); + return; + } + dbWriteVariableFP(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 0f1163dbf..1a753774c 100644 --- a/src/dbStatic/dbStaticLib.h +++ b/src/dbStatic/dbStaticLib.h @@ -100,6 +100,7 @@ epicsShareFunc long epicsShareAPI dbWriteDriver( DBBASE *pdbbase,const char *filename); epicsShareFunc long epicsShareAPI dbWriteDriverFP(DBBASE *pdbbase,FILE *fp); epicsShareFunc long epicsShareAPI dbWriteRegistrarFP(DBBASE *pdbbase,FILE *fp); +epicsShareFunc long epicsShareAPI dbWriteVariableFP(DBBASE *pdbbase,FILE *fp); epicsShareFunc long epicsShareAPI dbWriteBreaktable( DBBASE *pdbbase,const char *filename); epicsShareFunc long epicsShareAPI dbWriteBreaktableFP(DBBASE *pdbbase,FILE *fp); @@ -215,6 +216,7 @@ epicsShareFunc void epicsShareAPI dbDumpDevice( DBBASE *pdbbase,const char *recordTypeName); epicsShareFunc void epicsShareAPI dbDumpDriver(DBBASE *pdbbase); epicsShareFunc void epicsShareAPI dbDumpRegistrar(DBBASE *pdbbase); +epicsShareFunc void epicsShareAPI dbDumpVariable(DBBASE *pdbbase); epicsShareFunc void epicsShareAPI dbDumpBreaktable( DBBASE *pdbbase,const char *name); epicsShareFunc void epicsShareAPI dbPvdDump(DBBASE *pdbbase,int verbose); diff --git a/src/dbStatic/dbYacc.y b/src/dbStatic/dbYacc.y index 783ac66c9..1f8b08db3 100644 --- a/src/dbStatic/dbYacc.y +++ b/src/dbStatic/dbYacc.y @@ -13,7 +13,7 @@ static int yyAbort = 0; %token tokenMENU tokenCHOICE tokenRECORDTYPE %token tokenFIELD tokenINFO tokenREGISTRAR %token tokenDEVICE tokenDRIVER tokenBREAKTABLE -%token tokenRECORD tokenGRECORD +%token tokenRECORD tokenGRECORD tokenVARIABLE %token tokenSTRING tokenCDEFS %union @@ -33,6 +33,7 @@ database_item: include | device | driver | registrar + | variable | tokenBREAKTABLE break_head break_body | tokenRECORD record_head record_body | tokenGRECORD grecord_head record_body @@ -146,6 +147,12 @@ registrar: tokenREGISTRAR '(' tokenSTRING ')' dbRegistrar($3); dbmfFree($3); }; +variable: tokenVARIABLE '(' tokenSTRING ')' +{ + if(dbStaticDebug>2) printf("variable %s\n",$3); + dbVariable($3); dbmfFree($3); +}; + break_head: '(' tokenSTRING ')' { if(dbStaticDebug>2) printf("break_head %s\n",$2);