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