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