Added support for function() statement in .dbd files

This commit is contained in:
Andrew Johnson
2002-09-25 18:30:46 +00:00
parent dff960b3c3
commit 7d2d368033
8 changed files with 82 additions and 8 deletions
+3 -2
View File
@@ -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*/
+1
View File
@@ -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);
+1
View File
@@ -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);
+21 -2
View File
@@ -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;
+43
View File
@@ -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;
+2
View File
@@ -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);
+3 -3
View File
@@ -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);
+8 -1
View File
@@ -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);