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