Q. I am trying to find the /Free replacement for the *ENTRY PLIST. The conversion tool in WDSc doesn’t touch this code. Is it possible to do this in /Free code?
A. You’re probably comfortable coding a prototype and procedure interface for a subprocedure. But you can also use PR/PI definitions to replace the *ENTRY PLIST for an RPG IV program When coding a procedure interface for a main procedure (i.e., a program), you must remember a few additional requirements:
- The prototype for the main procedure must include the Extpgm keyword.
- The procedure interface must be named (the same as the prototype).
- The prototype must precede the procedure interface.
You have a choice when naming the prototype and the procedure interface. You can name the PR and PI descriptions to match the name of the module, or you can assign a name of your choosing — perhaps a shop-standard name such as Main. If the name on the PR/PI descriptions doesn’t match the module name, you must specify the module name with the Extpgm keyword (e.g., EXTPGM(‘MYPGM’)).
Here’s a sample *ENTRY PLIST for a program named MYPGM and a pair of sample PR/PI combinations to replace it.
*ENTRY PLIST:
C *Entry Plist C Parm CpyNbr 5 0 C Parm AcctID 7
Corresponding PR/PI description:
// ------------------------------------- Prototypes Dcl-pr Mypgm ExtPgm; *N Zoned(5:0); *N Char(7); End-pr; // ----------------------- Main procedure interface Dcl-pi Mypgm; CpyNbr Zoned(5:0); AcctID Char(7); End-pi;
Or:
// ------------------------------------- Prototypes Dcl-pr Main ExtPgm; *N Zoned(5:0); *N Char(7); End-pr; // ----------------------- Main procedure interface Dcl-pi Main; CpyNbr Zoned(5:0); AcctID Char(7); End-pi;
Or:
// ------------------------------------- Prototypes Dcl Main PR ExtPgm('MYPGM') D 5S 0 D 7 // ----------------------- Main procedure interface D Main PI D CpyNbr 5S 0 D AcctID 7
You can call this program (MYPGM) from any program, whether or not the calling program prototypes the call. The calling program can even be a CL program or an RPG III program. If the calling RPG IV program also has a prototype for MYPGM, the caller can use a free format call to MYPGM. For example:
// ------------------------------------- Prototypes Dcl-pr Mypgm ExtPgm('MYPGM'); *N Zoned(5:0); *N Char(7); End-pr; ... Mypgm(Company:Customer);
There are several reasons you might want to switch to using PR/PI descriptions instead of an *ENTRY PLIST. First, the coding is consistent with the coding required for subprocedures, which don’t support *ENTRY PLIST. Second, the free-format replacement specification for C-specs doesn’t support the PLIST or PARM operation; free-format coding renders the *ENTRY PLIST obsolete. Last, you can take advantage of prototyping to better control how parameters are passed by using prototyping keywords such as Const and Options(*NoPass).
Note that you can pass parameters by reference (just as you did with the *ENTRY PLIST) or by read-only reference (Const). You cannot, however, pass parameters by Value to a main procedure, nor does a main procedure support a return value.