/*************************************************************************************************************************************/
/* */
/* D U R E E E C O U L E E D E P U I S L E 01/01/1970 : */
/* */
/* */
/* Author of '$xcg/dure01011970$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1996??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 COMPATIBILITE_20060419 \
FAUX \
/* Permet de faire les sorties de 'IL_FAUT(inverser_le_processus)' telles qu'elles etaient */ \
/* avant le 20060419102005, c'est-a-dire avec un "K_LF" de trop... */
#define UTILISER_LA_DATE_COURANTE \
VRAI \
/* Faut-il utiliser la date courante ('VRAI') ou une date arbitraire ('FAUX') ? */
#define ANNEE_ARBITRAIRE \
LE_01_01_1970_A_00_00_00_ANNEE
#define MOIS_ARBITRAIRE \
LE_01_01_1970_A_00_00_00_MOIS
#define JOUR_ARBITRAIRE \
LE_01_01_1970_A_00_00_00_JOUR
#define HEURES_ARBITRAIRES \
LE_01_01_1970_A_00_00_00_HEURES
#define MINUTES_ARBITRAIRES \
LE_01_01_1970_A_00_00_00_MINUTES
#define SECONDES_ARBITRAIRES \
LE_01_01_1970_A_00_00_00_SECONDES
/* Date arbitraire a utiliser a la place de la date courante. */
#define EDITER_L_EN_TETE \
VRAI \
/* Faut-il editer l'en-tete "duree en secondes ecoulee..." ('VRAI') ou pas ('FAUX') ? Ceci */ \
/* a ete introduit le 20050124120654... */
#define EDITER_LES_SECONDES \
FAUX
#define EDITER_LES_MICROSECONDES \
FAUX
#define EDITER_LES_SECONDES_CONCATENEES_AUX_MICROSECONDES \
VRAI
/* Que faut-il editer ? */
#define TRANSFORMER_LE_NOMBRE_DE_SECONDES_CONCATENEES_AUX_MICROSECONDES \
FAUX
#define TRANSFORMER_LE_NOMBRE_DE_SECONDES_CONCATENEES_AUX_MICROSECONDES_PONDERATION_DE_Cshell \
UN
#define TRANSFORMER_LE_NOMBRE_DE_SECONDES_CONCATENEES_AUX_MICROSECONDES_PONDERATION_DE_Gpid \
UN
/* Si 'IL_FAUT(editer_les_secondes_concatenees_aux_microsecondes)' faut-il transformer le */
/* nombre de secondes via '$Cshell' ('VRAI') ou le laisser tel quel ('FAUX') ? Ceci fut */
/* introduit le 20090311094300 (la valeur par defaut garantissant la compatibilite */
/* anterieure). On notera qu'alors, lorsque cela sert a generer des noms de fichiers */
/* temporaires ('v $xE/.alias.1$vv$Y Getmp'), l'ordre alphabetique n'est plus l'ordre */
/* chronologique... */
/* */
/* Le 20090519094007 a la prise en compte de '$Cshell' fut introduite celle de 'Gpid(...)' */
/* les valeurs par defaut garantissant la compatibilite anterieure. Le 20090519102525, en */
/* fait cela fut modifie : la ponderation de 'Gpid(...)' est passee de 'ZERO' a 'UN' afin */
/* que '$Cshell' et 'Gpid(...)' interviennent tous les deux a priori... */
#define TRANSLATION_DES_SECONDES \
ZERO \
/* Translation a apporter a la duree en secondes. Cela fut introduit le 20060419095549 */ \
/* pour etre utilise dans l'alias 'synchro' ('v $xE/.alias.1$vv$Y synchro')... */
#define METTRE_DES_ZEROS_DEVANT_LES_SECONDES_ET_LES_MICROSECONDES \
VRAI \
/* Afin de pouvoir mettre (valeur par defaut) ou pas des "0"s devant les durees (en */ \
/* secondes et micro-secondes (introduit le 20120119082316). */
#define NOMBRE_DE_CHIFFRES_DES_SECONDES_LORS_D_UNE_CONCATENATION \
LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER
#define NOMBRE_DE_CHIFFRES_DES_MICROSECONDES_LORS_D_UNE_CONCATENATION \
NOMBRE_DE_CHIFFRES_DECIMAUX(micro_secondes)
/* Nombre de chiffres pour les secondes et les micro-secondes lorsque */
/* 'IL_FAUT(editer_les_secondes_concatenees_aux_microsecondes)'. ATTENTION, 'Prin?(...)' */
/* ne fait pas de troncation ; cela implique que si ces parametres sont trop petits, ils */
/* ignores par 'Prin?(...)' pour ne rien perdre. Cela justifie l'introduction des deux */
/* parametres 'DIVISEUR' ci-apres... */
/* */
/* La procedure 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' fut introduite le 20051210183154. On */
/* notera qu'avant cette date figurait ici : */
/* */
/* INTE(LO1X(micro_secondes)) */
/* */
/* et il semble donc qu'il manquait une incrementation d'une unite... */
/* */
/* ATTENTION : on n'oubliera pas 'v $Fvariables longueur_noms'... */
#define LOG10_DU_DIVISEUR_DES_SECONDES_LORS_D_UNE_CONCATENATION \
ZERO
#define LOG10_DU_DIVISEUR_DES_MICROSECONDES_LORS_D_UNE_CONCATENATION \
ZERO
/* Logarithme decimal des diviseurs respectifs des secondes et les micro-secondes lorsque */
/* 'IL_FAUT(editer_les_secondes_concatenees_aux_microsecondes)'. Combines avec les deux */
/* parametres 'NOMBRE' qui precedent, on peut ainsi generer de petites valeurs... */
#define INVERSER_LE_PROCESSUS \
FAUX \
/* Faut-il inverser le processus c'est-a-dire convertir une duree en une date ? */ \
/* ATTENTION, on notera bien que c'est une duree en secondes que l'on convertit et non pas */ \
/* la concatenation {secondes,micro-secondes} qui est la sortie par defaut du programme */ \
/* '$xcg/dure01011970$K'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D U R E E E C O U L E E D E P U I S L E 01/01/1970 : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Logical,INIT(compatibilite_20060419,COMPATIBILITE_20060419));
/* Permet de faire les sorties de 'IL_FAUT(inverser_le_processus)' telles qu'elles etaient */
/* avant le 20060419102005, c'est-a-dire avec un "K_LF" de trop... */
DEFV(Logical,INIT(utiliser_la_date_courante,UTILISER_LA_DATE_COURANTE));
/* Faut-il utiliser la date courante ('VRAI') ou une date arbitraire ('FAUX') ? */
DEFV(Int,INIT(annee_arbitraire,ANNEE_ARBITRAIRE));
DEFV(Int,INIT(mois_arbitraire,MOIS_ARBITRAIRE));
DEFV(Int,INIT(jour_arbitraire,JOUR_ARBITRAIRE));
DEFV(Int,INIT(heures_arbitraires,HEURES_ARBITRAIRES));
DEFV(Int,INIT(minutes_arbitraires,MINUTES_ARBITRAIRES));
DEFV(Int,INIT(secondes_arbitraires,SECONDES_ARBITRAIRES));
/* Date arbitraire a utiliser a la place de la date courante. */
DEFV(Logical,INIT(editer_l_en_tete,EDITER_L_EN_TETE));
/* Faut-il editer l'en-tete "duree en secondes ecoulee..." ('VRAI') ou pas ('FAUX') ? Ceci */
/* a ete introduit le 20050124120654... */
DEFV(Logical,INIT(editer_les_secondes,EDITER_LES_SECONDES));
DEFV(Logical,INIT(editer_les_microsecondes,EDITER_LES_MICROSECONDES));
DEFV(Logical,INIT(editer_les_secondes_concatenees_aux_microsecondes,EDITER_LES_SECONDES_CONCATENEES_AUX_MICROSECONDES));
/* Que faut-il editer ? */
DEFV(Logical,INIT(transformer_le_nombre_de_secondes_concatenees_aux_microsecondes
,TRANSFORMER_LE_NOMBRE_DE_SECONDES_CONCATENEES_AUX_MICROSECONDES
)
);
DEFV(Int,INIT(transformer_le_nombre_de_secondes_concatenees_aux_microsecondes_ponderation_de_Cshell
,TRANSFORMER_LE_NOMBRE_DE_SECONDES_CONCATENEES_AUX_MICROSECONDES_PONDERATION_DE_Cshell
)
);
DEFV(Int,INIT(transformer_le_nombre_de_secondes_concatenees_aux_microsecondes_ponderation_de_Gpid
,TRANSFORMER_LE_NOMBRE_DE_SECONDES_CONCATENEES_AUX_MICROSECONDES_PONDERATION_DE_Gpid
)
);
/* Si 'IL_FAUT(editer_les_secondes_concatenees_aux_microsecondes)' faut-il transformer le */
/* nombre de secondes via '$Cshell' ('VRAI') ou le laisser tel quel ('FAUX') ? Ceci fut */
/* introduit le 20090311094300 (la valeur par defaut garantissant la compatibilite */
/* anterieure). On notera qu'alors, lorsque cela sert a generer des noms de fichiers */
/* temporaires ('v $xE/.alias.1$vv$Y Getmp'), l'ordre alphabetique n'est plus l'ordre */
/* chronologique... */
/* */
/* Le 20090519094007 a la prise en compte de '$Cshell' fut introduite celle de 'Gpid(...)' */
/* les valeurs par defaut garantissant la compatibilite anterieure. Le 20090519102525, en */
/* fait cela fut modifie : la ponderation de 'Gpid(...)' est passee de 'ZERO' a 'UN' afin */
/* que '$Cshell' et 'Gpid(...)' interviennent tous les deux a priori. On notera que ces */
/* ponderations doivent etre des 'Int's. J'ai essaye d'en faire des 'Float's mais cela */
/* donne malheureusement des valeurs ne tenant pas dans un 'Int' ('tSecondes') ensuite */
/* ce qui donne alors systematiquement la valeur -2147483648 (soit 0x7ffffff)... */
DEFV(Int,INIT(translation_des_secondes,TRANSLATION_DES_SECONDES));
/* Translation a apporter a la duree en secondes. Cela fut introduit le 20060419095549 */
/* pour etre utilise dans l'alias 'synchro' ('v $xE/.alias.1$vv$Y synchro')... */
DEFV(Logical,INIT(mettre_des_zeros_devant_les_secondes_et_les_microsecondes
,METTRE_DES_ZEROS_DEVANT_LES_SECONDES_ET_LES_MICROSECONDES
)
);
/* Afin de pouvoir mettre (valeur par defaut) ou pas des "0"s devant les durees (en */
/* secondes et micro-secondes (introduit le 20120119082316). */
DEFV(Positive,INIT(nombre_de_chiffres_des_secondes_lors_d_une_concatenation
,NOMBRE_DE_CHIFFRES_DES_SECONDES_LORS_D_UNE_CONCATENATION
)
);
DEFV(Positive,INIT(nombre_de_chiffres_des_microsecondes_lors_d_une_concatenation
,NOMBRE_DE_CHIFFRES_DES_MICROSECONDES_LORS_D_UNE_CONCATENATION
)
);
/* Nombre de chiffres pour les secondes et les micro-secondes lorsque */
/* 'IL_FAUT(editer_les_secondes_concatenees_aux_microsecondes)'. ATTENTION, 'Prin?(...)' */
/* ne fait pas de troncation ; cela implique que si ces parametres sont trop petits, ils */
/* ignores par 'Prin?(...)' pour ne rien perdre. Cela justifie l'introduction des deux */
/* parametres 'DIVISEUR' ci-apres... */
/* */
/* ATTENTION : on n'oubliera pas 'v $Fvariables longueur_noms'... */
DEFV(Int,INIT(Log10_du_diviseur_des_secondes_lors_d_une_concatenation
,LOG10_DU_DIVISEUR_DES_SECONDES_LORS_D_UNE_CONCATENATION
)
);
DEFV(Int,INIT(Log10_du_diviseur_des_microsecondes_lors_d_une_concatenation
,LOG10_DU_DIVISEUR_DES_MICROSECONDES_LORS_D_UNE_CONCATENATION
)
);
/* Logarithme decimal des diviseurs respectifs des secondes et les micro-secondes lorsque */
/* 'IL_FAUT(editer_les_secondes_concatenees_aux_microsecondes)'. Combines avec les deux */
/* parametres 'NOMBRE' qui precedent, on peut ainsi generer de petites valeurs... */
DEFV(Positive,INIT(Secondes,ZERO));
DEFV(Positive,INIT(MicroSecondes,ZERO));
/* Duree en {secondes,micro-secondes} ecoulee depuis le 19700101000000. */
DEFV(Logical,INIT(inverser_le_processus,INVERSER_LE_PROCESSUS));
/* Faut-il inverser le processus c'est-a-dire convertir une duree en une date ? */
/* ATTENTION, on notera bien que c'est une duree en secondes que l'on convertit et non pas */
/* la concatenation {secondes,micro-secondes} qui est la sortie par defaut du programme */
/* '$xcg/dure01011970$K'. */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("compatibilite_20060419=",compatibilite_20060419);
GET_ARGUMENT_L("date_courante=""courante=",utiliser_la_date_courante);
GET_ARGUMENT_I("annee=""Annee=""A=",annee_arbitraire);
GET_ARGUMENT_I("mois=""Mois=""M=",mois_arbitraire);
GET_ARGUMENT_I("jour=""Jour=""J=",jour_arbitraire);
GET_ARGUMENT_I("heures=""Heures=""H=",heures_arbitraires);
GET_ARGUMENT_I("minutes=""m=""Minutes=",minutes_arbitraires);
GET_ARGUMENT_I("Secondes=""S=",secondes_arbitraires);
GET_ARGUMENT_L("et=""en_tete=",editer_l_en_tete);
GET_ARGUMENT_L("secondes=""s=",editer_les_secondes);
GET_ARGUMENT_L("ms=""microsecondes=",editer_les_microsecondes);
GET_ARGUMENT_L("sms=""secondes_microsecondes=",editer_les_secondes_concatenees_aux_microsecondes);
GET_ARGUMENT_L("tsms=""transformer_secondes_microsecondes="
,transformer_le_nombre_de_secondes_concatenees_aux_microsecondes
);
/* Parametres introduits le 20090311094300... */
GET_ARGUMENT_I("Ctsms=""Ctransformer_secondes_microsecondes="
,transformer_le_nombre_de_secondes_concatenees_aux_microsecondes_ponderation_de_Cshell
);
GET_ARGUMENT_I("Ptsms=""Ptransformer_secondes_microsecondes="
,transformer_le_nombre_de_secondes_concatenees_aux_microsecondes_ponderation_de_Gpid
);
/* Parametres introduits le 20090519094007... */
GET_ARGUMENT_L("zeros_secondes_microsecondes=""zeros=""zsms="
,mettre_des_zeros_devant_les_secondes_et_les_microsecondes
);
/* Parametres introduits le 20120119082316... */
GET_ARGUMENT_I("nombre_chiffres_secondes=""ns=""ls="
,nombre_de_chiffres_des_secondes_lors_d_une_concatenation
);
GET_ARGUMENT_I("nombre_chiffres_microsecondes=""nms=""lms="
,nombre_de_chiffres_des_microsecondes_lors_d_une_concatenation
);
GET_ARGUMENT_I("ds=",Log10_du_diviseur_des_secondes_lors_d_une_concatenation);
GET_ARGUMENT_I("dms=",Log10_du_diviseur_des_microsecondes_lors_d_une_concatenation);
GET_ARGUMENT_I("ts=""translation_secondes=",translation_des_secondes);
GET_ARGUMENT_L("inverser=",inverser_le_processus);
GET_ARGUMENT_I("duree=",Secondes);
);
)
Test(IL_NE_FAUT_PAS(inverser_le_processus))
Bblock
Test(IL_FAUT(utiliser_la_date_courante))
Bblock
DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes,MicroSecondes);
/* Calcul de la duree en {secondes,micro-secondes} ecoulee depuis le 19700101000000. */
Test(IL_FAUT(editer_les_secondes))
Bblock
Test(IL_FAUT(editer_l_en_tete))
Bblock
CAL2(Prin7("duree en secondes ecoulee depuis le %02d/%02d/%04d %02d:%02d:%02d %s = "
,LE_01_01_1970_A_00_00_00_JOUR
,LE_01_01_1970_A_00_00_00_MOIS
,LE_01_01_1970_A_00_00_00_ANNEE
,LE_01_01_1970_A_00_00_00_HEURES
,LE_01_01_1970_A_00_00_00_MINUTES
,LE_01_01_1970_A_00_00_00_SECONDES
,LE_01_01_1970_A_00_00_00_TZ
)
);
Eblock
ATes
Bblock
Eblock
ETes
CAL2(Prin1("%d\n"
,ADD2(Secondes,translation_des_secondes)
/* Translation a apporter a la duree en secondes. Cela fut introduit le 20060419095549 */
/* pour etre utilise dans l'alias 'synchro' ('v $xE/.alias.1$vv$Y synchro') afin de */
/* decaler l'heure editee de quelques secondes pour masquer la duree de l'execution de */
/* '$Fsynchro' (soit 3 ou 4 secondes...). */
)
);
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(editer_les_microsecondes))
Bblock
CAL2(Prin1("duree residuelle en micro-secondes=%d\n",MicroSecondes));
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(editer_les_secondes_concatenees_aux_microsecondes))
Bblock
DEFV(Positive,INIT(rSecondes,Secondes));
DEFV(Positive,INIT(rMicroSecondes,MicroSecondes));
/* Duree en {secondes,micro-secondes} ecoulee depuis le 19700101000000 reduites. */
Test(IZNE(translation_des_secondes))
Bblock
PRINT_ATTENTION("les secondes ne sont pas translatables lors de l'edition des microsecondes");
Eblock
ATes
Bblock
Eblock
ETes
Test(IFOU(IL_FAUT(editer_les_secondes),IL_FAUT(editer_les_microsecondes)))
Bblock
CAL2(Prin0("\n"));
Eblock
ATes
Bblock
Eblock
ETes
Repe(Log10_du_diviseur_des_secondes_lors_d_une_concatenation)
Bblock
EGAL(rSecondes,DIVI(rSecondes,DIX));
/* Reduction du nombre de secondes par une puissance de 10. On notera que l'on utilise */
/* pas 'EX10(Log10_du_diviseur_des_secondes_lors_d_une_concatenation)' pour diviser la */
/* valeur de 'Secondes' afin d'etre sur de travailler en nombres entiers... */
Eblock
ERep
Repe(Log10_du_diviseur_des_microsecondes_lors_d_une_concatenation)
Bblock
EGAL(rMicroSecondes,DIVI(rMicroSecondes,DIX));
/* Reduction du nombre de micro-secondes par une puissance de 10. On notera que l'on utilise */
/* pas 'EX10(Log10_du_diviseur_des_microsecondes_lors_d_une_concatenation)' pour diviser la */
/* valeur de 'MicroSecondes' afin d'etre sur de travailler en nombres entiers... */
Eblock
ERep
Test(IZNE(nombre_de_chiffres_des_secondes_lors_d_une_concatenation))
Bblock
DEFV(Int,INIT(tSecondes,rSecondes));
/* La possible Transformation de la duree en secondes a ete introduite le 20090311094300... */
/* */
/* ATTENTION : on notera le 'Int' (et non pas un 'Positive'...) afin de garantir que le */
/* 'ABSO(...)' ci-apres donne bien un nombre positif... */
Test(IL_FAUT(transformer_le_nombre_de_secondes_concatenees_aux_microsecondes))
Bblock
EGAL(tSecondes
,MUL2(LIN2(transformer_le_nombre_de_secondes_concatenees_aux_microsecondes_ponderation_de_Cshell
,Gval("Cshell")
,transformer_le_nombre_de_secondes_concatenees_aux_microsecondes_ponderation_de_Gpid
,Gpid()
,UN
)
,rSecondes
)
);
/* Cette transformation fut introduite le 20090311094300 afin de tenter de resoudre le */
/* probleme apparu avec la commande : */
/* */
/* job Gserveur Galerie_NewPictures $EXIST >& ... */
/* */
/* sur "europe.polytechnique.fr" (remplacant provisoire de '$CMAP28') ; le message : */
/* */
/* ...:File exists. */
/* */
/* est apparu pour un fichier temporaire dans un '$xT' dans 'v $xiMo/GENERE$Z FileTmpB'. */
/* Cela pourrait etre du au fait que "europe.polytechnique.fr" est un quadri-processeur */
/* et que par un hasard incroyable deux noms temporaires ont ete generes simultanement */
/* sur deux processeurs differents. Ici, on donne donc la possibilite de "perturber" le */
/* nombre de secondes par '$Cshell' qui donne necessairement des valeurs differentes au */
/* meme instant sur des processeurs differents. De plus on utilise un 'MUL2(...)' et non */
/* un 'ADD2(...)' ou un 'OUEX(...)' afin d'eviter le probleme decrit precedemment, mais */
/* avec un decalage temporel... */
/* */
/* En fait cela n'a pas supprime ce probleme qui se manifestait encore avec : */
/* */
/* job $xiMo/DiaporamaGeant$Z >& ... */
/* */
/* et apparement (toujours ?) dans les 'callX's de 'v $xiMo/GENERE$Z callX' soit directement */
/* soit indirectement dans les 'listG's de 'callX'. Or dans 'v $xiMo/GENERE$Z callX' il */
/* y a en fait deux 'callX's dans le meme "pipe" ; ils sont donc executes avec le meme */
/* '$Cshell' et donc le dispositif precedent ne peut corriger cette anomalie s'il s'agit */
/* bien d'un probleme de "synchronisme" trop parfait. C'est pourquoi la solution suivante */
/* a ete imaginee : 'v $xE/.alias.1$vv$Y 20090313162751' avec {GetSTmp,FilSTmpB,FilSTmpE}, */
/* les fichiers temporaires etant crees en meme temps que leur nom. Cela semble fonctionner. */
/* */
/* On notera le 'ABSO(...)' dans le 'Prin2(...)' ci-apres destine, en plus du 'Positive' */
/* a garantir une valeur positive... */
/* */
/* D'autre part, on utilise '$Cshell' et non pas 'Gpid()' car ce qui est utile pour */
/* resoudre le probleme decrit ci-dessus, ce n'est pas le numero du process constitue */
/* par '$xcg/dure01011970$X', mais celui du "shell" l'executant (en particulier un '$Z')... */
/* */
/* Le 20090519094007 a la prise en compte de '$Cshell' fut introduite celle de 'Gpid(...)' */
/* les valeurs par defaut garantissant la compatibilite anterieure. On notera au passage */
/* le 'LIN2(...,...,...,...,UN)' qui garantit une valeur non nulle quel que soient les */
/* ponderations... */
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(mettre_des_zeros_devant_les_secondes_et_les_microsecondes))
Bblock
CAL2(Prin2("%0*d",nombre_de_chiffres_des_secondes_lors_d_une_concatenation,ABSO(tSecondes)));
Eblock
ATes
Bblock
CAL2(Prin1("%d",ABSO(tSecondes)));
/* Possibilite introduite le 20120119082316... */
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IZNE(nombre_de_chiffres_des_microsecondes_lors_d_une_concatenation))
Bblock
Test(IL_FAUT(mettre_des_zeros_devant_les_secondes_et_les_microsecondes))
Bblock
CAL2(Prin2("%0*d",nombre_de_chiffres_des_microsecondes_lors_d_une_concatenation,rMicroSecondes));
Eblock
ATes
Bblock
CAL2(Prin1("%d",rMicroSecondes));
/* Possibilite introduite le 20120119082316... */
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IFOU(IZNE(nombre_de_chiffres_des_microsecondes_lors_d_une_concatenation)
,IZNE(nombre_de_chiffres_des_secondes_lors_d_une_concatenation)
)
)
Bblock
CAL2(Prin0("\n"));
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
CONVERSION_D_UNE_DATE_EN_UNE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes
,annee_arbitraire
,mois_arbitraire
,jour_arbitraire
,heures_arbitraires
,minutes_arbitraires
,secondes_arbitraires
);
/* Calcul de la duree en {secondes} ecoulee entre le 19700101000000 et la date arbitraire. */
Test(IL_FAUT(editer_l_en_tete))
Bblock
CAL2(Prin14("duree en secondes ecoulee du %02d/%02d/%04d %02d:%02d:%02d %s au %02d/%02d/%04d %02d:%02d:%02d %s = "
,LE_01_01_1970_A_00_00_00_JOUR
,LE_01_01_1970_A_00_00_00_MOIS
,LE_01_01_1970_A_00_00_00_ANNEE
,LE_01_01_1970_A_00_00_00_HEURES
,LE_01_01_1970_A_00_00_00_MINUTES
,LE_01_01_1970_A_00_00_00_SECONDES
,LE_01_01_1970_A_00_00_00_TZ
,jour_arbitraire
,mois_arbitraire
,annee_arbitraire
,heures_arbitraires
,minutes_arbitraires
,secondes_arbitraires
,GvarDefaut("TZ",LE_01_01_1970_A_00_00_00_TZ)
)
);
/* Puis edition... */
Eblock
ATes
Bblock
Eblock
ETes
CAL2(Prin1("%d\n"
,Secondes
)
);
/* Puis edition... */
Eblock
ETes
Eblock
ATes
Bblock
DEFV(CHAR,INIC(POINTERc(date),C_VIDE));
CONVERSION_D_UNE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00_EN_UNE_DATE(date,Secondes)
/* Conversion d'une duree en secondes ecoulee depuis le 19700101000000 en une date. */
/* ATTENTION, on notera bien que c'est une duree en secondes que l'on convertit et non pas */
/* la concatenation {secondes,micro-secondes} qui est la sortie par defaut du programme */
/* '$xcg/dure01011970$K'. On notera que le fichier '$xcg/dure01011970$vv$sed' permet de */
/* convertir (grace a '$SE') cette date en une date de format de type 'GDateC'... */
Test(IL_FAUT(compatibilite_20060419))
Bblock
CAL2(Prin1("%s\n",date));
Eblock
ATes
Bblock
CAL2(Prin1("%s",date));
/* En fait 'CONVERSION_D_UNE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00_EN_UNE_DATE(...)' */
/* semble placer un "K_LF" a la fin de 'date', d'ou cette nouvelle forme d'edition a compter */
/* du 20060419102005... */
Eblock
ETes
Eblock
ETes
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.