copie de 2 fichiers IFS avec remplacement de mots

BoTTom |
     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




©AF400