/* RTVSPLFC - Retrieve spooled file to User Space RTVSPLF CPP     */            
             PGM        PARM(&FILE &FULLUSRSPC  &FULLJOB  &SPLNBRB)             
                                                                                
             DCL        &FILE  *CHAR LEN(10)                                    
             DCL        &FULLUSRSPC *CHAR LEN(20)                               
             DCL        &FULLJOB *CHAR LEN(26)                                  
             DCL        &SPLNBRB *CHAR LEN(4)                                   
                                                                                
             DCL        &JOB *CHAR LEN(10)                                      
             DCL        &USER *CHAR LEN(10)                                     
             DCL        &JOBNBR *CHAR LEN(6)                                    
             DCL        &QLFJOB *CHAR LEN(26)                                   
             DCL        &INTJOB *CHAR LEN(16)                                   
             DCL        &INTSPLF *CHAR LEN(16)                                  
             DCL        &SPLHANDL *CHAR LEN(4)                                  
             DCL        &NXTBUF *CHAR LEN(4)                                    
             DCL        &DS *CHAR LEN(5000)    /* Spooled information*/         
             DCL        &DSLENB *CHAR LEN(4)                                    
             DCL        &BUFGET *CHAR LEN(4)                                    
             DCL        &ERRCDE *CHAR LEN(4)                                    
             DCL        &STRPOS *CHAR LEN(4)                                    
             DCL        &LEN *CHAR LEN(4)                                       
             DCL        &USEXTA *CHAR LEN(10)                                   
             DCL        &USSIZE *CHAR LEN(4)                                    
             DCL        &USSIZ  *DEC  LEN(9 0)                                  
             DCL        &USVALU *CHAR LEN(1)                                    
             DCL        &USAUTH *CHAR LEN(10)                                   
             DCL        &USRPLC *CHAR LEN(10)                                   
             DCL        &USTEXT *CHAR LEN(50)                                   
             DCL        &JOBID *CHAR LEN(16)                                    
             DCL        &SPLFID *CHAR LEN(16)                                   
             DCL        &FILE2 *CHAR LEN(10)                                    
             DCL        &USRSPC *CHAR LEN(10)                                   
             DCL        &USRSPCL *CHAR LEN(10)                                  
                                                                                
 /* SPOOL BUFFER SIZE ON SPLINFO OFFSET 861*/                                   
             DCL        &SPLBUFSIZC *CHAR LEN(4)                                
             DCL        &SPLBUFSIZ  *DEC  LEN(9 0)                              
 /* NUMBER OF BUFFER  ON SPLINFO OFFSET 997*/                                   
             DCL        &NUMOFBUFC  *CHAR LEN(4)                                
             DCL        &NUMOFBUF   *DEC  LEN(9 0)                              
             DCL        &BIN4       *char len(4)                                
             DCL        &BIN4NBR    *DEC  LEN(9 0)                              
                                                                                
             DCL        &ERRORSW *LGL                     /* Std err */         
             DCL        &MSGID *CHAR LEN(7)               /* Std err */         
             DCL        &MSGDTA *CHAR LEN(256)            /* Std err */         
             DCL        &MSGF *CHAR LEN(10)               /* Std err */         
             DCL        &MSGFLIB *CHAR LEN(10)            /* Std err */         
             DCL        &KEYVAR *CHAR LEN(4)              /* Std err */         
             MONMSG     MSGID(CPF0000) EXEC(GOTO STDERR1) /* Std err */         
                        /* Inlz fields */                                       
             CHGVAR     &ERRCDE X'00000000'                                     
                                                                                
                        /* Extract qualified names */                           
             CHGVAR     &USRSPC  %SST(&FULLUSRSPC 1 10)  /* User spc*/          
             CHGVAR     &USRSPCL %SST(&FULLUSRSPC 11 10) /* Library */          
                                                                                
             CHGVAR     &JOB    %SST(&FULLJOB 1 10)  /* Extract job */          
             CHGVAR     &USER   %SST(&FULLJOB 11 10) /* Extract user */         
             CHGVAR     &JOBNBR %SST(&FULLJOB 21  6) /* Ext job nbr */          
             IF         (&JOB *EQ '*') DO /* Use current job */                 
             RTVJOBA    JOB(&JOB) USER(&USER) NBR(&JOBNBR)                      
             ENDDO      /* Use current job */                                   
                                                                                
                        /* Build Qlfd job name for the call */                  
             CHGVAR     &QLFJOB (&JOB *CAT &USER *CAT &JOBNBR)                  
             CHGVAR     &FILE2  &FILE                                           
                                                                                
 CVTSPLN:                                                                       
                        /* Use 5000 byte len for DS - Cvt to bin */             
             CHGVAR     %BIN(&DSLENB 1 4) 5000                                  
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) TOPGMQ(*EXT) +             
                          MSGDTA('Retrieving spooled file +                     
                          attributes') MSGTYPE(*STATUS)                         
                        /* Call API to rtv spooled file attr */                 
             CALL       QUSRSPLA PARM(&DS &DSLENB 'SPLA0200' +                  
                          &QLFJOB &INTJOB &INTSPLF &FILE &SPLNBRB)              
                                                                                
                        /* Create the user space */                             
             CHGVAR     &SPLBUFSIZC %SST(&DS 861 4)                             
             CHGVAR     &NUMOFBUFC  %SST(&DS 997 4)                             
             CHGVAR     &SPLBUFSIZ  %BIN(&SPLBUFSIZC)                           
             CHGVAR     &NUMOFBUF   %BIN(&NUMOFBUFC)                            
             CHGVAR     (&USSIZ) ((&SPLBUFSIZ * &NUMOFBUF) +2000 +5000)         
             CHGVAR     %BIN(&USSIZE 1 4) &USSIZ                                
                                                                                
             CHGVAR     &USEXTA 'SPOOLFILE'                                     
             CHGVAR     &USVALU ' '                                             
             CHGVAR     &USAUTH '*ALL'                                          
             CHGVAR     &USRPLC '*NO'                                           
             CHGVAR     VAR(&USTEXT) VALUE(&FILE *BCAT &QLFJOB *BCAT +          
                          %SST(&DS 211 7))                                      
                                                                                
 CRTUSRSPC:  CALL       QUSCRTUS  PARM(&FULLUSRSPC &USEXTA +                    
                          &USSIZE &USVALU &USAUTH &USTEXT &USRPLC +             
                          &ERRCDE)                                              
                                                                                
                        /* Use API to open current file */                      
             CHGVAR     &QLFJOB '*INT'    /* used internal job ID */            
             CHGVAR     &FILE '*INT'      /* used internal spool ID */          
             CHGVAR     &JOBID %SST(&DS 17 16)                                  
             CHGVAR     &SPLFID %SST(&DS 33 16)                                 
                                                                                
                        /* -1 MEANS GET ENTIRE SPOOLED FILE */                  
             CHGVAR     %BIN(&BUFGET 1 4) -1                                    
 OPNSPLF:    CALL       QSPOPNSP PARM(&SPLHANDL &QLFJOB &JOBID +                
                          &SPLFID  &FILE &SPLNBRB &BUFGET &ERRCDE)              
                                                                                
                        /* Call API to get spooled records */                   
                        /* Request 'next buffer' processing by */               
                        /*   setting &NXTBUF to -1             */               
             CHGVAR     %BIN(&NXTBUF 1 4) -1                                    
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) +                          
                          MSGDTA('Duplicating the spooled file ' +              
                          *CAT &FILE2 *BCAT ' to User Space.') +                
                          TOPGMQ(*EXT) MSGTYPE(*STATUS)                         
 GETRCD:     CALL       QSPGETSP PARM(&SPLHANDL &FULLUSRSPC +                   
                          'SPFR0200' &NXTBUF '*ERROR' &ERRCDE)                  
                                                                                
 SAVATR:                /* Save spooled file attributes to user space*/         
                                                                                
             CHGVAR     %BIN(&LEN 1 4) 4                                        
             CHGVAR     %BIN(&STRPOS 1 4) 89                                    
             CALL       QUSRTVUS PARM(&FULLUSRSPC &STRPOS &LEN &BIN4)           
             CHGVAR     &BIN4NBR %BIN(&BIN4)                                    
             CHGVAR     %BIN(&STRPOS 1 4) (&BIN4NBR + 1)                        
             CHGVAR     %BIN(&LEN 1 4) 5000                                     
             CALL       QUSCHGUS PARM(&FULLUSRSPC &STRPOS &LEN &DS '2')         
                                                                                
                                                                                
 CLOSE:                 /* Call API to close spooled input file */              
             CALL       QSPCLOSP PARM(&SPLHANDL &ERRCDE)                        
                                                                                
             SNDPGMMSG  MSGID(CPI9801) MSGF(QCPFMSG) TOPGMQ(*EXT) +             
                          MSGTYPE(*STATUS) /* Blank status message */           
             SNDPGMMSG  MSG('Spool file ' *CAT &FILE2 *TCAT ' saved +           
                          as user space ' *CAT &USRSPCL *TCAT '/' +             
                          *CAT &USRSPC *TCAT '.') MSGTYPE(*COMP)                
                                                                                
             RMVMSG     CLEAR(*ALL)                                             
             RETURN     /* Normal end of program */                             
 STDERR1:               /* Standard error handling routine */                   
             IF         &ERRORSW SNDPGMMSG MSGID(CPF9999) +                     
                          MSGF(QCPFMSG) MSGTYPE(*ESCAPE) /* Func chk */         
             CHGVAR     &ERRORSW '1' /* Set to fail if error occurs */          
 STDERR2:    RCVMSG     MSGTYPE(*DIAG) RMV(*NO) KEYVAR(&KEYVAR) +               
                          MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +           
                          SNDMSGFLIB(&MSGFLIB)                                  
             IF         (&KEYVAR *EQ '    ') GOTO STDERR3                       
             RMVMSG     MSGKEY(&KEYVAR)                                         
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +                    
                          MSGDTA(&MSGDTA) MSGTYPE(*DIAG)                        
             GOTO       STDERR2 /* Loop back for addl diagnostics */            
 STDERR3:    RCVMSG     MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) +          
                          MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB)                      
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +                    
                          MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)                      
             ENDPGM                                                             
