
|
H option(*srcstmt) bnddir('QC2LE') dftactgrp(*no) actgrp(*caller)
 
 
* prototype
D Cpystmf PR
D 32A
D 32A
D 20A
D 20A
D*****************************************************************
D* IFS CONSTANTS
D*****************************************************************
D*** File Access Modes for open()
D O_RDONLY S 10I 0 INZ(1)
D O_WRONLY S 10I 0 INZ(2)
D O_RDWR S 10I 0 INZ(4)
D*** oflag Values for open()
D O_CREATE S 10I 0 INZ(8)
D O_EXCL S 10I 0 INZ(16)
D O_TRUNC S 10I 0 INZ(64)
D*** File Status Flags for open() and fcntl()
D O_NONBLOCK S 10I 0 INZ(128)
D O_APPEND S 10I 0 INZ(256)
D*** oflag Share Mode Values for open()
D O_SHARE_NONE S 10I 0 INZ(2000000)
D O_SHARE_RDONLY S 10I 0 INZ(0200000)
D O_SHARE_RDWR S 10I 0 INZ(1000000)
D O_SHARE_WRONLY S 10I 0 INZ(0400000)
D*** file permissions
D S_IRUSR S 10I 0 INZ(256)
D S_IWUSR S 10I 0 INZ(128)
D S_IXUSR S 10I 0 INZ(64)
D S_IRWXU S 10I 0 INZ(448)
D S_IRGRP S 10I 0 INZ(32)
D S_IWGRP S 10I 0 INZ(16)
D S_IXGRP S 10I 0 INZ(8)
D S_IRWXG S 10I 0 INZ(56)
D S_IROTH S 10I 0 INZ(4)
D S_IWOTH S 10I 0 INZ(2)
D S_IXOTH S 10I 0 INZ(1)
D S_IRWXO S 10I 0 INZ(7)
D*** misc
D O_TEXTDATA S 10I 0 INZ(16777216)
D O_CODEPAGE S 10I 0 INZ(8388608)
|
D*****************************************************************
* parametres en entrée
D Cpystmf PI
D inputpath 32A
D outputpath 32A
D origine 20A
D remplacement 20A
 
 
D open PR 10I 0 ExtProc('open')
D pathà * Value Options(*string)
D oflag 10I 0 Value
D mode 10U 0 Value Options(*nopass)
D codepage 10U 0 Value Options(*nopass)
* read() -- Read from Descriptor
D read PR 10I 0 Extproc('read')
D FileDescI 10I 0 Value
D bufferIà * Value
D nbyte 10U 0 Value
* write() -- Write to Descriptor
D write PR 10I 0 Extproc('write')
D FileDescO 10I 0 Value
D bufferOà * Value
D nbyte 10U 0 Value
* close() -- Close File or Socket Descriptor
D close PR 10I 0 Extproc('close')
D FileDesc 10I 0 Value
* lseek()--Set File Read/Write Offset
D lseek PR 10I 0 Extproc('lseek')
D FileDesc 10I 0 Value
D offset 10I 0 Value
D whence 10I 0 Value
 
* Variables for Open() API
D oflag S 10I 0 Inz(0)
D mode S 10U 0 Inz(0)
D codepage S 10U 0 Inz(437)
D Rc S 10I 0 Inz(0)
* Variables for Read(), Write() and Close() APIs
D FileDescI S 10I 0 Inz(0)
D FileDescO S 10I 0 Inz(0)
D bufferI S 200A Inz(*blank)
D bufferIà S * Inz(%addr(bufferI))
D bufferO S 300A Inz(*blank)
|
D bufferOà S * Inz(%addr(bufferO)) D nbyteset S 10U 0 Inz(200) D nbyteread S 10I 0 Inz(0) * Variables for lseek() API D whence S 10I 0 inz(1)   * autres variables D Null S 1A Inz(x'00') D Pos S 5U 0 Inz(0) D CRLFPos S 10I 0 Inz(0) D CRLF S 2A Inz(x'0d25')     * Options de lecture uniquement C Eval oflag = O_RDONLY + O_TEXTDATA * Open (ouverture pour lecture) C Eval FileDescI = open(%trimr(inputpath) : C oflag) C If FileDescI = -1 C 'prb OPEN ' DSPLY C Else * Options de création du chier (et code page) C Eval oflag = O_CREATE + O_RDWR + O_CODEPAGE C + O_TRUNC C Eval mode = S_IRWXU + S_IRWXG + C S_IROTH + S_IXOTH * Creation du fichier en sortie C Eval FileDescO = open(%trimr(outputpath) : C oflag : mode : codepage) C If FileDescO = -1 C 'prb OPEN' DSPLY C Else * S'il est créé, fermeture C Eval rc = close(FileDescO) C If rc = -1 C 'prb CLOSE' DSPLY C Else * OK, alors 2eme ouverture qui va assumer la conversion EBCDIC/ASCII C Eval oflag = O_WRONLY + O_TEXTDATA C Eval FileDescO = open(%trimr(outputpath) : C oflag) C If FileDescO = -1 C 'prb OPEN' DSPLY C Endif |
C Endif C Endif C Endif * C If FileDescI <> -1 and FileDescO <> -1 * Boucle principale jusqu'à EOF (ou erreur) C DoU nbyteread <= 0 or C FileDescI = -1 or rc = -1 * Lecture du fichier en entrée C Eval nbyteread = read(FileDescI : bufferIà : C nbyteset) C If nbyteread > 0 and FileDescI >= 0 * Scan du BUffer jusqu'à "carriage return" and "line feed" * (CRLF) C Eval CRLFpos = %scan(CRLF : bufferI) * CRLF trouvé, copie des données dans le buffer de sortie C If CRLFpos > 0   C Eval bufferO = %subst(bufferI : C 1 : CRLFpos + 1) * écriture dans fichier de sortie C exsr ecriture * repositionnement après le CRLF trouvé, par l'utilisation de lseek * afin que le prochain READ commence au début de la prochaine ligne C Eval rc = lseek(FileDescI : C - ((nbyteread - CRLFpos) - 1) : C whence) C If rc = -1 C 'prb SEEK' DSPLY C Endif * C else * sinon (pas de CRLF) on travaille sur la lg des buffers C if nbyteread < %len(bufferO) C eval CRLFpos = nbyteread C else C eval CRLFpos = %len(bufferO)   C Eval bufferO = %subst(bufferI : C 1 : CRLFpos) C endif * écriture dans fichier de sortie C exsr ecriture * |
C Endif * SI prb lors du READ() C Else C If FileDescI = -1 C 'prb READ ' DSPLY C Endif C Endif C Enddo * Fermeture des fichiers C Eval rc = close(FileDescI) C If rc = -1 C 'prb CLOSE' DSPLY C Endif C Eval rc = close(FileDescO) C If rc = -1 C 'prb CLOSE' DSPLY C Endif * fermetures OK C Endif * Fin C Eval *inLR = *on * * S/PGM d'écriture * C ecriture begsr *Recherche si on trouve ORIGINE, si OUI on met REMPLACEMENT à la place C Eval pos = %scan(%trimr(origine) : bufferO) C If pos > 0 C Eval bufferO = %replace(%trimr(remplacement): C bufferO : pos : C %len(%trimr(origine))) C Endif * Ecriture du buffer de sortie C Eval rc = write(FileDescO : bufferOà : C %scan(CRLF : bufferO) + 1) * SI prb C If rc = -1 C 'prb WRITE' DSPLY C Endif C endsr |