/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P L A C E M E N T   D E   V I R G U L E S   D ' U N E   L I G N E   A   L ' A U T R E  :                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Ce programme permet de transporter                                                                             */
/*                  les virgules situees au bout des lignes,                                                                         */
/*                  au debut des lignes suivantes, et ce apres                                                                       */
/*                  l'eventuelle suite d'espaces de tabulation.                                                                      */
/*                  Pour resoudre le probleme des lignes de '#define',                                                               */
/*                  sur lesquelles les virgules d'extremite sont                                                                     */
/*                  en general suivies d'espaces de tabulation                                                                       */
/*                  avant '\', ce programme s'utilise conjointement                                                                  */
/*                  avec '$SE' de la facon suivante :                                                                                */
/*                                                                                                                                   */
/*                                      $CA  <fichier>      | $SE -f $xcp/adjustK$D/virgule$sed | $xcp/adjustK.04$X                  */
/*                                                                                                                                   */
/*                    Mais ATTENTION, il resoud mal les trois                                                                        */
/*                  problemes suivants :                                                                                             */
/*                                                                                                                                   */
/*                  1-des lignes commentaires inserees a l'interieur                                                                 */
/*                  d'une liste (par exemple un 'DenumerXX(...)'.                                                                    */
/*                  La solution est alors, apres cette passe, de                                                                     */
/*                  rechercher les lignes commentaires dont le                                                                       */
/*                  premier caractere '/' (avant '*') est precede                                                                    */
/*                  immediatement d'une virgule, et de faire les                                                                     */
/*                  corrections a la main, qui consistent d'une                                                                      */
/*                  part a la remplacer par un espace, et la placer                                                                  */
/*                  sur la premiere ligne non commentaire qui suit                                                                   */
/*                  et ce devant le premier "symbole". Par exemple :                                                                 */
/*                                                                                                                                   */
/*                           ,SYMBOLE1                                                                                               */
/*                                     ,/* commentaire...                                                                            */
/*                                      /* commentaire...                                                                            */
/*                                      /* commentaire...                                                                            */
/*                            SYMBOLE2                                                                                               */
/*                                                                                                                                   */
/*                  deviendra ("a la main") :                                                                                        */
/*                                                                                                                                   */
/*                           ,SYMBOLE1                                                                                               */
/*                                      /* commentaire...                                                                            */
/*                                      /* commentaire...                                                                            */
/*                                      /* commentaire...                                                                            */
/*                           ,SYMBOLE2                                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                  2-des zones du type ', ' qui ne sont pas uniques                                                                 */
/*                  sur une meme ligne. Par exemple :                                                                                */
/*                                                                                                                                   */
/*                            FU,   FZERO,FZERO,            \                                                                        */
/*                            FZERO,FU,   FZERO,            \                                                                        */
/*                            FZERO,FZERO,FU                \                                                                        */
/*                                                                                                                                   */
/*                  donnera :                                                                                                        */
/*                                                                                                                                   */
/*                            FU    FZERO,FZERO,            \,                                                                       */
/*                            FZERO,FU    FZERO,            \,                                                                       */
/*                            FZERO,FZERO,FU                \                                                                        */
/*                                                                                                                                   */
/*                  Il faudra donc la aussi faire une retouche                                                                       */
/*                  "a la main", en recherchant les lignes contenant                                                                 */
/*                  encore ', *\\'...                                                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                  3-des 'CAL2(Prin1("\n...' sur plusieurs lignes                                                                   */
/*                  donnent des resultats bizarres, ainsi :                                                                          */
/*                                                                                                                                   */
/*                            CAL2(Prin1("\n x=%d",         \                                                                        */
/*                                       abscisse           \                                                                        */
/*                                       )                  \                                                                        */
/*                                 );                       \                                                                        */
/*                                                                                                                                   */
/*                  donnera :                                                                                                        */
/*                                                                                                                                   */
/*                            CAL2(Prin1("\,n x=%d"          \                                                                       */
/*                                       abscisse           \                                                                        */
/*                                       )                  \                                                                        */
/*                                 );                       \                                                                        */
/*                                                                                                                                   */
/*                  Il faudra donc rechercher "a la main" les                                                                        */
/*                  lignes contenant '\\,n' et corriger...                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcp/adjustK.04$K' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1990??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   LIMITEUR                                                                                                                      \
                    K_VIRGULE                                                                                                           \
                                        /* Definition du caractere que l'on va deplacer d'une ligne a la suivante...                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   CHANGEMENT_DE_LIGNE                                                                                                           \
                    Bblock                                                                                                              \
                    EGAL(on_vient_de_rencontrer_une_apostrophe,FAUX);                                                                   \
                    EGAL(on_vient_de_rencontrer_une_quote,FAUX);                                                                        \
                                        /* Apres chaque 'LINE-FEED', on reinitialise les detecteurs de quotes et d'apostrophes.      */ \
                    EGAL(on_est_sur_les_espaces_de_debut_de_ligne,VRAI);                                                                \
                                        /* Apres chaque 'LINE-FEED', on reinitialise le detecteur d'espace.                          */ \
                    CLIR(nombre_d_espaces_au_debut_de_la_ligne);                                                                        \
                                        /* Reinitialisation du compteur des espaces en debut de ligne                                */ \
                    Eblock
#define   EMISSION_DU_LIMITEUR                                                                                                          \
                    Bblock                                                                                                              \
                    CALS(Putchar(limiteur));                                                                                            \
                                        /* Emission du limiteur en attente,                                                          */ \
                    EGAL(on_vient_de_rencontrer_un_limiteur,FAUX);                                                                      \
                                        /* Et on reinitialise...                                                                     */ \
                    Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P L A C E M E N T   D E   V I R G U L E S   D ' U N E   L I G N E   A   L ' A U T R E  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(limiteur,LIMITEUR));
                                        /* Afin de choisir le caractere de declenchement de generation des "(" et ")".               */
     DEFV(Char,INIT(caractere_courant,K_UNDEF));
                                        /* Caractere courant.                                                                        */
     DEFV(Logical,INIT(on_vient_de_rencontrer_une_apostrophe,FAUX));
                                        /* Cet indicateur indique en permanence si l'on vient de rencontrer                          */
                                        /* immediatement une apostrophe (') :                                                        */
                                        /*                                                                                           */
                                        /*                  VRAI    : apres la premiere rencontree,                                  */
                                        /*                  FAUX    : apres la seconde,                                              */
                                        /*                                                                                           */
                                        /* cet indicateur fonctionnant en bascule, puisque les apostrophes forment                   */
                                        /* des couples de parentheses...                                                             */
     DEFV(Logical,INIT(on_vient_de_rencontrer_une_quote,FAUX));
                                        /* Cet indicateur indique en permanence si l'on vient de rencontrer                          */
                                        /* immediatement une quote (") :                                                             */
                                        /*                                                                                           */
                                        /*                  VRAI    : apres la premiere rencontree,                                  */
                                        /*                  FAUX    : apres la seconde,                                              */
                                        /*                                                                                           */
                                        /* cet indicateur fonctionnant en bascule, puisque les quotes forment                        */
                                        /* des couples de parentheses...                                                             */
     DEFV(Int,INIT(nombre_d_espaces_au_debut_de_la_ligne,ZERO));
                                        /* Compteur des espaces en debut de ligne (ne peut etre un 'Positive' a cause du             */
                                        /* 'Repe(PRED())' que l'on fait sur lui...                                                   */
     DEFV(Logical,INIT(on_est_sur_les_espaces_de_debut_de_ligne,VRAI));
                                        /* Cet indicateur indique en permanence si l'on se trouve sur les espaces situes             */
                                        /* immediatement au debut d'une ligne :                                                      */
                                        /*                                                                                           */
                                        /*                  VRAI    : tant qu'il y a des espaces en debut de ligne,                  */
                                        /*                  FAUX    : des qu'on a rencontre tout autre caractere (jusqu'au bout de   */
                                        /*                            la ligne).                                                     */
                                        /*                                                                                           */
     DEFV(Logical,INIT(on_vient_de_rencontrer_un_limiteur,FAUX));
                                        /* Cet indicateur indique en permanence si l'on vient de rencontrer                          */
                                        /* immediatement le limiteur courant :                                                       */
                                        /*                                                                                           */
                                        /*                  VRAI    : apres la premiere rencontree,                                  */
                                        /*                  FAUX    : apres tout autre caractere.                                    */
                                        /*                                                                                           */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(VIDE;
                         )
                    );

     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(IFET(EST_FAUX(on_est_sur_les_espaces_de_debut_de_ligne)
                   ,IFEQ(caractere_courant,limiteur)
                    )
               )
               Bblock
               Test(IFET(EST_FAUX(on_vient_de_rencontrer_une_quote)
                        ,EST_FAUX(on_vient_de_rencontrer_une_apostrophe)
                         )
                    )
                    Bblock
                    Test(EST_VRAI(on_vient_de_rencontrer_un_limiteur))
                         Bblock
                                        /* Cas ou l'on rencontre plusieurs limiteurs les uns a la suite des autres :                 */
                         CALS(Putchar(limiteur));
                                        /* Le limiteur precedent n'etant pas en fin de ligne (puisqu'il precede un autre limiteur),  */
                                        /* on l'emet...                                                                              */
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou l'on rencontre un premier limiteur apres un caractere quelconque :                 */
                         EGAL(on_vient_de_rencontrer_un_limiteur,VRAI);
                                        /* On memorise que l'on vient de rencontrer le limiteur hors d'une chaine...                 */
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    EMISSION_DU_LIMITEUR;
                                        /* Le limiteur etant dans une chaine, on l'ignore, et donc on le transmet...                 */
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Test(IFET(IFEQ(caractere_courant,K_QUOTE),EST_FAUX(on_vient_de_rencontrer_une_apostrophe)))
                    Bblock
                    EGAL(on_vient_de_rencontrer_une_quote,NOTL(on_vient_de_rencontrer_une_quote));
                                        /* On gere les quotes comme des parentheses...                                               */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(IFEQ(caractere_courant,K_APOSTROPHE),EST_FAUX(on_vient_de_rencontrer_une_quote)))
                    Bblock
                    EGAL(on_vient_de_rencontrer_une_apostrophe,NOTL(on_vient_de_rencontrer_une_apostrophe));
                                        /* On gere les apostrophes comme des parentheses...                                          */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFEQ(caractere_courant,K_LF))
                    Bblock
                                        /* Cas du changement de ligne :                                                              */
                    CHANGEMENT_DE_LIGNE;
                    Eblock
               ATes
                    Bblock
                                        /* Cas ou l'on ne change pas de ligne :                                                      */
                    Test(IFET(EST_FAUX(on_est_sur_les_espaces_de_debut_de_ligne)
                             ,EST_VRAI(on_vient_de_rencontrer_un_limiteur)
                              )
                         )
                         Bblock
                                        /* Cas ou l'on ne situe pas dans les espaces de debut de ligne, et ou un limiteur            */
                                        /* est en attente :                                                                          */
                         EMISSION_DU_LIMITEUR;
                                        /* Le limiteur precedent n'etant pas en fin de ligne, on l'emet...                           */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ETes

               Test(IFET(EST_VRAI(on_est_sur_les_espaces_de_debut_de_ligne)
                        ,IFEQ(caractere_courant,K_BLANC)
                         )
                    )
                    Bblock
                                        /* Cas ou l'on situe dans les espaces de debut de ligne, et qu'un nouvel espace arrive,      */
                                        /* 'on_est_sur_les_espaces_de_debut_de_ligne' conserve sa valeur courante...                 */
                    INCR(nombre_d_espaces_au_debut_de_la_ligne,I);
                                        /* On compte le nombre d'espaces au debut de chaque ligne.                                   */
                    Eblock
               ATes
                    Bblock
                                        /* Cas ou l'on est soit hors de la zone des premiers espaces, soit le caractere courant      */
                                        /* n'est pas un espace :                                                                     */
                    Test(IFNE(caractere_courant,K_LF))
                         Bblock
                         Test(EST_VRAI(on_est_sur_les_espaces_de_debut_de_ligne))
                              Bblock
                                        /* Cas ou l'on est en train de quitter la zone des premiers espaces :                        */
                              Test(EST_VRAI(on_vient_de_rencontrer_un_limiteur))
                                   Bblock
                                        /* Cas ou l'on est en train de quitter la zone des premiers espaces et qu'il y a un          */
                                        /* limiteur en attente :                                                                     */
                                   Repe(PRED(nombre_d_espaces_au_debut_de_la_ligne))
                                        Bblock
                                        CALS(Putchar(K_BLANC));
                                        /* Emission des espaces de debut de ligne, sauf le dernier.                                  */
                                        Eblock
                                   ERep

                                   EMISSION_DU_LIMITEUR;
                                        /* Emission du limiteur qui remplace le dernier espace rencontre.                            */
                                   Eblock
                              ATes
                                   Bblock
                                        /* Cas ou l'on est en train de quitter la zone des premiers espaces et qu'il n'y a           */
                                        /* pas de limiteur en attente :                                                              */
                                   Repe(nombre_d_espaces_au_debut_de_la_ligne)
                                        Bblock
                                        CALS(Putchar(K_BLANC));
                                        /* Emission de tous les espaces de debut de ligne lorsqu'il n'y a pas de limiteur            */
                                        /* en attente.                                                                               */
                                        Eblock
                                   ERep
                                   Eblock
                              ETes
                              CLIR(nombre_d_espaces_au_debut_de_la_ligne);
                                        /* Par pure proprete...                                                                      */
                              EGAL(on_est_sur_les_espaces_de_debut_de_ligne,FAUX);
                                        /* Ainsi, on sait qu'on n'est certainement plus sur les espaces de debut de ligne.           */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    CALS(Putchar(caractere_courant));
                                        /* Enfin, le caractere courant (sauf les blancs de debut de ligne et l'eventuel limiteur     */
                                        /* en attente) est emis...                                                                   */
                    Eblock
               ETes
               Eblock
          ETes
          Eblock
     ETan

     RETU_Commande;
     Eblock
ECommande



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