ibm-information-center/dist/eclipse/plugins/i5OS.ic.apis_5.4.0.1/qprcrtpg.htm

4299 lines
108 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Copyright" content="Copyright (c) 2006 by IBM Corporation">
<title>Create Program (QPRCRTPG) API</title>
<!-- Begin Header Records ========================================== -->
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<!-- QPRCRTP SCRIPT A converted by B2H R4.1 (346) (CMS) by HOLTJM at -->
<!-- RCHVMW2 on 5 Feb 1999 at 14:57:36 -->
<!--Edited by Kersten Dec 2001 -->
<!--End Header Records -->
<link rel="stylesheet" type="text/css" href="../rzahg/ic.css">
</head>
<body>
<a name="Top_Of_Page"></a>
<!-- Java sync-link -->
<script language="Javascript" src="../rzahg/synch.js" type="text/javascript">
</script>
<h2>Create Program (QPRCRTPG) API</h2>
<div class="box" style="width: 80%;">
<br>
&nbsp;&nbsp;Required Parameter Group:<br>
<!-- iddvc RMBR -->
<br>
<table width="100%">
<tr>
<td align="center" valign="top" width="10%">1</td>
<td align="left" valign="top" width="50%">Intermediate representation of the
program</td>
<td align="left" valign="top" width="20%">Input</td>
<td align="left" valign="top" width="20%">Char(*)</td>
</tr>
<tr>
<td align="center" valign="top">2</td>
<td align="left" valign="top">Length of intermediate representation of
program</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Binary(4)</td>
</tr>
<tr>
<td align="center" valign="top">3</td>
<td align="left" valign="top">Qualified program name</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(20)</td>
</tr>
<tr>
<td align="center" valign="top">4</td>
<td align="left" valign="top">Program text</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(50)</td>
</tr>
<tr>
<td align="center" valign="top">5</td>
<td align="left" valign="top">Qualified source file name</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(20)</td>
</tr>
<tr>
<td align="center" valign="top">6</td>
<td align="left" valign="top">Source file member information</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(10)</td>
</tr>
<tr>
<td align="center" valign="top">7</td>
<td align="left" valign="top">Source file last changed date and time
information</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(13)</td>
</tr>
<tr>
<td align="center" valign="top">8</td>
<td align="left" valign="top">Qualified printer file name</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(20)</td>
</tr>
<tr>
<td align="center" valign="top">9</td>
<td align="left" valign="top">Starting page number</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Binary(4)</td>
</tr>
<tr>
<td align="center" valign="top">10</td>
<td align="left" valign="top">Public authority</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(10)</td>
</tr>
<tr>
<td align="center" valign="top">11</td>
<td align="left" valign="top">Option template</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Char(*)</td>
</tr>
<tr>
<td align="center" valign="top">12</td>
<td align="left" valign="top">Number of option template entries</td>
<td align="left" valign="top">Input</td>
<td align="left" valign="top">Binary(4)</td>
</tr>
</table>
<br>
&nbsp;&nbsp;Optional Parameter:<br>
<!-- iddvc RMBR -->
<br>
<table width="100%">
<tr>
<td align="center" valign="top" width="10%">13</td>
<td align="left" valign="top" width="50%">Error code</td>
<td align="left" valign="top" width="20%">I/O</td>
<td align="left" valign="top" width="20%">Char(*)</td>
</tr>
</table>
<br>
&nbsp;&nbsp;Default Public Authority: *USE<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Threadsafe: No<br>
<!-- iddvc RMBR -->
<br>
</div>
<p>The Create Program (QPRCRTPG) API converts the symbolic representation of a
machine interface (MI) program into an OPM program object. This symbolic
representation is known as the intermediate representation of a program.</p>
<p>The QPRCRTPG API creates a program object that resides in the *USER domain
and runs in the *USER state. If you want the program object to be temporary,
you must do one of the following:</p>
<ul>
<li>Delete the object when you no longer need it.</li>
<li>Create the object in the QTEMP library, and let the system delete the
object automatically when the job ends.</li>
</ul>
<p>You can specify program objects created with the QPRCRTPG API in CL commands
that process objects of type *PGM. For example, you can:</p>
<ul>
<li>Save and restore program objects using the Save Object (SAVOBJ) and Restore
Object (RSTOBJ) commands.</li>
<li>Delete program objects using the Delete Program (DLTPGM) command.</li>
<li>Run program objects using the Call (CALL) command.</li>
<li>Rename program objects using the Rename Object (RNMOBJ) command.</li>
<li>Move program objects to a different library using the Move Object (MOVOBJ)
command.</li>
</ul>
<p><strong>Note:</strong> MI instructions that reference system-domain or
write-protected objects fail at security levels 40 and 50. At those levels, you
must use APIs to work with the objects.</p>
<br>
<h3>Authorities and Locks</h3>
<dl>
<dt><em>Program Authority</em></dt>
<dd>*ALL. Required only if the program already exists and the option value
*REPLACE is specified.</dd>
<dt><em>Program Library Authority</em></dt>
<dd>*CHANGE</dd>
<dt><em>Printer File Authority</em></dt>
<dd>*USE</dd>
<dt><em>Printer File Library Authority</em></dt>
<dd>*USE</dd>
<dt><em>Source File Authority</em></dt>
<dd>*USE</dd>
<dt><em>Source File Library Authority</em></dt>
<dd>*USE</dd>
</dl>
<br>
<h3>Required Parameter Group</h3>
<dl>
<dt><strong>Intermediate representation of the program</strong></dt>
<dd>INPUT; CHAR(*)
<p>A string containing the intermediate representation of the program to be
processed by the QPRCRTPG API. See <a href="#HDRIIRP">Program Syntax</a>.</p>
</dd>
<dt><strong>Length of intermediate representation of program</strong></dt>
<dd>INPUT; BINARY(4)
<p>The size, in bytes, of the intermediate representation of the program.</p>
</dd>
<dt><strong>Qualified program name</strong></dt>
<dd>INPUT; CHAR(20)
<p>The name and library of the program to be created or replaced. The first 10
characters contain the program name, and the second 10 characters contain the
name of the library where the program is located. The special value *CURLIB may
be used for the library name.</p>
</dd>
<dt><strong>Program text</strong></dt>
<dd>INPUT; CHAR(50)
<p>Text that briefly describes the program.</p>
</dd>
<dt><strong>Qualified source file name</strong></dt>
<dd>INPUT; CHAR(20)
<p>The name and library containing the source program. The first 10 characters
contain the source file name, and the second 10 characters contain the name of
the library where the file is located. This places the value in the program
object's service description. The special value *NONE may be used for the
source file name. If you specify *NONE, no source file information is placed in
the program object's service description. A special value, such as *LIBL, is
not valid for the source file library.</p>
</dd>
<dt><strong>Source file member information</strong></dt>
<dd>INPUT; CHAR(10)
<p>The file member containing the source program. This places the value in the
program object's service description.</p>
<p>This value must be blanks if you specify *NONE as the <strong>source file
name</strong>.</p>
</dd>
<dt><strong>Source file last changed date and time information</strong></dt>
<dd>INPUT; CHAR(13)
<p>The date and time the member of the source file was last updated. The format
of this field is in the CYYMMDDHHMMSS format, where:</p>
<table cellpadding="5">
<!-- cols="10 90" -->
<tr>
<td align="left" valign="top"><em>C</em></td>
<td align="left" valign="top">Century, where 0 indicates years 19<em>xx</em>
and 1 indicates years 20<em>xx</em>.</td>
</tr>
<tr>
<td align="left" valign="top"><em>YY</em></td>
<td align="left" valign="top">Year</td>
</tr>
<tr>
<td align="left" valign="top"><em>MM</em></td>
<td align="left" valign="top">Month</td>
</tr>
<tr>
<td align="left" valign="top"><em>DD</em></td>
<td align="left" valign="top">Day</td>
</tr>
<tr>
<td align="left" valign="top"><em>HH</em></td>
<td align="left" valign="top">Hour</td>
</tr>
<tr>
<td align="left" valign="top"><em>MM</em></td>
<td align="left" valign="top">Minute</td>
</tr>
<tr>
<td align="left" valign="top"><em>SS</em></td>
<td align="left" valign="top">Second</td>
</tr>
</table>
<p>This places the value in the program object's service description.</p>
<p>This value must be blank if you specify *NONE for the source file name
parameter.</p>
</dd>
<dt><strong>Qualified printer file name</strong></dt>
<dd>INPUT; CHAR(20)
<p>The name and library containing the printer file used to generate listings.
The first 10 characters contain the printer file name, and the second 10
characters contain the name of the library where the file is located. The only
special values supported for the library name are *LIBL and *CURLIB.</p>
<p>This value is ignored if you specify *NOLIST for the generate listing option
(see <a href="#HDR8OPTION">Values for the Option Template Parameter</a>).</p>
</dd>
<dt><strong>Starting page number</strong></dt>
<dd>INPUT; BINARY(4)
<p>The first page number to be used on listings. This value should be between 1
and 9999; otherwise, the API uses 1.</p>
<p>This value is ignored if you specify *NOLIST for the generate listing option
(see <a href="#HDR8OPTION">Values for the Option Template Parameter</a>).</p>
</dd>
<dt><strong>Public authority</strong></dt>
<dd>INPUT; CHAR(10)
<p>The authority you give the users who do not have specific private
authorities to the object, and where the user's group has no specific authority
to the object.</p>
<p>The values allowed are:</p>
<table cellpadding="5">
<tr>
<td align="left" valign="top"><em>*CHANGE</em></td>
</tr>
<tr>
<td align="left" valign="top"><em>*ALL</em></td>
</tr>
<tr>
<td align="left" valign="top"><em>*USE</em></td>
</tr>
<tr>
<td align="left" valign="top"><em>*EXCLUDE</em></td>
</tr>
<tr>
<td align="left" valign="top"><em>The name of an authorization list</em></td>
</tr>
</table>
<br>
</dd>
<dt><strong>Option template</strong></dt>
<dd>INPUT; CHAR(*)
<p>This is an array of options. You can specify between 0 and
17 values. Each entry contains a CHAR(11) value as described in <a href="#HDR8OPTION">Values
for the Option Template Parameter</a>.</p>
</dd>
<dt><strong>Number of option template entries</strong></dt>
<dd>INPUT; BINARY(4)
<p>The number of option template entries.</p>
<p>The value must be between 0 and 17.</p>
</dd>
</dl>
<br>
<h3>Optional Parameter</h3>
<dl>
<dt><strong>Error code</strong></dt>
<dd>I/O; CHAR(*)
<p>The structure in which to return error information. For the format of the
structure, see <a href="../apiref/error.htm#hdrerrcod">Error code parameter</a>. If this
parameter is omitted, diagnostic and escape messages are issued to the
application.</p>
</dd>
</dl>
<br>
<h3><a name="HDR8OPTION">Values for the Option Template Parameter</a></h3>
<p>When you are using the QPRCRTPG API, you can specify a value in the option
template. Only one value per option should be specified. If you specify more
than one, the system only uses the first one. If you specify no value for a
given option, the system uses the default value (underlined).</p>
<dl>
<dt><strong>Create program object</strong></dt>
<dd>Creates a program object.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*GEN</em></td>
<td align="left" valign="top">Generates a program and places the program in the
appropriate library.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*NOGEN</em></td>
<td align="left" valign="top">No program is generated. The syntax of the
intermediate representation of the program is checked, and if the generate
listing option is *LIST, a listing is produced.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Replace program</strong></dt>
<dd>Replaces the existing program if a program by the same name already exists
in the specified library.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*NOREPLACE</em></td>
<td align="left" valign="top">Does not replace an existing program by the same
name in the specified library.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*REPLACE</em></td>
<td align="left" valign="top">Replaces the existing program by moving it to the
QRPLOBJ library.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Generate listing</strong></dt>
<dd>Generates an output listing.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*NOLIST</em></td>
<td align="left" valign="top">Does not generate a listing.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*LIST</em></td>
<td align="left" valign="top">Generates a listing.
<p>You must specify the following parameters:</p>
<ul>
<li>Printer file name and library</li>
<li>Starting page number</li>
</ul>
</td>
</tr>
</table>
</dd>
<dt><strong>Create cross-reference listing</strong></dt>
<dd>Whether the listing is to contain a cross-reference list of variable and
data item references.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*NOXREF</em></td>
<td align="left" valign="top">Does not create cross-reference listing.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*XREF</em></td>
<td align="left" valign="top">Creates a cross-reference listing of references
to variables, labels, or both.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Create summary listing</strong></dt>
<dd>Whether the listing is to contain a list of program attributes.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*NOATR</em></td>
<td align="left" valign="top">Does not create a summary listing section.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*ATR</em></td>
<td align="left" valign="top">Creates a summary listing section.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>User profile</strong></dt>
<dd>The values allowed are:
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*USER</em></td>
<td align="left" valign="top">The user profile of the user running the program
is used as a source of authority when this program runs.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*ADOPT</em></td>
<td align="left" valign="top">When the program runs, the object authority of
both the program's owner and user are used.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*OWNER</em></td>
<td align="left" valign="top">The system uses the user profile of the owner of
the program as a source of authority when this program runs. Programs called by
this program adopt this authority.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Use adopted authority</strong></dt>
<dd>Whether the system uses the program-adopted authority from the calling
programs as a source of authority when this program is running. The user must
be authorized to create programs with adopted authority for the *ADPAUT option
to take effect.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*ADPAUT</em></td>
<td align="left" valign="top">The system uses program-adopted authority from
the calling program.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*NOADPAUT</em></td>
<td align="left" valign="top">The system does not use program-adopted authority
from the calling program.</td>
</tr>
</table>
<p><strong>Note:</strong> Authorization to create programs which can adopt
authority is controlled by the QUSEADPAUT system value. For more information,
refer to the description of this system value in the <a href="../rzaks/rzaks1.htm">Work Management</a> topic.</p>
</dd>
<dt><strong>Constrain arrays</strong></dt>
<dd>The values allowed are:
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*SUBSCR</em></td>
<td align="left" valign="top">Constrains arrays. This requests additional
run-time checks to ensure that references to array elements are not outside the
bounds of the declare statement. This option causes the resulting program to
run slower.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*NOSUBSCR</em></td>
<td align="left" valign="top">Does not constrain arrays. The results of
references to array elements outside the bounds of the declare statement are
not defined.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*UNCON</em></td>
<td align="left" valign="top">Allows fully unconstrained arrays. This ensures
that references to array elements outside the bounds of the declare statement
act as if the array element actually exists.</td>
</tr>
</table>
<p><strong>Note:</strong> This program attribute may be changed at run-time
using the Override Program Attributes (OVRPGATR) MI instruction.</p>
</dd>
<dt><strong>Constrain strings</strong></dt>
<dd>The values allowed are:
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*SUBSTR</em></td>
<td align="left" valign="top">Constrains strings. This requests additional
run-time checks to ensure that references to character strings are not outside
the bounds of the declare statement. This option causes the resulting program
to run slower.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*NOSUBSTR</em></td>
<td align="left" valign="top">Does not constrain strings. The results of
substring references outside the bounds of the declare statement are not
defined.</td>
</tr>
</table>
<p><strong>Note:</strong> You can change this program attribute at run-time
using the Override Program Attributes (OVRPGATR) MI instruction.</p>
</dd>
<dt><strong>Initialize static storage</strong></dt>
<dd><strong>Static storage</strong> is allocated the first time a program is
called. It remains allocated until explicitly deallocated.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*CLRPSSA</em></td>
<td align="left" valign="top">Initializes static storage. This code clears the
program static storage area (PSSA) on entry using the Call External (CALLX) MI
instruction.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*NOCLRPSSA</em></td>
<td align="left" valign="top">Does not initialize the PSSA.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Initialize automatic storage</strong></dt>
<dd>Automatic storage is allocated each time a program runs and automatically
deallocated when no longer needed.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*CLRPASA</em></td>
<td align="left" valign="top">Initializes automatic storage. This code clears
the program automatic storage area (PASA) on entry using the Call External
(CALLX) MI instruction.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*NOCLRPASA</em></td>
<td align="left" valign="top">Does not initialize the PASA.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Ignore decimal data errors</strong></dt>
<dd>Whether errors found in decimal data result in exceptions.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*NOIGNDEC</em></td>
<td align="left" valign="top">Does not ignore decimal data errors.
<p>When you specify *NOIGNDEC, decimal values used in numeric operations are
checked for valid decimal digits and sign codes. If the system finds an error,
it signals an exception.</p>
</td>
</tr>
<tr>
<td align="left" valign="top"><em>*IGNDEC</em></td>
<td align="left" valign="top">Ignores data decimal errors.
<p>When you specify *IGNDEC, decimal values used in numeric operations ensure
they contain valid decimal digit and sign codes. However, the system treats
digits that are not valid as zeros and signs that are not valid as positive
signs. There is no exception signaled.</p>
</td>
</tr>
</table>
<p>This option applies to only a subset of the numeric operations you
specify.</p>
<p><strong>Note:</strong> In all cases, the system signals decimal data errors
if you use data pointers to address any of the instruction's operands.</p>
<p>The following list contains the MI instructions this option affects:</p>
<table border width="80%">
<tr>
<th align="left" valign="bottom">MI Instruction</th>
<th align="left" valign="bottom">Packed Source Operands Supported</th>
<th align="left" valign="bottom">Zoned Source Operands Supported</th>
<th align="left" valign="bottom">Notes</th>
</tr>
<tr>
<td align="left" valign="top" width="25%">ADDN</td>
<td align="center" valign="top" width="25%">&nbsp;</td>
<td align="center" valign="top" width="25%">X</td>
<td align="left" valign="top" width="25%">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">CMPNV</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">CVTCN</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">You must specify operand 3 (the numeric view to
be used for operand 2) as a constant and no data-pointer-defined operands.</td>
</tr>
<tr>
<td align="left" valign="top">CVTDFFP</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">CVTNC</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">You must specify operand 3 (the numeric view to
be used for operand 1) as a constant and no data-pointer-defined operands.</td>
</tr>
<tr>
<td align="left" valign="top">CPYNV</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">You must specify no data-pointer-defined
operands.</td>
</tr>
<tr>
<td align="left" valign="top">DIV</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">DIVREM</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">EDIT</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">You must specify no data-pointer-defined
operands.</td>
</tr>
<tr>
<td align="left" valign="top">EXTRMAG</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">MULT</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">NEG</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">REM</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">SCALE</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">SUBN</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="left" valign="top">&nbsp;</td>
</tr>
</table>
<p>When you specify *IGNDEC, the system may still signal the decimal data
exception. That is, other MI instructions and instruction combinations not
listed above may signal the decimal data exception when the system finds
decimal data that is bad.</p>
</dd>
<dt><strong>Ignore binary data size errors</strong></dt>
<dd>The values allowed are:
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*NOIGNBIN</em></td>
<td align="left" valign="top">The system handles binary data size errors
normally. When a binary size error occurs, an exception is signaled and the
receiver contains the left-truncated result.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*IGNBIN</em></td>
<td align="left" valign="top">The system ignores binary data size errors. This
is used when an overflow or underflow occurs on a computation and when a
control MI instruction has a receiver that is a binary field. The receiver
contains the left-truncated result.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Support coincident operands</strong></dt>
<dd>The system overlaps coincident operands between the source and receiver
operands in one or more program instructions. <strong>Coincident
operands</strong> are operands that overlap physically, in storage.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*NOOVERLAP</em></td>
<td align="left" valign="top">Does not support coincident operands. If you
specify *NOOVERLAP, you guarantee that coincident operand overlap will not
occur while running the instruction. Therefore, the system can use the receiver
on an instruction as a work area during operations performed to produce the
final result. Using the receiver as a work area does not use as much processor
resource as would be required to move the final result from an internal work
area to the receiver.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*OVERLAP</em></td>
<td align="left" valign="top">Supports coincident operands. If you specify
*OVERLAP, the operands on an MI instruction may overlap. Therefore, the system
cannot use the receiver on an instruction as a work area during operations that
produce the final result. This can require more processor resource for running
the instruction but it ensures valid results if an overlap occurs.</td>
</tr>
</table>
<p>The following is a list of instructions this option affects:</p>
<ul>
<li>Add logical character (ADDLC)</li>
<li>Add numeric (ADDN)</li>
<li>And (AND)</li>
<li>Compute math function using one input value (CMF1)</li>
<li>Concatenate (CAT)</li>
<li>Convert character to numeric (CVTCN)</li>
<li>Convert decimal form to floating-point (CVTDFFP)</li>
<li>Convert external form to numeric value (CVTEFN)</li>
<li>Convert floating-point to decimal form (CVTFPDF)</li>
<li>Convert numeric to character (CVTNC)</li>
<li>Copy bytes left adjusted with pad (CPYBLAP)</li>
<li>Copy bytes right adjusted with pad (CPYBRAP)</li>
<li>Divide (DIV)</li>
<li>Divide with remainder (DIVREM)</li>
<li>Exclusive or (XOR)</li>
<li>Multiply (MULT)</li>
<li>Or (OR)</li>
<li>Remainder (REM)</li>
<li>Scale (SCALE)</li>
<li>Subtract logical character (SUBLC)</li>
<li>Subtract numeric (SUBN)</li>
<li>Trim length (TRIML)</li>
</ul>
<br>
<br>
</dd>
<dt><strong>Allow duplicate declares</strong></dt>
<dd>The values allowed are:
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*NODUP</em></td>
<td align="left" valign="top">This does not allow a program object to be
declared more than once. This requests that duplicate declare (DCL) statements
be diagnosed as errors.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*DUP</em></td>
<td align="left" valign="top">This allows a program object to be declared more
than once. This requests that program objects declared more than once be pooled
and not be diagnosed as errors.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Optimize</strong></dt>
<dd>The values allowed are:
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*OPT</em></td>
<td align="left" valign="top">This optimizes the program. In most instances,
this produces the smallest and best running program. Occasionally, the source
program may signal a MCH2802 escape message during processing. If this occurs,
you should not optimize the program.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*NOOPT</em></td>
<td align="left" valign="top">This does not optimize the program. This requests
the normal level code optimization when you create the program.</td>
</tr>
</table>
<br>
<br>
</dd>
<dt><strong>Target release</strong></dt>
<dd>The release of the operating system on which you intend to use the object
being created. You can use the object on a system with the specified release or
with any subsequent release of the operating system installed.
<p>The values allowed are:</p>
<table cellpadding="5">
<!-- cols="15 85" -->
<tr>
<td align="left" valign="top"><em>*CURRENT</em></td>
<td align="left" valign="top">The object is to be used on the release of the
operating system currently running on your system.</td>
</tr>
<tr>
<td align="left" valign="top"><em>*PRV</em></td>
<td align="left" valign="top">The object is to be used on the previous release
with modification level 0 of the operating system.</td>
</tr>
<tr>
<td align="left" valign="top" nowrap><em>target-release</em></td>
<td align="left" valign="top">Specify the release in the format VxRxMx.</td>
</tr>
</table>
</dd>
</dl>
<br>
<br>
<h3>Error Messages</h3>
<table width="100%" cellpadding="5">
<tr>
<th align="left" valign="top">Message ID</th>
<th align="left" valign="top">Error Message Text</th>
</tr>
<tr>
<td width="15%" valign="top">CPD0078 D</td>
<td width="85%" valign="top">Value &amp;3 for parameter not a valid name.</td>
</tr>
<tr>
<td align="left" valign="top">CPF2143 E</td>
<td align="left" valign="top">Cannot allocate object &amp;1 in &amp;2 type
*&amp;3.</td>
</tr>
<tr>
<td align="left" valign="top">CPF2144 E</td>
<td align="left" valign="top">Not authorized to &amp;1 in &amp;2 type
*&amp;3.</td>
</tr>
<tr>
<td align="left" valign="top">CPF2146 E</td>
<td align="left" valign="top">Owner of object &amp;1 and object being replaced
not the same.</td>
</tr>
<tr>
<td align="left" valign="top">CPF2283 E</td>
<td align="left" valign="top">Authorization list &amp;1 does not exist.</td>
</tr>
<tr>
<td align="left" valign="top">CPF223B D</td>
<td align="left" valign="top">&amp;1 in &amp;2 type *&amp;3 adopted authority
from previous call levels was set to *NO.</td>
</tr>
<tr>
<td align="left" valign="top">CPF223E E</td>
<td align="left" valign="top">Authority check for use adopted authority
attribute failed.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3CF1 E</td>
<td align="left" valign="top">Error code parameter not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C35 E</td>
<td align="left" valign="top">Value &amp;3 for parameter &amp;2 not a valid
name.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C5A E</td>
<td align="left" valign="top">Number of option template entries is not
valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C5B E</td>
<td align="left" valign="top">Option template entry is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C5C E</td>
<td align="left" valign="top">Source file name and library is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C5D E</td>
<td align="left" valign="top">Source file member is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C5F E</td>
<td align="left" valign="top">Internal Representation of Program (IRP) string
length parameter is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C50 E</td>
<td align="left" valign="top">Program &amp;1 not created.
</tr>
<tr>
<td align="left" valign="top">CPD0078 D</td>
<td align="left" valign="top">Value &amp;3 for parameter not a valid name.</td>
</tr>
<tr>
<td align="left" valign="top">CPD3C50 D</td>
<td align="left" valign="top">Value &amp;1 for the IRG string length parameter
was not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPD3C52 D</td>
<td align="left" valign="top">Number of option template entries is not
valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPD3C53 D</td>
<td align="left" valign="top">Option template entry is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPD3C54 D</td>
<td align="left" valign="top">Source file name and library is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPD3C55 D</td>
<td align="left" valign="top">Source file member is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPD3C56 D</td>
<td align="left" valign="top">Source file last changed date and time is not
valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C56 E</td>
<td align="left" valign="top">Source file last changed date and time is not
valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C60 E</td>
<td align="left" valign="top">Program name and library is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C61 E</td>
<td align="left" valign="top">Authority is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C62 E</td>
<td align="left" valign="top">Source file library specified.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C63 E</td>
<td align="left" valign="top">Source file member specified.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C64 E</td>
<td align="left" valign="top">Source file last changed date and time
specified.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C90 E</td>
<td align="left" valign="top">Literal value cannot be changed.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6301 E</td>
<td align="left" valign="top">Intermediate representation of program (IRP)
contains &amp;1 errors. Probable compiler error.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6303 E</td>
<td align="left" valign="top">Message &amp;1, &amp;2 received while running
create program command.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6304 E</td>
<td align="left" valign="top">Library &amp;1 not found.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6306 E</td>
<td align="left" valign="top">Program &amp;1 in library &amp;2 already
exists.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6307 E</td>
<td align="left" valign="top">Program template value at offset &amp;1, bit
&amp;2, length &amp;3 not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6308 E</td>
<td align="left" valign="top">Not authorized to create program.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6309 E</td>
<td align="left" valign="top">Not authorized to library &amp;1.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6455 E</td>
<td align="left" valign="top">Member &amp;2 file &amp;1 in library &amp;3 not
found.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6457 E</td>
<td align="left" valign="top">Cannot allocate library &amp;1 for program
insertion.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6551 E</td>
<td align="left" valign="top">Work space &amp;2 cannot be extended. Probable
compiler error.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6552 E</td>
<td align="left" valign="top">Space &amp;2 type &amp;3 subtype &amp;4 not PRM
workspace.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6553 E</td>
<td align="left" valign="top">PRM permanent table resolution failed. Probable
compiler error.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6554 E</td>
<td align="left" valign="top">Type of IST object &amp;4 at offset &amp;3 not
valid. Probable PRM error.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6555 E</td>
<td align="left" valign="top">Addressability field type not valid for IST
number &amp;4 at offset &amp;3. Probable PRM error.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6557 E</td>
<td align="left" valign="top">Error condition for IST &amp;4 at &amp;3 of IST
space not valid. Probable PRM error.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6560 E</td>
<td align="left" valign="top">Operation code &amp;5 in MI instruction &amp;3 at
offset &amp;6 not found in QPRODT.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6561 E</td>
<td align="left" valign="top">Operand &amp;4 in &amp;3 at offset &amp;5 in
program template not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6563 E</td>
<td align="left" valign="top">Program was too large to be created.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6564 E</td>
<td align="left" valign="top">Machine storage limit violation.</td>
</tr>
<tr>
<td align="left" valign="top">CPF6565 E</td>
<td align="left" valign="top">User profile storage limit exceeded.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9872 E</td>
<td align="left" valign="top">Program or service program &amp;1 in library
&amp;2 ended. Reason code &amp;3.</td>
</tr>
</table>
<br>
<br>
<h3>Program Attributes</h3>
<p>The QPRCRTPG API creates programs that have the following attributes:</p>
<ul>
<li>An associated space of 480 bytes initialized to hexadecimal 00. You can use
the QCLSPGAS API to store information in the program's associated space.</li>
<li>Observability.</li>
<li>A blank extended attribute.</li>
</ul>
<br>
<h3><a name="HDRIIRP">Program Syntax</a></h3>
<p>A program object consists of an <strong>instruction stream</strong> and an
<strong>object definition table (ODT)</strong>. The intermediate representation
of a program defines both of these components. It consists of one or more
statements:</p>
<p><img alt="Program syntax diagram" src="RBAFX516.gif"> </p>
<p>Instruction statements define MI instructions placed in the instruction
stream. Declare statements define program objects placed in the ODT. Directive
statements:</p>
<ul>
<li>Control the formatting of the output listing.</li>
<li>Define entry-point program objects.</li>
<li>Define symbolic breakpoints.</li>
<li>Specify the end of the program.</li>
</ul>
<p>The following sections explain how to define these statements.</p>
<p><strong>Note:</strong> In the diagrams below, names that begin with an
uppercase letter identify values specified in another diagram. Names that begin
with a lowercase letter identify values defined in the table below the
diagram.</p>
<br>
<h3>Label</h3>
<p>The following diagram and table show the possible labels:</p>
<p><img alt="Label statement syntax" src="RBAFX517.gif"> </p>
<p>Each name specified in the label generates a branch-point program object
corresponding to the next MI instruction.</p>
<table border width="80%">
<!-- cols="30 30 40" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Label name for next instruction</td>
</tr>
</table>
<br>
<br>
<h3><a name="qprdecst">Declare Statement</a></h3>
<p>Declare statements define program data objects. All the declare statements
in a program build the object definition table (ODT).</p>
<p>You cannot specifically declare branch and entry-point program objects.
However, you can declare branch-point program objects using labels. You can
also declare entry-point program objects using the entry directive
statement.</p>
<p>The types of declare statements follow:</p>
<ul>
<li>Scalar Data Object Declare Statement</li>
<li>Pointer Data Object Declare Statement</li>
<li>Space Pointer Machine Object Declare Statement</li>
<li>Operand List Declare Statement</li>
<li>Instruction Definition List Declare Statement</li>
<li>Exception Description Declare Statement</li>
<li>Space Object Declare Statement</li>
<li>Constant Object Declare Statement</li>
</ul>
<br>
<h3>Scalar-Data-Object Declare Statement</h3>
<p>The following diagram and table show the scalar-data-object declare
statement:</p>
<p><img src="RBAFX518.gif" alt="Scalar-Data-Object Declare Statement"> </p>
<p>Only certain combinations of attributes are allowed based on the data
object's addressability. The table below shows these combinations.</p>
<table border width="80%">
<tr>
<th align="left" valign="bottom">Address-ability</th>
<th align="left" valign="bottom">Array Attribute</th>
<th align="left" valign="bottom">Array Element Offset</th>
<th align="left" valign="bottom">Position</th>
<th align="left" valign="bottom">Boundary</th>
<th align="left" valign="bottom">Initial Value</th>
</tr>
<tr>
<td align="left" valign="top" rowspan="2">STAT</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="left" valign="top" rowspan="2">AUTO</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="left" valign="top" rowspan="2">DEF</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top" rowspan="2">DIR</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">BAS</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">BASPCO</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">PARM</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
</table>
<br>
<br>
<h3>Object Name</h3>
<p>The following diagram and table show the possible object names:</p>
<img alt="Object Name syntax" src="RBAFX535.gif">
<table border width="80%">
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Program object name to be declared</td>
</tr>
</table>
<br>
<br>
<h3>Array Attribute</h3>
<p>The following diagram and table show the possible array attributes:</p>
<img alt="Array Attribute syntax" src="RBAFX520.gif">
<table border width="80%">
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 16&nbsp;776&nbsp;191</td>
<td align="left" valign="top">Dimension of the data object with an implied
lower bound of 1.</td>
</tr>
<tr>
<td align="left" valign="top">integer2</td>
<td align="left" valign="top">-2&nbsp;147&nbsp;483&nbsp;648 to
2&nbsp;147&nbsp;483&nbsp;647</td>
<td align="left" valign="top">Lower bound of the array.</td>
</tr>
<tr>
<td align="left" valign="top">integer3</td>
<td align="left" valign="top">integer2 to 2&nbsp;147&nbsp;483&nbsp;647</td>
<td align="left" valign="top">Upper bound of the array. The dimension
(integer3&nbsp;-&nbsp;integer2) cannot exceed 16&nbsp;776&nbsp;191.</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>See <a href="../apiref/aboutapis.htm#codedisclaimer">Code disclaimer information</a>
for information pertaining to code examples.</p>
<p>The following declare statements each define an array of 50 elements. The
elements of ARRAY1 are numbered 1 to 50. The elements of ARRAY2 are numbered 0
to 49. Each element of the array is a BIN(2) field. The addressability of the
arrays is static.</p>
<pre>
DCL DD ARRAY1(50) BIN(2);
DCL DD ARRAY2(0:49) BIN(2);
</pre>
<br>
<h3>Scalar Type</h3>
<p>The following diagram and tables show the possible data types of scalar
items:</p>
<img alt="Scalar Type syntax" src="RBAFX521.gif">
<p>If you specify no value, the system uses BIN(2).</p>
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">CHAR</td>
<td align="left" valign="top">Scalar type is a character string.</td>
</tr>
<tr>
<td align="left" valign="top">BIN</td>
<td align="left" valign="top">Scalar type is binary.</td>
</tr>
<tr>
<td align="left" valign="top">UNSGND</td>
<td align="left" valign="top">Scalar type is unsigned binary. If you do not
specify this value, the scalar type is signed binary.</td>
</tr>
<tr>
<td align="left" valign="top">PKD</td>
<td align="left" valign="top">Scalar type is packed decimal.</td>
</tr>
<tr>
<td align="left" valign="top">ZND</td>
<td align="left" valign="top">Scalar type is zoned decimal.</td>
</tr>
<tr>
<td align="left" valign="top">FLT</td>
<td align="left" valign="top">Scalar type is floating-point.</td>
</tr>
</table>
<br>
<br>
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">See description.</td>
<td align="left" valign="top">Length in bytes of the character data object. If
the data object is an array, the range is 1 to 32&nbsp;767. Otherwise, the
range is 1 to 16&nbsp;776&nbsp;191.</td>
</tr>
<tr>
<td align="left" valign="top">integer2</td>
<td align="left" valign="top">2 or 4</td>
<td align="left" valign="top">Length in bytes of the binary data object.</td>
</tr>
<tr>
<td align="left" valign="top">integer3</td>
<td align="left" valign="top">1 to 31</td>
<td align="left" valign="top">Total digits in the data object.</td>
</tr>
<tr>
<td align="left" valign="top">integer4</td>
<td align="left" valign="top">0 to integer3</td>
<td align="left" valign="top">Number of digits to the right of the assumed
decimal point in the data object.</td>
</tr>
<tr>
<td align="left" valign="top">integer5</td>
<td align="left" valign="top">4 or 8</td>
<td align="left" valign="top">Precision in bytes of the data object.</td>
</tr>
</table>
<br>
<br>
<h3>Addressability</h3>
<p>The following diagram and tables show the possible addressabilities:</p>
<img alt="Addressability syntax" src="RBAFX522.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">STAT</td>
<td align="left" valign="top">Addressability type is direct static.</td>
</tr>
<tr>
<td align="left" valign="top">AUTO</td>
<td align="left" valign="top">Addressability type is direct automatic.</td>
</tr>
<tr>
<td align="left" valign="top">DIR</td>
<td align="left" valign="top">Addressability type is defined. See <a href=
"#HDR8SPCOBJ">Using Space Objects</a> for more information.</td>
</tr>
<tr>
<td align="left" valign="top">DEF</td>
<td align="left" valign="top">Addressability type is direct on the previous
space.</td>
</tr>
<tr>
<td align="left" valign="top">BAS</td>
<td align="left" valign="top">Addressability type is based.</td>
</tr>
<tr>
<td align="left" valign="top">*</td>
<td align="left" valign="top">Object does not have explicit basing object.</td>
</tr>
<tr>
<td align="left" valign="top">BASPCO</td>
<td align="left" valign="top">Addressability type is based on process
communication object space pointer.</td>
</tr>
<tr>
<td align="left" valign="top">PARM</td>
<td align="left" valign="top">Addressability type is a parameter.</td>
</tr>
</table>
<br>
<br>
<table border width="80%">
<!-- cols="15 15 60" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Space object name</td>
</tr>
<tr>
<td align="left" valign="top">name2</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Scalar data object name or pointer data object
name</td>
</tr>
<tr>
<td align="left" valign="top">name3</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Pointer data object name or space pointer object
name</td>
</tr>
</table>
<p>If you specify no value, the system uses STAT.</p>
<br>
<h3>Scope</h3>
<p><strong>Scope</strong> refers to the ability to export a variable so that
other programs can access it. The following diagram and table show the possible
scopes:</p>
<img alt="Scope syntax" src="RBAFX523.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">INT</td>
<td align="left" valign="top">Data object is not externally accessible</td>
</tr>
<tr>
<td align="left" valign="top">EXT</td>
<td align="left" valign="top">Data object is externally accessible</td>
</tr>
</table>
<p>If you specify no value, the system uses INT.</p>
<br>
<h3>Boundary</h3>
<p>The following diagram and table show the possible boundaries:</p>
<img alt="Boundary syntax" src="RBAFX524.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1, 2, 4, 8, 16</td>
<td align="left" valign="top">Data object boundary</td>
</tr>
</table>
<br>
<br>
<h3>Position</h3>
<p>The following diagram and table show the possible positions:</p>
<img alt="Position syntax" src="RBAFX525.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 16&nbsp;776&nbsp;191</td>
<td align="left" valign="top">Data object position</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>The following declare statements show how POS can be used along with DEF to
access the same storage space in different ways:</p>
<pre>
DCL DD DATETIME CHAR(12);
DCL DD DATE CHAR(6) DEF(DATETIME);
DCL DD TIME CHAR(6) DEF(DATETIME) POS(7);
</pre>
<p>DATETIME represents a 12 character time and date stamp. The first 6
characters contain the date and the second 6 characters contain the time.</p>
<br>
<h3>Array Element Offset</h3>
<p>The following diagram and table show the possible array element offsets:</p>
<img alt="Array Element Offset syntax" src="RBAFX526.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 32767</td>
<td align="left" valign="top">Array element offset</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>The following example shows AEO used in conjunction with DEF and POS:</p>
<pre>
DCL DD X CHAR(16);
DCL DD LFT(4) BIN(2) DEF(X) AEO(4) POS(1);
DCL DD RGT(4) BIN(2) DEF(X) AEO(4) POS(3);
</pre>
<p>Both LFT and RGT redefine the storage declared by X. Because the size of
each array element is smaller than the array element offset, there are 2-byte
gaps between each array element:</p>
<img alt="An illustration of the concept described in the preceding paragraph"
src="RBAFX527.gif"><br>
<br>
<h3>Optimization</h3>
<p><strong>Optimization</strong> determines whether or not an item can be moved
to a register and stored there over time. The following diagram shows the
possible optimization:</p>
<img alt="Optimization syntax" src="RBAFX528.gif">
<p>This value indicates that the data object contains an abnormal value. You
cannot optimize the value for more than a single reference because the value
may be changed in a manner that the QPRCRTPG API cannot detect.</p>
<br>
<h3>Initial Value</h3>
<p>The following diagram and table show each possible initial value:</p>
<img alt="Initial Value syntax" src="RBAFX529.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 16&nbsp;776&nbsp;191</td>
<td align="left" valign="top">Position of elements in a character string</td>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">-2&nbsp;147&nbsp;483&nbsp;648 to
2&nbsp;147&nbsp;483&nbsp;647</td>
<td align="left" valign="top">Position of elements in an array</td>
</tr>
<tr>
<td align="left" valign="top">integer2</td>
<td align="left" valign="top">1 to 16&nbsp;776&nbsp;191</td>
<td align="left" valign="top">Replication factor in a character string or
array</td>
</tr>
<tr>
<td align="left" valign="top">integer3</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Initial value for signed and unsigned binary data
objects</td>
</tr>
<tr>
<td align="left" valign="top">string1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Initial value for character string data
objects</td>
</tr>
<tr>
<td align="left" valign="top">packed1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Initial value for packed decimal data
objects</td>
</tr>
<tr>
<td align="left" valign="top">zoned1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Initial value for zoned decimal data objects</td>
</tr>
<tr>
<td align="left" valign="top">float1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Initial value for floating-point data
objects</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>The following declare statement declares and initializes a 10-element
array:</p>
<pre>
DCL DD IV(10) BIN(2) STAT INIT((1)10,*(2)(2)11,*(4)(3)12,*(7)(4)13);
</pre>
<p>There are four initial value elements. The following table describes this
function:</p>
<table border width="80%">
<tr>
<th align="left" valign="bottom">Initial Value Element</th>
<th align="left" valign="bottom">Result</th>
<th align="left" valign="bottom">Position</th>
<th align="left" valign="bottom">Replication Factor</th>
<th align="left" valign="bottom">Initial value</th>
</tr>
<tr>
<td align="left" valign="top" width="20%">(1)10</td>
<td align="left" valign="top" width="20%">IV(1)=10</td>
<td align="left" valign="top" width="20%">1 (default)</td>
<td align="left" valign="top" width="20%">1</td>
<td align="left" valign="top" width="20%">10</td>
</tr>
<tr>
<td align="left" valign="top">*(2)(2)11</td>
<td align="left" valign="top">
<pre>
IV(2)=11
IV(3)=11
</pre>
</td>
<td align="left" valign="top">2</td>
<td align="left" valign="top">2</td>
<td align="left" valign="top">11</td>
</tr>
<tr>
<td align="left" valign="top">*(4)(3)12</td>
<td align="left" valign="top">
<pre>
IV(4)=12
IV(5)=12
IV(6)=12
</pre>
</td>
<td align="left" valign="top">4</td>
<td align="left" valign="top">3</td>
<td align="left" valign="top">12</td>
</tr>
<tr>
<td align="left" valign="top">*(7)(4)13</td>
<td align="left" valign="top">
<pre>
IV(7)=13
IV(8)=13
IV(9)=13
IV(10)=13
</pre>
</td>
<td align="left" valign="top">7</td>
<td align="left" valign="top">4</td>
<td align="left" valign="top">13</td>
</tr>
</table>
<br>
<br>
<h3>Pointer-Data-Object Declare Statement</h3>
<p>The following diagram and table show the pointer-data-object declare
statement:</p>
<img alt="Pointer-Data-Object Declare Statement syntax" src="RBAFX530.gif">
<p>The system only allows certain combinations of attributes based on the data
object's addressability. These combinations are listed as follows:</p>
<table border width="80%">
<tr>
<th align="left" valign="bottom">Address-ability</th>
<th align="left" valign="bottom">Array Attribute</th>
<th align="left" valign="bottom">Array Element Offset Attribute</th>
<th align="left" valign="bottom">Position Attribute</th>
<th align="left" valign="bottom">Initial Value Attribute</th>
</tr>
<tr>
<td align="left" valign="top">STAT</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="left" valign="top">AUTO</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="left" valign="top" rowspan="2">DEF</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="left" valign="top" rowspan="2">DIR</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">X</td>
</tr>
<tr>
<td align="left" valign="top">BAS</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">BASPCO</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top">PARM</td>
<td align="center" valign="top">X</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
</tr>
</table>
<br>
<br>
<h3>Pointer Type</h3>
<p>The following diagram and table show the possible pointer types:</p>
<img alt="Pointer Type syntax" src="RBAFX531.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">PTR</td>
<td align="left" valign="top">Pointer type is not specified.</td>
</tr>
<tr>
<td align="left" valign="top">INSPTR</td>
<td align="left" valign="top">Pointer type is the instruction pointer.</td>
</tr>
<tr>
<td align="left" valign="top">SPCPTR</td>
<td align="left" valign="top">Pointer type is the space pointer.</td>
</tr>
<tr>
<td align="left" valign="top">DTAPTR</td>
<td align="left" valign="top">Pointer type is the data pointer.</td>
</tr>
<tr>
<td align="left" valign="top">SYSPTR</td>
<td align="left" valign="top">Pointer type is the system pointer.</td>
</tr>
</table>
<p>If you specify an initial value, you must specify INSPTR, SPCPTR, DTAPTR or
SYSPTR.</p>
<br>
<h3>Array Attribute</h3>
<p>The following diagram and table show the possible array attributes:</p>
<img alt="Array Attribute syntax" src="RBAFX532.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 1&nbsp;000&nbsp;000</td>
<td align="left" valign="top">Dimension of the data object with an implied
lower bound of 1.</td>
</tr>
<tr>
<td align="left" valign="top">integer2</td>
<td align="left" valign="top">-2&nbsp;147&nbsp;483&nbsp;648 to
2&nbsp;147&nbsp;483&nbsp;647</td>
<td align="left" valign="top">Lower bound of the array.</td>
</tr>
<tr>
<td align="left" valign="top">integer3</td>
<td align="left" valign="top">integer2 to 2&nbsp;147&nbsp;483&nbsp;647</td>
<td align="left" valign="top">Upper bound of the array. The dimension
(integer3&nbsp;-&nbsp;integer2) should not exceed 1&nbsp;000&nbsp;000.</td>
</tr>
</table>
<br>
<br>
<h3>Addressability</h3>
<p>The following diagram and tables show the possible addressabilities:</p>
<img alt="Addressability syntax" src="RBAFX533.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">STAT</td>
<td align="left" valign="top">Addressability type is direct static.</td>
</tr>
<tr>
<td align="left" valign="top">AUTO</td>
<td align="left" valign="top">Addressability type is direct automatic.</td>
</tr>
<tr>
<td align="left" valign="top">DIR</td>
<td align="left" valign="top">Addressability type is defined. See <a href=
"#HDR8SPCOBJ">Using Space Objects</a> for more information.</td>
</tr>
<tr>
<td align="left" valign="top">DEF</td>
<td align="left" valign="top">Addressability type is defined.</td>
</tr>
<tr>
<td align="left" valign="top">BAS</td>
<td align="left" valign="top">Addressability type is based.</td>
</tr>
<tr>
<td align="left" valign="top">*</td>
<td align="left" valign="top">Object does not have explicit basing object.</td>
</tr>
<tr>
<td align="left" valign="top">BASPCO</td>
<td align="left" valign="top">Addressability type is based on the process
communication object space pointer.</td>
</tr>
<tr>
<td align="left" valign="top">PARM</td>
<td align="left" valign="top">Addressability type is parameter.</td>
</tr>
</table>
<br>
<br>
<table border width="80%">
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Space object name</td>
</tr>
<tr>
<td align="left" valign="top">name2</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Scalar data object name or the pointer data
object name</td>
</tr>
<tr>
<td align="left" valign="top">name3</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Pointer data object name or the space pointer
machine object name</td>
</tr>
</table>
<br>
<br>
<h3>Position</h3>
<p>The following diagram and table show the possible positions:</p>
<img alt="Position syntax" src="RBAFX525.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 16&nbsp;776&nbsp;191</td>
<td align="left" valign="top">Data object position</td>
</tr>
</table>
<br>
<br>
<h3>Array Element Offset Value</h3>
<p>The following diagram and table show the possible array element offset
values:</p>
<img alt="Array Element Offset Value syntax" src="RBAFX526.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 32&nbsp;767</td>
<td align="left" valign="top">Array element offset</td>
</tr>
</table>
<br>
<br>
<h3>Optimization</h3>
<p>The following diagram shows the possible optimizations:</p>
<img alt="Optimization syntax" src="RBAFX528.gif">
<p>This value indicates that the data object contains an abnormal value. The
system cannot optimize a value for more than a single reference because the
value may be changed in a manner the QPRCRTPG API cannot find.</p>
<br>
<h3>Initial Value</h3>
<p>The following diagram shows each possible initial value:</p>
<img alt="Initial Value syntax" src="RBAFX534.gif">
<p>An initial value can only be specified if a pointer-type value other than
PTR is specified. The syntax of the initial value is based on the pointer-type
value that was used.</p>
<br>
<h3>Instruction Pointer Initial Value</h3>
<p>The following diagram and table show the possible initial value for the
instruction pointer:</p>
<img alt="Instruction Pointer Initial Value syntax" src="RBAFX535.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Label name</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>The following statement declares and initializes an instruction pointer:</p>
<pre>
LABELI:
:
:
DCL INSPTR INSTRUCTION_PTR INIT(LABELI);
</pre>
<br>
<h3>Space Pointer Initial Value</h3>
<p>The following diagram and table show the initial value for the space
pointer:</p>
<img alt="Space Pointer Initial Value syntax" src="RBAFX535.gif">
<table border width="80%">
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Scalar data object name or pointer data object
name</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>The following statement declares and initializes a space pointer:</p>
<pre>
DCL PTR ANY_POINTER;
DCL SPCPTR SPACE_PTR INIT(ANY_POINTER);
</pre>
<p>The pointer SPACE_PTR is initialized to point to the space location
containing ANY_POINTER. It does <em>not</em> contain the value of
ANY_POINTER.</p>
<br>
<h3>Data Pointer Initial Value</h3>
<p>The following diagram and table show the initial value for the data
pointer:</p>
<img alt="Data Pointer Initial Value syntax" src="RBAFX536.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">string1</td>
<td align="left" valign="top">32 bytes</td>
<td align="left" valign="top">External data object name</td>
</tr>
<tr>
<td align="left" valign="top">string2</td>
<td align="left" valign="top">30 bytes</td>
<td align="left" valign="top">Program containing external data object</td>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">0 to 255</td>
<td align="left" valign="top">Subtype of program</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>The following statement declares and initializes a data pointer:</p>
<pre>
DCL DTAPTR DVALUE INIT("DBINARY",PGM("DPGM"));
</pre>
<p>The pointer DTAPTR refers to the externally defined program object DBINARY
contained in program DPGM.</p>
<br>
<h3>System Pointer Initial Value</h3>
<p>The following diagram and tables show the initial value for the system
pointer:</p>
<img alt="System Pointer Initial Value syntax" src="RBAFX537.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">string1</td>
<td align="left" valign="top">1 to 30 bytes</td>
<td align="left" valign="top">System object</td>
</tr>
<tr>
<td align="left" valign="top">string2</td>
<td align="left" valign="top">1 to 30 bytes</td>
<td align="left" valign="top">Context where the system object is located</td>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">0 to 255</td>
<td align="left" valign="top">Subtype of the context</td>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">See table below.</td>
<td align="left" valign="top">Symbolic type of the system object</td>
</tr>
<tr>
<td align="left" valign="top">integer2</td>
<td align="left" valign="top">0 to 255</td>
<td align="left" valign="top">Subtype of the system object</td>
</tr>
</table>
<p>The following system object types are supported:</p>
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Type</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top"><strong>PGM</strong></td>
<td align="left" valign="top">Program</td>
</tr>
<tr>
<td align="left" valign="top"><strong>CTX</strong></td>
<td align="left" valign="top">Context</td>
</tr>
<tr>
<td align="left" valign="top"><strong>Q</strong></td>
<td align="left" valign="top">Queue</td>
</tr>
<tr>
<td align="left" valign="top"><strong>SPC</strong></td>
<td align="left" valign="top">Space</td>
</tr>
<tr>
<td align="left" valign="top"><strong>PCS</strong></td>
<td align="left" valign="top">Process control space</td>
</tr>
</table>
<br>
<br>
<h3><a name="DCLEXAMP">Example</a></h3>
<p>The following statement declares and initializes a system pointer:</p>
<pre>
DCL SYSPTR SYSTEM_PTR INIT("MYPGM",CTX("PGMLIB"),TYPE(PGM));
</pre>
<p>The pointer SYSTEM_PTR refers to the *PGM object MYPGM in the PGMLIB
library.</p>
<br>
<h3>Space-Pointer-Machine-Object Declare Statement</h3>
<p>The following diagram and table show the space-pointer-machine-object
declare statement:</p>
<img alt="Space-Pointer-Machine-Object Declare Statement syntax" src=
"RBAFX538.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">0 to 255</td>
<td align="left" valign="top">Optimization priority value, where 255 is the
highest priority</td>
</tr>
</table>
<p>The iSeries system provides two types of pointers that can access data:</p>
<ul>
<li>Space Pointers (SPCPTR)</li>
<li>Machine Space Pointers (MSPPTR)
<p>The MSPPTR has the following restrictions:</p>
<ul>
<li>It cannot be passed as a parameter</li>
<li>It cannot be part of a structure (SPC)</li>
<li>It cannot be based (BAS(on_some_pointer)) pointer</li>
<li>It is logically only automatic (AUTO) in storage scope</li>
</ul>
</li>
</ul>
<p>Because the MSPPTR has the above restrictions, the translator often assigns
the MSPPTR to a hardware register for the life of the entire program unit. What
this means is that loads may be eliminated from the generated code.</p>
<br>
<h3>Operand-List Declare Statement</h3>
<p>The following diagram and tables show the operand-list declare
statement:</p>
<img alt="Operand-List Declare Statement syntax" src="RBAFX539.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">ARG</td>
<td align="left" valign="top">Defines the argument list</td>
</tr>
<tr>
<td align="left" valign="top">PARM</td>
<td align="left" valign="top">Defines the parameter list</td>
</tr>
<tr>
<td align="left" valign="top">INT</td>
<td align="left" valign="top">An internal parameter list</td>
</tr>
<tr>
<td align="left" valign="top">EXT</td>
<td align="left" valign="top">An external parameter list</td>
</tr>
</table>
<br>
<br>
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Scalar data object or a pointer data object name.
Up to 255 names can be specified.</td>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">0 to 255</td>
<td align="left" valign="top">Minimum number of elements that the list can
contain. This implicitly defines a variable-length operand list. If you do not
specify the operand list, the system defines a fixed-length operand list. Up to
255 names can be specified.</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>The following statements declare both argument and parameter operand lists
along with the associated argument and parameter data objects:</p>
<pre>
DCL DD ARG1 BIN(2);
DCL DD ARG2 CHAR(3);
DCL OL ARGUMENT_LIST (ARG1, ARG2) ARG;
DCL DD PARM1 BIN(2) PARM;
DCL DD PARM2 CHAR(3) PARM;
DCL OL PARAMETER_LIST (PARM1, PARM2) PARM EXT;
</pre>
<p>A parameter operand list that refers to the data objects has parameter
(PARM) addressability.</p>
<br>
<h3>Instruction-Definition-List Declare Statement</h3>
<p>The following diagram and table show the instruction-definition-list declare
statement:</p>
<img alt="Instruction-Definition-List Declare Statement syntax" src=
"RBAFX540.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Label name. Up to 255 names can be
specified.</td>
</tr>
</table>
<br>
<br>
<h3>Example</h3>
<p>The following statements declare and use an instruction definition list:</p>
<pre>
LABEL1:
:
:
DCL IDL INSTRUCTION_LIST (LABEL1,LABEL2,LABEL3);
:
:
LABEL2:
B INSTRUCTION_LIST(3); /* Branch to LABEL3 */
:
:
LABEL3:
</pre>
<br>
<h3>Exception-Description Declare Statement</h3>
<p>The following diagram and tables show the exception-description declare
statement:</p>
<img alt="Exception-Description Declare Statement syntax" src="RBAFX541.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">INT</td>
<td align="left" valign="top">Exception handler type is the internal entry
point.</td>
</tr>
<tr>
<td align="left" valign="top">BP</td>
<td align="left" valign="top">Exception handler type is the internal branch
point.</td>
</tr>
<tr>
<td align="left" valign="top">EXT</td>
<td align="left" valign="top">Exception handler type is the external entry
point.</td>
</tr>
<tr>
<td align="left" valign="top">IGN</td>
<td align="left" valign="top">Exception handling action ignores any exceptions
and continues processing.</td>
</tr>
<tr>
<td align="left" valign="top">IMD</td>
<td align="left" valign="top">Exception handling action passes control to the
specified exception handler. This is the default.</td>
</tr>
<tr>
<td align="left" valign="top">SKP</td>
<td align="left" valign="top">Exception handling action is to continue to
search for another exception description to handle the exception.</td>
</tr>
<tr>
<td align="left" valign="top">RSG</td>
<td align="left" valign="top">Exception handling action continues to search for
an exception description by signaling the exception again to the previous
call.</td>
</tr>
<tr>
<td align="left" valign="top">DFR</td>
<td align="left" valign="top">Exception handling action postpones handling and
saves exception data for later exception handling.</td>
</tr>
</table>
<br>
<br>
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">0 to 65535</td>
<td align="left" valign="top">Exception identifier</td>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Name of the label for branch point exception
handlers, name of the entry point for the internal exception handlers, and the
name of the system pointer for the external exception handlers</td>
</tr>
<tr>
<td align="left" valign="top">string1</td>
<td align="left" valign="top">1 to 32 bytes</td>
<td align="left" valign="top">Compare value</td>
</tr>
</table>
<br>
<br>
<h3>Space-Object Declare Statement</h3>
<p>The following diagram and tables show the space-object declare
statement:</p>
<img alt="Space-Object Declare Statement syntax" src="RBAFX542.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">BAS</td>
<td align="left" valign="top">Addressability type is based.</td>
</tr>
<tr>
<td align="left" valign="top">*</td>
<td align="left" valign="top">Object does not have explicit basing object.</td>
</tr>
<tr>
<td align="left" valign="top">BASPCO</td>
<td align="left" valign="top">Addressability type is based on process
communication object space pointer.</td>
</tr>
</table>
<br>
<br>
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Basing pointer name for the space</td>
</tr>
</table>
<p>For information on using space objects, refer to <a href="#HDR8SPCOBJ">Using
Space Objects</a>.</p>
<br>
<h3>Constant-Object Declare Statement</h3>
<p>The following diagram and tables show the constant-object declare
statement:</p>
<img alt="Constant-Object Declare Statement syntax" src="RBAFX543.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">CHAR</td>
<td align="left" valign="top">Scalar type is character string.</td>
</tr>
<tr>
<td align="left" valign="top">BIN</td>
<td align="left" valign="top">Scalar type is binary.</td>
</tr>
<tr>
<td align="left" valign="top">UNSGND</td>
<td align="left" valign="top">Scalar type is unsigned binary.</td>
</tr>
<tr>
<td align="left" valign="top">PKD</td>
<td align="left" valign="top">Scalar type is packed decimal.</td>
</tr>
<tr>
<td align="left" valign="top">ZND</td>
<td align="left" valign="top">Scalar type is zoned decimal.</td>
</tr>
<tr>
<td align="left" valign="top">FLT</td>
<td align="left" valign="top">Scalar type is floating-point.</td>
</tr>
</table>
<br>
<br>
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 32&nbsp;767</td>
<td align="left" valign="top">Length in bytes of the character data object</td>
</tr>
<tr>
<td align="left" valign="top">integer2</td>
<td align="left" valign="top">2 or 4</td>
<td align="left" valign="top">Length in bytes of the binary data object</td>
</tr>
<tr>
<td align="left" valign="top">integer3</td>
<td align="left" valign="top">1 to 31</td>
<td align="left" valign="top">Number of decimal digits</td>
</tr>
<tr>
<td align="left" valign="top">integer4</td>
<td align="left" valign="top">0 to integer3</td>
<td align="left" valign="top">Number of fractional digits</td>
</tr>
<tr>
<td align="left" valign="top">integer5</td>
<td align="left" valign="top">4 or 8</td>
<td align="left" valign="top">Number of bytes in floating-point constant</td>
</tr>
</table>
<p>If you do not specify a scalar type, the system uses BIN(2).</p>
<br>
<h3>Instruction Statement</h3>
<p>An instruction statement defines an MI instruction. The instruction stream
used to create the program is made up of all the instruction statements in the
intermediate representation of the program.</p>
<img alt="Instruction Statement syntax" src="RBAFX544.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">See description.</td>
<td align="left" valign="top">Opcode for this instruction, as defined in the
<a href="../rzatk/mitoc.htm">iSeries Machine Interface Instructions</a> .</td>
</tr>
<tr>
<td align="left" valign="top">name2</td>
<td align="left" valign="top">S, R, B, I</td>
<td align="left" valign="top">This is the form of the instruction.<br>
<table cellpadding="5">
<tr>
<td align="left" valign="top"><em>S</em></td>
<td align="left" valign="top">Short</td>
</tr>
<tr>
<td align="left" valign="top"><em>R</em></td>
<td align="left" valign="top">Round</td>
</tr>
<tr>
<td align="left" valign="top"><em>B</em></td>
<td align="left" valign="top">Branch</td>
</tr>
<tr>
<td align="left" valign="top"><em>I</em></td>
<td align="left" valign="top">Indicator</td>
</tr>
</table>
</td>
</tr>
</table>
<p>For the semantic meanings and the syntax restrictions (number and types of
operands, optional forms, and so on) for individual MI instructions, see the
<a href="../rzatk/mitoc.htm">iSeries Machine Interface Instructions</a>.</p>
<p>Following the abbreviated instruction name, you can specify the optional
forms of certain MI instructions using a string of characters enclosed in
parentheses. The following is an example of some of the various combinations
possible for a single MI instruction, ADD NUMERIC:</p>
<pre>
ADDN A,B,C; Add numeric (A=B+C)
ADDN(S) A,B; Add numeric short (A=A+B)
ADDN(SR) A,B; Add numeric short and round (A=A+B)
ADDN(SB) A,B/POS(X),NEG(Y); Add numeric short and branch (A=A+B,
branch to X if A&gt;0, branch to Y if A&lt;0)
ADDN(RI) A,B,C/POS(I),NEG(J); Add numeric round and indicator (A=B+C;
I='on' if A&gt;0; j='on' if A&lt;0 )
</pre>
<p>Also note that the order of characters in the optional form string is not
significant. Thus, all of the following instructions are both valid and
equivalent:</p>
<pre>
ADDN(SRB)A,B/POS(X); Add numeric short, round and branch
ADDN(SBR)A,B/POS(X); Add numeric short, round and branch
ADDN(RSB)A,B/POS(X); Add numeric short, round and branch
</pre>
<br>
<h3>Operand</h3>
<p>The following diagram and table show the possible operands:</p>
<img alt="Operand syntax" src="RBAFX545.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Numeric binary scalar operand</td>
</tr>
<tr>
<td align="left" valign="top">string1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Character scalar operand</td>
</tr>
<tr>
<td align="left" valign="top">packed1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Numeric packed decimal scalar operand</td>
</tr>
<tr>
<td align="left" valign="top">zoned1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Numeric zoned decimal scalar operand</td>
</tr>
<tr>
<td align="left" valign="top">float1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Numeric floating-point scalar operand (4 or 8
bytes)</td>
</tr>
<tr>
<td align="left" valign="top">*</td>
<td align="left" valign="top">&nbsp;</td>
<td align="left" valign="top">Null operand</td>
</tr>
</table>
<br>
<br>
<h3>Variable Operand</h3>
<p>The following diagram and table show the possible variable operands:</p>
<img alt="Variable Operand syntax" src="RBAFX546.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Data object name to be used as a primary
operand.</td>
</tr>
<tr>
<td align="left" valign="top">name2</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Pointer data object to be used as the basing
pointer.</td>
</tr>
<tr>
<td align="left" valign="top">Index1</td>
<td align="left" valign="top">See description.</td>
<td align="left" valign="top">Subscript or substring start position. The range
for array subscripts is between the lower bound of the array and the upper
bound of the array. The range for substrings is between 1 and
16&nbsp;776&nbsp;191.</td>
</tr>
<tr>
<td align="left" valign="top">Index2</td>
<td align="left" valign="top">1 to 32&nbsp;767</td>
<td align="left" valign="top">Length of the substring.</td>
</tr>
<tr>
<td align="left" valign="top">Index3</td>
<td align="left" valign="top">0 to 32&nbsp;767</td>
<td align="left" valign="top">Length of the substring (zero allowed).</td>
</tr>
</table>
<br>
<br>
<h3>Relative Branch Target</h3>
<p>The following diagram and table show the possible relative branch
targets:</p>
<img alt="Relative Branch Target syntax" src="RBAFX547.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">1 to 4095</td>
<td align="left" valign="top">Branch target instruction number <em>
relative</em> to the current instruction. You must label the target (named or
null label).</td>
</tr>
</table>
<p><strong>Note:</strong> You cannot use blanks between either the '</p>
<pre>
=+
</pre>
<p>' symbol set and integer1 or the '</p>
<pre>
=-
</pre>
<p>' symbol set and integer1. However, a blank must precede the symbol
sets.</p>
<br>
<h3>Example</h3>
<p>The following instructions illustrate the use of relative branch
targets:</p>
<pre>
CPYNV X,0;
CMPBLA(B) A,'1'/EQ( =+2);
CPYNV X,1;
: CPYNV Y,X; /* Destination of relative branch */
</pre>
<p><strong>Note:</strong> A null label is placed in the destination instruction
of the relative branch.</p>
<br>
<h3>Target</h3>
<p>The following diagram and table show the possible targets:</p>
<img alt="Target syntax" src="RBAFX548.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">See keyword table.</td>
<td align="left" valign="top">Keyword for branch or indicator forms. You can
use an N before keywords to negate the condition except for IGN and DFR. See
"Resultant Conditions", under each MI instruction for the valid values.</td>
</tr>
<tr>
<td align="left" valign="top">name2</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Label name, instruction pointer name, or
instruction definition list name for the branch form. The name of character
variable is for the indicator form.</td>
</tr>
<tr>
<td align="left" valign="top">Index1</td>
<td align="left" valign="top">1 to 255</td>
<td align="left" valign="top">Instruction definition list index. You can only
specify this value when name2 is the name of an instruction definition
list.</td>
</tr>
</table>
<p>The following table shows the branch and indicator keywords:</p>
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top" colspan="2">Group 1</td>
</tr>
<tr>
<td align="left" valign="top">HI MXD NOR POS TR ZC</td>
<td align="left" valign="top">High Mixed Normalized Positive Truncated record
Zero and carry</td>
</tr>
<tr>
<td align="left" valign="top" colspan="2">Group 2</td>
</tr>
<tr>
<td align="left" valign="top">CR DEN IGN LO NEG NTZNTC RO</td>
<td align="left" valign="top">Complete record Denormalized Exception ignored
Low Negative Not-zero and no carry Receiver overrun</td>
</tr>
<tr>
<td align="left" valign="top" colspan="2">Group 3</td>
</tr>
<tr>
<td align="left" valign="top">AUTH DFR DQ EQ INF SE SGN ZER ZNTC</td>
<td align="left" valign="top">Authorized Exception postponed Dequeued Equal
Infinity Source all used Signaled Zero Zero and no carry</td>
</tr>
<tr>
<td align="left" valign="top" colspan="2">Group 4</td>
</tr>
<tr>
<td align="left" valign="top">EC NAN NTZC UNEQ UNOR</td>
<td align="left" valign="top">Escape code encountered Not a number (NaN)
Not-zero and carry Unequal Unordered</td>
</tr>
</table>
<p>By adding N to the beginning of the appropriate keyword you can form a not
condition. For example, the code for "not equal" is NEQ.</p>
<p>All conditions coded on a particular instruction must be mutually exclusive.
All conditions within a group are equivalent, and therefore, only one may be
specified. For example, POS (positive) and HI (high) cannot be coded on the
same instruction.</p>
<p>The not form of a condition is satisfied by any condition from another
group. For example, NEQ (not equal) is satisfied by HI (high), LO (low), or
UNOR (unordered). Therefore, you cannot specify NEQ with any of the other
three. However, you can use NEQ and EQ (or any other keyword in group 3)
together because they are mutually exclusive.</p>
<br>
<h3>Index</h3>
<p>The following diagram and table show the possible indexes:</p>
<img alt="Index syntax" src="RBAFX549.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">See description below.</td>
<td align="left" valign="top">Binary variable to use as the index</td>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">See description below.</td>
<td align="left" valign="top">Integer value to use as the index</td>
</tr>
</table>
<p>An index is a numeric value that qualifies an array or substring reference.
The context in which the index is used determines the range. For more
information, refer to the preceding tables.</p>
<br>
<h3><a name="qprdirst">Directive Statements</a></h3>
<p>The directive statements are as follows:</p>
<ul>
<li>Title Directive Statement</li>
<li>Space Directive Statement</li>
<li>Eject Directive Statement</li>
<li>Break Directive Statement</li>
<li>Entry Directive Statement</li>
<li>Reset Directive Statement</li>
<li>Program End Directive Statement</li>
</ul>
<br>
<h3>Title Directive Statement</h3>
<p>The title directive statement causes a heading to appear on the listings.
Only one title directive statement may be specified in a program. The following
diagram and table show the title directive statement:</p>
<img alt="Title Directive Statement syntax" src="RBAFX580.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">string1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Text of the title</td>
</tr>
</table>
<br>
<br>
<h3>Space Directive Statement</h3>
<p>The space directive statement causes a blank line to appear in the listing.
The following diagram and table show the space directive statement:</p>
<img alt="Space Directive Statement syntax" src="RBAFX581.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">integer1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Number of lines to skip</td>
</tr>
</table>
<br>
<br>
<h3>Eject Directive Statement</h3>
<p>The eject directive statement causes the next line to appear on a new page.
The following diagram shows the eject directive statement:</p>
<img alt="Eject Directive Statement syntax" src="RBAFX582.gif"><br>
<h3>Break Directive Statement</h3>
<p>The break directive statement allows symbolic breakpoints to be defined. The
following diagram and table show the break directive statement:</p>
<img alt="Break Directive Statement syntax" src="RBAFX583.gif">
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">string1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Breakpoint name</td>
</tr>
</table>
<br>
<br>
<h3>Entry Directive Statement</h3>
<p>The following diagram and tables show the entry directive statement:</p>
<img alt="Entry Directive Statement syntax" src="RBAFX584.gif">
<table border width="80%">
<!-- cols="10 90" -->
<tr>
<th align="left" valign="top">Keyword</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">INT</td>
<td align="left" valign="top">Internal entry point.</td>
</tr>
<tr>
<td align="left" valign="top">EXT</td>
<td align="left" valign="top">External entry point.</td>
</tr>
<tr>
<td align="left" valign="top">BRK</td>
<td align="left" valign="top">Symbolic breakpoint is associated with the entry
point.</td>
</tr>
<tr>
<td align="left" valign="top">*</td>
<td align="left" valign="top">Entry point defined has no name or is associated
with the next MI instruction.</td>
</tr>
</table>
<br>
<br>
<table border width="80%">
<!-- cols="15 15 70" -->
<tr>
<th align="left" valign="top">Constant</th>
<th align="left" valign="top">Range</th>
<th align="left" valign="top">Description</th>
</tr>
<tr>
<td align="left" valign="top">name1</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Entry point name being defined</td>
</tr>
<tr>
<td align="left" valign="top">name2</td>
<td align="left" valign="top">Any</td>
<td align="left" valign="top">Parameter list name for this entry point</td>
</tr>
<tr>
<td align="left" valign="top">string1</td>
<td align="left" valign="top">1-10 bytes</td>
<td align="left" valign="top">Breakpoint name</td>
</tr>
</table>
<p>The default scope is internal (INT).</p>
<p>The entry statement defines entry point program objects. The next
instruction number is associated with this entry point. The entry statement is
to be the definition point for this object, so the ODT number assigned to this
object is the next available ODT number.</p>
<br>
<h3>Reset Directive Statement</h3>
<p>The following diagram shows the reset directive statement:</p>
<img alt="Reset Directive Statement syntax" src="RBAFX585.gif">
<p>The specified name is a previously declared space object. The reset
statement causes subsequent data object declarations containing the DIR
attribute to use the specified space object. The system maintains next byte
counts for each space object; these counts are not affected by the reset
statement. For more information, see <a href="#HDR8SPCOBJ">Using Space
Objects</a>.</p>
<br>
<h3>Program End Directive Statement</h3>
<p>The following diagram shows the program end directive statement:</p>
<img alt="Program End Directive Statement syntax" src="RBAFX586.gif">
<p>This must be the last statement in the program. To ensure comments and
strings end before processing the PEND statement, use the following
statement:</p>
<pre>
/*'/*'/*"/*"*/; PEND;;;
</pre>
<br>
<h2>Coding Techniques</h2>
<p>This section contains additional information for coding the intermediate
representation of a program.</p>
<br>
<h3>Using Declare Statements</h3>
<p>Use the following guidelines when using declare statements:</p>
<ul>
<li>A declare statement for data objects defined on another data object must
occur after the declare statement for the data object on which it is defined.
<p><strong>Example</strong>: The following sets of declare statements are
valid:</p>
<pre>
DCL DD A CHAR(5);
DCL DD B CHAR(1) DEF(A);
DCL DD A CHAR(5);
DCL DD X BIN(2);
DCL PTR P1 AUTO;
DCL DD B CHAR(1) DEF(A);
</pre>
<p><strong>Example</strong>: The following declare statements are not valid
because B is defined on A but is declared before A:</p>
<pre>
DCL DD B CHAR(1) DEF(A);
DCL DD A CHAR(5);
</pre>
<p>This restriction also applies when there is a chain of dependencies.</p>
<p><strong>Example</strong>: In the figure below, B is defined on A and C is
defined on B:</p>
<pre>
DCL DD A CHAR(5);
DCL DD B CHAR(3) DEF(A);
DCL DD C CHAR(1) DEF(B);
</pre>
<p>If any object in a chain of definitions, as shown in the previous examples,
has an initial value specified, then the following restrictions apply:</p>
<ul>
<li>No object in that chain can have the BAS (based) addressability
attribute.</li>
<li>The highest level data object in the chain must be either static or
automatic.</li>
<li>When you initialize the same area twice, the system uses the last
value.</li>
</ul>
<p><strong>Example</strong>: The following declare statements are valid
because:</p>
<ul>
<li>The BAS addressability attribute is not used.</li>
<li>Data object A (implicitly) has the static addressability attribute.
<pre>
DCL DD A CHAR(5);
DCL DD B CHAR(3) DEF(A) INIT(C'YES');
DCL DD C CHAR(1) DEF(B);
</pre>
</li>
</ul>
</li>
<li>All declare statements for the objects that make up the elements of an
operand list must precede the declare statement for the operand list.</li>
<li>When a declare statement for an exception description refers to a system
pointer, the declare statement for the system pointer must precede the DCL for
the exception description.</li>
</ul>
<br>
<h3><a name="HDR8SPCOBJ">Using Space Objects</a></h3>
<p>Space objects, when used in conjunction with program objects declared with
the DIR attribute, provide a convenient way of declaring structures.</p>
<p><strong>Note:</strong> Space objects, as used here, do not refer to i5/OS
space objects.</p>
<p>When you declare a space object, a scalar data object with a scalar type of
CHAR(32767) is created. This object contains the structure to be defined.
Associated with this object is a "next byte" count. This value is initially 1
and represents the position where the next structure element will be
placed.</p>
<br>
<h3>Example: Simple Space Objects</h3>
<p>After you declare a space object, you can declare one or more scalar or
pointer data objects with an addressability attribute of DIR. As a result, the
system automatically declares each object with the DEF and POS attributes. The
name associated with the DEF attribute is the most recently declared space
object. The value associated with the POS attribute is the space object's next
byte count. After you declare the object, the system sets the next byte count
associated with the space object to the next available position within the
structure.</p>
<p>The group of declare statements on the left is equivalent to the group on
the right:</p>
<pre>
DCL SPC X BAS(PTR); DCL DD X CHAR(32767) BAS(PTR);
DCL DD A CHAR(2) DIR; DCL DD A CHAR(2) DEF(X) POS(1);
DCL DD B ZND(5,2) DIR; DCL DD B ZND(5,2) DEF(X) POS(3);
DCL DD C FLT(4) DIR; DCL DD C FLT(4) DEF(X) POS(8);
</pre>
<br>
<h3>Example: Explicit Position Values</h3>
<p>Data objects declared with DIR may also have an explicit POS value. The
object is defined on the appropriate space object and uses the specified POS
value. However, the next byte count is changed only if the POS value causes the
count to increase.</p>
<p>The group of declare statements on the left is equivalent to the group on
the right:</p>
<pre>
DCL SPC X BAS(PTR); DCL DD X CHAR(32767) BAS(PTR);
DCL DD A CHAR(4) DIR; DCL DD A CHAR(4) DEF(X) POS(1);
DCL DD B CHAR(4) POS(20) DIR; DCL DD B CHAR(4) DEF(X) POS(20);
DCL DD C CHAR(4) DIR; DCL DD C CHAR(4) DEF(X) POS(24);
DCL DD D CHAR(4) POS(10) DIR; DCL DD D CHAR(4) DEF(X) POS(10);
DCL DD E CHAR(4) DIR; DCL DD E CHAR(4) DEF(X) POS(28);
</pre>
<br>
<h3>Example: Explicit Boundary Alignment</h3>
<p>When you declare objects with an explicit boundary other than 1, the object
is positioned on the next available byte with that boundary. The position of
any data object with the direct attribute is the next available byte in the
space if no boundary or position is specified. The position of any pointer
object with the direct attribute is the next available byte in the space if no
position is specified. Space objects are assumed to begin on a 16-byte
boundary. You must ensure this condition exists at run-time.</p>
<p>The group of declare statements on the left is equivalent to the group on
the right:</p>
<pre>
DCL SPC X BAS(PTR); DCL DD X CHAR(32767) BAS(PTR);
DCL DD A CHAR(1) DIR; DCL DD A CHAR(1) DEF(X) POS(1);
DCL DD B FLT(4) DIR; BDRY(4); DCL DD B FLT(4) DEF(X) POS(5);
DCL PTR C DIR; POS(17); DCL PTR C DEF(X) POS(17);
</pre>
<br>
<h3>Example: Reset Directive Statement</h3>
<p>You can use the reset directive statement to change the name of the space
object to be used by subsequent declare statements.</p>
<p>The group of declare statements on the left is equivalent to the group on
the right:</p>
<pre>
DCL SPCPTR PTR1; DCL SPCPTR PTR1;
DCL SPCPTR PTR2; DCL SPCPTR PTR2;
DCL SPC X BAS(PTR1); DCL DD X CHAR(32767) BAS(PTR1);
DCL DD A CHAR(2) DIR; DCL DD A CHAR(2) DEF(X) POS(1);
DCL DD B ZND(5,2) DIR; DCL DD B ZND(5,2) DEF(X) POS(3);
DCL SPC Y BAS(PTR2); DCL DD Y CHAR(32767) BAS(PTR2);
DCL DD C CHAR(5) DIR; DCL DD C CHAR(5) DEF(Y) POS(1);
DCL DD D CHAR(7) DIR; DCL DD D CHAR(7) DEF(Y) POS(6);
RESET X;
DCL DD E CHAR(3) DIR; DCL DD E CHAR(3) DEF(X) POS(8);
</pre>
<br>
<h3>Constants</h3>
<p>This section describes the syntax of constant values.</p>
<br>
<h3>Integer</h3>
<p>Integers define signed and unsigned binary scalar data values. The two forms
of integers are decimal and hexadecimal. The decimal form is a sequence of
digits optionally preceded by a sign. The hexadecimal form is a string of
hexadecimal digits delimited with apostrophes and preceded by an H. Neither
form may exceed the 4-byte limit on binary numbers. When the value of the
integer is between -4095 and +8191, the QPRCRTPG API converts the integer to an
immediate operand where it can.</p>
<br>
<h3>Example</h3>
<pre>
+123
-1
54788
H'0F0D'
H'0123'
H'5E2D1AB4'
</pre>
<br>
<h3>String</h3>
<p>Strings define scalar character string data values. The three types of
string constants are character form, hexadecimal form, and Hollerith form.</p>
<p>The character form is a delimited string optionally preceded by a C.
Apostrophes or double quotation marks may be used for this form. The
hexadecimal form is a delimited string of hexadecimal digits preceded by an X.
The Hollerith form is a string of bytes preceded by the count of the number of
bytes in the string. The syntax is:</p>
<pre>
&lt; count | string &gt;
</pre>
<p>The count in the preceding syntax is the number of characters in the string.
The QPRCRTPG API ensures that the string contains the right number of
characters by checking for the</p>
<pre>
&gt;
</pre>
<p>character. No blanks are allowed between</p>
<pre>
&lt;
</pre>
<p>and</p>
<pre>
&gt;
</pre>
<p>unless they are part of the string. The QPRCRTPG API simply flags the
constant as in error if the right corner bracket does not appear in the correct
position.</p>
<br>
<h3>Example</h3>
<p>The following groups of strings are equivalent:</p>
<pre>
'ABCDE'
C'ABCDE'
X'C1C2C3C4C5'
&lt;5|ABCDE&gt;
'TE''ST'
"TE'ST"
X'E3C57DE2E3'
&lt;5|TE'ST&gt;
'/*'
X'615C'
&lt;2|/*&gt;
</pre>
<br>
<h3>Packed</h3>
<p>Packed constants define packed decimal scalar data values. Packed constants
are a string of decimal digits delimited with apostrophes. They can have an
embedded decimal point and can be preceded by a sign. P must precede the
delimited string. Packed constants have a maximum of 31 significant digits.</p>
<p><strong>Note:</strong> You must specify at least one numeric digit.</p>
<br>
<h3>Example</h3>
<br>
<pre>
P'+123.456'
P'1'
P'-1'
P'-123.345345345345'
P'+.00000000000001'
</pre>
<br>
<h3>Zoned</h3>
<p>Zoned constants define zoned decimal scalar data values. The external
representation of zoned constants is the same as that for packed constants
except that the preceding character is a Z.</p>
<p><strong>Note:</strong> You must specify at least one numeric digit.</p>
<br>
<h3>Example</h3>
<pre>
Z'+123.456'
Z'1'
Z'-1'
Z'-123.345345345345'
Z'+.00000000000001'
</pre>
<br>
<h3>Floating-Point Constants</h3>
<p>Floating-point constants define floating-point scalar data values. You must
specify whether the constant is a 4-byte (short floating-point) or an 8-byte
(long floating-point) value.</p>
<p>There are two ways to represent floating-point values. First, you can
specify floating-point constants as a delimited string of decimal digits
possibly with an embedded decimal point and optionally preceded by a sign. An F
for short floating-point values or an E for long floating-point values must
precede the delimited string. An E in the string determines the start of the
base 10 exponent. You specify the exponent as signed.</p>
<p>Second, you can specify floating-point constants as a string of hexadecimal
digits. The delimited string must be preceded by an XF for short floating-point
values or an XE for long floating-point values.</p>
<p><strong>Note:</strong> You must specify at least one numeric digit.</p>
<br>
<h3>Example</h3>
<br>
<pre>
<strong>Short Floating-Point Long Floating-Point
Values Values
</strong>
F'0' E'0'
F'+12' E'+12'
F'-12.21' E'-12.21'
F'12.34E2' E'12.34E2'
F'+3.2345678E-02' E'+3.2345678E-02'
XF'449A4000' XE'46CE6F37FFBE8722'
XF'40490FD0' XE'400921F9F01B866E'
</pre>
<p>Several special values are allowed:</p>
<pre>
<strong>Short Floating-Point Long Floating-Point
Values Values
</strong>
F'MNAN' E'MNAN' Masked Not A Number
F'UNAN' E'UNAN' Unmasked Not A Number
F'+INF' E'+INF' Plus Infinity
F'-INF' E'-INF' Minus Infinity
</pre>
<br>
<p><strong>Note:</strong> You must use floating-point constants to initialize
floating-point data objects.</p>
<br>
<h3>Name</h3>
<p>Names specified in the intermediate representation of a program are a
sequence of characters of up to 48 characters in length. You cannot use the
following characters as the first character of the name:</p>
<pre>
blank /,;():&lt;+'%-0123456789
</pre>
<p>You cannot use the following characters in subsequent characters of the
name:</p>
<pre>
blank /,;():&lt;+'%
</pre>
<br>
<h3>Example</h3>
<br>
<pre>
.NAME
NAME
THIS_IS_A_NAME
THIS_IS_A_NAME_2
&amp;NAME
!NAME
?NAME
.0001
</pre>
<p><strong>Note:</strong> Symbols that begin with a period (.) are not inserted
into the program's symbol table and may not be referred to by the i5/OS debug
function.</p>
<br>
<h3>Comments</h3>
<p>Comments, in the intermediate representation of a program, may appear
anywhere in the text. Comments are treated as blanks so they are significant in
finding tokens. Comments are a string of characters starting with</p>
<pre>
/*
</pre>
<p>and ending with</p>
<pre>
*/
</pre>
<p>. If a comment occurs immediately following a semicolon, it prints as a
separate line (or a multiple line as required) on the listing. If a comment is
embedded in a statement, then it appears as a part of that statement, such as a
remark.<br>
<br>
<br>
</p>
<h3>Example</h3>
<p>The following statements are equivalent:</p>
<pre>
CPYBLA A,B;
CPYBLA A, /* C-&gt; */ B ;
CPYBLA A,B; /* B is based on C */
</pre>
<br>
<h3>Blanks</h3>
<p>You can use strings of blanks of any length in the intermediate
representation of a program. Blanks act as delimiters in finding tokens and in
some places are necessary as in separating the opcode and operand in an
instruction statement.</p>
<br>
<h3>Example</h3>
<p>The following statements are equivalent:</p>
<pre>
ADDN A,B,C;
ADDN A , B , C ;
</pre>
<br>
<hr>
API introduced: V1R3
<hr>
<center>
<table cellpadding="2" cellspacing="2">
<tr align="center">
<td valign="middle" align="center"><a href="#Top_Of_Page">Top</a> | <a href=
"pgm1.htm">Program and CL Command APIs</a> | <a href="aplist.htm">APIs by
category</a></td>
</tr>
</table>
</center>
</body>
</html>