This is Unofficial EPICS BASE Doxygen Site
dbStaticRun.c
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2002 The University of Chicago, as Operator of Argonne
3 * National Laboratory.
4 * Copyright (c) 2002 The Regents of the University of California, as
5 * Operator of Los Alamos National Laboratory.
6 * EPICS BASE Versions 3.13.7
7 * and higher are distributed subject to a Software License Agreement found
8 * in file LICENSE that is included with this distribution.
9 \*************************************************************************/
10 /*dbStaticLibRun.c*/
11 
12 #include <stddef.h>
13 #include <stdio.h>
14 #include <limits.h>
15 #include <string.h>
16 #include <math.h>
17 
18 #include "cvtFast.h"
19 #include "dbDefs.h"
20 #include "ellLib.h"
21 #include "epicsPrint.h"
22 #include "epicsStdlib.h"
23 #include "epicsTypes.h"
24 #include "errMdef.h"
25 
26 #include "epicsExport.h" /* #define epicsExportSharedSymbols */
27 #include "dbBase.h"
28 #include "dbCommonPvt.h"
29 #include "dbStaticLib.h"
30 #include "dbStaticPvt.h"
31 #include "devSup.h"
32 #include "special.h"
33 
36 
37 static long do_nothing(struct dbCommon *precord) { return 0; }
38 
39 /* Dummy DSXT used for soft device supports */
40 struct dsxt devSoft_DSXT = {
41  do_nothing,
42  do_nothing
43 };
44 
45 static devSup *pthisDevSup = NULL;
46 
47 void dbInitDevSup(devSup *pdevSup, dset *pdset)
48 {
49  pdevSup->pdset = pdset;
50  if (pdevSup->link_type == CONSTANT)
51  pdevSup->pdsxt = &devSoft_DSXT;
52 
53  if (pdset->init) {
54  pthisDevSup = pdevSup;
55  pdset->init(0);
56  pthisDevSup = NULL;
57  }
58 }
59 
60 void devExtend(dsxt *pdsxt)
61 {
62  if (!pthisDevSup)
63  errlogPrintf("devExtend() called outside of dbInitDevSup()\n");
64  else {
65  pthisDevSup->pdsxt = pdsxt;
66  }
67 }
68 
69 long dbAllocRecord(DBENTRY *pdbentry,const char *precordName)
70 {
71  dbRecordType *pdbRecordType = pdbentry->precordType;
72  dbRecordNode *precnode = pdbentry->precnode;
73  dbFldDes *pflddes;
74  int i;
75  dbCommonPvt *ppvt;
76  dbCommon *precord;
77  char *pfield;
78 
79  if(!pdbRecordType) return(S_dbLib_recordTypeNotFound);
80  if(!precnode) return(S_dbLib_recNotFound);
81  if(pdbRecordType->rec_size == 0) {
82  printf("\t*** Did you run x_RegisterRecordDeviceDriver(pdbbase) yet? ***\n");
83  epicsPrintf("dbAllocRecord(%s) with %s rec_size = 0\n",
84  precordName, pdbRecordType->name);
85  return(S_dbLib_noRecSup);
86  } else if(pdbRecordType->rec_size<sizeof(*precord)) {
87  printf("\t*** Recordtype %s must include \"dbCommon.dbd\"\n", pdbRecordType->name);
88  epicsPrintf("dbAllocRecord(%s) with %s rec_size = %d\n",
89  precordName, pdbRecordType->name, pdbRecordType->rec_size);
90  return(S_dbLib_noRecSup);
91  }
92  ppvt = dbCalloc(1, offsetof(dbCommonPvt, common) + pdbRecordType->rec_size);
93  precord = &ppvt->common;
94  ppvt->recnode = precnode;
95  precord->rdes = pdbRecordType;
96  precnode->precord = precord;
97  pflddes = pdbRecordType->papFldDes[0];
98  if(!pflddes) {
99  epicsPrintf("dbAllocRecord pflddes for NAME not found\n");
100  return(S_dbLib_flddesNotFound);
101  }
102  assert(pflddes->offset == 0);
103  assert(pflddes->size == sizeof(precord->name));
104  if(strlen(precordName) >= sizeof(precord->name)) {
105  epicsPrintf("dbAllocRecord: NAME(%s) too long\n",precordName);
106  return(S_dbLib_nameLength);
107  }
108  strcpy(precord->name, precordName);
109  for(i=1; i<pdbRecordType->no_fields; i++) {
110 
111  pflddes = pdbRecordType->papFldDes[i];
112  if(!pflddes) continue;
113  pfield = (char*)precord + pflddes->offset;
114  pdbentry->pfield = (void *)pfield;
115  pdbentry->pflddes = pflddes;
116  pdbentry->indfield = i;
117  switch(pflddes->field_type) {
118  case DBF_STRING:
119  if(pflddes->initial) {
120  if(strlen(pflddes->initial) >= pflddes->size) {
121  epicsPrintf("initial size > size for %s.%s\n",
122  pdbRecordType->name,pflddes->name);
123  } else {
124  strcpy(pfield,pflddes->initial);
125  }
126  }
127  break;
128  case DBF_CHAR:
129  case DBF_UCHAR:
130  case DBF_SHORT:
131  case DBF_USHORT:
132  case DBF_LONG:
133  case DBF_ULONG:
134  case DBF_INT64:
135  case DBF_UINT64:
136  case DBF_FLOAT:
137  case DBF_DOUBLE:
138  case DBF_ENUM:
139  case DBF_MENU:
140  if(pflddes->initial) {
141  long status;
142 
143  status = dbPutStringNum(pdbentry,pflddes->initial);
144  if(status)
145  epicsPrintf("Error initializing %s.%s initial %s\n",
146  pdbRecordType->name,pflddes->name,pflddes->initial);
147  }
148  break;
149  case DBF_DEVICE:
150  if(!pflddes->ftPvt) dbGetDeviceMenu(pdbentry);
151  break;
152  case DBF_INLINK:
153  case DBF_OUTLINK:
154  case DBF_FWDLINK: {
155  DBLINK *plink = (DBLINK *)pfield;
156 
157  plink->type = CONSTANT;
158  if(pflddes->initial) {
159  plink->text =
160  dbCalloc(strlen(pflddes->initial)+1,sizeof(char));
161  strcpy(plink->text,pflddes->initial);
162  }
163  }
164  break;
165  case DBF_NOACCESS:
166  break;
167  default:
168  epicsPrintf("dbAllocRecord: Illegal field type\n");
169  }
170  }
171  return(0);
172 }
173 
174 long dbFreeRecord(DBENTRY *pdbentry)
175 {
176  dbRecordType *pdbRecordType = pdbentry->precordType;
177  dbRecordNode *precnode = pdbentry->precnode;
178 
179  if(!pdbRecordType) return(S_dbLib_recordTypeNotFound);
180  if(!precnode) return(S_dbLib_recNotFound);
181  if(!precnode->precord) return(S_dbLib_recNotFound);
182  free(dbRec2Pvt(precnode->precord));
183  precnode->precord = NULL;
184  return(0);
185 }
186 
187 long dbGetFieldAddress(DBENTRY *pdbentry)
188 {
189  dbRecordType *pdbRecordType = pdbentry->precordType;
190  dbRecordNode *precnode = pdbentry->precnode;
191  dbFldDes *pflddes = pdbentry->pflddes;
192 
193  if(!pdbRecordType) return(S_dbLib_recordTypeNotFound);
194  if(!precnode) return(S_dbLib_recNotFound);
195  if(!pflddes) return(S_dbLib_flddesNotFound);
196  if(!precnode->precord) return(0);
197  pdbentry->pfield = ((char *)precnode->precord) + pflddes->offset;
198  return(0);
199 }
200 
201 char *dbRecordName(DBENTRY *pdbentry)
202 {
203  dbRecordType *pdbRecordType = pdbentry->precordType;
204  dbRecordNode *precnode = pdbentry->precnode;
205  dbFldDes *pflddes;
206  char *precord;
207 
208  if(!pdbRecordType) return(0);
209  if(!precnode) return(0);
210  if(!precnode->precord) return(0);
211  precord = (char *)precnode->precord;
212  pflddes = pdbRecordType->papFldDes[0];
213  if(!pflddes) return(NULL);
214  return(precord + pflddes->offset);
215 }
216 
217 int dbIsMacroOk(DBENTRY *pdbentry) { return(FALSE); }
218 
220 {
221  dbFldDes *pflddes = pdbentry->pflddes;
222  void *pfield = pdbentry->pfield;
223 
224  if (!pflddes || !pfield)
225  return FALSE;
226 
227  switch (pflddes->field_type) {
228  case DBF_STRING: {
229  char *p = (char *)pfield;
230 
231  return pflddes->initial ? ! strcmp(pflddes->initial, p)
232  : ! strlen(p);
233  }
234  case DBF_CHAR: {
235  epicsInt8 field = *(epicsInt8 *)pfield;
236  epicsInt8 def;
237 
238  if (!pflddes->initial)
239  return field == 0;
240 
241  return ! epicsParseInt8(pflddes->initial, &def, 0, NULL)
242  && field == def;
243  }
244  case DBF_UCHAR: {
245  epicsUInt8 field = *(epicsUInt8 *)pfield;
246  epicsUInt8 def;
247 
248  if (!pflddes->initial)
249  return field == 0;
250 
251  return ! epicsParseUInt8(pflddes->initial, &def, 0, NULL)
252  && field == def;
253  }
254  case DBF_SHORT: {
255  epicsInt16 field = *(epicsInt16 *)pfield;
256  epicsInt16 def;
257 
258  if (!pflddes->initial)
259  return field == 0;
260 
261  return ! epicsParseInt16(pflddes->initial, &def, 0, NULL)
262  && field == def;
263  }
264  case DBF_ENUM:
265  case DBF_USHORT: {
266  epicsUInt16 field = *(epicsUInt16 *)pfield;
268 
269  if (!pflddes->initial)
270  return field == 0;
271 
272  return ! epicsParseUInt16(pflddes->initial, &def, 0, NULL)
273  && field == def;
274  }
275  case DBF_LONG: {
276  epicsInt32 field = *(epicsInt32 *)pfield;
277  epicsInt32 def;
278 
279  if (!pflddes->initial)
280  return field == 0;
281 
282  return ! epicsParseInt32(pflddes->initial, &def, 0, NULL)
283  && field == def;
284  }
285  case DBF_ULONG: {
286  epicsUInt32 field = *(epicsUInt32 *)pfield;
288 
289  if (!pflddes->initial)
290  return field == 0;
291 
292  return ! epicsParseUInt32(pflddes->initial, &def, 0, NULL)
293  && field == def;
294  }
295  case DBF_INT64: {
296  epicsInt64 field = *(epicsInt64 *)pfield;
297  epicsInt64 def;
298 
299  if (!pflddes->initial)
300  return field == 0;
301 
302  return ! epicsParseInt64(pflddes->initial, &def, 0, NULL)
303  && field == def;
304  }
305  case DBF_UINT64: {
306  epicsUInt64 field = *(epicsUInt64 *)pfield;
308 
309  if (!pflddes->initial)
310  return field == 0;
311 
312  return ! epicsParseUInt64(pflddes->initial, &def, 0, NULL)
313  && field == def;
314  }
315  case DBF_FLOAT: {
316  epicsFloat32 field = *(epicsFloat32 *)pfield;
318 
319  if (!pflddes->initial)
320  return field == 0;
321 
322  return ! epicsParseFloat32(pflddes->initial, &def, NULL)
323  && field == def;
324  }
325  case DBF_DOUBLE: {
326  epicsFloat64 field = *(epicsFloat64 *)pfield;
328 
329  if (!pflddes->initial)
330  return field == 0;
331 
332  return ! epicsParseFloat64(pflddes->initial, &def, NULL)
333  && field == def;
334  }
335  case DBF_MENU: {
336  epicsEnum16 field = *(epicsEnum16 *)pfield;
338  int index;
339 
340  if (!pflddes->initial)
341  return field == 0;
342 
343  index = dbGetMenuIndexFromString(pdbentry, pflddes->initial);
344  if (index < 0) {
345  if (epicsParseUInt16(pflddes->initial, &def, 0, NULL))
346  return FALSE;
347  }
348  else
349  def = index;
350  return field == def;
351  }
352  case DBF_DEVICE: {
353  dbRecordType *precordType = pdbentry->precordType;
354 
355  if (!precordType) {
356  epicsPrintf("dbIsDefaultValue: pdbRecordType is NULL??\n");
357  return FALSE;
358  }
359  return ellCount(&precordType->devList) == 0;
360  }
361  case DBF_INLINK:
362  case DBF_OUTLINK:
363  case DBF_FWDLINK: {
364  struct link *plink = (struct link *)pfield;
365 
366  if (!plink || plink->type != CONSTANT)
367  return FALSE;
368 
369  /* These conditions don't make a lot of sense... */
370  if (!plink->value.constantStr)
371  return TRUE;
372 
373  if (!pflddes->initial) /* Default value for a link field? */
374  return FALSE;
375 
376  return !strcmp(plink->value.constantStr, pflddes->initial);
377  }
378  default:
379  return TRUE;
380  }
381 }
382 
383 long dbPutStringNum(DBENTRY *pdbentry, const char *pstring)
384 {
385  dbFldDes *pflddes = pdbentry->pflddes;
386  void *pfield = pdbentry->pfield;
387  long status;
388  epicsUInt64 u64;
389  epicsInt64 i64;
390 
391  if (!pfield)
392  return S_dbLib_fieldNotFound;
393 
394  /* empty string is the same as writing numeric zero */
395  if (pstring[0] == '\0')
396  pstring = "0";
397 
398  switch (pflddes->field_type) {
399  case DBF_CHAR:
400  if (dbConvertStrict)
401  return epicsParseInt8(pstring, pfield, 0, NULL);
402  goto lax_signed;
403 
404  case DBF_SHORT:
405  if (dbConvertStrict)
406  return epicsParseInt16(pstring, pfield, 0, NULL);
407  goto lax_signed;
408 
409  case DBF_LONG:
410  if (dbConvertStrict)
411  return epicsParseInt32(pstring, pfield, 0, NULL);
412  goto lax_signed;
413 
414  case DBF_INT64:
415  if (dbConvertStrict)
416  return epicsParseInt64(pstring, pfield, 0, NULL);
417 
418  lax_signed:
419  status = epicsParseInt64(pstring, &i64, 0, NULL);
420  if (status)
421  return status;
422 
423  switch (pflddes->field_type) {
424  case DBF_CHAR: *(epicsInt8 *)pfield = (epicsInt8) i64; break;
425  case DBF_SHORT: *(epicsInt16*)pfield = (epicsInt16)i64; break;
426  case DBF_LONG: *(epicsInt32*)pfield = (epicsInt32)i64; break;
427  case DBF_INT64: *(epicsInt64*)pfield = (epicsInt64)i64; break;
428  default: break;
429  }
430  return status;
431 
432  case DBF_UCHAR:
433  if (dbConvertStrict)
434  return epicsParseUInt8(pstring, pfield, 0, NULL);
435  goto lax_unsigned;
436 
437  case DBF_ENUM:
438  case DBF_USHORT:
439  if (dbConvertStrict)
440  return epicsParseUInt16(pstring, pfield, 0, NULL);
441  goto lax_unsigned;
442 
443  case DBF_ULONG:
444  if (dbConvertStrict)
445  return epicsParseUInt32(pstring, pfield, 0, NULL);
446  goto lax_unsigned;
447 
448  case DBF_UINT64:
449  if (dbConvertStrict)
450  return epicsParseUInt64(pstring, pfield, 0, NULL);
451 
452  lax_unsigned:
453  status = epicsParseUInt64(pstring, &u64, 0, NULL);
454  if (status)
455  return status;
456 
457  switch (pflddes->field_type) {
458  case DBF_UCHAR: *(epicsUInt8 *)pfield = (epicsInt8) u64; break;
459  case DBF_ENUM:
460  case DBF_USHORT: *(epicsUInt16*)pfield = (epicsInt16)u64; break;
461  case DBF_ULONG: *(epicsUInt32*)pfield = (epicsInt32)u64; break;
462  case DBF_UINT64: *(epicsUInt64*)pfield = (epicsInt64)u64; break;
463  default: break;
464  }
465  return status;
466 
467  case DBF_FLOAT:
468  return epicsParseFloat32(pstring, pfield, NULL);
469 
470  case DBF_DOUBLE:
471  return epicsParseFloat64(pstring, pfield, NULL);
472 
473  case DBF_MENU:
474  case DBF_DEVICE: {
475  epicsEnum16 *field = (epicsEnum16 *) pfield;
476  int index = dbGetMenuIndexFromString(pdbentry, pstring);
477 
478  if (index < 0) {
480  long status = epicsParseUInt16(pstring, &value, 0, NULL);
481 
482  if (status)
483  return status;
484 
485  index = dbGetNMenuChoices(pdbentry);
486  if (value > index && index > 0 && value < USHRT_MAX)
487  return S_dbLib_badField;
488 
489  *field = value;
490  }
491  else
492  *field = index;
493  return 0;
494  }
495 
496  default:
497  return S_dbLib_badField;
498  }
499 }
500 
502 {
503  dbFldDes *pflddes = pdbentry->pflddes;
504  void *pfield = pdbentry->pfield;
505 
506  if (!pflddes || !pfield)
507  return -1;
508 
509  switch (pflddes->field_type) {
510  case DBF_MENU:
511  case DBF_DEVICE:
512  return * (epicsEnum16 *) pfield;
513  default:
514  epicsPrintf("dbGetMenuIndex: Called for field type %d\n",
515  pflddes->field_type);
516  }
517  return -1;
518 }
519 
520 epicsShareFunc long dbPutMenuIndex(DBENTRY *pdbentry, int index)
521 {
522  dbFldDes *pflddes = pdbentry->pflddes;
523  epicsEnum16 *pfield = pdbentry->pfield;
524 
525  if (!pflddes)
526  return S_dbLib_flddesNotFound;
527  if (!pfield)
528  return S_dbLib_fieldNotFound;
529 
530  switch (pflddes->field_type) {
531  case DBF_MENU: {
532  dbMenu *pdbMenu = (dbMenu *) pflddes->ftPvt;
533 
534  if (!pdbMenu)
535  return S_dbLib_menuNotFound;
536  if (index < 0 || index >= pdbMenu->nChoice)
537  return S_dbLib_badField;
538 
539  *pfield = index;
540  return 0;
541  }
542 
543  case DBF_DEVICE: {
544  dbDeviceMenu *pdbDeviceMenu = dbGetDeviceMenu(pdbentry);
545 
546  if (!pdbDeviceMenu)
547  return S_dbLib_menuNotFound;
548  if (index < 0 || index >= pdbDeviceMenu->nChoice)
549  return S_dbLib_badField;
550 
551  return dbPutString(pdbentry, pdbDeviceMenu->papChoice[index]);
552  }
553 
554  default:
555  break;
556  }
557  return S_dbLib_badField;
558 }
Definition: devSup.h:117
dbDeviceMenu * dbGetDeviceMenu(DBENTRY *pdbentry)
Definition: dbStaticLib.c:336
char ** papChoice
Definition: dbBase.h:57
epicsExportAddress(int, dbConvertStrict)
#define S_dbLib_badField
Definition: dbStaticLib.h:241
#define S_dbLib_recNotFound
Definition: dbStaticLib.h:238
long dbGetFieldAddress(DBENTRY *pdbentry)
Definition: dbStaticRun.c:187
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
#define FALSE
Definition: dbDefs.h:32
#define ellCount(PLIST)
Report the number of nodes in a list.
Definition: ellLib.h:84
double epicsFloat64
Definition: epicsTypes.h:49
pvd::Status status
dbRecordType * precordType
Definition: dbStaticLib.h:35
int i
Definition: scan.c:967
void devExtend(dsxt *pdsxt)
Definition: dbStaticRun.c:60
LIBCOM_API int epicsParseInt64(const char *str, epicsInt64 *to, int base, char **units)
Definition: epicsStdlib.c:281
void * precord
Definition: dbBase.h:116
dbFldDes * pflddes
Definition: dbStaticLib.h:36
unsigned short epicsUInt16
Definition: epicsTypes.h:41
#define S_dbLib_flddesNotFound
Definition: dbStaticLib.h:239
LIBCOM_API int epicsParseInt8(const char *str, epicsInt8 *to, int base, char **units)
Definition: epicsStdlib.c:181
#define printf
Definition: epicsStdio.h:41
#define epicsShareFunc
Definition: shareLib.h:209
int dbGetMenuIndexFromString(DBENTRY *pdbentry, const char *choice)
Definition: dbStaticLib.c:3097
unsigned char epicsUInt8
Definition: epicsTypes.h:39
#define NULL
Definition: catime.c:38
DEVSUPFUN init
Definition: devSup.h:143
int dbIsMacroOk(DBENTRY *pdbentry)
Definition: dbStaticRun.c:217
unsigned int epicsUInt32
Definition: epicsTypes.h:43
Miscellaneous macro definitions.
LIBCOM_API int epicsParseUInt8(const char *str, epicsUInt8 *to, int base, char **units)
Definition: epicsStdlib.c:197
unsigned long long epicsUInt64
Definition: epicsTypes.h:45
void * pfield
Definition: dbStaticLib.h:39
struct dsxt * pdsxt
Definition: dbBase.h:45
void dbInitDevSup(devSup *pdevSup, dset *pdset)
Definition: dbStaticRun.c:47
A doubly-linked list library.
Device support routines.
Definition: devSup.h:140
int dbGetNMenuChoices(DBENTRY *pdbentry)
Definition: dbStaticLib.c:3045
float epicsFloat32
Definition: epicsTypes.h:48
short indfield
Definition: dbStaticLib.h:41
short size
Definition: dbBase.h:98
dbRecordNode * precnode
Definition: dbStaticLib.h:37
#define epicsPrintf
Definition: errlog.h:51
LIBCOM_API int epicsParseUInt64(const char *str, epicsUInt64 *to, int base, char **units)
Definition: epicsStdlib.c:299
long dbAllocRecord(DBENTRY *pdbentry, const char *precordName)
Definition: dbStaticRun.c:69
char epicsInt8
Definition: epicsTypes.h:38
ELLLIST devList
Definition: dbBase.h:149
short no_fields
Definition: dbBase.h:152
Definition: dbBase.h:38
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
char * name
Definition: dbBase.h:151
#define epicsParseFloat32(str, to, units)
Definition: epicsStdlib.h:67
struct dsxt devSoft_DSXT
Definition: dbStaticRun.c:40
epicsUInt16 epicsEnum16
Definition: epicsTypes.h:47
Definition: dbBase.h:24
LIBCOM_API int epicsParseInt32(const char *str, epicsInt32 *to, int base, char **units)
Definition: epicsStdlib.c:245
long dbPutStringNum(DBENTRY *pdbentry, const char *pstring)
Definition: dbStaticRun.c:383
long dbFreeRecord(DBENTRY *pdbentry)
Definition: dbStaticRun.c:174
int nChoice
Definition: dbBase.h:27
#define TRUE
Definition: dbDefs.h:27
#define dbCalloc(nobj, size)
Definition: dbStaticLib.h:228
LIBCOM_API int epicsParseUInt32(const char *str, epicsUInt32 *to, int base, char **units)
Definition: epicsStdlib.c:263
char * dbRecordName(DBENTRY *pdbentry)
Definition: dbStaticRun.c:201
LIBCOM_API int epicsParseInt16(const char *str, epicsInt16 *to, int base, char **units)
Definition: epicsStdlib.c:213
char * constantStr
Definition: link.h:175
void * ftPvt
Definition: dbBase.h:96
#define S_dbLib_menuNotFound
Definition: dbStaticLib.h:242
dbFldDes ** papFldDes
Definition: dbBase.h:161
if(yy_init)
Definition: scan.c:972
int * def
Definition: flex.c:92
char * initial
Definition: dbBase.h:94
epicsShareFunc int dbGetMenuIndex(DBENTRY *pdbentry)
Definition: dbStaticRun.c:501
char * name
Definition: dbBase.h:81
short epicsInt16
Definition: epicsTypes.h:40
LIBCOM_API int epicsParseUInt16(const char *str, epicsUInt16 *to, int base, char **units)
Definition: epicsStdlib.c:229
long dbPutString(DBENTRY *pdbentry, const char *pstring)
Definition: dbStaticLib.c:2545
#define S_dbLib_noRecSup
Definition: dbStaticLib.h:245
#define S_dbLib_fieldNotFound
Definition: dbStaticLib.h:240
#define S_dbLib_nameLength
Definition: dbStaticLib.h:244
int nChoice
Definition: dbBase.h:56
epicsShareFunc int dbIsDefaultValue(DBENTRY *pdbentry)
Definition: dbStaticRun.c:219
unsigned short offset
Definition: dbBase.h:100
epicsShareFunc long dbPutMenuIndex(DBENTRY *pdbentry, int index)
Definition: dbStaticRun.c:520
dbfType field_type
Definition: dbBase.h:86
int dbConvertStrict
Definition: dbStaticRun.c:34
int epicsInt32
Definition: epicsTypes.h:42
#define S_dbLib_recordTypeNotFound
Definition: dbStaticLib.h:236
#define epicsParseFloat64(str, to, units)
Definition: epicsStdlib.h:68
long long epicsInt64
Definition: epicsTypes.h:44
int rec_size
Definition: dbBase.h:164
int link_type
Definition: dbBase.h:42
Exporting IOC objects.
dset * pdset
Definition: dbBase.h:44