Removed Forms support code fro dbStaticLib.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user