génération Liste des cours

BoTTom |
      **********************************************************************
      * transformation du fichier des cours au format XML                  *
      **********************************************************************
     FAF4MBRP1  if   e           k disk    extfile(qualif)
     Dqualif           s             21    inz('AF400/AF4MBRP1')
     D*****************************************************************
     D* PROTOTYPES IFS pour open() , write() et close()
     D*****************************************************************
     D*** open sur IFS
     Dopen             PR            10I 0 EXTPROC('open')
     D  nomfichier                     *   VALUE
     D  openflags                    10I 0 VALUE
     D  mode                         10U 0 VALUE OPTIONS(*NOPASS)
     D  codepage                     10U 0 VALUE OPTIONS(*NOPASS)
     D*** lecture IFS
     Dread             PR            10I 0 EXTPROC('read')
     D  filehandle                   10I 0 VALUE
     D  datareceived                   *   VALUE
     D  nbytes                       10U 0 VALUE
     D*** écriture IFS
     Dwrite            PR            10I 0 EXTPROC('write')
     D  filehandle                   10I 0 VALUE
     D  datatowrite                    *   VALUE
     D  nbytes                       10U 0 VALUE
     D*** fermeture IFS
     Dclose            PR            10I 0 EXTPROC('close')
     D  filehandle                   10I 0 VALUE
     D*****************************************************************
     D* CONSTANTES IFS
     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_CREAT         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 O_CCSID         S             10I 0 INZ(32)
     D*****************************************************************
     D* DEFINITIONS
     D*****************************************************************
     D*** divers
     D nomfichier      S            255A   INZ('/Af4dir/courshtm/xml/cours.xml')
     D lgfichier       S              9B 0
     D AsciiCodePage   S             10U 0 INZ(1252)
     D FullName        S            512A
     D ReturnInt       S             10I 0
     D***
     D File_Hdl        S             10I 0
     D Byteswrt        S             10I 0
     D EOR             S              2A   Inz(X'0D25')
     D Null            S              1A   Inz(X'00')
      ** divers ************************************************************
     Dligne            s           4096
     D I               s             10I 0
     D pos             s             10I 0
     D*****************************************************************
     D* Caractères interdit en XML
     D*****************************************************************
     DDS_invalide      DS
     D  origine                       5    inz('&<>"''')
     D  tbo                           1    DIM(5) overlay(ds_invalide)
     DDS_remplace      DS


|
     D  remplacement1                 6    inz('&amp;')
     D  remplacement2                 6    inz('&lt;')
     D  remplacement3                 6    inz('&gt;')
     D  remplacement4                 6    inz('&quot;')
     D  remplacement5                 6    inz('&apos;')
     D  tbr                           6    DIM(5) overlay(ds_remplace)
      *
      * DEBUT DU PGM
      *
     C*** Open file
     C*** la première ouverture créé le fichier
     C                   Eval      FullName = %TRIMR(nomfichier) + Null
     C**** avant la V5R10, il fallait ouvrir le fichier avec O_CODEPAGE
     C****  plutôt que O_CCSID
     C                   Eval      file_Hdl = open(%ADDR(FullName)
     C                               : O_CREAT + O_WRONLY + O_TRUNC +
     C                                 O_CCSID
     C                               : S_IRWXU + S_IROTH
     C                               : AsciiCodePage)
     C                   Eval      ReturnInt = close(file_Hdl)
     C*** la deuxième ouverture tiens compte du code page rencontré
     C***  et fera donc la conversion EBCDIC -> ASCII lors des write
     C                   Eval      file_Hdl = open(%ADDR(FullName)
     C                               : O_TEXTDATA + O_RDWR)
     C                   exsr      liste
     C                   Eval      ReturnInt = close(file_Hdl)
     C                   MOVE      *ON           *INLR
      *
      * SOUS PROGRAMME
      *
      /free
       BEGSR LISTE;
 
        // entête (une seule fois)
        eval ligne = '<?xml version="1.0" encoding="ISO-8859-1"?>' ;
        exsr writeln;
        eval ligne = '<AF400 COPYRIGHT="Volubis">' ;
        exsr writeln;
        eval ligne = ' ' ;
        exsr writeln;
 
        read af4mbrf1;
        dow not %eof;
         // mise en place d'une ligne


|
         eval ligne = ' <COURS NOM="' + %trim(af4mbr)  + '" MODULE="'
                      + %trim(AF4MDL) + '">' ;
         exsr writeln;
          // recherche des caractère & , < , > , " , '
          // qui sont invalides et remplacement (&amp; &lt; etc) comme HTML
          // sinon, encadrer les données de <![CDATA[  et ]]
          //  ligne = '  <TEXTE><![CDATA[' + %trim(ligne) + ']]</TEXTE>';
          eval ligne = af4txt;
          exsr verif_texte ;
         eval ligne = '  <TEXTE>' + %trim(ligne) + '</TEXTE>';
 
         exsr writeln;
         eval ligne = '  <TYPE>' + %trim(af4typ) + '</TYPE>';
         exsr writeln;
         eval ligne = '  <SRCFIL>' + %trim(srcfil) + '</SRCFIL>' ;
         exsr writeln;
         eval ligne = '  <SRCLIB>' + %trim(srclib) + '</SRCLIB>' ;
         exsr writeln;
         eval ligne = '  <SRCMBR>' + %trim(srcfil) + '</SRCMBR>' ;
         exsr writeln;
         eval ligne = '  <CHEMIN>' + %trim(infocp) + '</CHEMIN>' ;
         exsr writeln;
         eval ligne = '  <SUJET>' + %trim(sujet) + '</SUJET>'    ;
         exsr writeln;
         eval ligne = '  <MOT_DIRECTEUR>' ;
         exsr writeln;
         eval ligne = '    <MOTCLE1>' + %trim(motcl1) + '</MOTCLE1>' ;
         exsr writeln;
         eval ligne = '    <MOTCLE2>' + %trim(motcl2) + '</MOTCLE2>' ;
         exsr writeln;
         eval ligne = '    <MOTCLE3>' + %trim(motcl3) + '</MOTCLE3>' ;
         exsr writeln;
         eval ligne = '    <MOTCLE4>' + %trim(motcl4) + '</MOTCLE4>' ;
         exsr writeln;
         eval ligne = '    <MOTCLE5>' + %trim(motcl5) + '</MOTCLE5>'  ;
         exsr writeln;
         eval ligne = '  </MOT_DIRECTEUR>' ;
         exsr writeln;
         eval ligne = '  <DATREF>' + %CHAR(%date(datref : *CYMD)) +'</DATREF>';
         exsr writeln;
         eval ligne = ' </COURS>';
         exsr writeln;
 
         read af4mbrf1;


|
        enddo;
        // fin de liste
        eval ligne = ' ' ;
        exsr writeln;
        eval ligne = '</AF400>' ;
        exsr writeln;
 
        ENDSR ;
 
       BEGSR VERIF_TEXTE;
       // recherche er remplacement des caractères spéciaux
 
       for i = 1 to %elem(tbo) ;
         pos = 1;
         dow %scan(tbo(i) : ligne : pos) > 0 ;
             pos = %scan(tbo(i) : ligne : pos);
             ligne = %replace(%trim(tbr(i)) : ligne :
                              pos : %len(%trim(tbo(i)))
                              ) ;
             pos = pos + %len(%trim(tbr(i)));
             if pos > %len(ligne);
                leave;
             endif;
         enddo;
       endfor;
 
       ENDSR;
      /end-free
     C     Writeln       BEGSR
     C*** Ecriture IFS [utilisation du write() du langage C (*SRVPGM) ]
     C                   Eval      ligne = %Trimr(ligne) + EOR
     C                   Eval      byteswrt = write(file_Hdl
     C                               : %ADDR(ligne)
     C                               : %LEN(%TRIMR(ligne)))
     C***
     C                   endsr




©AF400