Removed Forms support code fro dbStaticLib.

This commit is contained in:
Andrew Johnson
2012-07-18 00:07:42 -05:00
parent 7f04d825ce
commit 0a88fd3f54
2 changed files with 1 additions and 815 deletions
+1 -805
View File
@@ -79,127 +79,12 @@ static int mapDBFtoDCT[DBF_NOACCESS+1] = {
DCT_INLINK,DCT_OUTLINK,DCT_FWDLINK,
DCT_NOACCESS};
struct form {
DBLINK *plink;
int linkType;
int nlines;
char **prompt;
char **value;
char **verify;
};
static char *promptCONSTANT[] = {
"Constant:"};
static char *promptINLINK[] = {
" PV Name:",
"NPP PP CA CP CPP:",
" NMS MS MSI MSS:"};
static char *promptOUTLINK[] = {
" PV Name:",
"NPP PP CA:",
"NMS or MS:"};
static char *promptFWDLINK[] = {
" PV Name:",
"<null> CA:"};
static char *promptVME_IO[] = {
" card:",
"signal:",
" parm:"};
static char *promptCAMAC_IO[] = {
" branch:",
" crate:",
" station:",
"subaddress:",
" function:",
" parameter:"};
static char *promptAB_IO[] = {
" link:",
" adapter:",
" card:",
" signal:",
" parm:"};
static char *promptGPIB_IO[] = {
"link:",
"addr:",
"parm:"};
static char *promptBITBUS_IO[] = {
" link:",
" node:",
" port:",
"signal:",
" parm:"};
static char *promptINST_IO[] = {
"parm:"};
static char *promptBBGPIB_IO[] = {
" link:",
" bbaddr:",
"gpibaddr:",
" parm:"};
static char *promptRF_IO[] = {
" cryo:",
" micro:",
" dataset:",
" element:"};
static char *promptVXI_IO[] = {
" Dynamic?",
"DYN frame:",
"DYN slot:",
"STATIC la:",
" Signal:",
" parm:"};
/*Each DBF link type is separate case*/
#define FORM_CONSTANT 0
#define FORM_INLINK 1
#define FORM_OUTLINK 2
#define FORM_FWDLINK 3
#define FORM_VME_IO 4
#define FORM_CAMAC_IO 5
#define FORM_AB_IO 6
#define FORM_GPIB_IO 7
#define FORM_BITBUS_IO 8
#define FORM_INST_IO 9
#define FORM_BBGPIB_IO 10
#define FORM_RF_IO 11
#define FORM_VXI_IO 12
#define FORM_NTYPES (FORM_VXI_IO + 1)
static char **promptAddr[FORM_NTYPES] = {
promptCONSTANT,
promptINLINK,
promptOUTLINK,
promptFWDLINK,
promptVME_IO,
promptCAMAC_IO,
promptAB_IO,
promptGPIB_IO,
promptBITBUS_IO,
promptINST_IO,
promptBBGPIB_IO,
promptRF_IO,
promptVXI_IO};
static int formlines[FORM_NTYPES] = {
sizeof(promptCONSTANT)/sizeof(char *),
sizeof(promptINLINK)/sizeof(char *),
sizeof(promptOUTLINK)/sizeof(char *),
sizeof(promptFWDLINK)/sizeof(char *),
sizeof(promptVME_IO)/sizeof(char *),
sizeof(promptCAMAC_IO)/sizeof(char *),
sizeof(promptAB_IO)/sizeof(char *),
sizeof(promptGPIB_IO)/sizeof(char *),
sizeof(promptBITBUS_IO)/sizeof(char *),
sizeof(promptINST_IO)/sizeof(char *),
sizeof(promptBBGPIB_IO)/sizeof(char *),
sizeof(promptRF_IO)/sizeof(char *),
sizeof(promptVXI_IO)/sizeof(char *)};
/*forward references for private routines*/
static FILE *openOutstream(const char *filename);
static void finishOutstream(FILE *stream);
static long setLinkType(DBENTRY *pdbentry);
static long putParmString(char **pparm,const char *pstring);
static long mapLINKTtoFORMT(DBLINK *plink,dbFldDes *pflddes,int *ind);
static void entryErrMessage(DBENTRY *pdbentry,long status,char *mess);
static void zeroDbentry(DBENTRY *pdbentry);
static char *getpMessage(DBENTRY *pdbentry);
@@ -368,47 +253,6 @@ void dbFreePath(DBBASE *pdbbase)
}
static long mapLINKTtoFORMT(DBLINK *plink,dbFldDes *pflddes,int *ind)
{
switch(plink->type) {
case CONSTANT:
*ind = FORM_CONSTANT; return(0);
case PV_LINK:
switch(pflddes->field_type) {
case DBF_INLINK:
*ind = FORM_INLINK; return(0);
case DBF_OUTLINK:
*ind = FORM_OUTLINK; return(0);
case DBF_FWDLINK:
*ind = FORM_FWDLINK; return(0);
default:
break;
}
break;
case VME_IO:
*ind = FORM_VME_IO; return(0);
case CAMAC_IO:
*ind = FORM_CAMAC_IO; return(0);
case AB_IO:
*ind = FORM_AB_IO; return(0);
case GPIB_IO:
*ind = FORM_GPIB_IO; return(0);
case BITBUS_IO:
*ind = FORM_BITBUS_IO; return(0);
case INST_IO:
*ind = FORM_INST_IO; return(0);
case BBGPIB_IO:
*ind = FORM_BBGPIB_IO; return(0);
case RF_IO:
*ind = FORM_RF_IO; return(0);
case VXI_IO:
*ind = FORM_VXI_IO; return(0);
default:
break;
}
return(S_dbLib_badLink);
}
static void entryErrMessage(DBENTRY *pdbentry,long status,char *mess)
{
char message[200];
@@ -443,7 +287,7 @@ static void entryErrMessage(DBENTRY *pdbentry,long status,char *mess)
static void zeroDbentry(DBENTRY *pdbentry)
{
/*NOTE that pdbbase, message, and formpvt MUST NOT be set to NULL*/
/*NOTE that pdbbase and message MUST NOT be set to NULL*/
pdbentry->precordType=NULL;
pdbentry->pflddes=NULL;
pdbentry->precnode=NULL;
@@ -757,7 +601,6 @@ DBENTRY * dbAllocEntry(dbBase *pdbbase)
void dbFreeEntry(DBENTRY *pdbentry)
{
if(pdbentry->message) free((void *)pdbentry->message);
if(pdbentry->formpvt) dbFreeForm(pdbentry);
dbmfFree(pdbentry);
}
@@ -773,7 +616,6 @@ void dbFinishEntry(DBENTRY *pdbentry)
free((void *)pdbentry->message);
pdbentry->message = NULL;
}
if(pdbentry->formpvt) dbFreeForm(pdbentry);
}
DBENTRY * dbCopyEntry(DBENTRY *pdbentry)
@@ -783,7 +625,6 @@ DBENTRY * dbCopyEntry(DBENTRY *pdbentry)
pnew = dbAllocEntry(pdbentry->pdbbase);
*pnew = *pdbentry;
pnew->message = NULL;
pnew->formpvt = NULL;
return(pnew);
}
@@ -791,7 +632,6 @@ void dbCopyEntryContents(DBENTRY *pfrom,DBENTRY *pto)
{
*pto = *pfrom;
pto->message = NULL;
pto->formpvt = NULL;
}
@@ -3017,648 +2857,6 @@ drvSup * dbFindDriver(dbBase *pdbbase, const char *name) {
return (drvSup *) pgph->userPvt;
}
int dbAllocForm(DBENTRY *psave)
{
DBENTRY dbEntry;
DBENTRY *pdbentry= &dbEntry;
dbFldDes *pflddes;
DBLINK *plink;
int nlines=0;
char *pstr;
struct form *pform;
int linkType;
long status = 0;
int nbytes,i;
if(psave->formpvt) {
status = dbFreeForm(psave);
if(status) return(status);
}
dbCopyEntryContents(psave,pdbentry);
pflddes = pdbentry->pflddes;
if(!pflddes) {
epicsPrintf("dbAllocForm called but no field is referenced\n");
goto done;
}
if(pflddes->field_type == DBF_DEVICE) {
status = dbFindField(pdbentry,"INP");
if(status) status = dbFindField(pdbentry,"OUT");
if(status) goto done;
pflddes = pdbentry->pflddes;
} else {
if((pflddes->field_type!=DBF_INLINK)
&& (pflddes->field_type!=DBF_OUTLINK)
&& (pflddes->field_type!=DBF_FWDLINK)) {
epicsPrintf("dbAllocForm called but not DBF_DEVICE or DBF_xxxLINK\n");
goto done;
}
plink = (DBLINK *)(pdbentry->pfield);
if(plink->type==MACRO_LINK) goto done;
if(strcmp(pflddes->name,"INP")==0 || strcmp(pflddes->name,"OUT")==0){
status = setLinkType(pdbentry);
if(status) {
errMessage(status,"in dbAllocForm from setLinkType");
return(0);
}
}
}
plink = (DBLINK *)(pdbentry->pfield);
if(plink->type==MACRO_LINK) goto done;
status = mapLINKTtoFORMT(plink,pflddes,&linkType);
if(status) goto done;
nlines = formlines[linkType];
/*Dont know how to handle string size. Just use messagesize*/
nbytes = sizeof(struct form) + 2*nlines*(sizeof(char *) + messagesize);
pform = dbCalloc(1,nbytes);
pform->nlines = nlines;
pform->linkType = linkType;
psave->formpvt = pform;
pform->plink = plink ;
pform->prompt = promptAddr[linkType];
pform->value = (char **)((char *)pform + sizeof(struct form));
pform->verify = (char **)((char *)(pform->value)+nlines*sizeof(char *));
pstr = (char *)(pform->verify) + nlines*sizeof(char *);
for(i=0; i<nlines; i++) {
pform->value[i] = pstr;
pstr += messagesize;
}
for(i=0; i<nlines; i++) {
pform->verify[i] = pstr;
pstr += messagesize;
}
done:
dbFinishEntry(pdbentry);
return(nlines);
}
long dbFreeForm(DBENTRY *pdbentry)
{
if(pdbentry->formpvt) {
free(pdbentry->formpvt);
pdbentry->formpvt = NULL;
}
return(0);
}
char ** dbGetFormPrompt(DBENTRY *pdbentry)
{
struct form *pform = pdbentry->formpvt;
if(!pform) return(NULL);
return(pform->prompt);
}
char ** dbGetFormValue(DBENTRY *pdbentry)
{
struct form *pform = pdbentry->formpvt;
DBLINK *plink;
char **value;
if(!pform) return(NULL);
plink = pform->plink;
if(!plink) return(NULL);
value = pform->value;
switch(pform->linkType) {
case FORM_CONSTANT:
if(plink->value.constantStr) {
strcpy(*value,plink->value.constantStr);
} else {
strcpy(*value,"");
}
break;
case FORM_INLINK: {
short pvlMask = plink->value.pv_link.pvlMask;
if(plink->value.pv_link.pvname)
strcpy(*value,plink->value.pv_link.pvname);
else
strcpy(*value,"");
value++;
if(pvlMask&pvlOptPP) strcpy(*value,"PP");
else if(pvlMask&pvlOptCA) strcpy(*value,"CA");
else if(pvlMask&pvlOptCP) strcpy(*value,"CP");
else if(pvlMask&pvlOptCPP) strcpy(*value,"CPP");
else strcpy(*value,"NPP");
value++;
strcpy(*value, msstring[pvlMask&pvlOptMsMode]);
value++;
}
break;
case FORM_OUTLINK: {
short pvlMask = plink->value.pv_link.pvlMask;
if(plink->value.pv_link.pvname)
strcpy(*value,plink->value.pv_link.pvname);
else
strcpy(*value,"");
value++;
if(pvlMask&pvlOptPP) strcpy(*value,"PP");
else if(pvlMask&pvlOptCA) strcpy(*value,"CA");
else strcpy(*value,"NPP");
value++;
strcpy(*value, msstring[pvlMask&pvlOptMsMode]);
value++;
}
break;
case FORM_FWDLINK: {
short pvlMask = plink->value.pv_link.pvlMask;
if(plink->value.pv_link.pvname)
strcpy(*value,plink->value.pv_link.pvname);
else
strcpy(*value,"");
value++;
if(pvlMask&pvlOptCA) strcpy(*value,"CA");
else strcpy(*value,"");
}
break;
case FORM_VME_IO:
cvtShortToString(plink->value.vmeio.card,*value);
value++;
cvtShortToString(plink->value.vmeio.signal,*value);
value++;
strcpy(*value,"@");
strcat(*value,plink->value.vmeio.parm);
break;
case FORM_CAMAC_IO:
cvtShortToString(plink->value.camacio.b,*value);
value++;
cvtShortToString(plink->value.camacio.c,*value);
value++;
cvtShortToString(plink->value.camacio.n,*value);
value++;
cvtShortToString(plink->value.camacio.a,*value);
value++;
cvtShortToString(plink->value.camacio.f,*value);
value++;
strcpy(*value,"@");
strcat(*value,plink->value.camacio.parm);
break;
case FORM_RF_IO:
cvtShortToString(plink->value.rfio.cryo,*value);
value++;
cvtShortToString(plink->value.rfio.micro,*value);
value++;
cvtShortToString(plink->value.rfio.dataset,*value);
value++;
cvtShortToString(plink->value.rfio.element,*value);
break;
case FORM_AB_IO:
cvtShortToString(plink->value.abio.link,*value);
value++;
cvtShortToString(plink->value.abio.adapter,*value);
value++;
cvtShortToString(plink->value.abio.card,*value);
value++;
cvtShortToString(plink->value.abio.signal,*value);
value++;
strcpy(*value,"@");
strcat(*value,plink->value.abio.parm);
break;
case FORM_GPIB_IO:
cvtShortToString(plink->value.gpibio.link,*value);
value++;
cvtShortToString(plink->value.gpibio.addr,*value);
value++;
strcpy(*value,"@");
strcat(*value,plink->value.gpibio.parm);
break;
case FORM_BITBUS_IO:
cvtCharToString(plink->value.bitbusio.link,*value);
value++;
cvtCharToString(plink->value.bitbusio.node,*value);
value++;
cvtCharToString(plink->value.bitbusio.port,*value);
value++;
cvtCharToString(plink->value.bitbusio.signal,*value);
value++;
strcpy(*value,"@");
strcat(*value,plink->value.bitbusio.parm);
break;
case FORM_INST_IO:
strcpy(*value,"@");
strcat(*value,plink->value.instio.string);
break;
case FORM_BBGPIB_IO:
cvtCharToString(plink->value.bbgpibio.link,*value);
value++;
cvtCharToString(plink->value.bbgpibio.bbaddr,*value);
value++;
cvtCharToString(plink->value.bbgpibio.gpibaddr,*value);
value++;
strcpy(*value,"@");
strcat(*value,plink->value.bbgpibio.parm);
break;
case FORM_VXI_IO:
strcpy(*value,(plink->value.vxiio.flag == VXIDYNAMIC ? "Yes" : "No"));
value++;
if(plink->value.vxiio.flag == VXIDYNAMIC)
cvtShortToString(plink->value.vxiio.frame,*value);
else
**value = 0;
value++;
if(plink->value.vxiio.flag == VXIDYNAMIC)
cvtShortToString(plink->value.vxiio.slot,*value);
else
**value = 0;
value++;
if(plink->value.vxiio.flag == VXISTATIC)
cvtShortToString(plink->value.vxiio.la,*value);
else
**value = 0;
value++;
cvtShortToString(plink->value.vxiio.signal,*value);
value++;
strcpy(*value,"@");
strcat(*value,plink->value.vxiio.parm);
break;
default :
return(NULL);
}
return(pform->value);
}
long dbPutForm(DBENTRY *pdbentry,char **value)
{
struct form *pform = pdbentry->formpvt;
DBLINK *plink;
char **verify;
long lvalue;
char *endp;
long status = 0;
if(!pform) return(S_dbLib_badLink);
plink = pform->plink;
if(!plink) return(S_dbLib_badLink);
verify = pform->verify;
switch(pform->linkType) {
case FORM_CONSTANT:
**verify = 0; /*Initialize to no error*/
if(**value == '\0') break;
(void) epicsStrtod(*value,&endp);
if(*endp!=0) {
strcpy(*verify,"Illegal. Must be number");
break;
}
if((!plink->value.constantStr)
|| ((int)strlen(plink->value.constantStr)<(int)strlen(*value))) {
free(plink->value.constantStr);
plink->value.constantStr = dbCalloc(strlen(*value)+1,sizeof(char));
}
strcpy(plink->value.constantStr,*value);
break;
case FORM_INLINK: {
DBENTRY dbEntry;
DBENTRY *plinkentry = &dbEntry;
short ppOpt = 0;
short msOpt = 0;
const char *pstr;
pstr = *value;
**verify = 0;
value++; verify++;
**verify = 0; /*Initialize verify to NULL*/
if((*value==NULL) || (strcmp(*value,"")==0)) ppOpt = 0;
else if(strstr(*value,"NPP")) ppOpt = 0;
else if(strstr(*value,"CPP")) ppOpt = pvlOptCPP;
else if(strstr(*value,"PP")) ppOpt = pvlOptPP;
else if(strstr(*value,"CA")) ppOpt = pvlOptCA;
else if(strstr(*value,"CP")) ppOpt = pvlOptCP;
else strcpy(*verify,"Illegal. Chose a value");
value++; verify++;
**verify = 0; /*Initialize verify to NULL*/
if((*value==NULL) || (strcmp(*value,"")==0)) msOpt = 0;
else if(strstr(*value,"NMS")) msOpt = pvlOptNMS;
else if(strstr(*value,"MSI")) msOpt = pvlOptMSI;
else if(strstr(*value,"MSS")) msOpt = pvlOptMSS;
/*must be the last one:*/
else if(strstr(*value,"MS")) msOpt = pvlOptMS;
else strcpy(*verify,"Illegal. Chose a value");
dbCopyEntryContents(pdbentry,plinkentry);
if(pdbentry->pflddes->field_type == DBF_DEVICE) {
status = dbFindField(plinkentry,"INP");
if(status) {
dbFinishEntry(plinkentry);
return(status);
}
}
putPvLink(plinkentry,ppOpt|msOpt,pstr);
dbFinishEntry(plinkentry);
}
break;
case FORM_OUTLINK: {
DBENTRY dbEntry;
DBENTRY *plinkentry = &dbEntry;
short ppOpt = 0;
short msOpt = 0;
const char *pstr;
pstr = *value;
**verify = 0;
value++; verify++;
**verify = 0; /*Initialize verify to NULL*/
if((*value==NULL) || (strcmp(*value,"")==0)) ppOpt = 0;
else if(strstr(*value,"NPP")) ppOpt = 0;
else if(strstr(*value,"PP")) ppOpt = pvlOptPP;
else if(strstr(*value,"CA")) ppOpt = pvlOptCA;
else strcpy(*verify,"Illegal. Chose a value");
value++; verify++;
**verify = 0; /*Initialize verify to NULL*/
if((*value==NULL) || (strcmp(*value,"")==0)) msOpt = 0;
else if(strstr(*value,"NMS")) msOpt = pvlOptNMS;
else if(strstr(*value,"MSI")) msOpt = pvlOptMSI;
else if(strstr(*value,"MSS")) msOpt = pvlOptMSS;
/*must be the last one:*/
else if(strstr(*value,"MS")) msOpt = pvlOptMS;
else strcpy(*verify,"Illegal. Chose a value");
dbCopyEntryContents(pdbentry,plinkentry);
if(pdbentry->pflddes->field_type == DBF_DEVICE) {
status = dbFindField(plinkentry,"OUT");
if(status) {
dbFinishEntry(plinkentry);
return(status);
}
}
putPvLink(plinkentry,ppOpt|msOpt,pstr);
dbFinishEntry(plinkentry);
}
break;
case FORM_FWDLINK: {
short ppOpt = 0;
short msOpt = 0;
const char *pstr;
pstr = *value;
**verify = 0;
value++; verify++;
**verify = 0; /*Initialize verify to NULL*/
if((*value==NULL) || (strcmp(*value,"")==0)) ppOpt = 0;
else if(strstr(*value,"CA")) ppOpt = pvlOptCA;
else strcpy(*verify,"Illegal. Chose a value");
putPvLink(pdbentry,ppOpt|msOpt,pstr);
}
break;
case FORM_VME_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.vmeio.card = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.vmeio.signal = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
status = putParmString(&plink->value.vmeio.parm,*value);
break;
case FORM_CAMAC_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.camacio.b = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.camacio.c = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.camacio.n = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.camacio.a = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.camacio.f = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
status = putParmString(&plink->value.camacio.parm,*value);
break;
case FORM_RF_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.rfio.cryo = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.rfio.micro = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.rfio.dataset = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.rfio.element = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
break;
case FORM_AB_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.abio.link = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.abio.adapter = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.abio.card = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.abio.signal = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
status = putParmString(&plink->value.abio.parm,*value);
break;
case FORM_GPIB_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.gpibio.link = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.gpibio.addr = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
status = putParmString(&plink->value.gpibio.parm,*value);
**verify = 0;
break;
case FORM_BITBUS_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.bitbusio.link = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.bitbusio.node = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.bitbusio.port = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.bitbusio.signal = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
status = putParmString(&plink->value.bitbusio.parm,*value);
**verify = 0;
break;
case FORM_INST_IO:
status = putParmString(&plink->value.instio.string,*value);
**verify = 0;
break;
case FORM_BBGPIB_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.bbgpibio.link = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.bbgpibio.bbaddr = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.bbgpibio.gpibaddr = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
status = putParmString(&plink->value.bbgpibio.parm,*value);
**verify = 0;
break;
case FORM_VXI_IO:
plink->value.vxiio.flag =
((strchr(*value,'Y')||strchr(*value,'y') ? VXIDYNAMIC : VXISTATIC));
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.vxiio.frame = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.vxiio.slot = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.vxiio.la = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.vxiio.signal = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
status = putParmString(&plink->value.vxiio.parm,*value);
**verify = 0;
break;
default :
status = S_dbLib_badLink;
}
return(status);
}
char ** dbVerifyForm(DBENTRY *pdbentry,char **value)
{
struct form *pform = pdbentry->formpvt;
DBLINK *plink;
DBLINK templink;
int nlines,i;
if(!pform) return(NULL);
plink = pform->plink;
if(!plink) return(NULL);
templink = *plink;
if(plink->type==CONSTANT) templink.value.constantStr = NULL;
if(plink->type==PV_LINK) templink.value.pv_link.pvname = NULL;
pform->plink = &templink;
dbPutForm(pdbentry,value);
if(plink->type==CONSTANT) free((void *)templink.value.constantStr);
if(plink->type==PV_LINK) free((void *)templink.value.pv_link.pvname);
pform->plink = plink;
nlines = pform->nlines;
for(i=0; i<nlines; i++) {
/* If any verify string is not null then return verify */
if(*pform->verify[i]) return(pform->verify);
}
return(NULL);
}
char * dbGetRelatedField(DBENTRY *psave)
{
DBENTRY dbEntry;
@@ -3748,7 +2946,6 @@ long dbCvtLinkToConstant(DBENTRY *pdbentry)
if(plink->type != PV_LINK) return(S_dbLib_badLink);
free((void *)plink->value.pv_link.pvname);
plink->value.pv_link.pvname = NULL;
dbFreeForm(pdbentry);
plink->type = CONSTANT;
if(pflddes->initial) {
plink->value.constantStr =
@@ -3782,7 +2979,6 @@ long dbCvtLinkToPvlink(DBENTRY *pdbentry)
if(plink->type == PV_LINK) return(0);
if(plink->type != CONSTANT) return(S_dbLib_badLink);
free(plink->value.constantStr);
dbFreeForm(pdbentry);
plink->type = PV_LINK;
plink->value.pv_link.pvlMask = 0;
plink->value.pv_link.pvname = 0;
-10
View File
@@ -56,7 +56,6 @@ typedef struct{
void *pfield;
char *message;
short indfield;
void *formpvt;
} DBENTRY;
/*dbDumpFldDes is obsolete. It is only provided for compatibility*/
@@ -204,14 +203,6 @@ epicsShareFunc int dbGetMenuIndexFromString(DBENTRY *pdbentry,
epicsShareFunc drvSup * dbFindDriver(dbBase *pdbbase,
const char *name);
epicsShareFunc int dbAllocForm(DBENTRY *pdbentry);
epicsShareFunc long dbFreeForm(DBENTRY *pdbentry);
epicsShareFunc char ** dbGetFormPrompt(DBENTRY *pdbentry);
epicsShareFunc char ** dbGetFormValue(DBENTRY *pdbentry);
epicsShareFunc long dbPutForm(DBENTRY *pdbentry, char **value);
epicsShareFunc char ** dbVerifyForm(DBENTRY *pdbentry,
char **value);
epicsShareFunc char * dbGetRelatedField(DBENTRY *pdbentry);
epicsShareFunc int dbGetNLinks(DBENTRY *pdbentry);
@@ -262,7 +253,6 @@ extern int dbStaticDebug;
#define S_dbLib_noRecSup (M_dbLib|19) /* Record support not found */
#define S_dbLib_strLen (M_dbLib|21) /* String is too long */
#define S_dbLib_noSizeOffset (M_dbLib|23) /* Missing SizeOffset Routine - No record support? */
#define S_dbLib_noForm (M_dbLib|25) /* dbAllocForm was not called */
#define S_dbLib_outMem (M_dbLib|27) /* Out of memory */
#define S_dbLib_infoNotFound (M_dbLib|29) /* Info item Not Found */