Create a PL/I source file, opdemo2.pli

  1. Create a new PL/I source file called opdemo2.pli.
  2. Overwrite the skeleton contents with the following code:
     OPDEMO2: PROC(JCLPARM) OPTIONS(MAIN) REORDER;
     
     
     DCL JCLPARM CHAR(20) VARYING;
    
     /*-------------------------------------------------------------------*/
     /*                        F I L E S                                  */
     /*-------------------------------------------------------------------*/
    
      DCL SYSIN FILE RECORD INPUT  ENVIRONMENT(FB RECSIZE(80));
    
      DCL SYSUT1 FILE RECORD INPUT  ENVIRONMENT(FB RECSIZE(80));
    
      DCL SYSUT2 FILE RECORD OUTPUT ENVIRONMENT(FB RECSIZE(80));
      
      DCL SYSPRINT FILE STREAM OUTPUT PRINT ENV (F RECSIZE (132));
    
     /*-------------------------------------------------------------------*/
     /*            S T R U C T U R E S    &    A R R A Y S                */
     /*-------------------------------------------------------------------*/
     /*-------------------------------------------------------------------*/
     /*                E X T E R N A L    E N T R I E S                   */
     /*-------------------------------------------------------------------*/
    
     /*-------------------------------------------------------------------*/
     /*                 O T H E R    V A R I A B L E S                    */
     /*-------------------------------------------------------------------*/
    
    
     DCL ACCUMULATOR     FIXED BIN(31) INIT(1);
    
     DCL ASCII_ALPHABET char(38)
       init('!ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ');
    
     DCL chTemp char(1);                                                                       
    
     DCL EBCDIC_ALPHABET char(38) init
       ('5AC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E9'x || 
        'F0F1F2F3F4F5F6F7F8F940'x);
    
     DCL EOF_SYSIN      CHAR(1) INIT('0');
     
     DCL EOF_SYSUT1     CHAR(1) INIT('0');
    
     DCL ITERATIONS     FIXED BIN(31) INIT(0);
    
     DCL JCLTRANS       CHAR(20) VARYING; 
    
     DCL REC_BUFF       char(80);
     
     DCL REPLY_STR      CHAR(120) varying;
     
     DCL SYSIN_NUM_RECS PIC '9999';
     
     DCL SYSPRINT_BUFF  CHAR(132);
     
     DCL VAR_NUMERIC    PIC '9999';
                                                                           
     /*-------------------------------------------------------------------*/
     /*              B U I L T I N     F U N C T I O N S                  */
     /*-------------------------------------------------------------------*/
     
     DCL DELAY BUILTIN;
     DCL PLIRETC BUILTIN;
     DCL TRANSLATE BUILTIN;
     
     /*-------------------------------------------------------------------*/
     /*                   M O D U L E     L O G I C                       */
     /*-------------------------------------------------------------------*/
    
    
      on error begin;
        PUT SKIP LIST('On Error Triggered');
        goto AFTERON;
      end;
    
     
      on conversion begin;
        PUT SKIP LIST('On Conversion Triggered');
        goto AFTERON;
      end;
    
      ON ENDFILE (SYSIN)
         begin;
           EOF_SYSIN = '1';
           put skip list('SYSIN EOF Reached - Num Recs: ' || 
                         sysin_num_recs);
         end;
    
    
      ON ENDFILE (SYSUT1)
         begin;
           EOF_SYSUT1 = '1';
           put skip list('SYSUT1 EOF Reached');
         end;
    
     SYSPRINT_BUFF = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || /* 26 */
                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || /* 52 */
                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || /* 78 */
                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || /* 104 */
                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || /* 130 */
                     '12';
     open file(sysprint);
     PUT SKIP LIST(SYSPRINT_BUFF);
     
     put skip list('Length of JCLPARM: ' || length(jclparm));
     PUT DATA(JCLPARM); 
     
     PUT SKIP;
    
     if (JCLTRANS = 'DISPLAYREPLY') then
       DISPLAY('STARTING OPDEMO.PLI') REPLY(reply_str);
     else
       do;
       
         /* Read SYSIN to EOF */
         sysin_num_recs = '0';
         open input file(sysin);
         do while(eof_sysin = '0');
             read file(sysin) into (rec_buff);
             if (eof_sysin = '0') then
               sysin_num_recs = sysin_num_recs + 1;
         end;
         close file(sysin);
       
       end;
    
     /***********************************************************/
     /*  Open SYSUT1 and read until EOF translating records and */
     /*  Writing them to SYSUT2                                 */
     /***********************************************************/
     
     open file(sysut1) input;
     open file(sysut2) output;
    
     do while(eof_sysut1 = '0');
        read file(sysut1) into(rec_buff);
        if (eof_sysut1 = '0') then
          do;
            rec_buff = Translate(rec_buff, ascii_alphabet, ebcdic_alphabet);
            write file(sysut2) from(rec_buff);
          end;
     end;
    
     close file(sysut1);
     close file(sysut2);
    
     STARTIT:
    
     PUT SKIP DATA(ACCUMULATOR);
     ACCUMULATOR = ACCUMULATOR + 15;
     PUT SKIP DATA(ACCUMULATOR);
    
     PUT SKIP LIST('Triggering ON Unit');
     VAR_NUMERIC = 'DAVE';
     PUT SKIP DATA(VAR_NUMERIC); 
    
     AFTERON:
     PUT SKIP LIST('SLEEPING for 3 Seconds');
    
     Delay(3000);  /*  Sleep for 3 seconds */
    
     Iterations = Iterations + 1;
    
     /*  Let's run for about 6 seconds */
     If Iterations < 2 then
       goto startit;
    
     END;
    
  3. Save the file. When the project builds, the output folder includes two .dll files, one for each .pli file. This is because the default output type is "All executable native libraries" in the build configuration.
Note: If any build errors occur, check if you've typed everything correctly and that the code begins in column 2.