|
This based on the CvtToStmF command published in News/400 but pretty
much rewritten to use my procedures.
The bits I guess you should be interested in are the API prototypes and
the subroutine 'ConvertRcd'
--Gerry
'*=====================================================================
'* Convert to Stream File - Process
'*
'* Author:
'* Gerry Tucker, October 2001
'*=====================================================================
/Copy ToolKitCpy,RpgleHSpec
'*---------------------------------------------------------------------
'* Global definitions
'*---------------------------------------------------------------------
/Copy ToolKitCpy,StdTypH
/Copy ToolKitCpy,StdConH
/Copy ToolKitCpy,ChChrH
/Copy ToolKitCpy,CpCmdH
/Copy ToolKitCpy,FdLstH
/Copy ToolKitCpy,FlFilH
/Copy ToolKitCpy,MbMbrH
/Copy ToolKitCpy,MsMsgH
/Copy ToolKitCpy,NbNbrH
/Copy ToolKitCpy,PsStsH
'*---------------------------------------------------------------------
'* Parameters
'*---------------------------------------------------------------------
D QFilNam Ds
D FilNam Like( StdNam )
D FilLib Like( StdNam )
D ObjNam S Like( StdStr )
D FilMbr S Like( StdNam )
D StrDlm S Like( StdChr )
D FldDlm S Like( StdChr )
D IncHdg S 7
D ErrTxt S Like( StdStr )
'*---------------------------------------------------------------------
'* Variables
'*---------------------------------------------------------------------
D RcdBuf S Like( FilBufTyp )
D RcdNbr S Like( StdBin )
D NumPtr S *
D Ocr S Like( StdInt )
D Tok S Like( StdTok )
D dBufLen S 5p 0
D iHdl S Like( StdInt )
D iOpt S Like( StdInt )
D iRtnCod S Like( StdInt )
D uAut S Like( StdUnsInt )
D iNumBytes S Like( StdInt )
D aPath S Like( StdStr )
D iWrtBytes S Like( StdInt )
D Ds Based( pErrNum )
D iErrNum Like( StdInt )
'*---------------------------------------------------------------------
'* Named constants
'*---------------------------------------------------------------------
D WrtOnly C 2
D CrtFil C 8
D Excl C 16
D Trunc C 64
D PubAut C 7
D ColHdg C '*COLHDG'
D Cr C x'0D'
D FldNam C '*FLDNAM'
D Lf C x'0A'
D None C '*NONE'
D Null C x'00'
D TabChr C x'05'
D TblAscii S Like( StdQNam )
D Inz( 'QASCII *LIBL ' )
'*---------------------------------------------------------------------
'* Field list constants
'*---------------------------------------------------------------------
D FldLst S Like( UsrLstDs )
D FldLstNam C 'CVTTOSTMFU'
D FldLstLib C 'QTEMP'
D FldLstSiz C 5120
D FfAry S Like( FfDtaDs ) Dim( 1000 )
D Idx S Like( StdInt ) Inz
D MaxIdx S Like( Idx )
'*---------------------------------------------------------------------
'* Prototype internal procedures
'*---------------------------------------------------------------------
'* Get error number
D GetErrNum Pr * ExtProc( '__errno' )
'* Ebcdic to Ascii conversion
D Xlate Pr ExtPgm( 'QDCXLATE' )
D BufLen 5p 0
D Buf 32767 Options( *VarSize )
D TrnTbl Like( StdQNam )
'* Open a stream file
D Open Pr ExtProc( 'open' )
D Like( StdInt )
D FilPth 32767 Options( *VarSize ) Const
D Opt Like( StdInt ) Value
D FilAut Like( StdUnsInt )
D Options( *NoPass: *Omit )
D CodPag Like( StdInt )
D Options( *NoPass: *Omit )
'* Write to a stream file
D Write Pr ExtProc( 'write' )
D Like( StdInt )
D Hdl Like( StdInt ) Value
D Buf 32767 Options( *VarSize )
D NumBytes Like( StdInt ) Value
'* Close a stream file
D Close Pr ExtProc( 'close' )
D Like( StdInt )
D Hdl Like( StdInt ) Value
D pOutput S * Inz( %Addr( OutputDs ) )
D OutputDs Ds
D Output Like( StdChr ) Dim( 32766 )
* Text buffer
D TextDs Ds
D Text Like( StdChr ) Dim( 32766 )
'*---------------------------------------------------------------------
'* Mainline
'*---------------------------------------------------------------------
C *Entry PList
C Parm QFilNam
C Parm ObjNam
C Parm FilMbr
C Parm StrDlm
C Parm FldDlm
C Parm IncHdg
C ExSr CheckPrms
C ExSr OpenInFil
C ExSr BuildFldLst
C ExSr OpenOutFil
C ExSr CreateHdr
C ExSr ConvertStmf
C ExSr CloseOutFil
C ExSr CloseInFil
C CallP CpExcCmd( 'ChgAut Obj(' + SQuote
+
C %Trim( ObjNam ) + SQuote+')
'+
C 'User( *Public ) '
+
C 'DtaAut( *Rwx ) '
+
C 'ObjAut( *All )' )
C CallP CpExcCmd( 'ChgAut Obj(' + SQuote
+
C %Trim( ObjNam ) + SQuote+')
'+
C 'User(' + %Trim( PsUsr )+')
'+
C 'DtaAut( *Rwx ) '
+
C 'ObjAut( *All )' )
C Eval *InLR = *On
'*---------------------------------------------------------------------
C CheckPrms BegSr
'*---------------------------------------------------------------------
C If Not FlFilFnd( FilNam: FilLib )
C Eval ErrTxt = 'File '
+
C %Trim( FilNam )
+
C ' not found in '
+
C %Trim( FilLib )
C ExSr ExitOnErr
C EndIf
C If Not MbRtvMbr( FilLib: FilNam: FilMbr:
C MdFmt200: MdDtaDs )
C Eval ErrTxt = 'Member '
+
C %Trim( FilMbr )
+
C ' not found in file '
+
C %Trim( FilLib ) + '/'
+
C %Trim( FilNam )
C ExSr ExitOnErr
C Else
C Eval FilLib = MdLib
C Eval FilMbr = MdMbr
C EndIf
C EndSr
*---------------------------------------------------------------------
C BuildFldLst BegSr
*---------------------------------------------------------------------
C CallP UlCrtLst( FldLstNam: FldLstLib:
C FldLstSiz: FldLst )
C CallP FdLstFld( FldLst: FilNam: FilLib:
C '*FIRST' )
C Clear FfAry
C DoW UlNxtLstEnt( FldLst: FfDtaDs )
C Eval Idx = Idx + 1
C Eval FfAry( Idx ) = FfDtaDs
C EndDo
C Eval MaxIdx = Idx
C CallP UlDltLst( FldLst )
C EndSr
*---------------------------------------------------------------------
C CreateHdr BegSr
*---------------------------------------------------------------------
C Select
C When IncHdg = None
C When IncHdg = FldNam
C Clear Output
C For Idx = 1 To MaxIdx
C Eval FfDtaDs = FfAry( Idx )
C If FfAltNam <> *Blanks
C Eval TextDs = FfAltNam
C Else
C Eval TextDs = FfFld
C EndIf
C Eval TextDs = ChStrToUpr( TextDs )
C Eval OutputDs = %Trim( OutputDs )
+
C StrDlm
+
C %Trim( TextDs )
+
C StrDlm + FldDlm
C EndFor
C Eval OutputDs = %SubSt( OutputDs: 1:
C %Len( %Trim( OutputDs )
)
C - 1 )
C ExSr WriteOut
C When IncHdg = ColHdg
C For Ocr = 1 To 3
C Clear Output
C For Idx = 1 To MaxIdx
C Eval FfDtaDs = FfAry( Idx )
C Select
C When Ocr = 1
C Eval TextDs = FfColHdg1
C When Ocr = 2
C Eval TextDs = FfColHdg2
C When Ocr = 3
C Eval TextDs = FfColHdg3
C EndSl
C Eval TextDs = ChStrToUpr( TextDs )
C Eval OutputDs = %Trim( OutputDs )
+
C StrDlm
+
C %Trim( TextDs )
+
C StrDlm + FldDlm
C EndFor
C Eval OutputDs = %SubSt( OutputDs: 1:
C %Len( %Trim( OutputDs )
)
C - 1 )
C ExSr WriteOut
C EndFor
C EndSl
C EndSr
*---------------------------------------------------------------------
C ConvertStmf BegSr
*---------------------------------------------------------------------
C DoW FlGetIn( RcdBuf: RcdNbr )
C ExSr ConvertRcd
C EndDo
C EndSr
*---------------------------------------------------------------------
C ConvertRcd BegSr
*---------------------------------------------------------------------
C Clear Output
C For Idx = 1 To MaxIdx
C Eval FfDtaDs = FfAry( Idx )
C Select
C When FfTyp = 'A' Or
C FfTyp = 'L' Or
C FfTyp = 'T' Or
C FfTyp = 'Z' Or
C FfTyp = 'H'
C Eval TextDs = %SubSt( RcdBuf:
FfOutPos:
C FfLen )
C Eval OutputDs = %Trim( OutputDs )
+
C StrDlm + %Trim( TextDs )
+
C StrDlm + FldDlm
C When FfTyp = 'S'
C ExSr PutNumPtr
C CallP NbNumToTok( NumPtr: FfLen: FfDecPos:
C Tok: LftNumSgn: *On )
C Eval OutputDs = %Trim( OutputDs )
+
C %Trim( Tok )
+
C FldDlm
C When FfTyp = 'P'
C ExSr PutNumPtr
C CallP NbDecToTok( NumPtr: FfDgt: FfDecPos:
C Tok: LftNumSgn: *On )
C Eval OutputDs = %Trim( OutputDs )
+
C %Trim( Tok )
+
C FldDlm
C When FfTyp = 'F'
C ExSr PutNumPtr
C CallP NbFltToTok( NumPtr: Tok )
C Eval OutputDs = %Trim( OutputDs )
+
C %Trim( Tok )
+
C FldDlm
C When FfTyp = 'B' And FfDgt = 9
C ExSr PutNumPtr
C CallP NbIntToTok( NumPtr: Tok: LftNumSgn:
*On )
C Eval OutputDs = %Trim( OutputDs )
+
C %Trim( Tok )
+
C FldDlm
C When FfTyp = 'B'
C ExSr PutNumPtr
C CallP NbSmlIntToTok( NumPtr: Tok:
LftNumSgn:
C *On )
C Eval OutputDs = %Trim( OutputDs )
+
C %Trim( Tok )
+
C FldDlm
C EndSl
C EndFor
C Eval OutputDs = %SubSt( OutputDs: 1:
C %Len( %Trim( OutputDs )
)
C - 1 )
C ExSr WriteOut
C EndSr
*---------------------------------------------------------------------
C WriteOut BegSr
*---------------------------------------------------------------------
C Eval dBufLen = %Len( %Trim( OutputDs )
)
C CallP XLate( dBufLen: OutputDs: TblAscii )
C Eval OutputDs = %Trim( OutputDs ) + Cr +
Lf
C Eval iNumBytes = %Len( %Trim( OutputDs )
)
C Eval iWrtBytes = Write( iHdl: OutputDs:
C iNumBytes )
C Eval pErrNum = GetErrNum
C Select
C When iErrNum = 3025
C Eval ErrTxt = 'Directory does not
exist'
C ExSr ExitOnErr
C When iErrNum = 3506
C Eval ErrTxt = 'Stream file in use'
C ExSr ExitOnErr
C EndSl
C EndSr
*---------------------------------------------------------------------
C PutNumPtr BegSr
*---------------------------------------------------------------------
C Eval NumPtr = %Addr( RcdBuf ) +
FfOutpos
C - 1
C EndSr
*---------------------------------------------------------------------
C OpenInFil BegSr
*---------------------------------------------------------------------
C If Not FlOpnIn( FilNam: FilLib: FilMbr )
C Eval *InLR = *On
C Return
C EndIf
C EndSr
*---------------------------------------------------------------------
C CloseInFil BegSr
*---------------------------------------------------------------------
C CallP FlCloIn
C EndSr
*---------------------------------------------------------------------
C OpenOutFil BegSr
*---------------------------------------------------------------------
C Eval aPath = %Trim( ObjNam ) + Null
C Eval iOpt = WrtOnly + CrtFil + Trunc
C Eval uAut = PubAut
C Eval iHdl = Open( aPath: iOpt: uAut
)
C If iHdl < 0
C Eval pErrNum = GetErrNum
C Select
C When iErrNum = 3471
C Eval ErrTxt = 'Stream file is a
directory'
C ExSr ExitOnErr
C When iErrNum = 3506
C Eval ErrTxt = 'Stream file in use'
C ExSr ExitOnErr
C When iErrNum = 3025
C Eval ErrTxt = 'Directory does not
exist'
C ExSr ExitOnErr
C EndSl
C Eval *InLR = *On
C Return
C EndIf
C EndSr
*---------------------------------------------------------------------
C CloseOutFil BegSr
*---------------------------------------------------------------------
C Eval iRtnCod = Close( iHdl )
C EndSr
*---------------------------------------------------------------------
C Cleanup BegSr
*---------------------------------------------------------------------
C ExSr CloseInFil
C ExSr CloseOutFil
C EndSr
/Copy ToolKitCpy,StdErrPrc
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.