/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A V A N T - P R E M I E R 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_c3$vv$DEF' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 20040417150812).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   S Y S T E M E   U T I L I S E  :                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    on definit ici le systeme utilise                                                                              */
/*                  pour compiler les modules, et ce sous                                                                            */
/*                  la forme : ORDINATEUR/OS/COMPILATEUR,                                                                            */
/*                  ou 'OS' designe le systeme d'exploitation.                                                                       */
/*                  Les noms suivants sont reconnus pour                                                                             */
/*                  la variable-shell 'SYSTEME' :                                                                                    */
/*                                                                                                                                   */
/*                                      SYSTEME_APC_LinuxDebian_GCC,                                                                 */
/*                                      SYSTEME_APC_LinuxMandrake_GCC,                                                               */
/*                                      SYSTEME_APC_LinuxRedHat_GCC,                                                                 */
/*                                      SYSTEME_APC_LinuxUbuntu_GCC,                                                                 */
/*                                      SYSTEME_APC_LinuxUbuntu_ICC,                                                                 */
/*                                      SYSTEME_APC_LinuxUlmint_GCC,                                                                 */
/*                                      SYSTEME_APC_LinuxUlmint_ICC,                                                                 */
/*                                      SYSTEME_CRAY2_UNICOS_CC,                                                                     */
/*                                      SYSTEME_CRAY2_UNICOS_SCC,                                                                    */
/*                                      SYSTEME_CRAYC98_UNICOS_CC,                                                                   */
/*                                      SYSTEME_CRAYC98_UNICOS_SCC,                                                                  */
/*                                      SYSTEME_CRAYC916_UNICOS_CC,                                                                  */
/*                                      SYSTEME_CRAYC916_UNICOS_SCC,                                                                 */
/*                                      SYSTEME_CRAYYMP1_UNICOS_CC,                                                                  */
/*                                      SYSTEME_CRAYYMP1_UNICOS_SCC,                                                                 */
/*                                      SYSTEME_CRAYYMP2_UNICOS_CC,                                                                  */
/*                                      SYSTEME_CRAYYMP2_UNICOS_SCC,                                                                 */
/*                                      SYSTEME_CRAYYMP4_UNICOS_CC,                                                                  */
/*                                      SYSTEME_CRAYYMP4_UNICOS_SCC,                                                                 */
/*                                      SYSTEME_DECALPHA340_OSF1_CC,                                                                 */
/*                                      SYSTEME_DECALPHA340_OSF1_GCC,                                                                */
/*                                      SYSTEME_DECALPHA340_OSF1_CC,                                                                 */
/*                                      SYSTEME_DECALPHA340_OSF1_GCC,                                                                */
/*                                      SYSTEME_DPX2000_SPIX_CC,                                                                     */
/*                                      SYSTEME_DPX5000_SPIX_CC,                                                                     */
/*                                      SYSTEME_ES9000_AIX_CC,                                                                       */
/*                                      SYSTEME_FX2800_CONCENTRIX_FXC,                                                               */
/*                                      SYSTEME_FX2800_CONCENTRIX_PCC,                                                               */
/*                                      SYSTEME_FX2800_CONCENTRIX_SCC,                                                               */
/*                                      SYSTEME_FX40_CONCENTRIX_CC,                                                                  */
/*                                      SYSTEME_FX40_CONCENTRIX_FXC,                                                                 */
/*                                      SYSTEME_HP705_HPUX_CC,                                                                       */
/*                                      SYSTEME_HP710_HPUX_CC,                                                                       */
/*                                      SYSTEME_HP720_HPUX_CC,                                                                       */
/*                                      SYSTEME_HP750_HPUX_CC,                                                                       */
/*                                      SYSTEME_HP755_HPUX_CC,                                                                       */
/*                                      SYSTEME_HP819_HPUX_CC,                                                                       */
/*                                      SYSTEME_NWS3000_NEWSOS_CC,                                                                   */
/*                                      SYSTEME_NWS3000_NEWSOS_2CC,                                                                  */
/*                                      SYSTEME_RS6000_AIX_CC,                                                                       */
/*                                      SYSTEME_SG4D20G_IRIX_CC,                                                                     */
/*                                      SYSTEME_SG4D25TG_IRIX_CC,                                                                    */
/*                                      SYSTEME_SG4D310VGX_IRIX_CC,                                                                  */
/*                                      SYSTEME_SG4D35TG_IRIX_CC,                                                                    */
/*                                      SYSTEME_SG4D85GT_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND308_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND324_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND3GA_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND408_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND424_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND4GA_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND508_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND524_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND5GA_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND808_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND824_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGIND8GA_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGINDA08_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGINDA24_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGINDAGA_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGO200A1_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGO200A2_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGO200A4_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGO25224_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGO252VA_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGO252VN_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGPCM801_IRIX_CC,                                                                    */
/*                                      SYSTEME_SGPCMA01_IRIX_CC,                                                                    */
/*                                      SYSTEME_SPS9_ROS_CC,                                                                         */
/*                                      SYSTEME_SPS9_ROS_RC,                                                                         */
/*                                      SYSTEME_SUN3_SUNOS_CC,                                                                       */
/*                                      SYSTEME_SUN4_SUNOS_CC,                                                                       */
/*                                      SYSTEME_SUN4NCUBE2S_SUNOS_CC,                                                                */
/*                                      SYSTEME_SUN4NCUBE2S_SUNOS_NCC,                                                               */
/*                                      SYSTEME_VAX8600_ULTRIX_CC,                                                                   */
/*                                      SYSTEME_VAX8600_ULTRIX_VCC,                                                                  */
/*                                      SYSTEME_VAX9000_ULTRIX_CC,                                                                   */
/*                                      SYSTEME_VAX9000_ULTRIX_GCC,                                                                  */
/*                                      SYSTEME_VAX9000_ULTRIX_VCC.                                                                  */
/*                                                                                                                                   */
/*                  La variable 'SYSTEME' est definie par un                                                                         */
/*                  "#define" implicite lors de la phase de                                                                          */
/*                  pre-processing par 'cpp' (option "-D").                                                                          */
/*                                                                                                                                   */
/*                    Mais ATTENTION, actuellement, l'ensemble                                                                       */
/*                  des logiciels n'a ete teste que pour (le                                                                         */
/*                  symbole "-->" indiquant le compilateur qui est                                                                   */
/*                  effectivement utilise lorsqu'il y a le choix                                                                     */
/*                  entre plusieurs) :                                                                                               */
/*                                                                                                                                   */
/*                            -->       SYSTEME_APC_LinuxDebian_GCC,                                                                 */
/*                            -->       SYSTEME_APC_LinuxMandrake_GCC,                                                               */
/*                            -->       SYSTEME_APC_LinuxRedHat_GCC,                                                                 */
/*                            -->       SYSTEME_APC_LinuxUbuntu_GCC,                                                                 */
/*                            -->       SYSTEME_CRAY2_UNICOS_SCC,                                                                    */
/*                            -->       SYSTEME_CRAYC98_UNICOS_SCC,                                                                  */
/*                            -->       SYSTEME_CRAYC916_UNICOS_SCC,                                                                 */
/*                            -->       SYSTEME_CRAYYMP1_UNICOS_SCC,                                                                 */
/*                            -->       SYSTEME_CRAYYMP2_UNICOS_SCC,                                                                 */
/*                            -->       SYSTEME_CRAYYMP4_UNICOS_SCC,                                                                 */
/*                            -->       SYSTEME_DECALPHA340_OSF1_CC,                                                                 */
/*                            -->       SYSTEME_DECALPHA340_OSF1_GCC,                                                                */
/*                            -->       SYSTEME_DECALPHA340_OSF1_CC,                                                                 */
/*                            -->       SYSTEME_DECALPHA340_OSF1_GCC,                                                                */
/*                            -->       SYSTEME_DPX5000_SPIX_CC,                                                                     */
/*                            -->       SYSTEME_ES9000_AIX_CC,                                                                       */
/*                                      SYSTEME_FX2800_CONCENTRIX_FXC,                                                               */
/*                            -->       SYSTEME_FX2800_CONCENTRIX_SCC,                                                               */
/*                            -->       SYSTEME_HP705_HPUX_CC,                                                                       */
/*                            -->       SYSTEME_HP710_HPUX_CC,                                                                       */
/*                            -->       SYSTEME_HP720_HPUX_CC,                                                                       */
/*                            -->       SYSTEME_HP750_HPUX_CC,                                                                       */
/*                            -->       SYSTEME_HP755_HPUX_CC,                                                                       */
/*                            -->       SYSTEME_HP819_HPUX_CC,                                                                       */
/*                                      SYSTEME_NWS3000_NEWSOS_CC,                                                                   */
/*                            -->       SYSTEME_NWS3000_NEWSOS_2CC,                                                                  */
/*                            -->       SYSTEME_RS6000_AIX_CC,                                                                       */
/*                            -->       SYSTEME_SG4D20G_IRIX_CC,                                                                     */
/*                            -->       SYSTEME_SG4D25TG_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SG4D310VGX_IRIX_CC,                                                                  */
/*                            -->       SYSTEME_SG4D35TG_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SG4D85GT_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND308_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND324_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND3GA_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND408_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND424_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND4GA_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND508_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND524_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND5GA_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND808_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND824_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGIND8GA_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGINDA08_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGINDA24_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGINDAGA_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGO200A1_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGO200A2_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGO200A4_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGO25224_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGO252VA_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGO252VN_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGPCM801_IRIX_CC,                                                                    */
/*                            -->       SYSTEME_SGPCMA01_IRIX_CC,                                                                    */
/*                                      SYSTEME_SPS9_ROS_CC,                                                                         */
/*                            -->       SYSTEME_SPS9_ROS_RC,                                                                         */
/*                            -->       SYSTEME_SUN3_SUNOS_CC,                                                                       */
/*                            -->       SYSTEME_SUN4_SUNOS_CC,                                                                       */
/*                            -->       SYSTEME_SUN4NCUBE2S_SUNOS_CC,                                                                */
/*                            -->       SYSTEME_SUN4NCUBE2S_SUNOS_NCC,                                                               */
/*                            -->       SYSTEME_VAX9000_ULTRIX_GCC.                                                                  */
/*                                                                                                                                   */
/*                  et avec une bonne probabilite de reussite                                                                        */
/*                  pour :                                                                                                           */
/*                                                                                                                                   */
/*                                      SYSTEME_CRAY2_UNICOS_CC,                                                                     */
/*                                      SYSTEME_CRAYC98_UNICOS_CC,                                                                   */
/*                                      SYSTEME_CRAYC916_UNICOS_CC,                                                                  */
/*                                      SYSTEME_CRAYYMP1_UNICOS_CC,                                                                  */
/*                                      SYSTEME_CRAYYMP2_UNICOS_CC,                                                                  */
/*                                      SYSTEME_CRAYYMP4_UNICOS_CC,                                                                  */
/*                                      SYSTEME_FX40_CONCENTRIX_CC,                                                                  */
/*                                      SYSTEME_FX40_CONCENTRIX_FXC,                                                                 */
/*                                      SYSTEME_VAX8600_ULTRIX_CC,                                                                   */
/*                                      SYSTEME_VAX9000_ULTRIX_CC.                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R E N T H E S A G E  :                                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines      */
                                        /* definitions soient faites avant d'autres ; en particulier 'PARE(...)' doit etre definie   */
                                        /* avant tout '-define ...'.                                                                 */

#define   PARE(x)                                                                                                                       \
                    (x)                                                                                                                 \
                                        /* Parenthesage d'un argument. Pour des raisons liees a la derivation d'ordre superieur a    */ \
                                        /* 1 lors de l'utilisation de fonctions du type 'INTE(...)' ou 'INTE(...)', la fonction      */ \
                                        /* 'PARE(...)' a ete transferee de '$xil/defi_K1$vv$DEF' a '$xil/defi_c1$vv$DEF', puis       */ \
                                        /* a '$xil/defi_c3$vv$DEF' le 20040417150812...                                              */
-define   NEUT(x)                                                                                                                       \
-_-_-_-             PARE(x)
                                        /* Le 20050822173929, a cause de l'usage 'v $xrs/Mobius2D.11$I NEUD', la definition          */
                                        /* anterieure de 'NEUT(...)' :                                                               */
                                        /*                                                                                           */
                                        /*                  #define   NEUT(x)                                                     \  */
                                        /*                                      SE11(x)                                              */
                                        /*                                                                                           */
                                        /* a donc ete simplifiee et deplacee de '$xil/defi_K1$vv$DEF' a '$xil/defi_c3$vv$DEF'. En    */
                                        /* effet, le passage de '$PASSE_1' a '$PASSE_D' des definitions suivantes (en chaine...) :   */
                                        /*                                                                                           */
                                        /*                  NEUT                                                                     */
                                        /*                  SE11                                                                     */
                                        /*                  gSE11                                                                    */
                                        /*                  PARE                                                                     */
                                        /*                  LIS2                a cause de 'v $xil/defi_c1$vv$DEF MdTb1', ce qui     */
                                        /*                                      sinon cree des structures du type'PARE(...,...)'.    */
                                        /*                                                                                           */
                                        /* ne suffisaient pas car, en effet, apparaisaient alors dans les '$c' de type derivables    */
                                        /* des ecritures du type (d_(VARIABLE)) (ou "VARIABLE" designe une variable quelconque et    */
                                        /* et derivable), d'ou pour simplifier (et la, j'ai honte...), cette nouvelle definition     */
                                        /* et son demenagement...                                                                    */
#define   ndNEUT(x)                                                                                                                     \
                    PARE(x)                                                                                                             \
                                        /* Introduit le 20130330190521 pour 'v $xci/valeurs_Arbre.01$K ndNEUT'...                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G A R A N T I E   C O N C E R N A N T   L ' O R D R E   D E S   Q U A T R E   O P E R A T I O N S                          */
/*        D E   B A S E   A V E C   T Y P A G E   ' Float '   S I M U L T A N E  :                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    On donne donc le choix entre l'operateur                                                                       */
/*                  de base {+,-,*,/} et la fonction 'Float' qui                                                                     */
/*                  est associee a chacun d'eux soit respectivement                                                                  */
/*                  {sfADD2(...),sfSOUS(...),sfMUL2(...),sfDIVI(...)}.                                                               */
/*                                                                                                                                   */
/*                    On notera qu'il est malheureusement impossible                                                                 */
/*                  d'ecrire :                                                                                                       */
/*                                                                                                                                   */
/*                            #define   gDIVI(a,b)                                                                                \  */
/*                                                _____ifdef(++D++GooF++F++                                                       \  */
/*                                                          ,sfDIVI(a,b)                                                          \  */
/*                                                          ,PARE(PARE(a) / PARE(b))                                              \  */
/*                                                           )                                                                       */
/*                                                                                                                                   */
/*                  car cela equivaut a ecrire :                                                                                     */
/*                                                                                                                                   */
/*                            #define   gDIVI(a,b)                                                                                   */
/*                                                _____ifdef(++D++GooF++F++ ,sfDIVI(a,b) ,...)                                       */
/*                                                                         .            .                                            */
/*                                                                        /|\          /|\                                           */
/*                                                                         |            |                                            */
/*                                                                         |            |                                            */
/*                                                                                                                                   */
/*                  avec un blanc (au moins) devant les virgules ; cela                                                              */
/*                  rend faux le test '_____ifdef(...)' lorsque le symbole                                                           */
/*                  'GooF' existe (il est alors declare inexistant...).                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    L'activation du dispositif se fera par :                                                                       */
/*                                                                                                                                   */
/*                            ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF                                                        */
/*                                                                                                                                   */
/*                  et sa desactivation ensuite par :                                                                                */
/*                                                                                                                                   */
/*                            DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF                                                     */
/*                                                                                                                                   */
/*                  (a la facon de couples de parentheses)                                                                           */
/*                  et cela autant de fois que necessaire...                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    Mais ATTENTION, des experiences menees a l'aide de                                                             */
/*                  'v $xrs/sphere.11$K' ont montre que cette garantie ne                                                            */
/*                  peut porter globalement sur un tel programme, mais                                                               */
/*                  uniquement sur de petits modules (par exemple, le                                                                */
/*                  calcul des trois fonctions {Fx(u,v),Fy(u,v),Fz(u,v)} de                                                          */
/*                  ce programme. En effet, des operateurs tels :                                                                    */
/*                                                                                                                                   */
/*                            #define   IdTb1(vecteur,index,dimension)                                                            \  */
/*                                                PINDIRECT(ADD2(vecteur,ITb1c(index,dimension)))                                    */
/*                                                                                                                                   */
/*                  ne peuvent etre modifies selon :                                                                                 */
/*                                                                                                                                   */
/*                            #define   IdTb1(vecteur,index,dimension)                                                            \  */
/*                                                PINDIRECT(INTE(ADD2(vecteur,ITb1c(index,dimension))))                              */
/*                                                                                                                                   */
/*                  l'operateur d'indirection "*" n'acceptant pas le "cast"                                                          */
/*                  'Int' non plus evidemment que le type 'Float'                                                                    */
/*                  resultant de 'sfADD2(...)' via 'ADD2(...)'. Le 20040419084011                                                    */
/*                  ont ete introduits les quatre operateurs "Basiques" (et en                                                       */
/*                  particulier 'bADD(...)') destines a resoudre ce probleme.                                                        */
/*                  Mais cela n'etait pas suffisant ; il a fallu aussi faire la                                                      */
/*                  modification 'v $xil/defi_c1$vv$DEF 20040423155513'...                                                           */
/*                                                                                                                                   */
/*                    D'autre part, l'utilisation generalisee du mode 'GooF'                                                         */
/*                  pourrait creer des problemes dans de nombreux formats                                                            */
/*                  d'entrees-sorties de type "%d" qui attendent donc des                                                            */
/*                  nombres de type 'Int' et qui seraient alors de type 'Float'...                                                   */
/*                                                                                                                                   */
/*                    Le 20040419112422, j'ai remplace 'GarantirOrdreOperations_AvecTypeFloat'                                       */
/*                  par 'GooF' (une abbreviation...) afin de reduire la longueur des                                                 */
/*                  chaines traitees par '$xcc/xpp$X' (message "actuals too long").                                                  */
/*                                                                                                                                   */
/*                    Le 20040419123740, il a fallu substituer {+-D-+,+-F-+} de                                                      */
/*                  substitution des quotes de '$M4' par {++D++,++F++} dans                                                          */
/*                  'v $xccp/GarOrdre$vv$m4 _____changequote' a cause des                                                            */
/*                  options '-c$PASSE_D ... -k$Us' lors d'un '$xcp/cpp$X'                                                            */
/*                  de "Derivations d'ordre superieur". Au passage, il etait                                                         */
/*                  essentiel de remplacer "-" par un caractere non alpha-numerique                                                  */
/*                  (tel "+") afin de ne pas provoquer de concatenation avec un                                                      */
/*                  nom de symbole (de ce point de vue-la, '_SYMBOLE_' et '-SYMBOLE-'                                                */
/*                  sont bien differents...). Rappelons qu'a cette date, la                                                          */
/*                  valeur de '$PASSE_D' est precisemment "-"...                                                                     */
/*                                                                                                                                   */
/*                    Le 20040504142248 je suis passe de {_____define,_____undefine}                                                 */
/*                  a {_____pushdef,_____popdef} qui est beaucoup plus asticieux et                                                  */
/*                  beaucoup plus prudent. Cela permet ainsi d'imbriquer volontairement                                              */
/*                  ou involontairement (par exemple via des 'include's) ces activations                                             */
/*                  et desactivations de 'GooF' et ce sans risque, par exemple, de desactiver                                        */
/*                  (a cause donc d'un '_____undefine(...)' imbrique lui-meme a l'interieur                                          */
/*                  d'un {_____define,_____undefine}) le dispositif...                                                               */
/*                                                                                                                                   */
/*                    Du cote des performances, l'experience montre qu'il                                                            */
/*                  vaut mieux eviter d'appliquer 'GooF' globalement a tout                                                          */
/*                  un programme. A titre d'exemple le calcul de 'v $xiirs/MOB3.11'                                                  */
/*                  (a la base du probleme 'v $xiirs/$Fnota 20040330115702'), qui                                                    */
/*                  en temps normal prend environ une minute sur '$LACT15' ), n'etait                                                */
/*                  pas termine au bout de 24 heures en mode 'GooF' global...                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    Enfin, on notera que lorsque le mode 'GooF' est active,                                                        */
/*                  alors il resoud simultanement le probleme ennuyeux decrit                                                        */
/*                  dans 'v $Fcompilers 20040220103647'.                                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ATTENTION :                                                                                                                */
/*                                                                                                                                   */
/*                    En resume donc, d'une part l'activation et la                                                                  */
/*                  desactivation du mode 'GooF' se fait respectivement                                                              */
/*                  par :                                                                                                            */
/*                                                                                                                                   */
/*                            #define   PRAGMA_CPP_____AUTORISER_LE_GooF                                                             */
/*                                                                                                                                   */
/*                  avant tout include (et en particulier avant l'include                                                            */
/*                  "DEFINITIONS.I") pour autoriser le processus ; puis                                                              */
/*                  pour l'activer la ou cela est necessaire :                                                                       */
/*                                                                                                                                   */
/*                            ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF                                                        */
/*                                                                                                                                   */
/*                  et :                                                                                                             */
/*                                                                                                                                   */
/*                            DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF                                                     */
/*                                                                                                                                   */
/*                  (a la facon de couples de parentheses). D'autre                                                                  */
/*                  part, lors de problemes ponctuels survenant lorsque                                                              */
/*                  le mode 'GooF' est active, on pourra remplacer                                                                   */
/*                  localement l'un des operateurs {ADD2(...),SOUS(...),MUL2(...),DIVI(...)}                                         */
/*                  par sa version "Basique" {bADD(...),bSOU(...),bMUL(...),bDIV(...)}.                                              */
/*                  Cela sera, par exemple le cas d'entrees-sorties en format "%d"...                                                */
/*                                                                                                                                   */
/*                    Enfin, l'utilsation du mode 'GooF' n'est conseille que                                                         */
/*                  que sur de petis modules afin de reduire la duree du                                                             */
/*                  travail de '$xcc/cpp$Z' et de ne pas trop penaliser les                                                          */
/*                  performances du '$X' ainsi genere...                                                                             */
/*                                                                                                                                   */
/*                    Une experience effectuee le 20070125160322 sur                                                                 */
/*                  'v $xcg/ADD3.01$K GooF' ont montre que les appels a                                                              */
/*                  {ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF,DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF}             */
/*                  pouvaient se trouver eux-memes dans une procedure. Ainsi,                                                        */
/*                  il sera possible d'ecrire :                                                                                      */
/*                                                                                                                                   */
/*                            #define   PROCEDURE(arguments)                                                                      \  */
/*                                                Bblock                                                                          \  */
/*                                                BLOC(SEQUENCE1;);                                                               \  */
/*                                                ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF                                 \  */
/*                                                BLOC(SEQUENCE2;);                                                               \  */
/*                                                DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF                              \  */
/*                                                BLOC(SEQUENCE3;);                                                               \  */
/*                                                Eblock                                                                             */
/*                                                                                                                                   */
/*                  puis :                                                                                                           */
/*                                                                                                                                   */
/*                            PROCEDURE(arguments);                                                                                  */
/*                                                                                                                                   */
/*                  Dans cet exemple les blocs {SEQUENCE1,SEQUENCE3}                                                                 */
/*                  s'executeront en mode "normal", alors que le bloc                                                                */
/*                  {SEQUENCE2} s'executera en mode 'GooF'.                                                                          */
/*                                                                                                                                   */
/*                  Une application de cela est de definir des fonctions                                                             */
/*                  qui pourraient s'executer en mode "normal" ou en mode                                                            */
/*                  'GooF' en definissant leur "contenu" via une procedure                                                           */
/*                  telle 'PROCEDURE(...)' ci-apres :                                                                                */
/*                                                                                                                                   */
/*                            #define   PROCEDURE(arguments)                                                                      \  */
/*                                                Bblock                                                                          \  */
/*                                                BLOC(SEQUENCE;);                                                                \  */
/*                                                Eblock                                                                             */
/*                                                                                                                                   */
/*                  et en programmant ainsi le corps de la fonction :                                                                */
/*                                                                                                                                   */
/*                            Bblock                                                                                                 */
/*                            Test(IL_FAUT(executer_la_fonction_en_mode_normal))                                                     */
/*                                 Bblock                                                                                            */
/*                                 PROCEDURE(arguments);                                                                             */
/*                                 Eblock                                                                                            */
/*                            ATes                                                                                                   */
/*                                 Bblock                                                                                            */
/*                                 ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF                                                   */
/*                                 PROCEDURE(arguments);                                                                             */
/*                                 DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF                                                */
/*                                 Eblock                                                                                            */
/*                            ETes                                                                                                   */
/*                            Eblock                                                                                                 */
/*                                                                                                                                   */
/*                  et ainsi la fonction a bien deux modes possibles d'execution                                                     */
/*                  controles par l'indicateur 'executer_la_fonction_en_mode_normal'.                                                */
/*                  Voir 'v $xil/defi_K2$vv$DEF US._GooF' a ce propos...                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P E R A T I O N S   A R I T H M E T I Q U E S   D ' A D D I T I O N  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   bADD(a,b)                                                                                                                     \
                    PARE(PARE(a) + PARE(b))                                                                                             \
                                        /* Addition des deux nombres 'a' et 'b'.                                                     */

                                        /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines      */
                                        /* definitions soient faites avant d'autres ; en particulier 'bADD(...)' doit etre definie   */
                                        /* avant tout '-define ...' qui l'utilise...                                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P E R A T I O N S   A R I T H M E T I Q U E S   D E   S O U S T R A C T I O N  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   bSOU(a,b)                                                                                                                     \
                    PARE(PARE(a) - PARE(b))                                                                                             \
                                        /* Soustraction des deux nombres 'a' et 'b'.                                                 */ \
                                        /*                                                                                           */ \
                                        /* Le 20061030121314 je note, qu'etant donne la notion d'arithmetique etendue, il est        */ \
                                        /* possible qu'il soit preferable de definir la soustraction a partir de l'addition          */ \
                                        /* suivant :                                                                                 */ \
                                        /*                                                                                           */ \
                                        /*                  a - b = a + (-b)                                                         */ \
                                        /*                                                                                           */ \
                                        /* de facon a ce qu'en modifiant les ponderations 'ponderation_de_*_dans_FfxADD2' (qui       */ \
                                        /* modifient le comportement de la fonction 'FfxADD2(...)') on modifie simultanement le      */ \
                                        /* comportement de la fonction 'FfxSOUS(....)'...                                            */ \
                                        /*                                                                                           */ \
                                        /* Cela fut fait le 20061030152833 : 'v $xig/fonct$vv$FON FfxxSOUS'...                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P E R A T I O N S   A R I T H M E T I Q U E S   D E   M U L T I P L I C A T I O N  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   bMUL(a,b)                                                                                                                     \
                    PARE(PARE(a) * PARE(b))                                                                                             \
                                        /* Multiplication des deux nombres 'a' et 'b'.                                               */
#define   bDOU(a)                                                                                                                       \
                    bMUL(DEUX,a)                                                                                                        \
                                        /* Double d'un nombre 'a' (introduit le 20100319085921 pour 'v $xil/defi_K2$vv$DEF NBITOC'). */

                                        /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines      */
                                        /* definitions soient faites avant d'autres ; en particulier 'bMUL(...)' doit etre definie   */
                                        /* avant tout '-define ...' qui l'utilise...                                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P E R A T I O N S   A R I T H M E T I Q U E S   D E   D I V I S I O N  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   bDIV(a,b)                                                                                                                     \
                    PARE(PARE(a) / PARE(b))                                                                                             \
                                        /* Division des deux nombres 'a' et 'b'.                                                     */ \
                                        /*                                                                                           */ \
                                        /* Le 20061030121314 je note, qu'etant donne la notion d'arithmetique etendue, il est        */ \
                                        /* possible qu'il soit preferable de definir la division a partir de la multiplication       */ \
                                        /* suivant :                                                                                 */ \
                                        /*                                                                                           */ \
                                        /*                  a / b = a * (1/b)                                                        */ \
                                        /*                                                                                           */ \
                                        /* de facon a ce qu'en modifiant les ponderations 'ponderation_de_*_dans_FfxMUL2' (qui       */ \
                                        /* modifient le comportement de la fonction 'FfxMUL2(...)') on modifie simultanement le      */ \
                                        /* comportement de la fonction 'FfxDIVZ(....)'...                                            */ \
                                        /*                                                                                           */ \
                                        /* Cela fut fait le 20061030152833 : 'v $xig/fonct$vv$FON FfxxDIVZ'...                       */
#define   bMOI(a)                                                                                                                       \
                    bDIV(a,DEUX)                                                                                                        \
                                        /* Moitie d'un nombre 'a' (introduit le 20100319085921 pour 'v $xil/defi_K2$vv$DEF NOCHW').  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   E N T R E   S A N S   E T   A V E C                                                                            */
/*        G A R A N T I E   C O N C E R N A N T   L ' O R D R E   D E S   Q U A T R E   O P E R A T I O N S                          */
/*        D E   B A S E   A V E C   T Y P A G E   ' Float '   S I M U L T A N E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    PRAGMA_CPP_____AUTORISER_LE_GooF

#    ifdef     PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
                                        /* Cas de l'arithmetique etendue des nombres flottants :                                     */
                                        /*                                                                                           */
                                        /* cette possibilite a ete introduite le 20050305211855...                                   */
                                        /*                                                                                           */
                                        /* On notera le 20061018120223 que cette option a vu apparaitre une certaine forme de        */
                                        /* "concurrence" avec 'v $xig/fonct$vv$FON 20061018104520' ; cette nouvelle possibilite      */
                                        /* possede un avantage sur cette option : celle de l'aspect dynamique, puisque cette         */
                                        /* nouvelle possibilite peut etre activee/desactivee a l'execution...                        */
#         include   DEFINIT_cC_DEF
                                        /* Definition des quatre fonctions arithmetiques de base {sfADD2,sfSOUS,sfMUL2,sfDIVI}       */
                                        /* lorsque l'extension de cette derniere est demandee...                                     */

#         define    GENERER_LES_GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS                               \
                                        /* A priori...                                                                               */
#    Aifdef    PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
                                        /* Cas de l'arithmetique traditionnelle des nombres flottants :                              */
#         include   DEFINIT_cD_DEF
                                        /* Definition des quatre fonctions arithmetiques de base {sfADD2,sfSOUS,sfMUL2,sfDIVI}       */
                                        /* lorsque l'extension de cette derniere n'est pas demandee.                                 */
                                        /*                                                                                           */
                                        /* Ces quatre fonctions ont ete deplacees depuis 'v $xig/fonct$vv$DEF' le 20040423150108     */
                                        /* afin que tout fonctionne correctement avec les operateurs derivables...                   */
#    Eifdef    PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS

@    define    PRAGMA_CPP_____LE_GooF_EST_ACTIVABLE
                                        /* Introduit le 20040425104638 pour 'v $xcc/cpp$Z 20040425104801'...                         */
#    include   DEFINIT_cA_DEF
                                        /* Cas ou le 'GooF' est autorise ; il suffit de l'activer la ou il est necessaire...         */
#Aifdef   PRAGMA_CPP_____AUTORISER_LE_GooF

#    ifdef     PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
#         message   "ATTENTION : l'extension de l'arithmetique est demandee alors que l'option 'GooF' n'est pas activable."
#    Aifdef    PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
#    Eifdef    PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS

#    include   DEFINIT_cB_DEF
                                        /* Cas ou le 'GooF' est inhibe.                                                              */
#Eifdef   PRAGMA_CPP_____AUTORISER_LE_GooF
                                        /* ATTENTION : on notera le passage par des fichiers d'include alors qu'il pourrait          */
                                        /* sembler etre plus simple de rendre conditionnelles les quatre definitions des operateurs  */
                                        /* de base {ADD2(...),SOUS(...),MUL2(...),DIVI(...)}. En fait, cela est impossible a cause   */
                                        /* de la derivation formelle (lorsque cela est demandee...). En effet, les operateurs qui    */
                                        /* sont derivables ne peuvent pas (est-ce bien sur ?) etre conditionnels...                  */
                                        /*                                                                                           */
                                        /* Le 20040420174339, 'PRAGMA_CPP_____PAS_DE_GooF' fut change  en                            */
                                        /* 'PRAGMA_CPP_____AUTORISER_LE_GooF' et donc inverse les conventions. En effet, il est      */
                                        /* evident que ce dispositif sera assez peu utilise ; or il est assez penalisant au niveau   */
                                        /* de '$xcc/cpp$Z' et pour certains '$K' (tels 'v $xbmcf/$xbmcf/conformes$K',                */
                                        /* 'v $xrk/rdn_walk.52$K',...) il est meme impossible (par manque de ressources...). Il vaut */
                                        /* mieux donc pouvoir l'autoriser si besoin est et l'inhiber par defaut...                   */



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