🚨 Oracle not porting Rdb to x86 and EOL on Itanium 12/2027 🚨
Technical Capabilities
Having trouble finding what you need?
Get in touch with us, so we can answer your specific questions directly.
Get In Touch

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(&lt;op-constant&gt;, <span class="str">"&lt;field-name&gt;"</span>, <span class="str">"&lt;panel-name&gt;"</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, __&lt;character-set-name&gt;, __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>

Frequently Asked Questions

Curious about how Sector7 can facilitate your application migration? Explore our FAQs for expert insights.

No items found.

Transform Your Legacy Software Today!

Get In Touch
Unlock the potential of your legacy software with our expert migration services.