There 3 sources here.. the program, the stored proc wrapper, and a test script.
Program:
**FREE
// C-sytle printf API, to send messages to the joblog, etc.
// can be called either through normal RPG calls or as
// as stored procedure, since the indicator DS is ignored.
// I didn't create a copybook with the procedure interface however.
// right now I only care about the stored proc.
ctl-opt dftactgrp(*no) actgrp('FTRBASE') main(main)
option(*nodebugio:*srcstmt:*nounref) datfmt(*ISO) decedit('0.')
copyright('k2uhl. Dual licensed under GotIntegrity?3% or Apache 2.0 (your choice)');
dcl-pr Qp0zLprintf int(10) extproc('Qp0zLprintf');
*n pointer value options(*string); // logMsg
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
*n pointer value options(*string:*nopass);
end-pr;
dcl-proc main;
dcl-Pi *n;
msg varchar(512); // logMsg
sub1 varchar(32) options(*nopass);
sub2 varchar(32) options(*nopass);
sub3 varchar(32) options(*nopass);
sub4 varchar(32) options(*nopass);
sub5 varchar(32) options(*nopass);
sub6 varchar(32) options(*nopass);
sub7 varchar(32) options(*nopass);
sub8 varchar(32) options(*nopass);
sub9 varchar(32) options(*nopass);
sub10 varchar(32) options(*nopass);
nullds likeds(anullds) options(*nopass);
end-pi;
dcl-s logMSG varchar(513);
dcl-c CRLF const(x'25');
dcl-ds anullds Inz;
null1 int(5);
null2 int(5);
null3 int(5);
null4 int(5);
null5 int(5);
null6 int(5);
null7 int(5);
null8 int(5);
null9 int(5);
null10 int(5);
end-ds;
dcl-ds cleanParms Inz;
tSub1 varchar(32);
tSub2 varchar(32);
tSub3 varchar(32);
tSub4 varchar(32);
tSub5 varchar(32);
tSub6 varchar(32);
tSub7 varchar(32);
tSub8 varchar(32);
tSub9 varchar(32);
tSub10 varchar(32);
end-ds;
clear cleanParms;
if %addr(sub1) <> *null;
tSub1 = sub1;
endif;
If %addr(sub2) <> *null;
tSub2 = sub2;
endif;
If %addr(sub3) <> *null;
tSub3 = sub3;
endif;
If %addr(sub4) <> *null;
tSub4 = sub4;
endif;
If %addr(sub5) <> *null;
tSub5 = sub5;
endif;
If %addr(sub6) <> *null;
tSub6 = sub6;
endif;
If %addr(sub7) <> *null;
tSub7 = sub7;
endif;
If %addr(sub8) <> *null;
tSub8 = sub8;
endif;
If %addr(sub9) <> *null;
tSub9 = sub9;
endif;
If %addr(sub10) <> *null;
tSub10 = sub10;
endif;
logMSG = %trimr(msg) + CRLF;
Qp0zLprintf(logMSG :tSub1 :tSub2 :tSub3 :tSub4 :tSub5 :tSub6 :tSub7
:tSub8 :tSub9 :tSub10);
end-Proc;
Wrapper:
create or replace procedure printf (
IN message varchar(512)
)
Language RPGLE specific printf0
Not Deterministic
EXTERNAL NAME printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32))
specific printf1
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32)
)
specific printf2
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32)
)
specific printf3
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32)
)
specific printf4
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32)
)
specific printf5
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32)
)
specific printf6
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32),
IN sub7 varchar(32)
)
specific printf7
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32),
IN sub7 varchar(32),
IN sub8 varchar(32)
)
specific printf8
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32),
IN sub7 varchar(32),
IN sub8 varchar(32),
IN sub9 varchar(32)
)
specific printf9
not deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32),
IN sub7 varchar(32),
IN sub8 varchar(32),
IN sub9 varchar(32),
IN sub10 varchar(32)
)
specific printf10 not deterministic
language rpgle external name printf
parameter style general;
$ grep -v '^ *$' printf.sql
create or replace procedure printf (
IN message varchar(512)
)
Language RPGLE specific printf0
Not Deterministic
EXTERNAL NAME printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32))
specific printf1
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32)
)
specific printf2
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32)
)
specific printf3
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32)
)
specific printf4
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32)
)
specific printf5
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32)
)
specific printf6
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32),
IN sub7 varchar(32)
)
specific printf7
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32),
IN sub7 varchar(32),
IN sub8 varchar(32)
)
specific printf8
Not Deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32),
IN sub7 varchar(32),
IN sub8 varchar(32),
IN sub9 varchar(32)
)
specific printf9
not deterministic
language rpgle external name printf
parameter style general;
create or replace procedure printf (
IN message varchar(512),
IN sub1 varchar(32),
IN sub2 varchar(32),
IN sub3 varchar(32),
IN sub4 varchar(32),
IN sub5 varchar(32),
IN sub6 varchar(32),
IN sub7 varchar(32),
IN sub8 varchar(32),
IN sub9 varchar(32),
IN sub10 varchar(32)
)
specific printf10 not deterministic
language rpgle external name printf
parameter style general;
Test function:
CL: CHGJOB LOG(4 0 *SAME);
-- Test PRINTF use as a stored proc.
call printf('Now is the time', '', '', '', '', '', '', '', '', '', '')
call printf('for all good men', '', '', '', '', '', '', '', '', '');
call printf('and women', '', '', '', '', '', '', '', '');
call printf('to aid', '', '', '', '', '', '', '');
call printf('the end', '', '', '', '', '', '');
call printf('of their', '', '', '', '', '');
call printf('parties', '', '', '', '');
call printf('.', '', '', '');
call printf('Correlated Instant Condorcet Runoff', '', '');
call printf('by', '');
call printf('Ken Kuhlman');
call printf('K%s K%s', 'en', 'uhlman');
See also: https://gist.github.com/forstie/314dde2d3e32ef9b7b83495e6d620fff