CLP is an acronym for Control Language Program.
In some realities, this is comparable to software that is the "glue" connecting higher level language programs like RPG; data base files and their over-rides; screen and print "files" and their over-rides; and other objects with Menus ... typically when we take a menu option, we are launching a CLP program. Thus, a CLP program might be thought of as a command script except that it is compiled and creates an object like any other program.
CLP Unique Commands
Some AS/400 commands can ONLY be executed from within a CLP program, not from a Command Line. These are used to define the environment for a CLP program or control its flow. In other programming languages, these might be called OP CODES.
- PGM (Begin program)
- DCL (Declare a variable)
- DCLF (Declare File)
- RCVF (Receive File)
In later releases, IBM also added the following CL-only commands (or "statements") for additional definition and control of a CL program.
- DCLPRCOPT (Declare processing options)
- INCLUDE (Include external CL source at compile-time)
- CLOSE (Close a file)
Some characters have special meaning in CL:
Ref: CL Programming, Expressions in CL commands
Like RPG, CLP also supports many built-in functions. These would typically be used in CHGVAR and/or IF statements to manipulate variable data before its subsequent use. Initially, CLP offered the following built-in functions.
|%BINary||Convert signed decimal data to or from binary character format.|
|%SubSTring||Extract or set a subset of another character string.|
|%SWITCH||Evaluate one or more of the eight job switches and return a Boolean result.|
As of V5R4 of the operating system, IBM added the following built-in functions to CLP.
|%ADDRess||Change or test the address stored in a CL pointer variable.|
|%OFfSet||Change or test the offset portion of an address stored in a CL pointer variable.|
As of V7R1 of the operating system, IBM added the following built-in functions to CLP.
|%CHECK||Using a forward search, returns the first position in a base string that contains a character that is not in the comparator string — or zero if the base string contains only characters from the comparator string.|
|%CHECKR||Using a reverse search, returns the last position in a base string that contains a character that is not in the comparator string — or zero if the base string contains only characters from the comparator string.|
|%SCAN||Using a forward search, returns the first position of an argument string within a source string — or zero if not found.|
|%TRIM||Returns the supplied string with leading and trailing blank characters or argument characters removed.|
|%TRIML||Returns the supplied string with leading (i.e., leftmost) blank characters or argument characters removed.|
|%TRIMR||Returns the supplied string with trailing (i.e., rightmost) blank characters or argument characters removed.|
As of V7R2 of the operating system, IBM added the following built-in functions to CLP.
|%CHAR||Converts logical, decimal, integer, or unsigned integer data to character format.|
|%DEC||Converts character, logical, decimal, integer, or unsigned integer data to packed decimal format.|
|%INT||Converts character, logical, decimal, or unsigned integer data to integer format.|
|%LEN||Returns the number of digits or characters of a CL numeric or character variable.|
|%LOWER||Returns a character string that is the same length as the argument specified with each uppercase letter replaced by the corresponding lowercase letter.|
|%SIZE||Returns the number of bytes occupied by the CL variable.|
|%UINT||Converts character, logical, decimal, or integer data to unsigned integer format.|
|%UPPER||Returns a character string that is the same length as the argument specified with each lowercase letter replaced by the corresponding uppercase letter.|
As of V5R4, CL allows the use of pointers. There were some problems with uninitialised pointers, and PTFs were issued. As of 15 Feb 2008, 5722-SS1:
These are immediate PTFs, but you will need to re-compile any CL programs using pointers in order to get the issues fixed.
One can't compare a pointer to *NULL, but a clever idea is to create an unused pointer (which will be set to *NULL if the above PTFs are applied) and compare to that. Here is a snippet from Tom L. for a CL program that performs getenv from a thread on RPG400-L.
dcl &pNull *ptr /* Auto-initialized to *null */ if ( &pEnvVar *eq &pNull ) do
This category has only the following subcategory.
- [×] CLP/400 examples (8 P)