/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D U   D E B U T   D ' U N   F I C H I E R  :                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Fonction :                                                                                                                 */
/*                                                                                                                                   */
/*                    Cette commande est destinee a remplacer                                                                        */
/*                  la commande '$HEA' a cause du probleme                                                                           */
/*                  'v $x/bugs/mHOTE$D/CMAP28$D/BrokenPipe.01$Z HEA'.                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcg/head.01$K' :                                                                                               */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20240815175647).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_MINI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_DE_LIGNES_A_EDITER                                                                                                     \
                    DIX                                                                                                                 \
                                        /* On n'editera que les 10 premieres lignes par defaut (comme '$HEA...)'                     */
#define   NOMBRE_DE_CARACTERES_A_EDITER                                                                                                 \
                    MILLE                                                                                                               \
                                        /* Le 20240818184654 est introduite la possibilite de limiter le nombre de caracteres        */ \
                                        /* independemment du nombre de lignes...                                                     */

#define   EMULER_HEAD                                                                                                                   \
                    VRAI                                                                                                                \
                                        /* Doit-on emuler 'head' ('VRAI') ou 'tail' ('FAUX') ? Cet indicateur a ete introduit        */ \
                                        /* le 20240816100949...                                                                      */
#define   EMULER_CAT                                                                                                                    \
                    FAUX                                                                                                                \
                                        /* Doit-on emuler 'cat' ('VRAI') ou 'head/tail' ('FAUX') ? Cet indicateur a ete introduit    */ \
                                        /* le 20240817122413...                                                                      */

#define   UTILISER_LE_NOMBRE_DE_LIGNES                                                                                                  \
                    VRAI                                                                                                                \
                                        /* Doit-on utiliser le nombre de lignes ('VRAI') ou bien le nombre de caracteres ('FAUX') ?  */ \
                                        /* Cet indicateur a ete introduit le 20240822095543...                                       */

#define   COMPTER_LES_K_LF                                                                                                              \
                    VRAI                                                                                                                \
                                        /* Doit-on compter ('VRAI') ou pas ('FAUX') les 'K_LF') ? Cet indicateur a ete introduit     */ \
                                        /* le 20240820155333...                                                                      */
#define   FERMER_LE_FICHIER_SI_BESOIN_EST                                                                                               \
                    VRAI                                                                                                                \
                                        /* Doit-on fermer le fichier si besoin est ('VRAI') ou pas ('FAUX')  ? Cet indicateur a      */ \
                                        /* ete introduit le 20240820155333...                                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   emuler_tail                                                                                                                   \
                    NOTL(emuler_head)                                                                                                   \
                                        /* Introduit le 20240817122919 pour mieux "symetriser" la programmation...                   */

#define   COMPTAGE_DES_K_LF                                                                                                             \
                    COND(IFET(IFEQ(caractere_courant,K_LF),IL_NE_FAUT_PAS(compter_les_K_LF)),ZERO,I)                                    \
                                        /* Pour faciliter le comptage eventuel des 'K_LF'...                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D U   D E B U T   D ' U N   F I C H I E R  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_de_lignes_a_editer,NOMBRE_DE_LIGNES_A_EDITER));
                                        /* On n'editera que les 10 premieres lignes par defaut (comme '$HEA...)'                     */
     DEFV(Positive,INIT(nombre_de_caracteres_a_editer,NOMBRE_DE_CARACTERES_A_EDITER));
                                        /* Le 20240818184654 est introduite la possibilite de limiter le nombre de caracteres        */
                                        /* independemment du nombre de lignes...                                                     */

     DEFV(Logical,INIT(emuler_head,EMULER_HEAD));
                                        /* Doit-on emuler 'head' ('VRAI') ou 'tail' ('FAUX') ? Cet indicateur a ete introduit        */
                                        /* le 20240816100949...                                                                      */
     DEFV(Logical,INIT(emuler_cat,EMULER_CAT));
                                        /* Doit-on emuler 'cat' ('VRAI') ou 'head/tail' ('FAUX') ? Cet indicateur a ete introduit    */
                                        /* le 20240817122413...                                                                      */

     DEFV(Logical,INIT(utiliser_le_nombre_de_lignes,UTILISER_LE_NOMBRE_DE_LIGNES));
                                        /* Doit-on utiliser le nombre de lignes ('VRAI') ou bien le nombre de caracteres ('FAUX') ?  */
                                        /* Cet indicateur a ete introduit le 20240822095543...                                       */

     DEFV(Logical,INIT(compter_les_K_LF,COMPTER_LES_K_LF));
                                        /* Doit-on compter ('VRAI') ou pas ('FAUX') les 'K_LF') ? Cet indicateur a ete introduit     */
                                        /* le 20240820155333...                                                                      */
     DEFV(Logical,INIT(fermer_le_fichier_si_besoin_est,FERMER_LE_FICHIER_SI_BESOIN_EST));
                                        /* Doit-on fermer le fichier si besoin est ('VRAI') ou pas ('FAUX')  ? Cet indicateur a      */
                                        /* ete introduit le 20240820155333...                                                        */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("head=""h=",emuler_head);
                         GET_ARGUMENT_N("tail=""t=",emuler_head);
                                        /* Arguments introduits le 20240816100949...                                                 */
                         GET_ARGUMENT_L("cat=""c=",emuler_cat);
                                        /* Argument introduit le 20240817122413...                                                   */

                         GET_ARGUMENT_L("utiliser_lignes=""ul=",utiliser_le_nombre_de_lignes);
                         GET_ARGUMENT_N("utiliser_caracteres=""uc=",utiliser_le_nombre_de_lignes);
                                        /* Argument introduit le 20240822095543...                                                   */

                         GET_ARGUMENT_I("nombre_lignes=""nl=""n=",nombre_de_lignes_a_editer);
                         GET_ARGUMENT_I("nombre_caracteres=""nc=",nombre_de_caracteres_a_editer);

                         GET_ARGUMENT_L("compter_K_LF=""K_LF=",compter_les_K_LF);
                                        /* Argument introduit le 20240820155333...                                                   */
                         GET_ARGUMENT_L("fermer_fichier=""fermer=""f=",fermer_le_fichier_si_besoin_est);
                                        /* Argument introduit le 20240824122239...                                                   */
                         )
                    );

     Test(IL_FAUT(emuler_cat))
                                        /* Possibilite introduite le 20240817122413...                                               */
          Bblock
          EGAL(nombre_de_lignes_a_editer,INFINI);
          EGAL(nombre_de_caracteres_a_editer,NOMBRE_DE_CARACTERES_A_EDITER);
          EGAL(emuler_head,VRAI);
                                        /* Cas de l'emulation de 'cat'.                                                              */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     begin_nouveau_block
          Bblock
          DEFV(Positive,INIT(nombre_de_lignes_rencontrees,ZERO));
                                        /* Nombre de lignes deja rencontrees...                                                      */
          DEFV(Positive,INIT(nombre_de_caracteres_rencontres,ZERO));
                                        /* Nombre de caracteres deja rencontrees...                                                  */

          DEFV(Char,INIT(caractere_precedent,K_UNDEF));
                                        /* Caractere precedent (introduit le 20240824113558)...                                      */
          DEFV(Char,INIT(caractere_courant,K_UNDEF));
                                        /* Caractere courant.                                                                        */

          Tant(GetcharT(caractere_courant))
               Bblock
                                        /* Le caractere courant de l'entree courante est recupere ; et on boucle                     */
                                        /* sur cette recuperation tant que l'on n'est pas au bout du fichier.                        */
               Test(IFOU(IFET(IL_FAUT(emuler_head)
                             ,IFOU(IFET(IL_FAUT(utiliser_le_nombre_de_lignes)
                                       ,IFLT(nombre_de_lignes_rencontrees,nombre_de_lignes_a_editer)
                                        )
                                        /* Cas de l'emulation de 'head' en utilisant le nombre de lignes.                            */
                                  ,IFET(IL_NE_FAUT_PAS(utiliser_le_nombre_de_lignes)
                                       ,IFLT(nombre_de_caracteres_rencontres,nombre_de_caracteres_a_editer)
                                        )
                                        /* Cas de l'emulation de 'head' en utilisant le nombre de caracteres.                        */
                                   )
                              )
                        ,IFET(IL_FAUT(emuler_tail)
                             ,IFOU(IFET(IL_FAUT(utiliser_le_nombre_de_lignes)
                                       ,IFGE(nombre_de_lignes_rencontrees,nombre_de_lignes_a_editer)
                                        /* Cas de l'emulation de 'tail' en utilisant le nombre de lignes.                            */
                                        )
                                  ,IFET(IL_NE_FAUT_PAS(utiliser_le_nombre_de_lignes)
                                       ,IFGE(nombre_de_caracteres_rencontres,nombre_de_caracteres_a_editer)
                                        )
                                        /* Cas de l'emulation de 'tail' en utilisant le nombre de caracteres.                        */
                                   )
                              )
                         )
                    )
                    Bblock
                    CALS(Putchar(caractere_courant));
                                        /* On renvoie le caractere courant tant qu'il n'y a pas assez de lignes rencontrees...       */

                    EGAL(caractere_precedent,caractere_courant);
                                        /* Memorisation du caractere precedent pour le test final de 'K_LF' (introduit le            */
                                        /* 20240824113558)...                                                                        */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFEQ(caractere_courant,K_LF))
                    Bblock
                    INCR(nombre_de_lignes_rencontrees,I);
                                        /* Comptage des lignes rencontrees...                                                        */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               INCR(nombre_de_caracteres_rencontres,COMPTAGE_DES_K_LF);
                                        /* Comptage des caracteres rencontres...                                                     */
               Eblock
          ETan

          Test(IL_FAUT(fermer_le_fichier_si_besoin_est))
                                        /* Test introduit le 20240824122239...                                                       */
               Bblock
               Test(IFNE(caractere_precedent,K_LF))
                                        /* Je note le 20240824113558 que le caractere courant vaut 'CARA(NEUT(PROBLEMES))' et c'est  */
                                        /* donc le caractere precedent qu'il faut tester...                                          */
                    Bblock
                    CALS(Putchar(K_LF));
                                        /* On rajoute un 'K_LF' au cas ou il manquerait a la fin du fichier et qu'il est necessaire  */
                                        /* de l'ajouter...                                                                           */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_nouveau_block

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2024-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2024-2024.