VX/DECFORMS+ - TDMS Compatibility Extensions
Overview
VX/DECFORMS+ is the TDMS compatibility layer for Sector7's VX/DECFORMS product. It extends the IFDL language and runtime so applications originally written for OpenVMS TDMS (Terminal Data Management System) can be migrated into the DECforms world without rewriting request logic that sets field display attributes at runtime.
Standard DECforms treats reverse video, blinking, bold, and underline as declaration-time display properties. TDMS request logic frequently asserted or cleared those attributes during a request instead. VX/DECFORMS+ closes that gap with new IFDL response steps, a layout-level compatibility mode, and diagnostic counters so unsupported behaviour is always counted and logged rather than silently dropped.
<!-- Webflow embed (min). Source: vx-decforms-plus-page-technical/decforms-plus-tech-body-embed-dark.html → python3 website/embeds/minify_webflow_embed.py … -->
<div class="s7-tech-embed" data-vxdecformsplus-body-embed="1" data-technical-mega-embed="1" lang="en"><h2 id="architecture">Architecture and pipeline</h2><p>
VX/DECFORMS+ sits on top of the base VX/DECFORMS compiler and <code>libvxdf</code>
runtime. Form authors continue to write IFDL source; the extensions add new response
steps to the IFDL grammar and route them through a single runtime entry point at
execution time.
</p><div class="table-wrapper"><table><thead><tr><th>Stage</th><th>VMS / DECforms original</th><th>VX/DECFORMS+ on Linux</th><th>Role</th></tr></thead><tbody><tr><td>Form source</td><td><code>.ifdl</code> IFDL text</td><td>Same <code>.ifdl</code> text, now allowing <code>TDMS …</code> and <code>CHARACTER SET</code> response steps</td><td>Author or port the form</td></tr><tr><td>Compile</td><td>DECforms <code>FORMS</code> compiler</td><td>VX/DECFORMS compiler emits generated C that calls the <code>forms_*</code> runtime</td><td>Lower IFDL to runtime calls</td></tr><tr><td>Generated call</td><td>Attributes were declaration-time only</td><td><code>forms_TDMSCompatibility(op, "field", "panel");</code> and <code>forms_Dispatch(__CHARACTER_SET, …);</code></td><td>Runtime entry points</td></tr><tr><td>Runtime</td><td>DECforms shareable image</td><td><code>libvxdf</code> resolves field to panel, sets flags, redisplays</td><td>Apply the attribute</td></tr></tbody></table></div><p>
The new response steps are legal anywhere an existing response step (for example
<code>Display</code>, <code>Message</code>, <code>Reset</code>, or <code>Signal</code>)
is legal: inside any <code>Response … End Response</code> block.
</p><div class="callout"><strong>Three extensions.</strong> VX/DECFORMS+ adds TDMS field-attribute response
steps, a <code>CHARACTER SET</code> response step, and a layout-level TDMS
compatibility mode controlled by configuration or the <code>forms_TDMSCompatibility()</code>
API.
</div><h2 id="response-steps">TDMS field-attribute response steps</h2><p>
The core VX/DECFORMS+ extension lets migrated TDMS request logic set or clear display
attributes on a named field of a named panel at response time, the way a TDMS request
would have done on OpenVMS.
</p><h6>Syntax</h6>
<pre><span class="kw">TDMS</span> [ <span class="kw">NO</span> ] <span class="kw">REVERSE</span> <span class="kw">FIELD</span> field-name <span class="kw">ON</span> panel-name
<span class="kw">TDMS</span> [ <span class="kw">NO</span> ] <span class="kw">BLINKING</span> <span class="kw">FIELD</span> field-name <span class="kw">ON</span> panel-name
<span class="kw">TDMS</span> [ <span class="kw">NO</span> ] <span class="kw">BOLD</span> <span class="kw">FIELD</span> field-name <span class="kw">ON</span> panel-name
<span class="kw">TDMS</span> [ <span class="kw">NO</span> ] <span class="kw">UNDERLINED</span> <span class="kw">FIELD</span> field-name <span class="kw">ON</span> panel-name</pre>
<p><code>field-name</code> is a field defined on the current form; <code>panel-name</code> is a
panel in the current layout on which that field is displayed. The <code>NO</code> variant
clears the attribute; the bare form asserts it. All four attributes and both variants
are recognised by the compiler and implemented in the runtime.
</p><h6>Example</h6><p>
A migrated TDMS request that reverse-videos an invalid account-type field and clears
the highlight once it validates, expressed as VX/DECFORMS+ IFDL:
</p>
<pre><span class="kw">Internal Response</span> FLAG_ACCT_TYPE_ERROR
<span class="kw">TDMS Reverse Field</span> ACCT_TYPE <span class="kw">On</span> Account_Type_Panel
<span class="kw">Message</span> <span class="str">"Invalid account type. Correct and re-enter."</span>
<span class="kw">End Response</span>
<span class="kw">Internal Response</span> CLEAR_ACCT_TYPE_ERROR
<span class="kw">TDMS No Reverse Field</span> ACCT_TYPE <span class="kw">On</span> Account_Type_Panel
<span class="kw">End Response</span></pre>
<p>
Keywords are case-insensitive. Response block structure and step ordering match the
surrounding IFDL exactly as in existing migrated forms.
</p><h6>Compiler lowering</h6><p>
The compiler lowers every TDMS step to a single call:
</p>
<pre>forms_TDMSCompatibility(<op-constant>, <span class="str">"<field-name>"</span>, <span class="str">"<panel-name>"</span>);</pre>
<div class="table-wrapper"><table><thead><tr><th>IFDL response step</th><th>Op constant</th><th>Effect</th></tr></thead><tbody><tr><td><code>TDMS REVERSE FIELD f ON p</code></td><td><code>forms_tdmscompat_k_reverse_field</code> (6)</td><td>Assert reverse video</td></tr><tr><td><code>TDMS NO REVERSE FIELD f ON p</code></td><td><code>forms_tdmscompat_k_no_reverse_field</code> (7)</td><td>Clear reverse video</td></tr><tr><td><code>TDMS BLINKING FIELD f ON p</code></td><td><code>forms_tdmscompat_k_blink_field</code> (8)</td><td>Assert blinking</td></tr><tr><td><code>TDMS NO BLINKING FIELD f ON p</code></td><td><code>forms_tdmscompat_k_no_blink_field</code> (9)</td><td>Clear blinking</td></tr><tr><td><code>TDMS BOLD FIELD f ON p</code></td><td><code>forms_tdmscompat_k_bold_field</code> (10)</td><td>Assert bold</td></tr><tr><td><code>TDMS NO BOLD FIELD f ON p</code></td><td><code>forms_tdmscompat_k_no_bold_field</code> (11)</td><td>Clear bold</td></tr><tr><td><code>TDMS UNDERLINED FIELD f ON p</code></td><td><code>forms_tdmscompat_k_underline_field</code> (12)</td><td>Assert underline</td></tr><tr><td><code>TDMS NO UNDERLINED FIELD f ON p</code></td><td><code>forms_tdmscompat_k_no_underline_field</code> (13)</td><td>Clear underline</td></tr></tbody></table></div><h6>Runtime behaviour</h6><p><code>forms_TDMSCompatibility()</code> for a field-attribute operation performs a full
end-to-end update:
</p><ul><li>Requires an active layout and active form (otherwise returns <code>vxdf_s_abort</code> with a diagnostic).</li><li>Requires non-empty field and panel names (otherwise <code>vxdf_s_badparam</code>).</li><li>Looks the panel up in the layout; an undefined panel is a counted error.</li><li>Resolves the field on the form; an undefined field is a counted error.</li><li>Finds the field's block-list entry on that panel; if the field is not displayed on that panel it is a counted error.</li><li>Sets or clears the corresponding display flag on the block-list entry.</li><li>Redisplays the field on the panel.</li><li>On success, increments the layout's <code>iTDMSCompatLowered</code> counter and logs the action.</li></ul><p>
Every failure path increments both <code>iTDMSCompatUnsupported</code> and
<code>iTDMSCompatWarnings</code> and emits an error message naming the field, panel,
and action. Nothing is silently skipped.
</p><h2 id="character-set">CHARACTER SET response step</h2><p>
DECforms defines <code>CHARACTER SET character-set-name</code> as a display and text
attribute. VX/DECFORMS additionally accepts it <strong>as a response step</strong>,
applying it to the current field or current panel block-list at response time.
</p>
<pre><span class="kw">CHARACTER SET</span> character-set-name</pre>
<p>
The compiler lowers this step to:
</p>
<pre>forms_Dispatch(__CHARACTER_SET, __<character-set-name>, __End);</pre>
<p><code>character-set-name</code> uses the same DECforms character-set vocabulary the
compiler already validates for the declaration-time attribute (for example
<code>PRIVATE_USER_PREFERENCE</code> or <code>PRIVATE_RULE</code>). The runtime handles
<code>__CHARACTER_SET</code> through the existing dispatch path; the extension is that
it may now appear as a response step inside a <code>Response</code> block.
</p><h2 id="compat-mode">Layout-level TDMS compatibility mode</h2><p>
Beyond the per-field response steps, a whole layout can run in TDMS compatibility mode.
This mode is enabled at layout declaration time or toggled at runtime, and pairs with
per-layout diagnostic counters so migration engineers can see exactly how much TDMS
behaviour a form exercised.
</p><h6>Enabling via configuration</h6><p>
At <code>forms_DeclareLayout()</code> time the runtime checks the config item
<strong><code>VXDFTDMSCOMPAT</code></strong>. Because the name is <code>VXDF</code>-prefixed,
it is read from the process environment or from the <code>vxForms.conf</code> config file.
The search order is <code>$VXFORMCONFIG</code>, then <code>${HOME}/./vxForms.conf</code>,
then <code>${VXREL}/syslib/</code>, <code>${VXREL}/lib64/</code>, and
<code>/opt/vxrt/syslib/</code>.
</p><p>
When set, the layout's TDMS compatibility flag is turned on, the aggressive compatibility
flag is applied, and the runtime logs that TDMS compatibility mode is enabled for the
layout.
</p>
<pre><span class="cmt"># environment</span>
<span class="kw">export</span> VXDFTDMSCOMPAT=1
<span class="cmt"># or in vxForms.conf (first file found on the config search path)</span>
VXDFTDMSCOMPAT 1</pre>
<div class="callout"><strong>Boolean config.</strong><code>VXDFTDMSCOMPAT</code> is read as a boolean config
item: present or true enables compatibility mode for the layout.
</div><h6>Controlling at runtime</h6><p><code>forms_TDMSCompatibility()</code> also accepts mode-control operations that take no
field or panel arguments:
</p><div class="table-wrapper"><table><thead><tr><th>Op constant (value)</th><th>Effect</th></tr></thead><tbody><tr><td><code>forms_tdmscompat_k_query</code> (0)</td><td>Returns <code>vxdf_s_success</code> if compat mode is on, else <code>vxdf_s_notfound</code></td></tr><tr><td><code>forms_tdmscompat_k_enable</code> (1)</td><td>Turns compat mode on for the active layout</td></tr><tr><td><code>forms_tdmscompat_k_disable</code> (2)</td><td>Turns compat mode off and clears compatibility flags</td></tr><tr><td><code>forms_tdmscompat_k_aggressive</code> (3)</td><td>Turns compat on and sets the aggressive flag</td></tr><tr><td><code>forms_tdmscompat_k_supported</code> (4)</td><td>Records a supported diagnostic; increments <code>iTDMSCompatLowered</code></td></tr><tr><td><code>forms_tdmscompat_k_unsupported</code> (5)</td><td>Records an unsupported diagnostic; increments <code>iTDMSCompatUnsupported</code> and <code>iTDMSCompatWarnings</code></td></tr></tbody></table></div><p>
Diagnostic operations (4 and 5) take two string arguments: a feature name and a detail
string.
</p><h6>Per-layout diagnostic counters</h6><p>
Each layout carries four counters so operators and migration engineers can audit TDMS
compatibility usage:
</p><div class="table-wrapper"><table><thead><tr><th>Counter</th><th>Meaning</th></tr></thead><tbody><tr><td><code>iTDMSCompatFlags</code></td><td>Active compatibility flag bits (including aggressive mode)</td></tr><tr><td><code>iTDMSCompatLowered</code></td><td>TDMS compatibility operations successfully applied</td></tr><tr><td><code>iTDMSCompatWarnings</code></td><td>Warnings emitted (parallels every unsupported operation)</td></tr><tr><td><code>iTDMSCompatUnsupported</code></td><td>Operations refused (bad parameters, missing field or panel, display failure)</td></tr></tbody></table></div><p>
This is the "never silently skip" contract in practice: an unsupported or unresolved TDMS
operation is always counted and logged, never dropped.
</p><h2 id="runtime-api">The <code>forms_TDMSCompatibility</code> API</h2><p>
Generated application code and any hand-written integration call one exported runtime
function:
</p>
<pre><span class="kw">S32</span> forms_TDMSCompatibility( <span class="kw">U32</span> Parameter, ... );</pre>
<p><code>Parameter</code> is one of the <code>forms_TDMSCompatibility_t</code> operation constants
(values 0 through 13). The varargs depend on the operation class:
</p><ul><li><strong>Mode operations (0 through 3):</strong> no additional arguments.</li><li><strong>Diagnostic operations (4 and 5):</strong><code>const char *feature</code>, <code>const char *detail</code>.</li><li><strong>Field operations (6 through 13):</strong><code>const char *field-name</code>, <code>const char *panel-name</code>.</li></ul><h6>Return values</h6><div class="table-wrapper"><table><thead><tr><th>Status</th><th>When returned</th></tr></thead><tbody><tr><td><code>vxdf_s_success</code></td><td>Operation completed successfully</td></tr><tr><td><code>vxdf_s_notfound</code></td><td>Query when compatibility mode is disabled</td></tr><tr><td><code>vxdf_s_badparam</code></td><td>Bad or missing arguments, undefined field or panel, field not on panel, or unsupported diagnostic</td></tr><tr><td><code>vxdf_s_abort</code></td><td>No active layout or form</td></tr></tbody></table></div><h6>Operation summary</h6>
<pre>forms_TDMSCompatibility(Parameter, ...);
<span class="cmt">// Parameter 0 query</span>
<span class="cmt">// 1 enable</span>
<span class="cmt">// 2 disable</span>
<span class="cmt">// 3 aggressive</span>
<span class="cmt">// 4 supported(feature, detail)</span>
<span class="cmt">// 5 unsupported(feature, detail)</span>
<span class="cmt">// 6/7 [no] reverse field(field, panel)</span>
<span class="cmt">// 8/9 [no] blinking field(field, panel)</span>
<span class="cmt">// 10/11 [no] bold field(field, panel)</span>
<span class="cmt">// 12/13 [no] underlined field(field, panel)</span></pre>
<h2 id="divergences">Divergences from TDMS and DECforms</h2><p>
VX/DECFORMS+ deliberately extends standard DECforms behaviour where TDMS migrations
require it. The table below summarises the main differences and the reason for each.
</p><div class="table-wrapper"><table><thead><tr><th>Behaviour</th><th>Divergence</th><th>Reason</th></tr></thead><tbody><tr><td>Display attributes as <strong>response steps</strong></td><td>DECforms sets these as declaration-time attributes only</td><td>TDMS set them at request/runtime; the extension preserves that timing so ported request logic works unchanged</td></tr><tr><td>Field must be <strong>displayed on the named panel</strong></td><td>The runtime edits the panel's block-list entry and redisplays; a field not on that panel has no entry to edit</td><td>Counted error rather than a silent no-op, so migration diagnostics stay honest</td></tr><tr><td>Unsupported operations are <strong>counted and logged, then rejected</strong></td><td>TDMS would simply apply the attribute</td><td>Migration diagnostics: an operator or engineer must be able to see what did not carry over</td></tr><tr><td><code>CHARACTER SET</code> as a response step</td><td>DECforms allows it only as a display attribute</td><td>VX/DECFORMS convenience extension for TDMS-style runtime attribute changes</td></tr></tbody></table></div><div class="callout warn"><strong>Scope note.</strong> VX/DECFORMS+ implements TDMS field display-attribute
response steps and layout compatibility mode. Automated import of TDMS request-block
(<code>.RLB</code>) definitions into IFDL is a separate concern and is not covered by
these extensions.
</div><h2 id="status">Feature status</h2><div class="table-wrapper"><table><thead><tr><th>Feature</th><th>Status</th></tr></thead><tbody><tr><td><code>TDMS [NO] REVERSE FIELD … ON …</code></td><td><span class="ac-live">live</span></td></tr><tr><td><code>TDMS [NO] BLINKING FIELD … ON …</code></td><td><span class="ac-live">live</span></td></tr><tr><td><code>TDMS [NO] BOLD FIELD … ON …</code></td><td><span class="ac-live">live</span></td></tr><tr><td><code>TDMS [NO] UNDERLINED FIELD … ON …</code></td><td><span class="ac-live">live</span></td></tr><tr><td><code>CHARACTER SET</code> response step</td><td><span class="ac-live">live</span></td></tr><tr><td><code>VXDFTDMSCOMPAT</code> layout compat mode (environment / <code>vxForms.conf</code>)</td><td><span class="ac-live">live</span></td></tr><tr><td>Runtime enable / disable / aggressive / query operations</td><td><span class="ac-live">live</span></td></tr><tr><td>Supported / unsupported diagnostic operations and counters</td><td><span class="ac-live">live</span></td></tr><tr><td>TDMS request-block import / translation</td><td><span class="ac-v2">out of scope for VX/DECFORMS+</span></td></tr><tr><td>Additional TDMS video attributes beyond reverse, blink, bold, underline</td><td><span class="ac-v1">not in current grammar</span></td></tr></tbody></table></div><h2 id="quickref">Quick reference</h2><h6>IFDL response steps added</h6>
<pre><span class="kw">TDMS</span> [ <span class="kw">NO</span> ] <span class="kw">REVERSE</span> <span class="kw">FIELD</span> field <span class="kw">ON</span> panel
<span class="kw">TDMS</span> [ <span class="kw">NO</span> ] <span class="kw">BLINKING</span> <span class="kw">FIELD</span> field <span class="kw">ON</span> panel
<span class="kw">TDMS</span> [ <span class="kw">NO</span> ] <span class="kw">BOLD</span> <span class="kw">FIELD</span> field <span class="kw">ON</span> panel
<span class="kw">TDMS</span> [ <span class="kw">NO</span> ] <span class="kw">UNDERLINED</span> <span class="kw">FIELD</span> field <span class="kw">ON</span> panel
<span class="kw">CHARACTER SET</span> character-set-name</pre>
<h6>New and reused keywords</h6><div class="kw-grid"><div>TDMS</div><div>REVERSE</div><div>BLINKING</div><div>BOLD</div><div>UNDERLINED</div><div>NO</div><div>FIELD</div><div>ON</div><div>CHARACTER SET</div></div><p>
Keywords are case-insensitive. <code>TDMS</code> is new; the attribute and structure
keywords reuse existing DECforms IFDL vocabulary.
</p><h6>Runtime entry point</h6>
<pre><span class="kw">S32</span> forms_TDMSCompatibility(<span class="kw">U32</span> Parameter, ...);</pre>
<h6>Enable compatibility mode</h6><div class="kw-grid"><div>VXDFTDMSCOMPAT</div><div>vxForms.conf</div><div>$VXFORMCONFIG</div><div>forms_tdmscompat_k_enable</div><div>forms_tdmscompat_k_aggressive</div></div><h6>Diagnostic counters (per layout)</h6><div class="kw-grid"><div>iTDMSCompatLowered</div><div>iTDMSCompatWarnings</div><div>iTDMSCompatUnsupported</div><div>iTDMSCompatFlags</div></div></div>