<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki-ext.aps.anl.gov/epics/index.php?action=history&amp;feed=atom&amp;title=V4_DBD_Generated_Code</id>
	<title>V4 DBD Generated Code - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-ext.aps.anl.gov/epics/index.php?action=history&amp;feed=atom&amp;title=V4_DBD_Generated_Code"/>
	<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_DBD_Generated_Code&amp;action=history"/>
	<updated>2026-06-03T22:49:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_DBD_Generated_Code&amp;diff=2704&amp;oldid=prev</id>
		<title>MartyKraimer at 19:48, 15 September 2005</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_DBD_Generated_Code&amp;diff=2704&amp;oldid=prev"/>
		<updated>2005-09-15T19:48:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_DBD_Generated_Code&amp;amp;diff=2704&amp;amp;oldid=517&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>MartyKraimer</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_DBD_Generated_Code&amp;diff=517&amp;oldid=prev</id>
		<title>AndrewJohnson: /* exampleRecord.dbd */</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_DBD_Generated_Code&amp;diff=517&amp;oldid=prev"/>
		<updated>2005-05-02T21:33:07Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;exampleRecord.dbd&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:33, 2 May 2005&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l312&quot;&gt;Line 312:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 312:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== exampleRecord.dbd ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== exampleRecord.dbd ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;From this files the following two files are &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;generatedp&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;From this files the following two files are &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;generated&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* File &amp;lt;tt&amp;gt;exampleRecord.h&amp;lt;/tt&amp;gt; contains:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* File &amp;lt;tt&amp;gt;exampleRecord.h&amp;lt;/tt&amp;gt; contains:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>AndrewJohnson</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_DBD_Generated_Code&amp;diff=41&amp;oldid=prev</id>
		<title>AndrewJohnson at 20:59, 2 May 2005</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_DBD_Generated_Code&amp;diff=41&amp;oldid=prev"/>
		<updated>2005-05-02T20:59:16Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== EPICS: Code generated from DBD ==&lt;br /&gt;
&lt;br /&gt;
April 29 2005&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WARNING: This contains 1/2 baked ideas. Needs lots of work!!! ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the beginning of the task of deciding what code should be generated from the V4 database definition files. So far the following are discussed:&lt;br /&gt;
&lt;br /&gt;
* code that implements a dataAccess interface.&lt;br /&gt;
* A header file for use by record support.&lt;br /&gt;
* Code that provides access without requiring the generated header file&lt;br /&gt;
* Code that provides a dataAccess interface.&lt;br /&gt;
&lt;br /&gt;
The general scheme is to generate the following from each &amp;lt;tt&amp;gt;xxx.dbd&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;xxx.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
This contains a &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt; definition that contains only data. The record support module uses this to access the record.&lt;br /&gt;
* &amp;lt;tt&amp;gt;xxxMeta.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
This implements an &amp;lt;tt&amp;gt;iocStructMetaSupport&amp;lt;/tt&amp;gt;, which is described below, for accessing data without requiring the generated header file.&lt;br /&gt;
* &amp;lt;tt&amp;gt;xxxDA.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
This contains a &amp;lt;tt&amp;gt;class&amp;lt;/tt&amp;gt; definition which is uses for dataAccess.&lt;br /&gt;
* &amp;lt;tt&amp;gt;xxxDA.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
This implements the dataAccess interface to xxx. All access from outside the record uses this interface to access the record.&lt;br /&gt;
&lt;br /&gt;
The above files are generated for each &amp;lt;tt&amp;gt; struct&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;record&amp;lt;/tt&amp;gt; definition.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Database Definition Files ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following Database Definition Files are used as examples.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;displayLimit.dbd&amp;lt;/tt&amp;gt; contains:&lt;br /&gt;
 struct(displayLimit) {&lt;br /&gt;
     field(low,float64)&lt;br /&gt;
     field(high,float64)&lt;br /&gt;
 }&lt;br /&gt;
* &amp;lt;tt&amp;gt;exampleRecord.dbd&amp;lt;/tt&amp;gt; contains: &lt;br /&gt;
 include &amp;quot;dbCommon.dbd&amp;quot;&lt;br /&gt;
 record(example) extends iocRecord {&lt;br /&gt;
     field(value,float64)&lt;br /&gt;
     field(displayLimit,struct(displayLimit))&lt;br /&gt;
 }&lt;br /&gt;
* &amp;lt;tt&amp;gt;alltypesRecord.dbd&amp;lt;/tt&amp;gt; contains: &lt;br /&gt;
 include &amp;quot;dbCommon.dbd&amp;quot;&lt;br /&gt;
 record(allTypes) extends iocRecord {&lt;br /&gt;
     field(fbool,bool)&lt;br /&gt;
     field(foctet,octet)&lt;br /&gt;
     field(fint16,int16)&lt;br /&gt;
     field(fuint16,uint16)&lt;br /&gt;
     field(fint32,int32)&lt;br /&gt;
     field(fuint32,uint32)&lt;br /&gt;
     field(fint64,int64)&lt;br /&gt;
     field(fuint64,uint64)&lt;br /&gt;
     field(ffloat32,float32)&lt;br /&gt;
     field(ffloat64,float64)&lt;br /&gt;
     field(fstring,string)&lt;br /&gt;
     field(fmenu,menu(menuName))&lt;br /&gt;
     field(fenum,enum)&lt;br /&gt;
     field(fstruct,struct(displayLimit))&lt;br /&gt;
     field(flink,link(dir))&lt;br /&gt;
     field(fdevice,device(dir,interfaceName))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== iocTypes.h ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File iocTypes.h describes the datatypes used by V4 databases:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/* TBD iocNdimArrayT*/&lt;br /&gt;
 enum iocType {&lt;br /&gt;
     iocUnknownT,iocBooleanT,iocOctetT,&lt;br /&gt;
     iocInt16T,iocUInt16T,iocInt32T,iocUInt32T,iocInt64T,iocUInt64T,&lt;br /&gt;
     iocFloat32T,iocFloat64T,&lt;br /&gt;
     iocStringT,iocMenuT,iocEnumT,iocLinkT,iocDeviceT,iocArrayT&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 /* some of the following may require OSD definitions*/&lt;br /&gt;
 typedef bool               iocBoolean;&lt;br /&gt;
 typedef char               iocOctet;&lt;br /&gt;
 typedef short              iocInt16;&lt;br /&gt;
 typedef unsigned short     iocUInt16;&lt;br /&gt;
 typedef int                iocInt32;&lt;br /&gt;
 typedef unsigned int       iocUInt32;&lt;br /&gt;
 typedef long long          iocInt64;&lt;br /&gt;
 typedef unsigned long long iocUInt64;&lt;br /&gt;
 typedef float              iocFloat32;&lt;br /&gt;
 typedef double             iocFloat64;&lt;br /&gt;
&lt;br /&gt;
 class iocRecord;&lt;br /&gt;
&lt;br /&gt;
 /* iocStructPtr always references a class that contains only data*/&lt;br /&gt;
 typedef void * iocStructPtr;&lt;br /&gt;
&lt;br /&gt;
 /* iocInterfacePtr always references a class that contains only methods*/&lt;br /&gt;
 typedef void *iocInterfacePtr;&lt;br /&gt;
&lt;br /&gt;
 class iocInterface {&lt;br /&gt;
     const char      *interfaceType;&lt;br /&gt;
     iocInterfacePtr *pinterface;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 /*iocString holds UTF-8 characters*/&lt;br /&gt;
 class iocString {&lt;br /&gt;
 public:&lt;br /&gt;
     iocInt32  capacity;  /*capacity in bytes*/&lt;br /&gt;
     iocOctet  *pstorage;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 class iocStructMember {&lt;br /&gt;
     iocString name;&lt;br /&gt;
     iocType   type;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 class iocStructDef{&lt;br /&gt;
     iocString       name;&lt;br /&gt;
     iocInt16        nmembers;&lt;br /&gt;
     iocStructMember *pmember[];&lt;br /&gt;
     iocInterface    interface;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 class iocStructField{&lt;br /&gt;
     iocStructDef *piocStructDef;&lt;br /&gt;
     iocStructPtr ptr;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 class iocMenuDef{&lt;br /&gt;
 public:&lt;br /&gt;
     iocString name;&lt;br /&gt;
     iocInt16  nchoices;&lt;br /&gt;
     iocString *pchoice[];&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 class iocMenuField{&lt;br /&gt;
 public:&lt;br /&gt;
     iocInt16    index;&lt;br /&gt;
     iocMenuDef  *piocMenuDef[];&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 class iocEnumField{&lt;br /&gt;
 public:&lt;br /&gt;
     iocInt16  index;&lt;br /&gt;
     iocInt16  nchoices;&lt;br /&gt;
     iocString *pchoice[];&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 enum iocLinkDir {&lt;br /&gt;
     iocLinkDirNone,&lt;br /&gt;
     iocLinkDirForward,&lt;br /&gt;
     iocLinkDirIn,&lt;br /&gt;
     iocLinkDirOut,&lt;br /&gt;
     iocLinkDirInOut&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 enum iocLinkType {&lt;br /&gt;
     iocLinkTypeconstant,&lt;br /&gt;
     iocLinkTypepvlink,&lt;br /&gt;
     iocLinkTypecalink,&lt;br /&gt;
     iocLinkTypedblink&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 class iocLinkDef{&lt;br /&gt;
 public:&lt;br /&gt;
     iocString     choice;&lt;br /&gt;
     iocLinkDir    dir;&lt;br /&gt;
     iocString     configName;&lt;br /&gt;
     iocString     interfaceName;&lt;br /&gt;
     iocInterface *piocInterface;&lt;br /&gt;
 };&lt;br /&gt;
 class iocLinkField{&lt;br /&gt;
 public:&lt;br /&gt;
     iocLinkType type;&lt;br /&gt;
     iocLinkDef  linkDef;&lt;br /&gt;
     iocString   pvname;&lt;br /&gt;
     iocStruct   config;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 class iocDeviceDef {&lt;br /&gt;
 public:&lt;br /&gt;
     iocString    choice;&lt;br /&gt;
     iocLinkDir   dir;&lt;br /&gt;
     iocString    configName;&lt;br /&gt;
     iocInterface interface;&lt;br /&gt;
 };&lt;br /&gt;
 class iocDeviceField {&lt;br /&gt;
 public:&lt;br /&gt;
     iocDeviceDef device;&lt;br /&gt;
     iocStruct    config;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 template&amp;lt; class ARR_T &amp;gt; class iocArray {&lt;br /&gt;
 public:&lt;br /&gt;
     iocInt32  capacity;  /*capacity in number of elements*/&lt;br /&gt;
     iocInt32  size;      /*current number of elements*/&lt;br /&gt;
     iocType   type;&lt;br /&gt;
     ARR_T     *pstorage;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 /*  The following array types are supported by iocCore&lt;br /&gt;
  *  iocArray&amp;lt;void&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocOctet&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocInt16&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocUInt16&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocInt32&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocUInt32&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocInt64&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocUInt64&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocFloat32&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocFloat64&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocString&amp;gt;;&lt;br /&gt;
  *  iocArray&amp;lt;iocLinkField&amp;gt;;&lt;br /&gt;
 **/&lt;br /&gt;
&lt;br /&gt;
 /* every struct and every record support module implements the following*/&lt;br /&gt;
 class iocStructMetaSupport {&lt;br /&gt;
     virtual iocStructPtr create() = 0;&lt;br /&gt;
     virtual iocBoolean initialize(iocString *errorMessage, iocStructPtr ptr) = 0;&lt;br /&gt;
     virtual iocBoolean finalize(iocString *errorMessage, iocStructPtr ptr) = 0;&lt;br /&gt;
     virtual void destroy(iocStructPtr ptr) = 0;&lt;br /&gt;
     virtual void *indexToAddr(iocString *errorMessage,&lt;br /&gt;
             iocStructPtr ptr, iocInt16 index) = 0;&lt;br /&gt;
     // ???? is anything else needed&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 /* record support implements the following*/&lt;br /&gt;
 class iocRecordSupport {&lt;br /&gt;
     virtual void special(iocRecord *piocRecord,&lt;br /&gt;
             iocBoolean  after,&lt;br /&gt;
             iocInt16 nlevels, // number of elements in fieldIndex&lt;br /&gt;
             iocInt16 fieldIndex[] // array of field indices&lt;br /&gt;
             ) = 0;&lt;br /&gt;
 };&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generated Record Support files ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== displayLimit.dbd ===&lt;br /&gt;
&lt;br /&gt;
From this file the following two files are generated for use by record support.&lt;br /&gt;
&lt;br /&gt;
* File &amp;lt;tt&amp;gt;displayLimit.h&amp;lt;/tt&amp;gt; contains:&lt;br /&gt;
 class displayLimit {&lt;br /&gt;
 public:&lt;br /&gt;
     iocFloat64 low;&lt;br /&gt;
     iocFloat64 high;&lt;br /&gt;
 };&lt;br /&gt;
 const iocInt16 displayLimit_low = 0;&lt;br /&gt;
 const iocInt16 displayLimit_high = 1;&lt;br /&gt;
 const iocInt16 displayLimit_lastIndex = displayLimit_high;&lt;br /&gt;
 epicsExtern iocStructMetaSupport *pdisplayLimitMetaSupport;&lt;br /&gt;
* File &amp;lt;tt&amp;gt;displayLimitMeta.cpp&amp;lt;/tt&amp;gt; contains:&lt;br /&gt;
 class displayLimitMetaSupport : public iocStructMetaSupport&lt;br /&gt;
 {&lt;br /&gt;
     iocStructPtr create();&lt;br /&gt;
     iocBoolean initialize(iocString *errorMessage, iocStructPtr ptr);&lt;br /&gt;
     iocBoolean finalize(iocString *errorMessage, iocStructPtr ptr);&lt;br /&gt;
     void destroy(iocStructPtr ptr);&lt;br /&gt;
     void *indexToAddr(iocString *errorMessage,&lt;br /&gt;
             iocStructPtr ptr, iocInt16 index);&lt;br /&gt;
 }&lt;br /&gt;
 iocStructMetaSupport *pdisplayLimitMetaSupport;&lt;br /&gt;
 iocStructPtr displayLimitMetaSupport::create() {return new displayLimit;}&lt;br /&gt;
 iocBoolean displayLimitMetaSupport::initialize(&lt;br /&gt;
         iocString *errorMessage,iocStructPtr ptr)&lt;br /&gt;
 {&lt;br /&gt;
     displayLimit *pdisplayLimit = prt;&lt;br /&gt;
     pdisplayLimit-&amp;gt;low = 0;&lt;br /&gt;
     pdisplayLimit-&amp;gt;high = 0;&lt;br /&gt;
     return iocTrue;&lt;br /&gt;
 }&lt;br /&gt;
 iocBoolean displayLimitMetaSupport::finalize(&lt;br /&gt;
         iocString *errorMessage,iocStructPtr ptr)&lt;br /&gt;
 { return iocTrue}&lt;br /&gt;
 void displayLimitMetaSupport::destroy(iocStructPtr ptr) {delete ptr;}&lt;br /&gt;
 void * displayLimitMetaSupport::indexToAddr(iocString *errorMessage,&lt;br /&gt;
     iocStructPtr ptr, iocInt16 index)&lt;br /&gt;
 {&lt;br /&gt;
     displayLimit *pdisplayLimit = ptrptr;&lt;br /&gt;
     switch(index) {&lt;br /&gt;
         case displayLimit_low:  return (void *)&amp;amp;pdisplayLimit-&amp;gt;low;&lt;br /&gt;
         case displayLimit_high: return (void *)&amp;amp;pdisplayLimit-&amp;gt;high;&lt;br /&gt;
         default: break;&lt;br /&gt;
     }&lt;br /&gt;
     // write a message to errorMessage How?&lt;br /&gt;
     return null;&lt;br /&gt;
 }&lt;br /&gt;
 static void displayLimitRegister(void)&lt;br /&gt;
 {&lt;br /&gt;
     pdisplayLimitMetaSupport = new displayLimitMetaSupport;&lt;br /&gt;
     // NOTE MUST ALSO register interface&lt;br /&gt;
 }&lt;br /&gt;
 epicsExportRegistrar(displayLimitRegister);&lt;br /&gt;
&lt;br /&gt;
=== exampleRecord.dbd ===&lt;br /&gt;
&lt;br /&gt;
From this files the following two files are generatedp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* File &amp;lt;tt&amp;gt;exampleRecord.h&amp;lt;/tt&amp;gt; contains:&lt;br /&gt;
 class exampleRecord : iocRecord {&lt;br /&gt;
 public:&lt;br /&gt;
     iocFloat64 value;&lt;br /&gt;
     iocStruct  displayLimit;&lt;br /&gt;
 };&lt;br /&gt;
 const iocInt16 exampleRecord_firstIndex = 1001&lt;br /&gt;
 const iocInt16 exampleRecord_value = 1001;&lt;br /&gt;
 const iocInt16 exampleRecord_displayLimit = 1002;&lt;br /&gt;
 const iocInt16 exampleRecord_lastIndex = exampleRecord_displayLimit;&lt;br /&gt;
 epicsExtern iocStructMetaSupport *pexampleRecordMetaSupport;&lt;br /&gt;
* File &amp;lt;tt&amp;gt;exampleRecordMeta.cpp&amp;lt;/tt&amp;gt; contains:&lt;br /&gt;
 class exampleRecordMetaSupport : public iocClassMetaSupport&lt;br /&gt;
 {&lt;br /&gt;
     iocStructPtr create();&lt;br /&gt;
     iocBoolean init(iocString *errorMessage, iocStructPtr ptr);&lt;br /&gt;
     void destroy(iocStructPtr ptr);&lt;br /&gt;
     void *indexToAddr(iocString *errorMessage,&lt;br /&gt;
             iocStructPtr ptr, iocInt16 index);&lt;br /&gt;
 }&lt;br /&gt;
 iocClassMetaSupport *pexampleRecordMetaSupport;&lt;br /&gt;
 iocStructPtr exampleRecordMetaSupport::create() { return new exampleRecord}&lt;br /&gt;
 iocBoolean exampleRecordMetaSupport::initialize(&lt;br /&gt;
         iocString *errorMessage,iocStructPtr ptr)&lt;br /&gt;
 {&lt;br /&gt;
     exampleRecord *pexampleRecord = ptr;&lt;br /&gt;
     if(piocRecordMetaSupport-&amp;gt;initialize(errorMessage,pexampleRecord)==iocFalse)&lt;br /&gt;
         return iocFalse;&lt;br /&gt;
     pexampleRecord-&amp;gt;value = 0;&lt;br /&gt;
     return iocTrue;&lt;br /&gt;
 }&lt;br /&gt;
 iocBoolean exampleRecordMetaSupport::finalize(&lt;br /&gt;
         iocString *errorMessage,iocStructPtr ptr)&lt;br /&gt;
 {&lt;br /&gt;
     exampleRecord *pexampleRecord = ptr;&lt;br /&gt;
     if(piocRecordMetaSupport-&amp;gt;finalize(errorMessage,pexampleRecord)==iocFalse)&lt;br /&gt;
         return iocFalse;&lt;br /&gt;
     pexampleRecord-&amp;gt;value = 0;&lt;br /&gt;
     return iocTrue;&lt;br /&gt;
 }&lt;br /&gt;
 void exampleRecordMetaSupport::destroy(iocStructPtr ptr)&lt;br /&gt;
 {&lt;br /&gt;
     // Most records have much more to do&lt;br /&gt;
     delete ptr;&lt;br /&gt;
 }&lt;br /&gt;
 void * exampleRecordMetaSupport::indexToAddr(iocString *errorMessage,&lt;br /&gt;
     iocStructPtr ptr, iocInt16 index)&lt;br /&gt;
 {&lt;br /&gt;
     exampleRecord *pexampleRecord = ptrptr;&lt;br /&gt;
     switch(index) {&lt;br /&gt;
         case exampleRecord_common:&lt;br /&gt;
                    return (void *)&amp;amp;pexampleRecord-&amp;gt;common;&lt;br /&gt;
         case exampleRecord_value:&lt;br /&gt;
                    return (void *)&amp;amp;pexampleRecord-&amp;gt;value;&lt;br /&gt;
         case exampleRecord_displayLimit:&lt;br /&gt;
                    return (void *)&amp;amp;pexampleRecord-&amp;gt;displayLimit;&lt;br /&gt;
         default: break;&lt;br /&gt;
     }&lt;br /&gt;
     // write a message to errorMessage How?&lt;br /&gt;
     return null;&lt;br /&gt;
 }&lt;br /&gt;
 static void exampleRecordRegister(void)&lt;br /&gt;
 {&lt;br /&gt;
     pexampleRecordMetaSupport = new exampleRecordMetaSupport;&lt;br /&gt;
     // NOTE MUST ALSO register interface&lt;br /&gt;
 }&lt;br /&gt;
 epicsExportRegistrar(exampleRecordRegister);&lt;br /&gt;
&lt;br /&gt;
=== alltypesRecord.dbd ===&lt;br /&gt;
&lt;br /&gt;
As a last example alltypesRecord.h is generated as follows:&lt;br /&gt;
&lt;br /&gt;
 class allTypesRecord {&lt;br /&gt;
 public:&lt;br /&gt;
     iocRecord  common;&lt;br /&gt;
     iocBoolean fbool;&lt;br /&gt;
     iocOctet   foctet;&lt;br /&gt;
     iocInt16   fint16;&lt;br /&gt;
     iocUInt16  fuint16;&lt;br /&gt;
     iocInt32   fint32;&lt;br /&gt;
     iocUInt32  fuint32;&lt;br /&gt;
     iocInt64   fint32;&lt;br /&gt;
     iocUInt64  fuint32;&lt;br /&gt;
     iocFloat32 ffloat32;&lt;br /&gt;
     iocFloat64 ffloat64;&lt;br /&gt;
     iocString  fstring;&lt;br /&gt;
     iocMenu    fmenu;&lt;br /&gt;
     iocEnum    fenum&lt;br /&gt;
     iocStruct  fstruct;&lt;br /&gt;
     iocLink    flink;&lt;br /&gt;
     iocDevice  fdevice;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 const iocInt16 allTypes_firstIndex = 1001001&lt;br /&gt;
 const iocInt16 allTypes_fbool = 1001;&lt;br /&gt;
 const iocInt16 allTypes_foctet = 1002;&lt;br /&gt;
 const iocInt16 allTypes_fint16 = 1003;&lt;br /&gt;
 const iocInt16 allTypes_fuint16 = 1004;&lt;br /&gt;
 const iocInt16 allTypes_fint32 = 1005;&lt;br /&gt;
 const iocInt16 allTypes_fuint32 = 1006;&lt;br /&gt;
 const iocInt16 allTypes_fint64 = 1007;&lt;br /&gt;
 const iocInt16 allTypes_fuint64 = 1008;&lt;br /&gt;
 const iocInt16 allTypes_ffloat32 = 1009;&lt;br /&gt;
 const iocInt16 allTypes_ffloatn64 = 10010;&lt;br /&gt;
 const iocInt16 allTypes_ffstring = 10011;&lt;br /&gt;
 const iocInt16 allTypes_fmenu = 10012;&lt;br /&gt;
 const iocInt16 allTypes_fenum = 10013;&lt;br /&gt;
 const iocInt16 allTypes_fstruct = 10014;&lt;br /&gt;
 const iocInt16 allTypes_flink = 10015&lt;br /&gt;
 const iocInt16 allTypes_fdevice = 10016&lt;br /&gt;
 const iocInt16 allTypes_lastIndex = allTypes_fdevice;&lt;br /&gt;
&lt;br /&gt;
 epicsExtern iocStructMetaSupport *allTypesMetaSupport;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generated dataAccess files ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== displayLimitDA.h ==&lt;br /&gt;
&lt;br /&gt;
From &amp;lt;tt&amp;gt;displayLimit.dbd&amp;lt;/tt&amp;gt; files style=&amp;quot;font-family: courier&amp;quot;&amp;gt;displayLimitDA.hand &amp;lt;tt&amp;gt;displayLimitDA.cpp&amp;lt;/tt&amp;gt; are generated.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;displayLimitDA.h&amp;lt;/tt&amp;gt; contains:&lt;br /&gt;
     #ifdef displayLimitDAH&lt;br /&gt;
     #define displayLimitDAH&lt;br /&gt;
     #include &amp;lt;displayLimit.h&amp;gt;&lt;br /&gt;
     #include &amp;lt;dataAccess.h&amp;gt;&lt;br /&gt;
     #include &amp;lt;daDataLocator.h&amp;gt;&lt;br /&gt;
     using namespace da;&lt;br /&gt;
     class displayLimitDA : public propertyCatalog {&lt;br /&gt;
     public:&lt;br /&gt;
         displayLimitDA(displayLimit *pdisplayLimit);&lt;br /&gt;
         ~displayLimitDA();&lt;br /&gt;
         void traverse (propertyViewer &amp;amp; ) const;&lt;br /&gt;
         traverseModifyStatus traverse(propertyManipulator &amp;amp;);&lt;br /&gt;
         bool find (const propertyId &amp;amp;, propertyViewer &amp;amp;) const;&lt;br /&gt;
         displayLimitDA &amp;amp; operator = (const displayLimitDA &amp;amp;) const;&lt;br /&gt;
         displayLimitDA &amp;amp; operator != (const displayLimitDA &amp;amp;) const;&lt;br /&gt;
         displayLimitDA &amp;amp; operator = (const daData &amp;amp;);&lt;br /&gt;
     private:&lt;br /&gt;
         displayLimit *pdisplayLimit;&lt;br /&gt;
         static bool init;&lt;br /&gt;
         static locator &amp;lt; displayLimitDA &amp;gt; locate;&lt;br /&gt;
         void lowReadBinder ( propertyViewer &amp;amp; ) const;&lt;br /&gt;
         void lowWriteBinder ( propertyViewer &amp;amp; ) const;&lt;br /&gt;
         void highReadBinder ( propertyViewer &amp;amp; ) const;&lt;br /&gt;
         void highWriteBinder ( propertyViewer &amp;amp; ) const;&lt;br /&gt;
     };&lt;br /&gt;
     #endif //displayLimitDAH&lt;br /&gt;
* &amp;lt;tt&amp;gt;displayLimitDA.cpp&amp;lt;/tt&amp;gt; implements the dataAccess interface.&lt;br /&gt;
     #include &amp;quot;displayLimitDA.h&amp;quot;&lt;br /&gt;
     #include &amp;lt;daPropertyId.h&amp;gt;&lt;br /&gt;
     bool displayLimitDA::init = false;&lt;br /&gt;
     locator &amp;lt; displayLimitDA &amp;gt; displayLimitDA::locate;&lt;br /&gt;
     static const propertyId propertyDisplayLimit(&amp;quot;displayLimit&amp;quot;);&lt;br /&gt;
     static const propertyId propertyLow(&amp;quot;low&amp;quot;);&lt;br /&gt;
     static const propertyId propertyHigh(&amp;quot;high&amp;quot;);&lt;br /&gt;
     void displayLimitDA::traverse ( propertyViewer &amp;amp; viewer ) const&lt;br /&gt;
     {&lt;br /&gt;
         viewer.reveal(propertyLow,low);&lt;br /&gt;
         viewer.reveal(propertyHigh,high);&lt;br /&gt;
     }&lt;br /&gt;
     traverseModifyStatus displayLimitDA::traverse ( propertyManipulator &amp;amp; manipulator ) const&lt;br /&gt;
     {&lt;br /&gt;
         manipulator.reveal(propertyLow,low);&lt;br /&gt;
         manipulator.reveal(propertyHigh,high);&lt;br /&gt;
         return tmsSuccess;&lt;br /&gt;
     }&lt;br /&gt;
     displayLimitDA &amp;amp;displayLimitDA::find ( const propertyId &amp;amp;type, propertyViewer &amp;amp;adt ) const&lt;br /&gt;
     {&lt;br /&gt;
         return displayLimitDA::locate.callExportFunction ( *this, type, adt );&lt;br /&gt;
     }&lt;br /&gt;
     bool displayLimitDA::operator == ( const displayLimitDA &amp;amp; d ) const&lt;br /&gt;
     {&lt;br /&gt;
         equivStatus stat = equiv ( *this, d );&lt;br /&gt;
         return equivStatusToBool ( stat );&lt;br /&gt;
     }&lt;br /&gt;
     displayLimitDA &amp;amp; displayLimitDA::operator = ( const displayLimitDA &amp;amp; d )&lt;br /&gt;
     {&lt;br /&gt;
         assignStatus stat = assign ( *this, d );&lt;br /&gt;
         throwExceptionIfUnsuccessful ( stat );&lt;br /&gt;
         return *this;&lt;br /&gt;
     }&lt;br /&gt;
     void displayLimitDA::lowReadBinder(propertyViewer &amp;amp;adt ) const&lt;br /&gt;
     { adt.reveal(propertyLow,low); }&lt;br /&gt;
     void displayLimitDA::lowWriteBinder(propertyManipulator &amp;amp;adt ) const&lt;br /&gt;
     { adt.reveal(propertyLow,low); }&lt;br /&gt;
     void displayLimitDA::highReadBinder(propertyViewer &amp;amp;adt ) const&lt;br /&gt;
     { adt.reveal(propertyHigh,high); }&lt;br /&gt;
     void displayLimitDA::highWriteBinder(propertyManipulator &amp;amp;adt ) const&lt;br /&gt;
     { adt.reveal(propertyHigh,high); }&lt;br /&gt;
     displayLimitDA::displayLimitDA(displayLimit *p) : pdisplayLimit(p)&lt;br /&gt;
     {&lt;br /&gt;
         if(init==false) {&lt;br /&gt;
             locate.installExportFunction(propertyLow,&amp;amp;lowReadBinder);&lt;br /&gt;
             locate.installExportFunction(propertyLow,&amp;amp;lowWriteBinder);&lt;br /&gt;
             locate.installExportFunction(propertyHigh,&amp;amp;highReadBinder);&lt;br /&gt;
             locate.installExportFunction(propertyHigh,&amp;amp;highWriteBinder);&lt;br /&gt;
             init = true;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
== exampleRecord ==&lt;br /&gt;
&lt;br /&gt;
From &amp;lt;tt&amp;gt;exampleRecord.dbd&amp;lt;/tt&amp;gt; The following files are generated&lt;br /&gt;
&lt;br /&gt;
* exampleRecordDA.h contains:&lt;br /&gt;
     #ifdef exampleRecordDAH&lt;br /&gt;
     #define exampleRecordDAH&lt;br /&gt;
     #include &amp;lt;dataAccess.h&amp;gt;&lt;br /&gt;
     #include &amp;lt;daDataLocator.h&amp;gt;&lt;br /&gt;
     using namespace da;&lt;br /&gt;
     class exampleRecordDA : public propertyCatalog {&lt;br /&gt;
     public:&lt;br /&gt;
         exampleRecordDA(exampleRecord *pexampleRecord);&lt;br /&gt;
         ~exampleRecordDA();&lt;br /&gt;
         void traverse (propertyViewer &amp;amp; ) const;&lt;br /&gt;
         traverseModifyStatus traverse(propertyManipulator &amp;amp;);&lt;br /&gt;
         bool find (const propertyId &amp;amp;, propertyViewer &amp;amp;) const;&lt;br /&gt;
         exampleRecordDA &amp;amp; operator = (const exampleRecordDA &amp;amp;) const;&lt;br /&gt;
         exampleRecordDA &amp;amp; operator != (const exampleRecordDA &amp;amp;) const;&lt;br /&gt;
         exampleRecordDA &amp;amp; operator = (const daData &amp;amp;);&lt;br /&gt;
     private:&lt;br /&gt;
         exampleRecord *pexampleRecord;&lt;br /&gt;
         static bool init;&lt;br /&gt;
         static locator &amp;lt; exampleRecordDA &amp;gt; locate;&lt;br /&gt;
         void lowReadBinder ( propertyViewer &amp;amp; ) const;&lt;br /&gt;
         void lowWriteBinder ( propertyViewer &amp;amp; ) const;&lt;br /&gt;
         void highReadBinder ( propertyViewer &amp;amp; ) const;&lt;br /&gt;
         void highWriteBinder ( propertyViewer &amp;amp; ) const;&lt;br /&gt;
     };&lt;br /&gt;
     #endif //exampleRecordDA&lt;br /&gt;
* &amp;lt;tt&amp;gt;exampleRecordDA.cpp&amp;lt;/tt&amp;gt; is the dataAccess interface for exampleRecord&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; #include &amp;quot;exampleRecord.h&amp;quot;&lt;br /&gt;
 #include &amp;lt;daPropertyId.h&amp;gt;&lt;br /&gt;
 struct exampleRecordDAPvt {&lt;br /&gt;
     displayLimitDA *pdisplayLimitDA;&lt;br /&gt;
 };&lt;br /&gt;
 bool exampleRecordDA::init = false;&lt;br /&gt;
 locator &amp;lt; exampleRecordDA &amp;gt; exampleRecordDA::locate;&lt;br /&gt;
 static const propertyId propertyValue(&amp;quot;value&amp;quot;);&lt;br /&gt;
 static const propertyId propertyDisplayLimit(&amp;quot;displayLimit&amp;quot;);&lt;br /&gt;
 void exampleRecordDA::traverse ( propertyViewer &amp;amp; viewer ) const&lt;br /&gt;
 {&lt;br /&gt;
     displayLimitDA *pdisplayLimitDA = pexampleRecordDAPvt-&amp;gt;pdisplayLimitDA;&lt;br /&gt;
     viewer.reveal(propertyValue,value);&lt;br /&gt;
     pdisplayLimitDA-&amp;gt;traverse(viewer);&lt;br /&gt;
 }&lt;br /&gt;
 traverseModifyStatus exampleRecordDA::traverse ( propertyManipulator &amp;amp; manipulator ) const&lt;br /&gt;
 {&lt;br /&gt;
     displayLimitDA *pdisplayLimitDA = (displayLimitDA*)recDAPvt;&lt;br /&gt;
     manipulator.reveal(propertyValue,value);&lt;br /&gt;
     return pdisplayLimitDA-&amp;gt;traverse(manipulator);&lt;br /&gt;
 }&lt;br /&gt;
 exampleRecordDA &amp;amp;exampleRecordDA::find ( const propertyId &amp;amp;type, propertyViewer &amp;amp;adt ) const&lt;br /&gt;
 {&lt;br /&gt;
     return exampleRecordDA::locate.callExportFunction ( *this, type, adt );&lt;br /&gt;
 }&lt;br /&gt;
 bool exampleRecordDA::operator == ( const exampleRecordDA &amp;amp; d ) const&lt;br /&gt;
 {&lt;br /&gt;
     equivStatus stat = equiv ( *this, d );&lt;br /&gt;
     return equivStatusToBool ( stat );&lt;br /&gt;
 }&lt;br /&gt;
 exampleRecordDA &amp;amp; exampleRecordDA::operator = ( const exampleRecordDA &amp;amp; d )&lt;br /&gt;
 {&lt;br /&gt;
     assignStatus stat = assign ( *this, d );&lt;br /&gt;
     throwExceptionIfUnsuccessful ( stat );&lt;br /&gt;
     return *this;&lt;br /&gt;
 }&lt;br /&gt;
 void exampleRecordDA::valueReadBinder(propertyViewer &amp;amp;adt ) const&lt;br /&gt;
 { adt.reveal(propertyValue,value); }&lt;br /&gt;
 void exampleRecordDA::valueWriteBinder(propertyManipulator &amp;amp;adt ) const&lt;br /&gt;
 { adt.reveal(propertyValue,value); }&lt;br /&gt;
 exampleRecordDA::exampleRecordDA(exampleRecord *p) : pexampleRecord(p)&lt;br /&gt;
 {&lt;br /&gt;
     if(init==false) {&lt;br /&gt;
         locate.installExportFunction(propertyValue,&amp;amp;valueReadBinder);&lt;br /&gt;
         locate.installExportFunction(propertyValue,&amp;amp;valueWriteBinder);&lt;br /&gt;
         locate.installExportFunction(propertyDisplayLimit,&amp;amp;displayLimitReadBinder);&lt;br /&gt;
         locate.installExportFunction(propertyDisplayLimit,&amp;amp;displayLimitWriteBinder);&lt;br /&gt;
         init = true;&lt;br /&gt;
     }&lt;br /&gt;
     pexampleRecordDAPvt-&amp;gt;pdisplayLimitDA  = new displayLimitDA(pdisplayLimit);&lt;br /&gt;
 }&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standard Interfaces ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: This discussion belongs elsewhere but for now it here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iocTypes.h&amp;lt;/tt&amp;gt; defines two interfaces:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;iocStructMetaSupport&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;iocRecordSupport&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the beginning of defining the successor to the V3 Record Support Entry Table. This needs more thought so the following are just preliminary ideas.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;iocStructMetaSupport&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This has an implementation for every &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt; and every &amp;lt;tt&amp;gt;record&amp;lt;/tt&amp;gt;. A tool will exist to create this support. For most structures the generated file may be sufficient. For a &amp;quot;smart&amp;quot; &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt; and for all record types the generated file is only a skeleton that must be modified to implement the semantics. It contains the following methods:&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;create&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Create storage for the &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;record&amp;lt;/tt&amp;gt;. The default implementation should always be sufficiant.&lt;br /&gt;
; &amp;lt;tt&amp;gt;initialize&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Perform initialization. This is analagous to V3 &amp;lt;tt&amp;gt;init_record&amp;lt;/tt&amp;gt;.&lt;br /&gt;
: Questions. Are multiple passes needed? How many? Note that device link, device have separate interfaces for connecting and disconnecting.&lt;br /&gt;
; &amp;lt;tt&amp;gt;finalize&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Is this needed? Are multiple passes needed?&lt;br /&gt;
; &amp;lt;tt&amp;gt;destroy&amp;lt;/tt&amp;gt;&lt;br /&gt;
: free storage used by &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;record&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;indexToAddr&amp;lt;/tt&amp;gt;&lt;br /&gt;
: This converts a field index to an address. The generated header files contain the field indices.&lt;br /&gt;
; Additional????&lt;br /&gt;
: Are they needed?&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;iocRecordSupport&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This is implemented by record support. Support for &amp;quot;smart&amp;quot; structures can also implement this interface. It implements the following methods:&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;special&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Called before and after the field is modified from outside record support itself. fieldIndex is an array in field indices that locate the exact field being modified.&lt;br /&gt;
; Additional????&lt;br /&gt;
: Are they needed?&lt;/div&gt;</summary>
		<author><name>AndrewJohnson</name></author>
	</entry>
</feed>