Barbara Morris wrote on Tuesday, June 25, 2013
You need EXTPGM on the prototype if you're _ever_ going to call the
program from RPG. In that case, the prototype goes in a /copy file and
gets copied into the program source itself, and into all the source that
calls it.
So you're doing it right, by putting the prototypes in a /copy file with
EXTPGM.
7.1: If you're _never_ going to use the prototype to call the program
from RPG, then don't bother coding the prototype at all. Just code the
PI without a name and without EXTPGM.
<= 6.1: If you're _never_ going to call the program from RPG, put the
prototype in the program source, and you don't need the EXTPGM. But
remember that if you don't code EXTPGM, the prototype name has to match
the module. Without EXTPGM, you're technically coding a prototype for
the main procedure, not for the program.
Examples of programs that will never be called by RPG:
- command processing programs
- exit point programs
- throwaway hacks for casual testing
- (possibly) programs only intended to be called by CL
Barbara, thank you for clearly outlining "best practice" for coding PR/PI to
replace the old-style *ENTRY PLIST.
The (RPG Reference) Manual confused me somewhat. In the V7.1 "What's
New" section it states:
"Optional prototypes
If a program or procedure is not called by another RPG module, it is
optional to specify the prototype. The prototype may be omitted for the
following types of programs and procedures:
- A program that is only intended to be used as an exit program or as the
command-processing program for a command
- A program that is only intended to be called from a different programming
language <<<<<
- A procedure that is not exported from the module
- A procedure that is exported from the module but only intended to be
called from a different programming language"
The above text suggests Program A cannot call Program B if both programs are
written in RPG _and_ Program B has no prototype defined within the module.
This has never made sense to me. But perhaps I am misinterpreting?
The following example works perfectly well - now that we can specify EXTPGM
on the PI in Program B. Yet the code appears to contradict the Manual.
========================================
// Module/program name is PROGRAMA
D CallParms Pr ExtPgm('PROGRAMB')
D 10A Const
D String S 10A Inz('String 8')
/Free
CallP CallParms(String);
*InLR = *On;
/End-Free
========================================
// Module/program name is PROGRAMB
// No Prototype (PR)
D EntryPlist Pi ExtPgm('PROGRAMB')
D String 10A Const
/Free
Dsply String '*REQUESTER';
*InLR = *On;
/End-Free
========================================
PLEASE NOTE: I am _not_ suggesting the above example is good practice! I
appreciate it would be far wiser to code the prototype in a separate source
member and /COPY in both of the above programs.
I know I am "splitting hairs" and probably wearing out my welcome. The
reason I am trying to nail down the semantics is because the above example
is an easier starting point from which to teach the use of PI/PR to students
familiar with the old PLIST way of doing things. (Duplicating the PR is
both Caller and Called programs does not make a good impression at first
look.)
I agree wholeheartedly that using /COPY to embed the PR in both programs is
desirable for building more robust code. (I do come across installations
where standards expressly forbid the use of /COPY - hence another appeal of
the V7.1 enhancements.)
Thanks again for everyone's patience!
Brian Parkins.
As an Amazon Associate we earn from qualifying purchases.