Skip to content

Instantly share code, notes, and snippets.

@kskuhlman
Last active June 26, 2019 08:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kskuhlman/1c9e61a606a89ee0647bbd72b4de8d43 to your computer and use it in GitHub Desktop.
Save kskuhlman/1c9e61a606a89ee0647bbd72b4de8d43 to your computer and use it in GitHub Desktop.
printf to the joblog, with full replacement support.

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');
@kskuhlman
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment