lecture d'une Directory

BoTTom |
      *-------------------------------------------------------------------------
      * READ_DIR      : lecture d'une directory , avec recherche des
      *                  fichiers suivant un masque recu en paramètre
      *-------------------------------------------------------------------------
 
     H datedit( *dmy ) dftactgrp( *no ) bnddir( 'QC2LE' )
     H option( *srcstmt : *nodebugio )
      *-------------------------------------------------------------------------
      * Prototypes pour les APIs IFS
      *----------------------------------------------------------------
     D errno           pr            10i 0
      *----------------------------------------------------------------
     D strerror        pr              *   ExtProc('strerror')
     D    errnum                     10I 0 value
      *-------------------------------------------------------------------------
     D lstat           pr            10i 0 extproc('lstat')
     D                                 *   value
     D                                 *   value
      *----------------------------------------------------------------
     D opendir         pr              *   extproc('opendir')
     D                                 *   value
 
      *----------------------------------------------------------------
     D readdir         pr              *   extproc('readdir')
     D                                 *   value
 
      *----------------------------------------------------------------
     D closedir        pr            10i 0 extproc('closedir')
     D                                 *   value
 
      *----------------------------------------------------------------
      * Prototypes pour les APIs envoi de message
      *----------------------------------------------------------------
     D sndpgmmsg       pr                  extpgm('QMHSNDPM')
     D  msgid                         7a   const
     D  qualmsff                     20a   const
     D  msgdata                   65535a   const options(*varsize)
     D  msgdatalen                   10i 0 const
     D  msgtype                      10a   const
     D  tocse                     65535a   const options(*varsize)
     D  tocsectr                     10i 0 const
     D  msgkey                        4a   const
     D  errcode                        *   const
      *-------------------------------------------------------------------------


|
      * DS systeme
     D pgmsts         sds
     D pgmname           *proc
 
      *-------------------------------------------------------------------------
      *   Data Structure renvoyee par procedure lstat()
     D statds          ds           128
     D  st_mode                      10u 0
     D  st_ino                       10u 0
     D  st_nlink                      5u 0
     D  reserved1                     2a
     D  st_uid                       10u 0
     D  st_gid                       10u 0
     D  st_size                      10u 0
 
      * Last access time in seconds since Epoch
     D  st_atime                     10u 0
      * Last change time in seconds since Epoch
     D  st_mtime                     10u 0
      * Last change status time in seconds since Epoch
     D  st_ctime                     10u 0
 
     D  st_dev                       10u 0
     D  st_blksize                   10i 0
     D  st_allocsize                 10i 0
     D  st_objtype                   10a
     D  reserved2                     2a
     D  st_codepage                   5u 0
     D  st_reserved1                 62a
     D  st_ino_gen_id                10u 0
 
      *   Data Structure poste Directory renvoye par procedure readdir()
     D direntry        ds
     D d_reserved1                   16a
     D d_fileno_genid                10u 0
     D d_fileno                      10u 0
     D d_reclen                      10u 0
     D d_reserved3                   10i 0
     D d_reserved4                    6a
     D d_reserved5                    2a
     D d_ccsid                       10i 0
     D d_country_id                   2a
     D d_language_id                  3a
     D d_nls_reserved                 3a


|
     D d_namelen                     10u 0
     D d_name                       640a
 
      *   paramètres et autres variables
     D dirname         s            100a
     D ficname         s             32a
     D ficname2        s                    like(ficname)
     D fullname        s            256a
     D option          s              1a
     D pos             s              3I 0
      *   XLATE
     D minuscule       C                   'abcdefghijklmnopqrstuvwxyz'
     D MAJUSCULE       C                   'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
     D msg             s             80a   varying
     D msgkey          s              4a
     D msgid           s              7a
     D dsp             s             52a
     D null            s              1a   inz(x'00')
     D entrycount      s             10u 0
     D returnint       s             10i 0
     D ptrtodir        s               *
     D ptrtoentry      s               *
     D rtnentry        s                   based(ptrtoentry) like(direntry)
     D entryname       s            120a
     D entryname2      s                   like(entryname)
     D entrypath       s            256a
     D cmdline         s            512
     D cmdlen          s             15  5
     D hhmmss          s              6  0
 
     D objvar          s             90
     D objvarlen       s             10i 0 inz(%size(objvar))
     D objvarfmt       s              8
     D objtyp          s             10
     D epoch           s               z   inz(z'1970-01-01-00.00.00.000000')
     D dt              s               z
 
      *   qualification
     D outfile         ds
     D  outfilnam                    10
     D  outfillib                    10
 
      *----------------------------------------------------------------


|
      * Error Messages
     D api_error       ds
     D  err_size                     10i 0 inz( %size( api_error ))
     D  err_length                   10i 0 inz(0)
     D  err_id                        7a
     D                                1a
     D  err_data                    128a
 
      *-----------------------------------------------------------------
      *  c'est parti !
      *-----------------------------------------------------------------
     C                   eval      fullname = %trimr( dirname ) + null
 
      * Ouvre la directory
     C                   eval      ptrtodir  = opendir( %addr( fullname ) )
 
     C                   if        ptrtodir  = *null
     C                   eval      msgid = 'CPE' + %char( errno )
     C                   eval      msg = %trim( %str( strerror( errno ) ) ) +
     C                                   ' - API opendir()'
     C                   exsr      sndescmsg
     C                   endif
 
      * Initialise le nombre d'objets récupérés
     C                   eval      entrycount = 0
 
     C                   dou       ptrtoentry = *null
 
      * Lecture du poste suivant
     C                   eval      ptrtoentry = readdir( ptrtodir  )
      * Place le poste renvoye dans la DS DirEntry
     C                   if        ptrtoentry <> *null
     C                   eval      direntry = rtnentry
      * Compte le nombre d'objets récupérés
     C                   eval      entrycount = entrycount + 1
      * Recupere le nom de l'objet
     C                   eval      entryname = %str( %addr( d_name ) )
      * Determine le type de l'objet (STMF, DIR, ...)
     C                   eval      entrypath = %trim( dirname ) + '/'
     C                             + %trimr( entryname ) + null
     C                   eval      returnint = lstat( %addr( entrypath )
     C                                         : %addr( statds ) )
 
      * si prb, envoi de message


|
     C                   if        returnint < 0
     C                   eval      msgid = 'CPE' + %char( errno )
     C                   eval      msg = %trim( %str( strerror( errno ) ) ) +
     C                                   ' - API lstat()'
     C                   exsr      sndescmsg
 
     C                   else
 
      * Affiche le nom du poste lu si fichier et commence pareil...
     C                   eval      dsp = %trim(entryname) + ' ' + st_objtype
     C                   if        st_objtype = '*STMF'
 
      * on ignore la casse
     C                   eval      entryname2=%xlate(minuscule : MAJUSCULE:
     C                                               entryname)
     C                   if        pos < 1
     C                             or (%subst(ficname2: 1 : pos)
     C                             =   %subst(entryname2 : 1 : pos)
     C                                )
     C                   dsply                   dsp
     C                   endif
     C                   endif
 
     C                   endif
 
      * Date & heure traduits depuis "Epoch"
     C     epoch         adddur    st_atime:*s   dt
 
     C                   endif
 
     C                   enddo
 
      * Ferme directory
     C                   eval      returnint = closedir( ptrtodir  )
 
     C                   if        returnint < 0
     C                   eval      msgid = 'CPE' + %char( errno )
     C                   eval      msg = %trim( %str( strerror( errno ) ) ) +
     C                                   ' - API closedir()'
     C                   exsr      sndescmsg
     C                   endif
 
     C                   eval      *inlr = *on
 


|
 
      *----------------------------------------------------------
     C     *inzsr        begsr
     C     *entry        plist
     C                   parm                    dirname
     C                   parm                    ficname
      * cadrage a gauche
     c                   eval      ficname2 = %triml(ficname)
      * conversion (ignorer la casse, là aussi)
     C                   eval      ficname2 = %xlate(minuscule : MAJUSCULE :
     C                                               ficname2)
      * recherche caractère joker
     C                   eval      pos = %scan('*' : ficname2) - 1
     c                   if        pos < 1
      * si non, on travaille sur le premier espace
     C                   eval      pos = %scan(' ' : ficname2) - 1
     c                   endif
     c
     C                   endsr
 
 
      *------------------------------------------------------------
     C     sndescmsg     begsr
 
      * Envoie un message d'échappement à l'appelant
     C                   callp     sndpgmmsg( msgid     : 'QCPFMSG   QSYS'
     C                                      : msg       : %len(msg)
     C                                      : '*ESCAPE' : '*'
     C                                      : 4         : msgkey
     C                                      : *null )
     C                   endsr
      * -----------------------------------------------------------
      * Procedure d'erreur errno pour APIs type Unix
      * -----------------------------------------------------------
     P errno           b
     D errno           pi            10i 0
 
     D syserrno        pr              *   extproc('__errno')
     D p_errno         s               *
     D retval          s             10i 0 based(p_errno)
 
     C                   eval      p_errno = syserrno
     C                   return    retval
     P                 e





©AF400