/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S E C O N D E   P A R T I E   D E S   D E F I N I T I O N S   D U   L A N G A G E   ' K '                                  */
/*        D E P E N D A N T E S   D U   L A N G A G E   S O U R C E   ( ' C ' )  :                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Dans ce fichier, se trouvent toutes les                                                                        */
/*                  constantes, les definitions et les macros                                                                        */
/*                  utiles a la definition du langage 'K' et                                                                         */
/*                  qui dependent du langage source (le 'C').                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xil/defi_c2$vv$DEF' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D ' A C C E S   A   L ' E N V I R O N N E M E N T  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   POINTEUR_D_UNE_VARIABLE_UNDEF                                                                                                 \
                    ZERO                                                                                                                \
                                        /* Valeur du pointeur renvoye par 'getenv()' pour une variable inexistante...                */
#define   VALEUR_D_UNE_VARIABLE_UNDEF                                                                                                   \
                    CHAINE_UNDEF                                                                                                        \
                                        /* Valeur d'une variable inexistante apres un 'Gvar()'...                                    */

DEFV(Extern,DEFV(CHAR,POINTERc(getenv())));
                                        /* Le 20040603105032, la definition de 'getenv(...)' est passee de 'FonctionC' a 'CHAR'      */
                                        /* a cause de 'v $xil/defi_K2$vv$DEF DebutDeDefinitionDeFonction' et ce afin donc que ce     */
                                        /* marqueur n'apparaisse pas dans un 'Extern'...                                             */

#if       (         (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )
                                        /* Test introduit le 20071121111207 a cause de '$LACT18'...                                  */
                                        /*                                                                                           */
                                        /* Le SYSTEME 'SYSTEME_APC_LinuxRedHat_GCC' a ete introduit le 20090318090854 suite au       */
                                        /* remplacement de "trinite.polytechnique.fr" par "europe.polytechnique.fr" (='$CMAP28',     */
                                        /* 'v $Fmachines 20090316110150').                                                           */
#    define    GvarDefaut(variable,valeur_par_defaut)                                                                                   \
                         COND(IFNE(Cara(getenv(variable)),Cara(POINTEUR_D_UNE_VARIABLE_UNDEF))                                          \
                             ,Cara(getenv(variable))                                                                                    \
                             ,Cara(valeur_par_defaut)                                                                                   \
                              )                                                                                                         \
                                        /* Recuperation d'une variable definie par 'setenv' avec valeur par defaut.                  */
#Aif      (         (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )
#    define    GvarDefaut(variable,valeur_par_defaut)                                                                                   \
                         COND(IFNE(getenv(variable),POINTEUR_D_UNE_VARIABLE_UNDEF)                                                      \
                             ,getenv(variable)                                                                                          \
                             ,ptCARA(valeur_par_defaut)                                                                                 \
                              )                                                                                                         \
                                        /* Recuperation d'une variable definie par 'setenv' avec valeur par defaut.                  */
#Eif      (         (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )

DEFV(Extern,DEFV(vrai_Int_de_base,putenv()));
                                        /* On notera le 20110226101007 qu'il serait peu utile de definir de plus :                   */
                                        /*                                                                                           */
                                        /*                  DEFV(Extern,DEFV(vrai_Int_de_base,putenv()));                            */
                                        /*                                                                                           */
                                        /* car, en effet, cela ne permet de modifier une variable que dans l'environnement du        */
                                        /* process '$X' courant et non pas (malheureusement...) dans le '$CSH' qui a lance           */
                                        /* l'execution de ce '$X'. J'ai note cela alors que je faisais des tests en vue de           */
                                        /* renvoyer 'v $xig/common$STR liste_des_CODE_ERREUR_rencontres' au '$CSH' a la sortie       */
                                        /* de chaque '$X' afin de pouvoir tester, si besoin etait, l'ensemble des codes d'erreur     */
                                        /* rencontres...                                                                             */
                                        /*                                                                                           */
                                        /* Finalement, je l'introduit le 20120214082654 car, en effet, cela va etre utile pour       */
                                        /* les '$x' qui creent des process "fils", par exemple dans des activites paralleles...      */

#define   PvarDefaut(variable,valeur)                                                                                                   \
                    putenv(EGAs(chain_Aconcaten3(variable,"=",valeur)))                                                                 \
                                        /* Mise d'une variable dans l'environnement (introduit le 20120214091448)...                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   C O N V E R S I O N S   N U M E R I Q U E S  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Extern,DEFV(vrai_Int_de_base,atoi()));
#define   Conversion_Int(chaine_numerique)                                                                                              \
                    INTE(atoi(chaine_numerique))                                                                                        \
                                        /* Acces a la fonction de conversion alpha-NUMERIQUE --> valeur entiere, sans test de ce     */ \
                                        /* qui pourrait trainer derriere...                                                          */ \
                                        /* On notera la fonction 'INTE(...)' mise en place le 1995072400 afin d'eviter des           */ \
                                        /* problemes du type :                                                                       */ \
                                        /*                                                                                           */ \
                                        /*                  ...: warning(1177): argument is incompatible with formal                 */ \
                                        /*                                                                                           */ \
                                        /* sur 'SYSTEME_SGPCM801_IRIX_CC'...                                                         */
#define   Conversion_Logical(chaine_numerique)                                                                                          \
                    LOGI(atoi(chaine_numerique))                                                                                        \
                                        /* Acces a la fonction de conversion alpha-NUMERIQUE --> valeur logique (introduite le       */ \
                                        /* 20180218111641...).                                                                       */

DEFV(Extern,DEFV(vrai_Long_Int_de_base,strtol()));
%define   Conversion_generale_int(chaine_numerique,chaine_residuelle)                                                                   \
                    strtol(chaine_numerique,ADRESSE(chaine_residuelle),BASE10)
                                        /* Acces a la fonction de conversion alpha-NUMERIQUE --> valeur entiere, avec test de ce     */
                                        /* qui pourrait trainer derriere... On notera l'utilisation de '$PASSE_3' ("%") car, en      */
                                        /* effet, 'Conversion_generale_Int' est utilisee dans '$xig/fonct$vv$FON' en conjonction     */
                                        /* avec l'operateur de concatenation ("`") de '$xcc/cpp$Z'. ATTENTION, on ne peut ecrire :   */
                                        /*                                                                                           */
                                        /*                  %define   Conversion_generale_Int(...)                                \  */
                                        /*                                                                                           */
                                        /*                                                \_/                                        */
                                        /*                                                                                           */
                                        /* a cause de l'usage :                                                                      */
                                        /*                                                                                           */
                                        /*                  Conversion_generale`fonction_de_conversion(...)                          */
                                        /*                                                                                           */
                                        /* qui en est fait dans '$xig/fonct$vv$FON' ; en effet, cela impliquerait l'utilisation de   */
                                        /* 'Int' en tant qu'argument de 'GENERE__FonctionI_Fload(...)' ; or, 'Int' est lui-meme      */
                                        /* une procedure ; il y aurait donc un conflit d'usage...                                    */

                                        /* ATTENTION, etant donne que 'Conversion_generale_genp(...)' et 'GENP(...)' n'appartiennent */
                                        /* pas a la meme '$PASSE_?', la definition de 'Conversion_generale_genp(...)' ne peut avoir  */
                                        /* lieu qu'apres celle de 'GENP(...)' ('v $xiii/Images$DEF Conversion_generale_genp').       */

DEFV(Extern,DEFV(vrai_double_de_base,atof()));
#define   Conversion_Float(chaine_numerique)                                                                                            \
                    atof(chaine_numerique)                                                                                              \
                                        /* Acces a la fonction de conversion alpha-NUMERIQUE --> valeur flottante, sans test de ce   */ \
                                        /* qui pourrait trainer derriere...                                                          */

DEFV(Extern,DEFV(vrai_double_de_base,strtod()));
%define   Conversion_generale_flot(chaine_numerique,chaine_residuelle)                                                                  \
                    strtod(chaine_numerique,ADRESSE(chaine_residuelle))
                                        /* Acces a la fonction de conversion alpha-NUMERIQUE --> valeur flottante, avec test de ce   */
                                        /* qui pourrait trainer derriere... On notera l'utilisation de '$PASSE_3' ("%") car, en      */
                                        /* effet, 'Conversion_generale_Float' est utilisee dans '$xig/fonct$vv$FON' en conjonction   */
                                        /* avec l'operateur de concatenation ("`") de '$xcc/cpp$Z'. ATTENTION, on ne peut ecrire :   */
                                        /*                                                                                           */
                                        /*                  %define   Conversion_generale_Float(...)                              \  */
                                        /*                                                                                           */
                                        /*                                                \___/                                      */
                                        /*                                                                                           */
                                        /* a cause de l'usage :                                                                      */
                                        /*                                                                                           */
                                        /*                  Conversion_generale`fonction_de_conversion(...)                          */
                                        /*                                                                                           */
                                        /* qui en est fait dans '$xig/fonct$vv$FON' ; en effet, cela impliquerait l'utilisation de   */
                                        /* 'Float' en tant qu'argument de 'GENERE__FonctionI_Fload(...)' ; or, 'Float' est lui-meme  */
                                        /* une procedure ; il y aurait donc un conflit d'usage...                                    */



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.