// Maximum length of IFS records is 32740 chars // Records will be terminated by the windows-style CR/LF sequence // Character fields are enclosed within double quotes (") // and trailing blanks are removed // Numeric and date fields are output as-is.   // ATENTION : EN V6R10 il faut (en plus de 5733OAR) // SI39480 sur 5761SS1 et SI39912 sur 5761WDS   H DftActGrp(*No) Option(*SrcStmt)   // Standard IBM supplied Open Access definitions /copy QOAR/QRPGLESRC,QRNOPENACC // Definition of additional handler parameter and constants /copy AF4SRCT/EXEMPLEOAR,cvs_cpy // Standard IBM supplied IFS prototypes /copy qsysinc/qrpglesrc,ifs // RPG Status code values /copy AF4SRCT/EXEMPLEOAR,status   // On V7 and later systems this PR can be removed and so can those for // local subprocedures openFile(), writeFile() and closeFile(). D CVS_HDLR pr ExtPgm('CVS_HDLR') D info likeds(QrnOpenAccess_T)   // Definitions for local subprocedures D openFile pr like(fileHandle) D path like(ifs_hdlr_info_t.path) D const   D writeFile pr like(filehandle) D handle like(fileHandle) value   D closeFile pr D handle like(fileHandle) value   D CVS_HDLR PI D info likeds(QrnOpenAccess_T)   // Field Names/Values structures D nvInput ds likeds(QrnNamesValues_T) D based(pNvInput)   // Structure to map the "additional informatin" parameter passed |
// by the RPG program. In this case it contains the IFS file name. // Its pointer is contained within the userArea field in the info struct D ifs_info ds likeds(ifs_hdlr_info_t) D based(pIfs_info)   // Used by the IFS routines to determine which IFS file is to be used // Maps to storage dynamically allocated when opening the file. // Pointer is stored in the rpgStatus field in the info structure D fileHandle s 10i 0 based(pfileHandle)   /free // Use the pointers in the info area to set up access to the // the handle for the IFS file (stateInfo) // and the IFS file name (userArea) pfileHandle = info.stateInfo;   pIfs_info = info.userArea;   If info.rpgOperation = QrnOperation_WRITE; // Set up access to Name/Value information pNvInput = info.namesValues;   // Write error is unlikely but signal it if it occurs If ( writeFile(fileHandle) = fileError ); info.rpgStatus = errIO; EndIf;   elseIf info.rpgOperation = QrnOperation_OPEN; // Specify that we want to use Name/Value information info.useNamesValues = *On;   // Allocate the storage for the file handle and store the pointer // in the info area. That way RPG can associate the pointer with // the specific file and give it back to us on each operation. pfileHandle = %Alloc(%Size(fileHandle)); info.stateInfo = pfileHandle;   // Ensure that file handle is zero before attempting open() clear fileHandle;   fileHandle = openFile (ifs_info.path); // Open file if fileHandle = fileNotOpen; info.rpgStatus = errImpOpenClose; // Open failed EndIf; |
  elseif info.rpgOperation = QrnOperation_CLOSE; closeFile (fileHandle);   // free the state information and null out the info pointer dealloc(n) pfileHandle; info.stateInfo = *null;   else; // Any other operation is unsupported so notify RPG info.rpgStatus = 1299; // general error status endif;   Return;   /end-free     P openFile b D openFile pi like(fileHandle) D path like(ifs_hdlr_info_t.path) D const   /free return open( path : O_CREAT + O_WRONLY + O_CCSID + O_TRUNC + O_TEXTDATA + O_TEXT_CREAT : S_IRUSR + S_IWUSR + S_IRGRP + S_IROTH : 819 : 0 ); /end-free   P openFile e   P closeFile b D closeFile pi D handle like(fileHandle) value D rc s 10i 0   /free   rc = close (handle);   /end-free |
    P closeFile e   P writeFile b D pi like(filehandle) D handle like(fileHandle) value   D buffer s 32740a Varying Inz D value s 32470a Based(pvalue) D i s 5i 0 D reply s 10i 0 D comma c ';' D quote c '"' D CRLF c x'0d25'   /free // Process all fields in record For i = 1 to nvInput.num; pvalue = nvInput.field(i).value; // set up to access data   If ( nvInput.field(i).dataType = QrnDatatype_Alpha ) Or ( nvInput.field(i).dataType = QrnDatatype_AlphaVarying); buffer += quote + %trimR( %xlate(';':',': %subst( value: 1: nvInput.field(i).valueLenBytes))) + quote;   ElseIf ( nvInput.field(i).dataType = QrnDatatype_Decimal ); buffer += %subst(value: 1: nvInput.field(i).valueLenBytes);   ElseIf ( nvInput.field(i).dataType = QrnDatatype_Date ); buffer += %subst(value: 1: nvInput.field(i).valueLenBytes);   EndIf;   If i <> nvInput.num; // Add comma after every field except the last buffer += comma; EndIf;   EndFor;   buffer += CRLF; // Add record termination |
  // reply will contain the length of data written or -1 in case of error reply = write ( handle: %Addr(buffer:*Data): %Len(buffer) );   Return reply;   /end-free P writeFile e |