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