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