/*************************************************************************************************************************************/ /* */ /* 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_c1$vv$DEF' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19940000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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. */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N C A T E N A T I O N A V E C E S P A C E M E N T : */ /* */ /*************************************************************************************************************************************/ #define KONC(a,b) \ a b \ /* Concatenation avec espacement ; elle est destinee en fait uniquement a calculer la */ \ /* taille de certains types (par exemple 'size_Int' et 'size_Positive')... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* B U G S T R E S G E N E R A U X : */ /* */ /*************************************************************************************************************************************/ #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) /* Introduit le 20241120144302 et complete le 20241121095824 avec {Debian,Mandrake,RedHat}, */ /* le probleme correspondant se manifestant aussi sur '$CMAP28'... */ # define BUG_SYSTEME_APC_GCC_tableaux_statiques_trop_volumineux_1 \ /* Voir le probleme 'v $xil/defi_c1$vv$DEF 20241120150941'... */ #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) # nTestADef BUG_SYSTEME_APC_GCC_too_large_stack_frames \ /* Le compilateur 'gcc' ne tolere pas des tableaux locaux (et donc implantes dans la pile) */ \ /* de trop grande taille (de l'ordre de 1047923*8 octets). Pour plus de details, on pourra */ \ /* consulter 'v $Dbugs/APC$D/LinuxRedHat$D/GCC$D/lorenz.11$c'. Le 20000308085017, la */ \ /* reponse au "bug report" est de "customiser" avec 'ulimit', d'ou d'une part 'nTestADef' */ \ /* de desactivation du bug, et d'autre part 'v $xE/.profile$vv$Y ulimit'... */ /* Jusqu'au 20040227141752, il y a eu ici : */ /* */ /* # nTestADef BUG_SYSTEME_APC_GCC_optimisation_01 */ /* */ /* ce symbole ayant ete change en 'BUG_SYSTEME_APC_GCC_ExcessPrecisionProblem_01' */ /* le 20040303094121. Mais le 20040227141752, 'BUG_SYSTEME_APC_GCC_optimisation_01' */ /* (remplace donc le 20040303094121 par 'BUG_SYSTEME_APC_GCC_ExcessPrecisionProblem_01') */ /* a ete introduit dans 'v $xcp/Bugs$K BUG_SYSTEME_APC_GCC_ExcessPrecisionProblem_01' (pour */ /* y etre genere automatiquement...). */ /* */ /* l'optimisation ('O1', 'O2' ou 'O3') provoque un comportement anormal de certaines */ /* fonctions ('v $xiii/tri_image$FON IFproduit_generalise_inverse_a_gauche_A1' par exemple */ /* pour laquelle le test 'Test(IFGT(distance_minimale_...))' est systematiquement VRAI pour */ /* l'integralite de 50% des lignes (environ...) meme si cela n'est pas possible. Ceci a */ /* ete introduit le 20040203155437 et se manifeste a cette date sur '$LACT15' et '$LACT16'. */ /* */ /* Il est a noter qu'une autre facon de lutter contre ce fleau consiste a supprimer tout */ /* simplement l'optimisation dans la definition de '$Cc' ; malheureusement, cette solution */ /* est mauvaise car alors les performances chutent brutalement ; en contre-partie, elle */ /* s'applique partout ou ce "bug" existe (a condition de recompiler...), alors que le */ /* solution ici utilisee demande a ce que les fonctions problematiques aient ete recensees. */ /* */ /* Ce bug a ete supprime le 20040204122533 apres l'introduction d'une finesse plus grande */ /* dans la non optimisabilite des modules ('v $xcc/cb$Z PRAGMA_CL_____BLOC_NON_OPTIMISABLE') */ /* et a donc ete introduit dans 'v $xiii/tri_image$FON PRAGMA_CL_____BLOC_NON_OPTIMISABLE'. */ /* */ /* Le 20040209153210, le programme 'v $Dbugs/APC$D/LinuxDebian$D/GCC$D/flottant.01$c' a */ /* definitivement mis en cause la compilation et l'optimisation ; ce n'est donc pas moi */ /* qui suis reponsable... */ /* */ /* Le 20040219161107, j'ai note deux facons de faire disparaitre le probleme decrit dans */ /* 'v $Dbugs/APC$D/LinuxDebian$D/GCC$D/flottant.01$c' et dans */ /* 'v $Dbugs/APC$D/LinuxDebian$D/GCC$D/flottant.02$c' en utilisant l'une des deux options */ /* suivantes pour '$Cc' : */ /* */ /* -ffloat-store */ /* */ /* qui est disponible partout (elle reduit de 80 a 64 bits la precision) et : */ /* */ /* -mfpmath=sse,387 -msse2 */ /* */ /* qui elle utilise simultanement les instructions flottantes du jeu 'standard 387' et les */ /* instructions du jeu 'SSE'. Malheureusement, a cette date, cette derniere possibilite */ /* est disponible sur '$LACT16', mais pas sur '$LACT15'... Par contre, en ce qui concerne */ /* le probleme 'v $Dbugs/APC$D/LinuxDebian$D/GCC$D/flottant.14$c', seule l'option : */ /* */ /* -mfpmath=sse,387 -msse2 */ /* */ /* le corrige (alors qu'elle n'est pas disponible sur '$LACT15'...). Cela prouve bien que */ /* le probleme 'v $Dbugs/APC$D/LinuxDebian$D/GCC$D/flottant.02$c' (dit "direct") et */ /* le probleme 'v $Dbugs/APC$D/LinuxDebian$D/GCC$D/flottant.14$c' (dit "inverse") sont */ /* deux problemes differents puisque l'option '-mfpmath=sse,387 -msse2' corrige les deux... */ /* */ /* Le 20040220111433, je note que grace a 'v $Fcompilers 20040220103647' ce "bug" n'a en */ /* fait plus de raisons d'etre, mais je conserve tout ce qui precede parce que cela semble */ /* bien precieux... */ /* */ /* Le 20040222103215, j'ai trouve l'explication "finale". Imaginons donc deux nombres */ /* flottants 'A' et 'B' qui viennent d'etre calcules dans les registres flottants 80 bits. */ /* Ils vont etre qualifies par la suite de "compatibles" ce qui signifie que l'on peut */ /* faire de l'arithmetique entre-eux et surtout les comparer sans ambiguite. Imaginons */ /* alors que par un manque de ressources flottantes le nombre 'A' (par exemple) soit */ /* contraint de retourner en memoire (il se retrouve alors en 64 bits) "sans que */ /* l'optimiseur s'en rende compte" (c'est-la le "bug" !). Si ensuite les deux nombres */ /* 'A' (64 bits) et 'B' (80 bits) doivent etre compares, le nombre 'A' est ramene dans */ /* un registre flottant et on lui ajoute donc 16 bits (tres certainement nuls). Les deux */ /* nombres 'A' et 'B' ne sont plus "compatibles" et si le test est fait ainsi malgre tout */ /* (ce qui est le cas dans le contexte de ce "bug") son resultat ne peut etre que faux... */ /* */ /* Finalement ce probleme est connu depuis une dizaine d'annees sous le nom de "excess */ /* precision problem" ('v $Dcourrier_in/20040227142837 wilson@specifixinc.com'). */ /* */ /* On notera l'introduction dans 'v $xig/fonct$vv$DEF 20040303135217' de fonctions qui */ /* sont destinees a garantir la qualite des tests portant sur les nombres 'Float' ; ainsi */ /* en forcant leur passage dans la pile avant le test, on garantit leur mise sur 64 bits */ /* quel que soit le format anterieur (64 ou 80 bits...). */ #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) #if ( (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ ) # TestADef BUG_SYSTEME_DECALPHA_OSF1_CC_large_stack_frames_not_yet_supported \ /* Le compilateur 'cc' ne tolere pas des tableaux locaux aux fonctions (et donc implantes */ \ /* dans la pile) de trop grande taille (de l'ordre de 128*1024 octets...). */ \ /* */ \ /* On notera par la suite (dans les fichiers 'v $xiii/di_image$DEF', 'v $xiii/entrees$DEF' */ \ /* et 'v $xiii/quad_image$FON') les tests simultanes de : */ \ /* */ \ /* BUG_SYSTEME_DECALPHA_OSF1_CC_large_stack_frames_not_yet_supported */ \ /* */ \ /* et de : */ \ /* */ \ /* BUG_SYSTEME_DECALPHA340_OSF1_CC_large_stack_frames_not_yet_supported */ \ /* BUG_SYSTEME_DECALPHA350_OSF1_CC_large_stack_frames_not_yet_supported */ \ /* BUG_SYSTEME_DECALPHA464_OSF1_CC_large_stack_frames_not_yet_supported */ \ /* */ \ /* afin de garantir la compatibilite entre '$xil/defi_c1.vA$DEF' et '$xil/defi_c1$vv$DEF. */ #Aif ( (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ ) #Eif ( (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ ) #if ( (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # nTestADef BUG_SYSTEME_VAX_ULTRIX_GCC_jumps_superieurs_a_32_kilo_octets \ /* Le compilateur 'gcc' supporte mal les sauts de portee superieure a 32 kilo-octets. */ #Aif ( (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) #Eif ( (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N C L U D E S S Y S T E M E S : */ /* */ /* */ /* Nota : */ /* */ /* Le symbole 'NO_DEFINES_SYSTEMES' */ /* permet de faire ou pas les includes */ /* systemes : on ne les fait pas s'il */ /* est defini... */ /* */ /*************************************************************************************************************************************/ #ifndef NO_INCLUDES_SYSTEMES @ if ( (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) @ define __USE_FILE_OFFSET64 /* Introduit le 20071121102508 afin d'eviter les messages : */ /* */ /* warning: incompatible implicit declaration of built-in function 'malloc' */ /* warning: incompatible implicit declaration of built-in function 'exit' */ /* */ /* sur '$LACT18'... */ /* */ /* ATTENTION : je note le 20080116092751 que '__USE_FILE_OFFSET64' doit etre defini avant */ /* les 'include's car, en effet, il est utilise dans beaucoup d'entre-eux... */ @ Aif ( (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) @ Eif ( (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) @ if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ ) @ define __USE_LARGEFILE64 @ define __USE_FILE_OFFSET64 /* Introduit le 20060520121632 suite au probleme 'v $xcg/fichier_etat$K 20060519191756'... */ /* */ /* ATTENTION : je note le 20080116092751 que '__USE_LARGEFILE64' et '__USE_FILE_OFFSET64' */ /* doivent etre definis avant les 'include's car, en effet, ils sont utilises dans beaucoup */ /* d'entre-eux... */ @ Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ ) @ Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ ) @ include <errno.h> /* Definit les erreurs standards... */ @ include <stdio.h> /* Definit les entrees-sorties standard. */ @ 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)) \ ) /* Le SYSTEME 'SYSTEME_APC_LinuxRedHat_GCC' a ete introduit le 20090318090848 suite au */ /* remplacement de "trinite.polytechnique.fr" par "europe.polytechnique.fr" (='$CMAP28', */ /* 'v $Fmachines 20090316110150'). */ @ include <stdlib.h> @ 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)) \ ) @ 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)) \ ) @ if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) @ include <asm-generic/fcntl.h> /* Fonctions d'entrees-sorties introduites le 20191119144441 pour l'utilisation */ /* 'v $xcg/TestRedirection.01$K$INUTILE OPEN_LARGE_FILE'... */ @ Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) @ include <fcntl.h> /* Fonctions d'entrees-sorties. On notera que sur 'SYSTEME_SG4D..._IRIX_CC' cet include */ /* provoque lui-meme un include de '<sys/fcntl.h>' dans lequel se trouve definis des */ /* des symboles comme 'O_RDONLY'... */ /* */ /* Je note le 20150310162758 que sur des MACHINEs telle '$LACT19', ces defintions */ /* {O_RDONLY,O_WRONLY,O_RDWR,...} sont dans 'v /usr/include/asm-generic/fcntl$h', mais */ /* ATTENTION, elles sont en octal et non pas en hexa-decimal ! */ @ Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) @ include <sys/signal.h> /* Definit les types de signaux qui sont envoyables a un process. */ @ include <sys/stat.h> /* Definit le format des informations relatives a un fichier. Le 20110531134318 ceci a */ /* ete deplace depuis 'v $xig/fonct$vv$FON 20110531134310' et ce a cause du programme */ /* 'v $xcg/PhaseCrit.01$K Chmod'... */ @ include <time.h> @ include <sys/time.h> /* Definit les structures et les fonctions d'acces a la date et a l'heure. */ @ include <netdb.h> @ if ( (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) /* Le SYSTEME 'SYSTEME_APC_LinuxUlmint_GCC' a ete introduit le 20160813135704 suite a */ /* l'introduction de '$LACT1A'... */ @ include <x86_64-linux-gnu/sys/types.h> /* En plus a cette date, a cause de 'v /usr/include/regex$h sys.types.h', il a fallu creer */ /* le lien 'v $Dhistory/LACT1A$D/20160813141121.$ADMINISTRATEUR x86_64-linux-gnu.sys.types' */ /* et ainsi, ce qui precede est inutile, mais conserve malgre tout... */ @ Aif ( (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) @ include <sys/types.h> /* Pour definir la structure "stat" dans <stat.h>. Avant l'introduction de la date et de */ /* l'heure dans 'PRINT_DEFAUT(...)' de '$xil/defi_c1$vv$DEF' cet include etait situe dans */ /* '$xig/fonct$vv$FON'. Or malheureusement, par exemple avec 'SYSTEME_NWS3000_NEWSOS', le */ /* type 'time_t' est defini dans '<sys/types.h>' et non pas dans '<times.h>' d'ou ce */ /* deplacement... */ @ Eif ( (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) /* Pour 'RemoteCommande(...)' et 'GetServeurByName(...)'. */ #Aifndef NO_INCLUDES_SYSTEMES #Eifndef NO_INCLUDES_SYSTEMES /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E P R E S E N T A T I O N D E S F O R M U L E S : */ /* */ /* */ /* Nota important : */ /* */ /* Les noms des fonctions suivantes */ /* sont choisis de telle facon qu'ils */ /* fassent exactement 4 caracteres ; */ /* ainsi, en ajoutant la parenthese */ /* qui suit leur appel, on trouve 4+1=5, */ /* ce qui correspond a la tabulation */ /* choisie (5), qui elle-meme divise */ /* exactement 10... */ /* */ /* De plus, les definitions ne sont */ /* suivies d'aucun ";", afin de pouvoir */ /* les combiner sans limites... */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* ' C A S T ' S U R L E S T Y P E S ( ' T y p e d e f P ' ) : */ /* */ /*************************************************************************************************************************************/ #define ptCAST(nom_de_type,x) \ CAST(KONC(nom_de_type(VIDE),fETOILE(VIDE)),x) \ /* De facon a faire un 'CAST' pour un Pointeur sur un Type... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E C L A R A T I O N D ' U N N O U V E A U T Y P E : */ /* */ /*************************************************************************************************************************************/ #ifdef DEFV_CAST_VERSION_01 # message "La version 'DEFV_CAST_VERSION_01' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_01 #Eifdef DEFV_CAST_VERSION_01 #ifdef DEFV_CAST_VERSION_02 # message "La version 'DEFV_CAST_VERSION_02' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_02 #Eifdef DEFV_CAST_VERSION_02 #ifdef DEFV_CAST_VERSION_03 # define PGPD \ VIDE # define Typedef(type,structure) \ = define type(var) structure var /* Definition d'un nouveau type ; mais attention, l'ordre des arguments pour 'Typedef' */ /* est inverse de celui de 'typedef' : */ /* */ /* typedef structure type; */ /* */ /* mais est plus logique... */ # define TypedefP(type,structure) \ = define type(var) structure var # define TypedefT(type,structure) \ = define type(var) structure(var)# # define TypedefS(type,structure) \ = define type(var) structure(var)# # define TypedefB(type,structure) \ = define type(var) structure var /* NOTA : ces quatre versions de 'Typedef()' appelees 'TypedefX()' ('X' valant 'B', 'P', */ /* 'S' ou 'T' pour Basic, Primaire, Secondaire et Tertiaire, ce qui donne l'ordre d'appel */ /* logique) comme un "typedef", parce que les ecritures suivantes sont illegales (alors */ /* qu'elles devraient l'etre) : */ /* */ /* typedef int int1; */ /* typedef short int1 int2; */ /* */ /* et : */ /* */ /* typedef register int int3; */ /* */ /* Ces versions sont prises en compte par un post-pre-processing (d'ou les "=", et autres). */ # define TypedefAES(type,structure) \ <> define type(var) structure var /* Procedure speciale de traitement des arguments d'une fonction via 'Argument', des objets */ /* externes a un module via 'Ailleurs', ainsi que des objets statiques via 'Statique' ; */ /* ceux-ci seront pris en compte entre la 'PASSE_1' et le 'PASSE_2' dans une passe speciale */ /* (dite 'PASSE_A') et reperee par '<>'... */ #Aifdef DEFV_CAST_VERSION_03 #Eifdef DEFV_CAST_VERSION_03 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S E N T I E R S D E B A S E : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P L A C E M E N T E N M E M O I R E : */ /* */ /*************************************************************************************************************************************/ #define _const \ const #define _volatile \ volatile #define _long \ long #define _unsigned \ unsigned /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ /* la parametrisation de leurs tailles par 'SIZE'... */ TypedefB(Constante,_const) TypedefB(Volatile,_volatile) /* Le type 'Volatile' a ete introduit le 20040227134728 pour 'v $xcp/Bugs$K Volatile' ; il */ /* permet de bloquer l'optimisation relative aux variables ainsi "etiquettees"... */ TypedefB(Static,static) TypedefB(Short,short) TypedefB(Long,_long) TypedefB(Unsigned,_unsigned) #nodefine Register_VERSION_01 /* Version anterieure au 20030815112720. */ #define Register_VERSION_02 /* Version a compter du 20030815112720 ou la notion desuete et non portable d'allocation */ /* de donnees dans les registres est supprimee... */ #ifdef Register_VERSION_01 TypedefB(Register,register) #Aifdef Register_VERSION_01 #Eifdef Register_VERSION_01 #ifdef Register_VERSION_02 #Aifdef Register_VERSION_02 #Eifdef Register_VERSION_02 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E P R I M I T I F ' C A R A C T E R E ' : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, ces definitions devraient etre logiquement dans '$xil/defi_K2$vv$DEF' mais */ /* malheureusement, on en a besoin tout de suite. De plus, on ne peut la mettre dans */ /* '$xil/defi_K1$vv$DEF', car alors, 'TypedefP(...)' et 'TypedefS(...)' ne sont pas encore */ /* definis... */ /* A compter du 20040514131015, tous les types "de base" doivent subir un traitement */ /* specifique via 'v $xcc/cpp$Z TypesBase.vv' grace a 'v $xccp/TypesBase$vv$sed _de_base'. */ /* Ce dernier fichier devra donc etre mis a jour au cas ou de nouveaux types "de base" */ /* seraient ajoutes... */ #define vrai_char_de_base \ char #define _char \ vrai_char_de_base \ /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ \ /* la parametrisation de leurs tailles par 'SIZE'... */ TypedefP(vrai_CHAR_de_base,vrai_char_de_base) TypedefP(Char,_char) TypedefS(CHAR,CONC(Unsigned,Char)) TypedefS(cChar,CONC(Constante,Char)) #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ ) TypedefS(CHAR_ou_vrai_CHAR_de_base,vrai_CHAR_de_base) #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ ) TypedefS(CHAR_ou_vrai_CHAR_de_base,CHAR) #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE > 602000000)) \ ) #define Conversion_CHAR_en_vrai_CHAR_de_base(pointeur_converti,pointeur) \ DEFV(CHAR_ou_vrai_CHAR_de_base,INIT(POINTERc(pointeur_converti),ptCAST(CHAR_ou_vrai_CHAR_de_base,pointeur))); \ /* Conversion si necessaire d'un pointeur 'CHAR' en un pointeur 'CHAR_ou_vrai_CHAR_de_base'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E P R I M I T I F ' E N T I E R ' : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, ces definitions devraient etre logiquement dans '$xil/defi_K2$vv$DEF' mais */ /* malheureusement, on en a besoin tout de suite. De plus, on ne peut la mettre dans */ /* '$xil/defi_K1$vv$DEF', car alors, 'TypedefP(...)' et 'TypedefS(...)' ne sont pas encore */ /* definis... */ /* A compter du 20040514131015, tous les types "de base" doivent subir un traitement */ /* specifique via 'v $xcc/cpp$Z TypesBase.vv' grace a 'v $xccp/TypesBase$vv$sed _de_base'. */ /* Ce dernier fichier devra donc etre mis a jour au cas ou de nouveaux types "de base" */ /* seraient ajoutes... */ #define vrai_int_de_base \ int #define _int \ vrai_int_de_base \ /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ \ /* la parametrisation de leurs tailles par 'SIZE'... */ TypedefP(vrai_Int_de_base,vrai_int_de_base) TypedefP(_Int,_int) TypedefS(vrai_Short_Int_de_base,CONC(Short,vrai_Int_de_base)) TypedefS(vrai_Long_Int_de_base,CONC(Long,vrai_Int_de_base)) TypedefS(vrai_Positive_de_base,CONC(Unsigned,vrai_Int_de_base)) TypedefS(vrai_binaire_de_base,vrai_Positive_de_base) /* Definition d'un type entier de base... */ /* ATTENTION, avant le 1995032700, on definissait ici 'PRECISION_DU_Int'. Or malheureusement */ /* dans '$xcc/cpp$Z', lors de la '$PASSE_1' des fichiers demandant la derivation formelle */ /* d'ordre N (voir par exemple '$xtKg'), on fait : */ /* */ /* set choix_cK="$choix_cK ""-Dinclure_DEFINIT_K_DEF" */ /* */ /* ce qui provoque la non prise en compte des fichiers 'inclure_DEFINIT_c_DEF'. Or de plus */ /* dans '$xil/defi_K2$vv$DEF', il y a des instructions '$PASSE_1' conditionnelles qui */ /* utilisent 'PRECISION_DU_Int'. Donc si 'PRECISION_DU_Int' est defini dans un fichier */ /* de type 'inclure_DEFINIT_c_DEF', on aura le message : */ /* */ /* ...: undef symbol PRECISION_DU_Int in preprocessor if */ /* */ /* d'ou le transfert de la definition de 'PRECISION_DU_Int' dans '$xil/defi_K1$vv$DEF'... */ /* */ /* ATTENTION, avant le 1995091300, on trouvait ici : */ /* */ /* TypedefS(vrai_Long_Int_de_base,CONC(Long,_Int)) */ /* */ /* mais, cela ne semblant pas logique, elle fut modifiee... */ /* */ /* Le type 'vrai_Positive_de_base' a ete introduit le 20021209123822 pour etre utilise */ /* dans '$xcp/substitue.01$K vrai_Positive_de_base'. */ /* */ /* Le type 'vrai_binaire_de_base' a ete introduit le 20100324081428... */ #if (PRECISION_DU_Int==SIMPLE_PRECISION) TypedefS(Int,_Int) #Aif (PRECISION_DU_Int==SIMPLE_PRECISION) #Eif (PRECISION_DU_Int==SIMPLE_PRECISION) #if (PRECISION_DU_Int==DOUBLE_PRECISION) TypedefS(Int,CONC(Long,_Int)) #Aif (PRECISION_DU_Int==DOUBLE_PRECISION) #Eif (PRECISION_DU_Int==DOUBLE_PRECISION) TypedefS(ShortInt,CONC(Short,_Int)) TypedefS(LongInt,CONC(Long,_Int)) TypedefS(Positive,CONC(Unsigned,Int)) /* ATTENTION, on notera que l'on ecrit : */ /* */ /* TypedefS(LongInt,CONC(Long,_Int)) */ /* */ /* et non pas : */ /* */ /* TypedefP(LongInt,vrai_Long_Int_de_base) */ /* */ /* afin de ne pas faire d'hypothese sur la nature de '_Int' ; de meme pour la definition */ /* de 'Int'... */ #if (PRECISION_DU_Int==SIMPLE_PRECISION) TypedefS(LPositive,CONC(Long,Positive)) /* Cette definition n'est en fait utilisee que pour definir 'genere_LPositive' dans le */ /* fichier '$xiiD/definit.1$DEF'. */ #Aif (PRECISION_DU_Int==SIMPLE_PRECISION) #Eif (PRECISION_DU_Int==SIMPLE_PRECISION) #if (PRECISION_DU_Int==DOUBLE_PRECISION) TypedefS(LPositive,Positive) /* Cette definition n'est en fait utilisee que pour definir 'genere_LPositive' dans le */ /* fichier '$xiiD/definit.1$DEF'. */ #Aif (PRECISION_DU_Int==DOUBLE_PRECISION) #Eif (PRECISION_DU_Int==DOUBLE_PRECISION) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E P R I M I T I F ' S I M P L E - P R E C I S I O N ' : */ /* */ /*************************************************************************************************************************************/ /* A compter du 20040514131015, tous les types "de base" doivent subir un traitement */ /* specifique via 'v $xcc/cpp$Z TypesBase.vv' grace a 'v $xccp/TypesBase$vv$sed _de_base'. */ /* Ce dernier fichier devra donc etre mis a jour au cas ou de nouveaux types "de base" */ /* seraient ajoutes... */ #define vrai_float_de_base \ float \ /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ \ /* la parametrisation de leurs tailles par 'SIZE' et l'utilisation dans les interfaces */ \ /* avec certaines bibliotheques (celle du CUBI7 par exemple...). */ #if (PRECISION_DU_Float==SIMPLE_PRECISION) # define _float \ vrai_float_de_base \ /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ \ /* la parametrisation de leurs tailles par 'SIZE'... */ #Aif (PRECISION_DU_Float==SIMPLE_PRECISION) #Eif (PRECISION_DU_Float==SIMPLE_PRECISION) #if (PRECISION_DU_Float==DOUBLE_PRECISION) # define _float \ vrai_double_de_base \ /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ \ /* la parametrisation de leurs tailles par 'SIZE'... */ #Aif (PRECISION_DU_Float==DOUBLE_PRECISION) #Eif (PRECISION_DU_Float==DOUBLE_PRECISION) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E P R I M I T I F ' D O U B L E - P R E C I S I O N ' : */ /* */ /*************************************************************************************************************************************/ /* A compter du 20040514131015, tous les types "de base" doivent subir un traitement */ /* specifique via 'v $xcc/cpp$Z TypesBase.vv' grace a 'v $xccp/TypesBase$vv$sed _de_base'. */ /* Ce dernier fichier devra donc etre mis a jour au cas ou de nouveaux types "de base" */ /* seraient ajoutes... */ #define vrai_double_de_base \ double \ /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ \ /* la parametrisation de leurs tailles par 'SIZE'... */ #if ( (defined(SYSTEME_CRAY2_UNICOS)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ ) # define PRECISION_DU_Double \ SIMPLE_PRECISION \ /* Version CRAY2/UNICOS, */ \ /* version CRAYC98/UNICOS, */ \ /* version CRAYC916/UNICOS, */ \ /* version CRAYYMP1/UNICOS, */ \ /* version CRAYYMP2/UNICOS, */ \ /* version CRAYYMP4/UNICOS. */ #Aif ( (defined(SYSTEME_CRAY2_UNICOS)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ ) # define PRECISION_DU_Double \ DOUBLE_PRECISION \ /* Valeur par defaut... */ #Eif ( (defined(SYSTEME_CRAY2_UNICOS)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ ) #if (PRECISION_DU_Double==SIMPLE_PRECISION) # define _double \ vrai_float_de_base \ /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ \ /* la parametrisation de leurs tailles par 'SIZE'... */ #Aif (PRECISION_DU_Double==SIMPLE_PRECISION) #Eif (PRECISION_DU_Double==SIMPLE_PRECISION) #if (PRECISION_DU_Double==DOUBLE_PRECISION) # define _double \ vrai_double_de_base \ /* Ces types intermediaires sont definis brutalement par des '#define' pour permettre la */ \ /* la parametrisation de leurs tailles par 'SIZE'... */ #Aif (PRECISION_DU_Double==DOUBLE_PRECISION) #Eif (PRECISION_DU_Double==DOUBLE_PRECISION) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A ' S I M P L E - P R E C I S I O N ' */ /* E T D E L A ' D O U B L E - P R E C I S I O N ' : */ /* */ /*************************************************************************************************************************************/ TypedefP(vrai_Float_de_base,vrai_float_de_base) TypedefP(Float,_float) TypedefP(vrai_Double_de_base,vrai_double_de_base) TypedefP(Double,_double) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U T Y P E V I D E : */ /* */ /*************************************************************************************************************************************/ TypedefP(Void,void) /* Definition du type vide... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E G L E S D ' I N D E X A T I O N : */ /* */ /*************************************************************************************************************************************/ #define INDEX0 \ ZERO \ /* Premier index d'une liste. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I M E N S I O N N E M E N T S T A N D A R D : */ /* */ /* */ /* Nota : */ /* */ /* L'indexation pour les "structures" */ /* a 1, 2, 3,... dimensions est du type : */ /* */ /* ITb1c(...) : index1 */ /* ITb2c(...) : (index2*dim1)+index1 */ /* ITb3c(...) : (((index3*dim2)+index2)*dim1)+index1 */ /* ITb4c(...) : (((((index4*dim3)+index3)*dim2)+index2)*dim1)+index1 */ /* */ /* avec des notations evidentes... */ /* */ /*************************************************************************************************************************************/ #define DIME(dimension) \ COND(IZGT(dimension),INTE(dimension),UN) \ /* Definition de la fonction de dimensionnement, mais ATTENTION, en general, les */ \ /* compilateurs n'acceptent pas les dimensions nulles. L'introduction de 'INTE(...)' a eu */ \ /* lieu le 20040418183321 avec la mise en place du dispositif de garantie eventuelle de */ \ /* l'ordre des operations 'v $xil/defi_c3$vv$DEF GarantirOrdreOperations_AvecTypeFloat'. */ #ifdef SYSTEME_DPX5000_SPIX_CC # undef DIME # define DIME(dimension) \ INTE(dimension) \ /* Definition de la fonction de dimensionnement... */ \ /* */ \ /* Version DPX5000/SPIX/CC. */ #Aifdef SYSTEME_DPX5000_SPIX_CC #Eifdef SYSTEME_DPX5000_SPIX_CC #define gDTb1(vecteur,dimension) \ vecteur[dimension] \ /* Definition d'un tableau a une dimension sans verification a priori de la dimension. */ #define DTb1(vecteur,dimension) \ gDTb1(vecteur,DIME(dimension)) \ /* Definition d'un tableau a une dimension avec verification de la dimension, */ #define ITb1(vecteur,index) \ PARE(vecteur[index]) \ /* Indexation d'un tel tableau. */ #define ITb1c(index,dimension) \ INTE(index) \ /* Conversion d'un indice mono-dimensionnel en un indice mono-dimensionnel. Le passage */ \ /* de 'NEUT(...)' a 'INTE(...)' a eu lieu le 20040423155513 suite a l'introduction du */ \ /* dispositif 'v $xil/defi_c3$vv$DEF GooF'. */ #define ITb1csd(index) \ ITb1c(index,ARGUMENT_ABSENT) \ /* Introduit le 20220803182004 pour definir 'IdTb1sd(...)' ("sd"="Sans Dimension")... */ #define ITb1v(vecteur,index,dimension) \ ITb1(vecteur,ITb1c(index,dimension)) \ /* Indexation "vectoriel" d'un tel tableau (defini par symetrie avec 'ITb2v(...)' et */ \ /* 'ITb3v(...)'). */ \ /* */ \ /* ATTENTION, avant le 20000405163016, la definition etait : */ \ /* */ \ /* #define ITb1v(vecteur,index,dimension) \ */ \ /* ITb1(vecteur,index) */ \ /* */ #define DdTb1(pointeur,vecteur,dimension,valeur_initiale) \ INIT(pointeur(vecteur),valeur_initiale) \ /* Definition d'un tableau alloue dynamiquement a une dimension. */ #define MdTb1(vecteur,dimension,type,libre) \ EGAL(vecteur,AllocIn(dimension,type)) #undef MdTb1 #define MdTb1(vecteur,dimension,type,libre) \ EGAL(vecteur \ ,EGAL(INDIRECT(COND(IFEQ(vecteur,libre) \ ,ADRESSE(vecteur) \ ,PARE(LIS2(eFdTb1(vecteur,dimension,type),ADRESSE(vecteur))) \ ) \ ) \ ,AllocIn(dimension,type) \ ) \ ) /* Allocation dynamique de la memoire necessaire a un tableau a une dimension. */ /* */ /* ATTENTION, avant le 1994092700, la definition etait la suivante : */ /* */ /* EGAL(vecteur,AllocIn(dimension,type)) */ /* */ /* mais prevoyant la possibilite de reallouer des structures (voir le probleme evoque */ /* dans la fonction 'Iload_image_avec_redimensionnement_eventuel(...)' dans le fichier */ /* 'v $xiii/files$FON') on adopte cette nouvelle definition inspiree du test effectue dans */ /* 'v $xtc/alloc.01$c'. L'ancienne definition a ete conservee, mais en lui ajoutant le */ /* quatrieme et nouvel argument 'libre' (on ne sait jamais...). */ /* */ /* On notera les points particuliers suivants : */ /* */ /* 1-la structure 'EGAL(vecteur,EGAL(...))' n'est la que pour permettre a '$xcc/cpp$Z' de */ /* travailler normalement ; en effet, il repere les formes du type 'EGAL(vecteur,...)', et */ /* bien qu'elle soit ici redondante au niveau de l'affectation qu'elle realise (puisque */ /* cette derniere a deja ete effectuee par le 'EGAL(...)' le plus "interne"), elle est donc */ /* necessaire si l'on veut que '$xcc/cpp$Z' recupere les objets statiques utilises sans */ /* avoir a en changer la programmation... */ /* */ /* 2-la structure 'PARE(LIS2(...))' permet de faire executer la fonction 'eFdTb1(...)' mais */ /* sans que son resultat ne soit pris en compte dans l'evaluation de l'expression qui doit */ /* nous fournir l'adresse du pointeur sur l'objet statique. Notons d'ailleurs au passge */ /* que 'eFdTb1(...)' a le type 'Void' (via 'Free(...)') ce qui signifie qu'elle ne renvoie */ /* pas de valeur ; elle ne pourrait pas figurer d'ailleurs dans une expression ou sa valeur */ /* serait requise (voir 'v $xtc/alloc.01$c' a ce propos). */ #define eFdTb1(vecteur,dimension,type) \ FreSS(vecteur) #define FdTb1(vecteur,dimension,type,libre) \ Bblock \ CALZ(eFdTb1(vecteur,dimension,type)); \ EGAL(vecteur,libre); \ Eblock /* Liberation dynamique de la memoire necessaire a un tableau a une dimension, */ /* la premiere forme ('eFdTb1(...)' pouvant figurer dans une expression et par exemple */ /* dans 'MdTb1(...)', alors que la seconde ('FdTb1(...)') ne le peut pas a cause de */ /* l'utilisation de 'CALS(...)'. Pour des raisons de simplicite, les fonctions 'eFdTb2(...)' */ /* et 'eFdTb3(...)' ne seront pas definies... */ /* */ /* ATTENTION : le 20180315115310, je note que c'est bien 'FreSS(...)' qu'il faut utiliser */ /* et non pas : */ /* */ /* #define eFdTb1(vecteur,dimension,type) \ */ /* CALZ_FreSS(vecteur) */ /* */ /* etant donnes les localisations des appels des 'eFdTb1(...)'s... */ /* */ /* Le 20050221165524 a ete introduit la reinitialisation de 'vecteur' avec 'libre' a cause */ /* d'un probleme rencontre 'v $xiipf/fonction.3$FON FdTb1' ou l'on fait une suite de */ /* 'FdTb1(...)' suivis par des 'MdTb1(...)' or cette derniere procedure fait implicitement */ /* un 'eFdTb1(...)' lorsque le pointeur 'vecteur' semble ne pas etre 'libre'. D'ou cette */ /* mise a jour tres hygienique d'ailleurs qui rend le pointeur libre... */ /* */ /* Le 20051025155153, j'ai ajoute un ";" qui manquait, semble-t-il, derriere le 'CALS(...)'. */ #define IdTb1(vecteur,index,dimension) \ PINDIRECT(bADD(vecteur,ITb1c(index,dimension))) \ /* Indexation d'un tableau alloue dynamiquement et a une dimension. */ \ /* */ \ /* ATTENTION, avant le 20000406084728, la definition etait : */ \ /* */ \ /* #define IdTb1(vecteur,index,dimension) \ */ \ /* PINDIRECT(ADD2(vecteur,index)) */ \ /* */ \ /* Le 20040419084436, 'ADD2(...)' a ete remplace par 'bADD(...)' afin de permettre */ \ /* la mise en place du dispositif de garantie eventuelle de l'ordre des operations */ \ /* 'v $xil/defi_c3$vv$DEF GarantirOrdreOperations_AvecTypeFloat'. */ #define IdTb1sd(vecteur,index) \ PINDIRECT(bADD(vecteur,ITb1csd(index))) \ /* A cause de 'v $xci/valeurs_ArbreSternBrocot$K TRI_D_UNE_LISTE_QUELCONQUE', cette */ \ /* procedure a ete introduite le 20220803182004 car pour 'TRI_D_UNE_LISTE_QUELCONQUE(...)' */ \ /* le dernier argument aurait du etre 'IdTb1(...)' qui demande trois arguments, alors */ \ /* que 'v $ximd/operator.1$FON TRI_D_UNE_LISTE_QUELCONQUE' et donc les proecdures */ \ /* telle 'v $ximd/operator.1$FON TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE' en */ \ /* demande deux pour l'argument formel 'AccesListe(...)' qui, en general est 'IdTb1(...)' */ \ /* ('v $xrv/distance.02$K gELEMENT_DU_FICHIER' et 'v $xrv/ARITHMET.1g$I gELEMENT_DU_FICHIER' */ \ /* par exemple...). On notera que : "sd"="Sans Dimension"... */ #if ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # define ATb1(vecteur) \ ADRESSE(ITb1(vecteur,INDEX0)) \ /* Et adresse d'un tel tableau... */ #Aif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # define ATb1(vecteur) \ vecteur \ /* Et adresse d'un tel tableau... */ #Eif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) #define DTb0(vecteur) \ vecteur[] \ /* Definition d'un tableau a une dimension "muette", */ #define ITb0(vecteur,index) \ ITb1(vecteur,index) \ /* Et indexation d'un tel tableau... */ #define DTbp(vecteur) \ DTb0(PARE(POINTEUR(vecteur))) \ /* Definition d'un pointeur sur un tableau a une seul dimension "muette". */ #define ITbp(vecteur,index) \ ITb0(PINDIRECT(vecteur),index) \ /* Et indexation d'un tel tableau... */ #define DTb2(matrice,dimension_1,dimension_2) \ matrice[DIME(dimension_1)][DIME(dimension_2)] \ /* Definition d'un tableau a deux dimensions, */ #define ITb2(matrice,index_1,index_2) \ PARE(matrice[index_1][index_2]) \ /* Indexation d'un tel tableau. */ #define ITb2c(index_1,dimension_1,index_2,dimension_2) \ AXPB(ITb1c(index_2,dimension_2),dimension_1,ITb1c(index_1,dimension_1)) \ /* Conversion d'un indice bi-dimensionnel en un indice mono-dimensionnel. */ #define ITb2v(matrice,index_1,dimension_1,index_2,dimension_2) \ ITb1(matrice,ITb2c(index_1,dimension_1,index_2,dimension_2)) \ /* Indexation "vectoriel" d'un tel tableau. */ \ /* */ \ /* ATTENTION, avant le 20000405163016, la definition etait : */ \ /* */ \ /* #define ITb2v(matrice,index_1,dimension_1,index_2,dimension_2) \ */ \ /* ITb1(matrice,AXPB(index_2,dimension_1,index_1)) */ \ /* */ #define DdTb2(pointeur,matrice,dimension_1,dimension_2,valeur_initiale) \ DdTb1(pointeur,matrice,bMUL(dimension_1,dimension_2),valeur_initiale) \ /* Definition d'un tableau alloue dynamiquement a deux dimensions. */ #define MdTb2(matrice,dimension_1,dimension_2,type,libre) \ MdTb1(matrice,bMUL(dimension_1,dimension_2),type,libre) \ /* Allocation dynamique de la memoire necessaire a un tableau a deux dimensions. */ #define FdTb2(matrice,dimension_1,dimension_2,type,libre) \ FdTb1(matrice,bMUL(dimension_1,dimension_2),type,libre) \ /* Liberation dynamique de la memoire necessaire a un tableau a deux dimensions. */ #define IdTb2(matrice,index_1,dimension_1,index_2,dimension_2) \ IdTb1(matrice,ITb2c(index_1,dimension_1,index_2,dimension_2),bMUL(dimension_1,dimension_2)) \ /* Indexation d'un tableau alloue dynamiquement et a deux dimensions. */ \ /* */ \ /* ATTENTION, avant le 20000406084728, la definition etait : */ \ /* */ \ /* #define IdTb2(matrice,index_1,dimension_1,index_2,dimension_2) \ */ \ /* IdTb1(matrice \ */ \ /* ,AXPB(index_2,dimension_1,index_1) \ */ \ /* ,MUL2(dimension_1,dimension_2) \ */ \ /* ) */ \ /* */ #if ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # define ATb2(vecteur) \ ADRESSE(ITb2(vecteur,INDEX0,INDEX0)) \ /* Et adresse d'un tel tableau... */ #Aif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # define ATb2(matrice) \ matrice \ /* Et adresse d'un tel tableau... */ #Eif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) #define DTb3(tensor3,dimension_1,dimension_2,dimension_3) \ tensor3[DIME(dimension_1)][DIME(dimension_2)][DIME(dimension_3)] \ /* Definition d'un tableau a trois dimensions. */ #define ITb3(tensor3,index_1,index_2,index_3) \ PARE(tensor3[index_1][index_2][index_3]) \ /* Indexation d'un tel tableau. */ #define ITb3c(index_1,dimension_1,index_2,dimension_2,index_3,dimension_3) \ ITb2c(index_1,dimension_1,ITb2c(index_2,dimension_2,index_3,dimension_3),dimension_2) \ /* Conversion d'un indice tri-dimensionnel en un indice mono-dimensionnel. */ #define ITb3v(tensor3,index_1,dimension_1,index_2,dimension_2,index_3,dimension_3) \ ITb1(tensor3,ITb3c(index_1,dimension_1,index_2,dimension_2,index_3,dimension_3)) \ /* Indexation "vectoriel" d'un tel tableau. */ \ /* */ \ /* ATTENTION, avant le 20000405163016, la definition etait : */ \ /* */ \ /* #define ITb3v(tensor,index_1,dimension_1,index_2,dimension_2,index_3,dimension_3) \ */ \ /* ITb1(tensor \ */ \ /* ,AXPB(AXPB(index_3,dimension_2,index_2),dimension_1,index_1) \ */ \ /* ) */ \ /* */ #define DdTb3(pointeur,tensor3,dimension_1,dimension_2,dimension_3,valeur_initiale) \ DdTb1(pointeur,tensor3,MUL3(dimension_1,dimension_2,dimension_3),valeur_initiale) \ /* Definition d'un tableau alloue dynamiquement a trois dimensions. */ #define MdTb3(tensor3,dimension_1,dimension_2,dimension_3,type,libre) \ MdTb1(tensor3,MUL3(dimension_1,dimension_2,dimension_3),type,libre) \ /* Allocation dynamique de la memoire necessaire a un tableau a trois dimensions. */ #define FdTb3(tensor3,dimension_1,dimension_2,dimension_3,type,libre) \ FdTb1(tensor3,MUL3(dimension_1,dimension_2,dimension_3),type,libre) \ /* Liberation dynamique de la memoire necessaire a un tableau a trois dimensions. */ #define IdTb3(tensor3,index_1,dimension_1,index_2,dimension_2,index_3,dimension_3) \ IdTb1(tensor3 \ ,ITb3c(index_1,dimension_1,index_2,dimension_2,index_3,dimension_3) \ ,MUL3(dimension_1,dimension_2,dimension_3) \ ) \ /* Indexation d'un tableau alloue dynamiquement et a trois dimensions. */ \ /* */ \ /* ATTENTION, avant le 20000406084728, la definition etait : */ \ /* */ \ /* #define IdTb3(tensor,index_1,dimension_1,index_2,dimension_2,index_3,dimension_3) \ */ \ /* IdTb1(tensor \ */ \ /* ,AXPB(AXPB(index_3,dimension_2,index_2),dimension_1,index_1) \ */ \ /* ,MUL3(dimension_1,dimension_2,dimension_3) \ */ \ /* ) */ \ /* */ #define DTb4(tensor4,dimension_1,dimension_2,dimension_3,dimension_4) \ tensor4[DIME(dimension_1)][DIME(dimension_2)][DIME(dimension_3)][DIME(dimension_4)] \ /* Definition d'un tableau a quatre dimensions. L'ensemble des definitions relatives aux */ \ /* tableaux a quatre dimensions furent introduites le 20081216142213... */ #define ITb4(tensor4,index_1,index_2,index_3,index_4) \ PARE(tensor4[index_1][index_2][index_3][index_4]) \ /* Indexation d'un tel tableau. */ #define ITb4c(index_1,dimension_1,index_2,dimension_2,index_3,dimension_3,index_4,dimension_4) \ ITb2c(index_1,dimension_1,ITb3c(index_2,dimension_2,index_3,dimension_3,index_4,dimension_4),dimension_2) \ /* Conversion d'un indice quadri-dimensionnel en un indice mono-dimensionnel. */ #define ITb4v(tensor4,index_1,dimension_1,index_2,dimension_2,index_3,dimension_3,index_4,dimension_4) \ ITb1(tensor4,ITb4c(index_1,dimension_1,index_2,dimension_2,index_3,dimension_3,index_4,dimension_4)) \ /* Indexation "vectoriel" d'un tel tableau. */ #define DdTb4(pointeur,tensor4,dimension_1,dimension_2,dimension_3,dimension_4,valeur_initiale) \ DdTb1(pointeur,tensor4,MUL4(dimension_1,dimension_2,dimension_3,dimension_4),valeur_initiale) \ /* Definition d'un tableau alloue dynamiquement a quatre dimensions. */ #define MdTb4(tensor4,dimension_1,dimension_2,dimension_3,dimension_4,type,libre) \ MdTb1(tensor4,MUL4(dimension_1,dimension_2,dimension_3,dimension_4),type,libre) \ /* Allocation dynamique de la memoire necessaire a un tableau a quatre dimensions. */ #define FdTb4(tensor4,dimension_1,dimension_2,dimension_3,dimension_4,type,libre) \ FdTb1(tensor4,MUL4(dimension_1,dimension_2,dimension_3,dimension_4),type,libre) \ /* Liberation dynamique de la memoire necessaire a un tableau a quatre dimensions. */ #define IdTb4(tensor4,index_1,dimension_1,index_2,dimension_2,index_3,dimension_3,index_4,dimension_4) \ IdTb1(tensor4 \ ,ITb4c(index_1,dimension_1,index_2,dimension_2,index_3,dimension_3,index_4,dimension_4) \ ,MUL4(dimension_1,dimension_2,dimension_3,dimension_4) \ ) \ /* Indexation d'un tableau alloue dynamiquement et a quatre dimensions. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S D I R E C T A U X S T R U C T U R E S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : on notera le 20201104140607 ci-dessous le fait que les differentes */ /* definitions suivantes sont suivies d'espaces et d'indicateur de ligne-suite. Cela */ /* a pour consequences que des structures telles : */ /* */ /* ASD2(FAload_point_coordonnees_01_____matrice_de_transformation,cx,cx) */ /* */ /* ('v $xci/accumule.41$I ASD2') sont traduites en : */ /* */ /* FFAload_point_coordonnees_01_____matrice_de_transformation.cx .cx */ /* . */ /* /|\ */ /* | */ /* */ /* avec donc un espace "parasite"... */ #define ASD1(structure,element) \ structure.element \ /* Acces direct aux elements d'une structure a un niveau. On notera que contrairement a la */ \ /* definition de 'ASI1(...)', on ne peut pas ecrire : */ \ /* */ \ /* #define ASD1(structure,element) \ */ \ /* PARE(structure).element */ \ /* */ \ /* On verra en particulier dans 'v $xiii/vecteurs$DEF' la definition de 'WCG(...)' qui */ \ /* contient par exemple : */ \ /* */ \ /* WCG_ELEMENT(contexte,ASD1(vecteurs_____cursor_3D,x)); */ \ /* */ \ /* qui equivaut a : */ \ /* */ \ /* EGAL(ASD1(contexte,ASD1(vecteurs_____cursor_3D,x))); */ \ /* */ \ /* soit apres traduction : */ \ /* */ \ /* ((contexte).(vecteurs_____cursor_3D).x = ((vecteurs_____cursor_3D).x)); */ \ /* . . */ \ /* /|\ /|\ */ \ /* | | */ \ /* | | */ \ /* */ \ /* ce qu'aucun compilateur 'C' n'autorise... */ #define ASD2(structure,element1,element2) \ ASD1(ASD1(structure,element1),element2) \ /* Acces direct aux elements d'une structure a deux niveaux, */ #define ASD3(structure,element1,element2,element3) \ ASD1(ASD2(structure,element1,element2),element3) \ /* Acces direct aux elements d'une structure a trois niveaux, */ #define ASD4(structure,element1,element2,element3,element4) \ ASD1(ASD3(structure,element1,element2,element3),element4) \ /* Acces direct aux elements d'une structure a quatre niveaux, */ #define ASD5(structure,element1,element2,element3,element4,element5) \ ASD1(ASD4(structure,element1,element2,element3,element4),element5) \ /* Acces direct aux elements d'une structure a cinq niveaux. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S I N D I R E C T A U X S T R U C T U R E S : */ /* */ /*************************************************************************************************************************************/ #define ASI1(structure,element) \ PARE(structure)->element \ /* Acces indirect aux elements d'une structure a un niveau. On notera le 'PARE(...)' destine */ \ /* aux cas ou 'structure' est lui-meme une indirection (voir un exemple d'utilisation dans */ \ /* 'v $xrq/particle.M55$I' ou l'on trouve dans la fonction 'iPARTICULE(...)' la procedure */ \ /* 'INDIRECT(...)' en tant que premier argument de 'ASI1(...)'. */ #define ASI2(structure,element1,element2) \ ASD1(ASI1(structure,element1),element2) \ /* Acces indirect aux elements d'une structure a deux niveaux, */ #define ASI3(structure,element1,element2,element3) \ ASD1(ASI2(structure,element1,element2),element3) \ /* Acces indirect aux elements d'une structure a trois niveaux, */ #define ASI4(structure,element1,element2,element3,element4) \ ASD1(ASI3(structure,element1,element2,element3),element4) \ /* Acces indirect aux elements d'une structure a quatre niveaux, */ #define ASI5(structure,element1,element2,element3,element4,element5) \ ASD1(ASI4(structure,element1,element2,element3,element4),element5) \ /* Acces indirect aux elements d'une structure a cinq niveaux. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T A I L L E D ' U N E S T R U C T U R E : */ /* */ /*************************************************************************************************************************************/ #define SIZE_GENERAL(element) \ NEUT(sizeof(element)) \ /* Definition generale de tous les casts et independante de la version. Theoriquement, il */ \ /* suffirait d'ecrire : */ \ /* */ \ /* #define SIZE_GENERAL(element) \ */ \ /* sizeof(element) */ \ /* */ \ /* Malheureusement, sur certains SYSTEMEs (par exemple 'SYSTEME_HP7??_HPUX_CC' ou encore */ \ /* 'SYSTEME_NWS3000_NEWSOS_2CC'), il apparait qu'il faut caster... C'est l'absence de ce */ \ /* cast qui serait responsable, apparemment, des bugs du type 'BUG_SYSTEME_..._SARS', que */ \ /* je conserve provisoirement, mais qui devrait prochainement disparaitre grace aux */ \ /* modifications apportees a 'DECG(...)' et 'DECD(...)' (en effet, ainsi que cela est dit */ \ /* ci-apres, 'SIZE_GENERAL(...)' ne peut rien faire...). */ \ /* */ \ /* Pas de chance, j'ai essaye d'utiliser : */ \ /* */ \ /* #define SIZE_GENERAL(element) \ */ \ /* INTE(sizeof(element)) */ \ /* */ \ /* mais 'SYSTEME_NWS3000_NEWSOS_CC' et 'SYSTEME_NWS3000_NEWSOS_2CC' ne l'accepte pas, car */ \ /* en effet, 'SIZE_GENERAL(...)' est utilise (via d'autres procedures) pour dimensionner */ \ /* des structures a l'aide de 'DIME(...)'. Cette procedure contient un 'COND(...)', et si */ \ /* il contient un "cast" via 'SIZE_GENERAL(...)', alors le message : */ \ /* */ \ /* ccom: Error: ...,line ...: constant expected */ \ /* */ \ /* apparait, d'ou le retour a la version anterieure (avec 'NEUT(...)' malgre tout...). */ #ifdef DEFV_CAST_VERSION_01 # message "La version 'DEFV_CAST_VERSION_01' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_01 #Eifdef DEFV_CAST_VERSION_01 #ifdef DEFV_CAST_VERSION_02 # message "La version 'DEFV_CAST_VERSION_02' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_02 #Eifdef DEFV_CAST_VERSION_02 #ifdef DEFV_CAST_VERSION_03 # define SIZE(element) \ SIZE_GENERAL(element(VIDE)) \ /* Definition generale de 'size'... */ #Aifdef DEFV_CAST_VERSION_03 #Eifdef DEFV_CAST_VERSION_03 #define SIZP(element) \ SIZE_GENERAL(element) \ /* Definition de 'size' relative aux elements divers qui ne sont pas definis sous */ \ /* forme de procedures a arguments (par exemple les variables 'size_...'. */ #define SIZC(element) \ SIZE_GENERAL(element) \ /* Definition de 'size' relative aux chaines... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N G E N E R A L E D E S ' C A S T ' S : */ /* */ /*************************************************************************************************************************************/ #define CAST_GENERAL(type,expression) \ PARE(PARE(type)PARE(expression)) \ /* Definition generale de tous les casts et independante de la version... */ #ifdef DEFV_CAST_VERSION_01 # message "La version 'DEFV_CAST_VERSION_01' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_01 #Eifdef DEFV_CAST_VERSION_01 #ifdef DEFV_CAST_VERSION_02 # message "La version 'DEFV_CAST_VERSION_02' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_02 #Eifdef DEFV_CAST_VERSION_02 #ifdef DEFV_CAST_VERSION_03 # define CAST(type,expression) \ CAST_GENERAL(type(VIDE_CAST),expression) \ /* Definition generale de tous les casts. On notera la presence de 'VIDE_CAST' qui n'est */ \ /* defini nulle part et qui permet de resoudre le probleme de l'elimination des couples de */ \ /* parentheses vides qui apparaissent lors de l'utilisation de 'ptCAST(...)'. En effet, */ \ /* alors l'argument 'type' ci-dessus n'y est pas une macro-procedure, et donc : */ \ /* */ \ /* type(VIDE) */ \ /* */ \ /* est consideree comme : */ \ /* */ \ /* type (VIDE) */ \ /* */ \ /* soit : */ \ /* */ \ /* type () */ \ /* */ \ /* L'elimination de ces '()' par '$xcc/cpp$D/parent_vides$sed' reposait jusqu'au 1995062300 */ \ /* sur la detection des chaines suivantes : */ \ /* */ \ /* * () */ \ /* */ \ /* or, par malheur, de telles chaines peuvent etre decoupees par '$xcp/decoupage$K' apres */ \ /* le caractere 'K_ETOILE', ce que l'on ne peut interdire, sous peine de voir apparaitre */ \ /* des lignes trop longues. D'ou ce 'VIDE_CAST' qui n'est reconnu que par le fichier */ \ /* '$xcc/cpp$D/parent_vides$sed'... */ # define CASP(type,expression) \ CAST_GENERAL(type(VIDE),expression) \ /* Definition des casts relatifs aux 'genere_XXX' des pixels... */ #Aifdef DEFV_CAST_VERSION_03 #Eifdef DEFV_CAST_VERSION_03 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S O B J E T S A E X T E R I O R I S E R : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, ces definitions devraient etre logiquement dans '$xil/defi_K2$vv$DEF' mais */ /* malheureusement, on en a besoin tout de suite. De plus, on ne peut la mettre dans */ /* '$xil/defi_K1$vv$DEF', car alors, 'TypedefP(...)' et 'TypedefS(...)' ne sont pas encore */ /* definis... */ #define ___Extern \ extern \ /* Afin de bien parametrer 'Extern' et 'Ailleurs'... */ TypedefP(Extern,___Extern) /* Ce mot clef permet de designer les references externes a des objets "systemes" (par */ /* exemple, des fonctions de la bibliotheque mathematiques). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S B L O C S : */ /* */ /*************************************************************************************************************************************/ #define BEGIN { #define END } /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S T R U C T U R E S G E N E R A L E S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */ /* definitions soient faites avant d'autre ; en particulier 'Benumeration' doit etre */ /* definie avant tout '-define ...' qui l'utilise... */ #define Bstructure \ BEGIN #define Estructure(nom) \ END nom /* Definition des structures 'struct'. */ #define Bunion \ BEGIN #define Eunion(nom) \ END nom /* Definition des unions 'union'. */ #define Bliste \ BEGIN #define Eliste \ END; /* Definition des listes. */ #define Benumeration \ BEGIN #define Eenumeration \ END /* Definition des enumerations 'enum' ; on notera un changement dans ces definitions : */ /* autrefois, il y avait : */ /* */ /* #define Eenumeration(nom) \ */ /* END nom */ /* */ /* et */ /* */ /* #define Enum \ */ /* enum */ /* */ /* ainsi, on voit que le 'nom' est passe de 'Eenumeration' a 'Enum', ce qui evite que le */ /* 'nom' ne soit signale comme symbole indefini par la commande 'nm'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E N U M E R A T I O N S S T A N D A R D S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */ /* definitions soient faites avant d'autre ; en particulier 'Denumer17(...)' doit etre */ /* definie avant tout '-define ...' qui l'utilise... */ #define Denumer01(element01,nom) \ Enum(nom) \ Benumeration \ element01 \ Eenumeration #define Denumer02(element01,element02,nom) \ Enum(nom) \ Benumeration \ element01 \ ,element02 \ Eenumeration #define Denumer03(element01,element02,element03,nom) \ Enum(nom) \ Benumeration \ element01 \ ,element02 \ ,element03 \ Eenumeration #define Denumer04(element01,element02,element03,element04,nom) \ Enum(nom) \ Benumeration \ element01 \ ,element02 \ ,element03 \ ,element04 \ Eenumeration #define Denumer05(element01,element02,element03,element04,element05,nom) \ Enum(nom) \ Benumeration \ element01 \ ,element02 \ ,element03 \ ,element04 \ ,element05 \ Eenumeration #define Denumer06(element01,element02,element03,element04,element05,element06,nom) \ Enum(nom) \ Benumeration \ element01 \ ,element02 \ ,element03 \ ,element04 \ ,element05 \ ,element06 \ Eenumeration #define Denumer07(element01,element02,element03,element04,element05,element06,element07,nom) \ Enum(nom) \ Benumeration \ element01 \ ,element02 \ ,element03 \ ,element04 \ ,element05 \ ,element06 \ ,element07 \ Eenumeration #define Denumer08(element01,element02,element03,element04,element05,element06,element07,element08,nom) \ Enum(nom) \ Benumeration \ element01 \ ,element02 \ ,element03 \ ,element04 \ ,element05 \ ,element06 \ ,element07 \ ,element08 \ Eenumeration #define Denumer09(element01,element02,element03,element04,element05,element06,element07,element08,element09,nom) \ Enum(nom) \ Benumeration \ element01 \ ,element02 \ ,element03 \ ,element04 \ ,element05 \ ,element06 \ ,element07 \ ,element08 \ ,element09 \ Eenumeration #define Denumer10(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ Eenumeration #define Denumer11(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ Eenumeration /* Introduit le 20230927110826... */ #define Denumer12(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ Eenumeration /* Introduit le 20230927110826... */ #define Denumer13(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ Eenumeration #define Denumer14(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ Eenumeration /* Introduit le 20230731112533... */ #define Denumer15(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ ,el15 \ Eenumeration /* Introduit le 20230731112533... */ #define Denumer16(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ ,el15 \ ,el16 \ Eenumeration #define Denumer17(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ ,el15 \ ,el16 \ ,el17 \ Eenumeration #define Denumer18(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ ,el15 \ ,el16 \ ,el17 \ ,el18 \ Eenumeration #define Denumer19(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,el19,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ ,el15 \ ,el16 \ ,el17 \ ,el18 \ ,el19 \ Eenumeration #define Denumer20(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,el19,el20,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ ,el15 \ ,el16 \ ,el17 \ ,el18 \ ,el19 \ ,el20 \ Eenumeration #define Denumer21(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,el19,el20,el21,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ ,el15 \ ,el16 \ ,el17 \ ,el18 \ ,el19 \ ,el20 \ ,el21 \ Eenumeration #define Denumer22(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,el19,el20,el21,el22,nom) \ Enum(nom) \ Benumeration \ el01 \ ,el02 \ ,el03 \ ,el04 \ ,el05 \ ,el06 \ ,el07 \ ,el08 \ ,el09 \ ,el10 \ ,el11 \ ,el12 \ ,el13 \ ,el14 \ ,el15 \ ,el16 \ ,el17 \ ,el18 \ ,el19 \ ,el20 \ ,el21 \ ,el22 \ Eenumeration #define Denumer23(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ Eenumeration #define Denumer24(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ Eenumeration #define Denumer25(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ Eenumeration #define Denumer26(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ Eenumeration #define Den27(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ Eenumeration #define Den28(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ Eenumeration #define Den29(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ Eenumeration #define Den30(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ Eenumeration #define Den31(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ Eenumeration \ /* Introduit le 20051111134206... */ #define Den32(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ ,eW \ Eenumeration \ /* Introduit le 20051114142602... */ #define Den33(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ ,eW \ ,eX \ Eenumeration \ /* Introduit le 20110224094845... */ #define Den34(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ ,eW \ ,eX \ ,eY \ Eenumeration \ /* Introduit le 20110224094845... */ #define Den35(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,eZ,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ ,eW \ ,eX \ ,eY \ ,eZ \ Eenumeration \ /* Introduit le 20110224094845... */ #define Den36(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,eZ,ea,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ ,eW \ ,eX \ ,eY \ ,eZ \ ,ea \ Eenumeration \ /* Introduit le 20110224094845... */ #define Den37(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,eZ,ea,eb,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ ,eW \ ,eX \ ,eY \ ,eZ \ ,ea \ ,eb \ Eenumeration \ /* Introduit le 20110224094845... */ #define Den38(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,eZ,ea,eb,ec,nom) \ Enum(nom) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ ,eW \ ,eX \ ,eY \ ,eZ \ ,ea \ ,eb \ ,ec \ Eenumeration #define Den39(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,eZ,ea,eb,ec,ed,n) \ Enum(n) \ Benumeration \ e1 \ ,e2 \ ,e3 \ ,e4 \ ,e5 \ ,e6 \ ,e7 \ ,e8 \ ,e9 \ ,eA \ ,eB \ ,eC \ ,eD \ ,eE \ ,eF \ ,eG \ ,eH \ ,eI \ ,eJ \ ,eK \ ,eL \ ,eM \ ,eN \ ,eO \ ,eP \ ,eQ \ ,eR \ ,eS \ ,eT \ ,eU \ ,eV \ ,eW \ ,eX \ ,eY \ ,eZ \ ,ea \ ,eb \ ,ec \ ,ed \ Eenumeration #define Den47(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,o,p,q,r,s,t,u,v,n) \ Enum(n) \ Benumeration \ A \ ,B \ ,C \ ,D \ ,E \ ,F \ ,G \ ,H \ ,I \ ,J \ ,K \ ,L \ ,M \ ,N \ ,O \ ,P \ ,Q \ ,R \ ,S \ ,T \ ,U \ ,V \ ,W \ ,X \ ,Y \ ,Z \ ,a \ ,b \ ,c \ ,d \ ,e \ ,f \ ,g \ ,h \ ,i \ ,j \ ,k \ ,l \ ,m \ ,o \ ,p \ ,q \ ,r \ ,s \ ,t \ ,u \ ,v \ Eenumeration #define Den48(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,o,p,q,r,s,t,u,v,w,n) \ Enum(n) \ Benumeration \ A \ ,B \ ,C \ ,D \ ,E \ ,F \ ,G \ ,H \ ,I \ ,J \ ,K \ ,L \ ,M \ ,N \ ,O \ ,P \ ,Q \ ,R \ ,S \ ,T \ ,U \ ,V \ ,W \ ,X \ ,Y \ ,Z \ ,a \ ,b \ ,c \ ,d \ ,e \ ,f \ ,g \ ,h \ ,i \ ,j \ ,k \ ,l \ ,m \ ,o \ ,p \ ,q \ ,r \ ,s \ ,t \ ,u \ ,v \ ,w \ Eenumeration \ /* La procedure 'Den48(...)' a ete introduite le 20081004121952... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A I T E M E N T E V E N T U E L D E S C O N S T A N T E S " E N U M E R E E S " : */ /* */ /*************************************************************************************************************************************/ #define ENUM(x) \ INTE(x) \ /* Deux cas sont possibles : ou bien les constantes enumerees sont typees en entiers */ \ /* (et on utilise 'NEUT'), ou bien elles ont un type inconnu (de moi...) et il faut */ \ /* alors forcer 'INTE'. En fait, pratiquement seul le systeme de REFERENCE */ \ /* 'SYSTEME_DPX5000_SPIX_CC' permet la definition : */ \ /* */ \ /* #define ENUM(x) NEUT(x) */ \ /* */ \ /* Mais dans la mesure ou l'on souhaite generer parfois des fichiers "bootstrapables" */ \ /* de type '$c' qui soient portables sur des machines arbitraires, il faut choisir la */ \ /* solution qui soit compatible avec le maximum de systemes, et comme le systeme de */ \ /* REFERENCE 'SYSTEME_DPX5000_SPIX_CC' autorise 'INTE', on l'adopte partout... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S S T R U C T U R E S : */ /* */ /*************************************************************************************************************************************/ #define Struct \ struct #define Union \ union #define STRU(nom_de_structure) \ Struct nom_de_structure \ /* Pour etre utilise dans 'Typedef()'. */ #define UNIO(nom_d_union) \ Union nom_d_union \ /* Pour etre utilise dans 'Typedef()'. */ #define Enum(nom_d_une_liste_enumeree) \ enum nom_d_une_liste_enumeree \ /* Pour creer une liste enumeree. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S T R U C T U R E S S T A N D A R D S : */ /* */ /*************************************************************************************************************************************/ #define Dstruct00(nom1,nom2) \ Dstruct01(nom1 \ ,DEFV(Dummy,dummy) \ ,nom2 \ ) #ifdef SYSTEME_DPX5000_SPIX_CC # undef Dstruct00 # define Dstruct00(nom1,nom2) \ STRU(nom1) \ Bstructure \ Estructure(nom2) \ /* Le compilateur 'cc' accepte les structures vides... */ \ /* */ \ /* Version DPX5000/SPIX/CC. */ #Aifdef SYSTEME_DPX5000_SPIX_CC #Eifdef SYSTEME_DPX5000_SPIX_CC #define Dstruct01(nom1,element01,nom2) \ STRU(nom1) \ Bstructure \ element01; \ Estructure(nom2) #define Dstruct02(nom1,element01,element02,nom2) \ STRU(nom1) \ Bstructure \ element01; \ element02; \ Estructure(nom2) #define Dstruct03(nom1,element01,element02,element03,nom2) \ STRU(nom1) \ Bstructure \ element01; \ element02; \ element03; \ Estructure(nom2) #define Dstruct04(nom1,element01,element02,element03,element04,nom2) \ STRU(nom1) \ Bstructure \ element01; \ element02; \ element03; \ element04; \ Estructure(nom2) #define Dstruct05(nom1,element01,element02,element03,element04,element05,nom2) \ STRU(nom1) \ Bstructure \ element01; \ element02; \ element03; \ element04; \ element05; \ Estructure(nom2) #define Dstruct06(nom1,element01,element02,element03,element04,element05,element06,nom2) \ STRU(nom1) \ Bstructure \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ Estructure(nom2) #define Dstruct07(nom1,element01,element02,element03,element04,element05,element06,element07,nom2) \ STRU(nom1) \ Bstructure \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ element07; \ Estructure(nom2) #define Dstruct08(nom1,element01,element02,element03,element04,element05,element06,element07,element08,nom2) \ STRU(nom1) \ Bstructure \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ element07; \ element08; \ Estructure(nom2) #define Dstruct09(nom1,element01,element02,element03,element04,element05,element06,element07,element08,element09,nom2) \ STRU(nom1) \ Bstructure \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ element07; \ element08; \ element09; \ Estructure(nom2) #define Dstruct10(nom1,el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,nom2) \ STRU(nom1) \ Bstructure \ el01; \ el02; \ el03; \ el04; \ el05; \ el06; \ el07; \ el08; \ el09; \ el10; \ Estructure(nom2) #define Dstruct12(nom1,el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,nom2) \ STRU(nom1) \ Bstructure \ el01; \ el02; \ el03; \ el04; \ el05; \ el06; \ el07; \ el08; \ el09; \ el10; \ el11; \ el12; \ Estructure(nom2) #define Dstruct13(nom1,el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,nom2) \ STRU(nom1) \ Bstructure \ el01; \ el02; \ el03; \ el04; \ el05; \ el06; \ el07; \ el08; \ el09; \ el10; \ el11; \ el12; \ el13; \ Estructure(nom2) #define Dstruct14(nom1,el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,nom2) \ STRU(nom1) \ Bstructure \ el01; \ el02; \ el03; \ el04; \ el05; \ el06; \ el07; \ el08; \ el09; \ el10; \ el11; \ el12; \ el13; \ el14; \ Estructure(nom2) #define Dstruct15(nom1,el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,nom2) \ STRU(nom1) \ Bstructure \ el01; \ el02; \ el03; \ el04; \ el05; \ el06; \ el07; \ el08; \ el09; \ el10; \ el11; \ el12; \ el13; \ el14; \ el15; \ Estructure(nom2) #define Dstruct16(nom1,el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,nom2) \ STRU(nom1) \ Bstructure \ el01; \ el02; \ el03; \ el04; \ el05; \ el06; \ el07; \ el08; \ el09; \ el10; \ el11; \ el12; \ el13; \ el14; \ el15; \ el16; \ Estructure(nom2) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* U N I O N S S T A N D A R D S : */ /* */ /*************************************************************************************************************************************/ #define Dunion_01(nom1,element01,nom2) \ UNIO(nom1) \ Bunion \ element01; \ Eunion(nom2) #define Dunion_02(nom1,element01,element02,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ Eunion(nom2) #define Dunion_03(nom1,element01,element02,element03,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ element03; \ Eunion(nom2) #define Dunion_04(nom1,element01,element02,element03,element04,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ element03; \ element04; \ Eunion(nom2) #define Dunion_05(nom1,element01,element02,element03,element04,element05,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ element03; \ element04; \ element05; \ Eunion(nom2) #define Dunion_06(nom1,element01,element02,element03,element04,element05,element06,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ Eunion(nom2) #define Dunion_07(nom1,element01,element02,element03,element04,element05,element06,element07,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ element07; \ Eunion(nom2) #define Dunion_08(nom1,element01,element02,element03,element04,element05,element06,element07,element08,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ element07; \ element08; \ Eunion(nom2) #define Dunion_09(nom1,element01,element02,element03,element04,element05,element06,element07,element08,element09,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ element07; \ element08; \ element09; \ Eunion(nom2) #define Dunion_10(nom1,element01,element02,element03,element04,element05,element06,element07,element08,element09,element10,nom2) \ UNIO(nom1) \ Bunion \ element01; \ element02; \ element03; \ element04; \ element05; \ element06; \ element07; \ element08; \ element09; \ element10; \ Eunion(nom2) #define Dunion_11(nom1,elem01,elem02,elem03,elem04,elem05,elem06,elem07,elem08,elem09,elem10,elem11,nom2) \ UNIO(nom1) \ Bunion \ elem01; \ elem02; \ elem03; \ elem04; \ elem05; \ elem06; \ elem07; \ elem08; \ elem09; \ elem10; \ elem11; \ Eunion(nom2) #define Dunion_12(nom1,elem01,elem02,elem03,elem04,elem05,elem06,elem07,elem08,elem09,elem10,elem11,elem12,nom2) \ UNIO(nom1) \ Bunion \ elem01; \ elem02; \ elem03; \ elem04; \ elem05; \ elem06; \ elem07; \ elem08; \ elem09; \ elem10; \ elem11; \ elem12; \ Eunion(nom2) #define Dunion_13(nom1,elem01,elem02,elem03,elem04,elem05,elem06,elem07,elem08,elem09,elem10,elem11,elem12,elem13,nom2) \ UNIO(nom1) \ Bunion \ elem01; \ elem02; \ elem03; \ elem04; \ elem05; \ elem06; \ elem07; \ elem08; \ elem09; \ elem10; \ elem11; \ elem12; \ elem13; \ Eunion(nom2) \ /* La definition 'Dunion_13(...)' a ete introduite le 20150227112637... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T A N T E S D E B A S E ( 1 ) : */ /* */ /*************************************************************************************************************************************/ #define UNDEF \ 444719 \ /* Pour ce qui n'est pas defini. On notera que cette valeur, d'une part convient aussi bien */ \ /* a des machines 16 bits, et que d'autre part, sa valeur 'def0' rappelle phonetiquement le */ \ /* mot 'defaut' (a titre d'information, sa valeur decimale est 57072)... */ \ /* */ \ /* ATTENTION, il y a eu pendant longtemps : */ \ /* */ \ /* #define UNDEF \ */ \ /* PARE(0xdef0) */ \ /* */ \ /* Malheureusement, cette forme ne permet pas d'utiliser le symbole 'UNDEF' dans des tests */ \ /* du type '#if'. D'ou cette nouvelle forme plus compatible. Cette modification a ete */ \ /* effectuee a cause de '$xiidG/fonction.1$FON' et du traitement tres particulier du */ \ /* symbole 'VL_PACKING_RGB_8' lors de '$PASSE_1' alors qu'il n'est defini qu'en '$PASSE_5'. */ \ /* */ \ /* Le 20030405180029 afin d'etre "en phase" avec la variable '$UNDEF', je suis passe de */ \ /* 57072 a 444444719... */ \ /* */ \ /* Le 20030528141449 je suis passe de 444444719 a 444719 car, en effet, 'UNDEF' peut, par */ \ /* exemple, intervenir dans des allocations memoire ('v $xci/valeurs_alea$K UNDEF') ; il */ \ /* faut donc limiter les risques de debordement. On notera que malgre la modification de */ \ /* 'v $xci/valeurs_alea$K 20030528154724' consistant a remplacer 'UNDEF' par 'gnnUNDEF', il */ \ /* est preferable de conserver la petite valeur (444719) plutot que la grande (444444719), */ \ /* car, en effet, la grande valeur pourrait avoir des consequences facheuses ailleurs... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* L I S T E S P O U R L E P R E - P R O C E S S E U R : */ /* */ /* */ /* Utilisation : */ /* */ /* Pour transmettre une liste de */ /* valeurs numeriques de longueur */ /* variable lors d'un appel de */ /* macro-procedures, on ne peut utiliser */ /* la virgule comme separateur, car */ /* en effet, le pre-processeur considere */ /* alors que le nombre d'arguments a */ /* l'appel est different du nombre */ /* d'arguments formels ; il faut donc */ /* "ruser" ; on ecrira par exemple : */ /* */ /* BlistA ELEM(x) ELEM(y) ELEM(z) ElistA */ /* */ /* pour transmettre la liste {x,y,z}. */ /* */ /* Il est imperatif que la definition de */ /* 'ELEM' ne commence pas par une parenthese */ /* (d'ou l'operateur neutre '~~'), et de meme */ /* ne finisse pas par une parenthese (voir la */ /* definition de 'UNDEF')... D'autre part, */ /* afin de parentheser par 'PARE' l'argument */ /* 'x' (qui peut etre n'importe quoi, et en */ /* particulier une expression), et pour */ /* satisfaire la contrainte precedente (pas */ /* de parentheses encadrant la definition */ /* de 'ELEM'), il faut noyer 'PARE(x)' a */ /* l'interieur d'autre chose ; d'ou la */ /* structure conditionnelle qui joue */ /* le role de limiteur (evidemment, pour */ /* les raisons evoquees ci-dessus, on ne */ /* peut utiliser la forme 'COND'...). */ /* */ /*************************************************************************************************************************************/ #nodefine ELEM_SYSTEME_DPX5000_SPIX_CC_VERSION_01 \ /* ATTENTION : la 'VERSION_01' est incompatible avec les fichiers "bootstrappables", et */ \ /* en particulier '$xbg/common$c'. */ #define ELEM_SYSTEME_DPX5000_SPIX_CC_VERSION_02 \ /* La 'VERSION_02' quant a elle, est compatible avec les fichiers "bootstrappables", et */ \ /* en particulier '$xbg/common$c'. */ #define BlistA \ BEGIN \ /* Debut d'une liste variable d'arguments numeriques ou de caracteres, */ #define ElistA \ END \ /* Fin d'une liste variable d'arguments numeriques ou de caracteres. */ =define ELEM(element) \ element /* Definition d'un element. */ /* On notera que cette procedure n'est prise en compte que lors de la 'PASSE_2', et */ /* ce afin qu'il n'y ait pas de problemes de nombre d'arguments dans des procedures */ =define IstructL01(element01) \ BlistA \ ELEM(element01) \ ElistA =define IstructL02(element01,element02) \ BlistA \ ELEM(element01) \ ,ELEM(element02) \ ElistA =define IstructL03(element01,element02,element03) \ BlistA \ ELEM(element01) \ ,ELEM(element02) \ ,ELEM(element03) \ ElistA =define IstructL04(element01,element02,element03,element04) \ BlistA \ ELEM(element01) \ ,ELEM(element02) \ ,ELEM(element03) \ ,ELEM(element04) \ ElistA =define IstructL05(element01,element02,element03,element04,element05) \ BlistA \ ELEM(element01) \ ,ELEM(element02) \ ,ELEM(element03) \ ,ELEM(element04) \ ,ELEM(element05) \ ElistA =define IstructL06(element01,element02,element03,element04,element05,element06) \ BlistA \ ELEM(element01) \ ,ELEM(element02) \ ,ELEM(element03) \ ,ELEM(element04) \ ,ELEM(element05) \ ,ELEM(element06) \ ElistA =define IstructL07(element01,element02,element03,element04,element05,element06,element07) \ BlistA \ ELEM(element01) \ ,ELEM(element02) \ ,ELEM(element03) \ ,ELEM(element04) \ ,ELEM(element05) \ ,ELEM(element06) \ ,ELEM(element07) \ ElistA =define IstructL08(element01,element02,element03,element04,element05,element06,element07,element08) \ BlistA \ ELEM(element01) \ ,ELEM(element02) \ ,ELEM(element03) \ ,ELEM(element04) \ ,ELEM(element05) \ ,ELEM(element06) \ ,ELEM(element07) \ ,ELEM(element08) \ ElistA =define IstructL09(element01,element02,element03,element04,element05,element06,element07,element08,element09) \ BlistA \ ELEM(element01) \ ,ELEM(element02) \ ,ELEM(element03) \ ,ELEM(element04) \ ,ELEM(element05) \ ,ELEM(element06) \ ,ELEM(element07) \ ,ELEM(element08) \ ,ELEM(element09) \ ElistA =define IstructL10(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10) \ BlistA \ ELEM(el01) \ ,ELEM(el02) \ ,ELEM(el03) \ ,ELEM(el04) \ ,ELEM(el05) \ ,ELEM(el06) \ ,ELEM(el07) \ ,ELEM(el08) \ ,ELEM(el09) \ ,ELEM(el10) \ ElistA =define IstructL11(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11) \ BlistA \ ELEM(el01) \ ,ELEM(el02) \ ,ELEM(el03) \ ,ELEM(el04) \ ,ELEM(el05) \ ,ELEM(el06) \ ,ELEM(el07) \ ,ELEM(el08) \ ,ELEM(el09) \ ,ELEM(el10) \ ,ELEM(el11) \ ElistA =define IstructL12(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12) \ BlistA \ ELEM(el01) \ ,ELEM(el02) \ ,ELEM(el03) \ ,ELEM(el04) \ ,ELEM(el05) \ ,ELEM(el06) \ ,ELEM(el07) \ ,ELEM(el08) \ ,ELEM(el09) \ ,ELEM(el10) \ ,ELEM(el11) \ ,ELEM(el12) \ ElistA =define IstructL40(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10 \ ,el11,el12,el13,el14,el15,el16,el17,el18,el19,el20 \ ,el21,el22,el23,el24,el25,el26,el27,el28,el29,el30 \ ,el31,el32,el33,el34,el35,el36,el37,el38,el39,el40 \ ) \ BlistA \ ELEM(el01) \ ,ELEM(el02) \ ,ELEM(el03) \ ,ELEM(el04) \ ,ELEM(el05) \ ,ELEM(el06) \ ,ELEM(el07) \ ,ELEM(el08) \ ,ELEM(el09) \ ,ELEM(el10) \ ,ELEM(el11) \ ,ELEM(el12) \ ,ELEM(el13) \ ,ELEM(el14) \ ,ELEM(el15) \ ,ELEM(el16) \ ,ELEM(el17) \ ,ELEM(el18) \ ,ELEM(el19) \ ,ELEM(el20) \ ,ELEM(el21) \ ,ELEM(el22) \ ,ELEM(el23) \ ,ELEM(el24) \ ,ELEM(el25) \ ,ELEM(el26) \ ,ELEM(el27) \ ,ELEM(el28) \ ,ELEM(el29) \ ,ELEM(el30) \ ,ELEM(el31) \ ,ELEM(el32) \ ,ELEM(el33) \ ,ELEM(el34) \ ,ELEM(el35) \ ,ELEM(el36) \ ,ELEM(el37) \ ,ELEM(el38) \ ,ELEM(el39) \ ,ELEM(el40) \ ElistA =define IstructL50(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10 \ ,el11,el12,el13,el14,el15,el16,el17,el18,el19,el20 \ ,el21,el22,el23,el24,el25,el26,el27,el28,el29,el30 \ ,el31,el32,el33,el34,el35,el36,el37,el38,el39,el40 \ ,el41,el42,el43,el44,el45,el46,el47,el48,el49,el50 \ ) \ BlistA \ ELEM(el01) \ ,ELEM(el02) \ ,ELEM(el03) \ ,ELEM(el04) \ ,ELEM(el05) \ ,ELEM(el06) \ ,ELEM(el07) \ ,ELEM(el08) \ ,ELEM(el09) \ ,ELEM(el10) \ ,ELEM(el11) \ ,ELEM(el12) \ ,ELEM(el13) \ ,ELEM(el14) \ ,ELEM(el15) \ ,ELEM(el16) \ ,ELEM(el17) \ ,ELEM(el18) \ ,ELEM(el19) \ ,ELEM(el20) \ ,ELEM(el21) \ ,ELEM(el22) \ ,ELEM(el23) \ ,ELEM(el24) \ ,ELEM(el25) \ ,ELEM(el26) \ ,ELEM(el27) \ ,ELEM(el28) \ ,ELEM(el29) \ ,ELEM(el30) \ ,ELEM(el31) \ ,ELEM(el32) \ ,ELEM(el33) \ ,ELEM(el34) \ ,ELEM(el35) \ ,ELEM(el36) \ ,ELEM(el37) \ ,ELEM(el38) \ ,ELEM(el39) \ ,ELEM(el40) \ ,ELEM(el41) \ ,ELEM(el42) \ ,ELEM(el43) \ ,ELEM(el44) \ ,ELEM(el45) \ ,ELEM(el46) \ ,ELEM(el47) \ ,ELEM(el48) \ ,ELEM(el49) \ ,ELEM(el50) \ ElistA =define IstructL60(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10 \ ,el11,el12,el13,el14,el15,el16,el17,el18,el19,el20 \ ,el21,el22,el23,el24,el25,el26,el27,el28,el29,el30 \ ,el31,el32,el33,el34,el35,el36,el37,el38,el39,el40 \ ,el41,el42,el43,el44,el45,el46,el47,el48,el49,el50 \ ,el51,el52,el53,el54,el55,el56,el57,el58,el59,el60 \ ) \ BlistA \ ELEM(el01) \ ,ELEM(el02) \ ,ELEM(el03) \ ,ELEM(el04) \ ,ELEM(el05) \ ,ELEM(el06) \ ,ELEM(el07) \ ,ELEM(el08) \ ,ELEM(el09) \ ,ELEM(el10) \ ,ELEM(el11) \ ,ELEM(el12) \ ,ELEM(el13) \ ,ELEM(el14) \ ,ELEM(el15) \ ,ELEM(el16) \ ,ELEM(el17) \ ,ELEM(el18) \ ,ELEM(el19) \ ,ELEM(el20) \ ,ELEM(el21) \ ,ELEM(el22) \ ,ELEM(el23) \ ,ELEM(el24) \ ,ELEM(el25) \ ,ELEM(el26) \ ,ELEM(el27) \ ,ELEM(el28) \ ,ELEM(el29) \ ,ELEM(el30) \ ,ELEM(el31) \ ,ELEM(el32) \ ,ELEM(el33) \ ,ELEM(el34) \ ,ELEM(el35) \ ,ELEM(el36) \ ,ELEM(el37) \ ,ELEM(el38) \ ,ELEM(el39) \ ,ELEM(el40) \ ,ELEM(el41) \ ,ELEM(el42) \ ,ELEM(el43) \ ,ELEM(el44) \ ,ELEM(el45) \ ,ELEM(el46) \ ,ELEM(el47) \ ,ELEM(el48) \ ,ELEM(el49) \ ,ELEM(el50) \ ,ELEM(el51) \ ,ELEM(el52) \ ,ELEM(el53) \ ,ELEM(el54) \ ,ELEM(el55) \ ,ELEM(el56) \ ,ELEM(el57) \ ,ELEM(el58) \ ,ELEM(el59) \ ,ELEM(el60) \ ElistA /* Initialisation de structures "lineaires" a 1,2,3... elements. */ /* */ /* On notera que ces procedures ne sont prises en compte que lors de la 'PASSE_2', et */ /* ce afin qu'il n'y ait pas de problemes de nombre d'arguments dans des procedures */ /* telle 'vectorF_3D'... */ /* */ /* Pour 'v $xiii/vecteurs$FON IstructL40' a ete introduit 'IstructL40(...)' le */ /* 20230730115502... */ /* */ /* Le 20230906150104 a ete introduit 'IstructL50(...)' en prevision d'une extension */ /* de 'v $xiii/vecteurs$FON IstructL50'... */ /* */ /* Le 20230926180544 a ete introduit 'IstructL60(...)' en prevision d'une extension */ /* de 'v $xiii/vecteurs$FON IstructL60'... */ #define Ichaine00 \ IstructL01(K_NULL) #define Ichaine01(caractere01) \ IstructL02(caractere01,K_NULL) #define Ichaine02(caractere01,caractere02) \ IstructL03(caractere01,caractere02,K_NULL) #define Ichaine03(caractere01,caractere02,caractere03) \ IstructL04(caractere01,caractere02,caractere03,K_NULL) #define Ichaine04(caractere01,caractere02,caractere03,caractere04) \ IstructL05(caractere01,caractere02,caractere03,caractere04,K_NULL) #define Ichaine05(caractere01,caractere02,caractere03,caractere04,caractere05) \ IstructL06(caractere01,caractere02,caractere03,caractere04,caractere05,K_NULL) #define Ichaine06(caractere01,caractere02,caractere03,caractere04,caractere05,caractere06) \ IstructL07(caractere01,caractere02,caractere03,caractere04,caractere05,caractere06,K_NULL) #define Ichaine07(caractere01,caractere02,caractere03,caractere04,caractere05,caractere06,caractere07) \ IstructL08(caractere01,caractere02,caractere03,caractere04,caractere05,caractere06,caractere07,K_NULL) /* Pour initialiser des chaines de caracteres a partir d'une liste de caracteres... */ =define IstructH101(structure01) \ BlistA \ structure01 \ ElistA =define IstructH102(structure01,structure02) \ BlistA \ structure01 \ ,structure02 \ ElistA =define IstructH103(structure01,structure02,structure03) \ BlistA \ structure01 \ ,structure02 \ ,structure03 \ ElistA /* Initialisation de structures "1-hierarchiques" a 1,2,3... elements. Le qualificatif */ /* "1-hierarchiques" signifiant "lineaire de structures lineaires", d'ou le 'H1' pour */ /* signifier "premier niveau". */ /* On notera que ces procedures ne sont prises en compte que lors de la 'PASSE_2', et */ /* ce afin qu'il n'y ait pas de problemes de nombre d'arguments dans des procedures */ /* telle 'vectorF_3D'... */ #ifdef ELEM_SYSTEME_DPX5000_SPIX_CC_VERSION_01 # ifdef SYSTEME_DPX5000_SPIX_CC = undef ELEM = define ELEM(element) \ ~~VRAI ? PARE(element) : UNDEF /* Definition d'un element ; ATTENTION : la forme conditionnelle ne peut */ /* etre precedee de parentheses, de meme que l'on ne peut en rencontrer a la */ /* fin (donc COND(VRAI,element,UNDEF) est interdit). Enfin, je n'ai rien trouve */ /* de mieux que cela pour faire office de separateur et qui convienne a la fois */ /* au pre-processeur et au compilateur... */ /* On notera que cette procedure n'est prise en compte que lors de la 'PASSE_2', et */ /* ce afin qu'il n'y ait pas de problemes de nombre d'arguments dans des procedures */ /* telle 'vectorF_3D'... */ /* */ /* Version DPX5000/SPIX/CC. */ = undef IstructL01 = define IstructL01(element01) \ BlistA \ ELEM(element01) \ ElistA = undef IstructL02 = define IstructL02(element01,element02) \ BlistA \ ELEM(element01) \ ELEM(element02) \ ElistA = undef IstructL03 = define IstructL03(element01,element02,element03) \ BlistA \ ELEM(element01) \ ELEM(element02) \ ELEM(element03) \ ElistA /* Initialisation de structures "lineaires" a 1,2,3... elements. */ /* On notera que ces procedures ne sont prises en compte que lors de la 'PASSE_2', et */ /* ce afin qu'il n'y ait pas de problemes de nombre d'arguments dans des procedures */ /* telle 'vectorF_3D'... */ /* */ /* Version DPX5000/SPIX/CC. */ = undef IstructH101 = define IstructH101(structure01) \ BlistA \ structure01 \ ElistA = undef IstructH102 = define IstructH102(structure01,structure02) \ BlistA \ structure01 \ structure02 \ ElistA = undef IstructH103 = define IstructH103(structure01,structure02,structure03) \ BlistA \ structure01 \ structure02 \ structure03 \ ElistA /* Initialisation de structures "1-hierarchiques" a 1,2,3... elements. Le qualificatif */ /* "1-hierarchiques" signifiant "lineaire de structures lineaires", d'ou le 'H1' pour */ /* signifier "premier niveau". */ /* On notera que ces procedures ne sont prises en compte que lors de la 'PASSE_2', et */ /* ce afin qu'il n'y ait pas de problemes de nombre d'arguments dans des procedures */ /* telle 'vectorF_3D'... */ /* */ /* Version DPX5000/SPIX/CC. */ # Aifdef SYSTEME_DPX5000_SPIX_CC # Eifdef SYSTEME_DPX5000_SPIX_CC #Aifdef ELEM_SYSTEME_DPX5000_SPIX_CC_VERSION_01 #Eifdef ELEM_SYSTEME_DPX5000_SPIX_CC_VERSION_01 #ifdef ELEM_SYSTEME_DPX5000_SPIX_CC_VERSION_02 #Aifdef ELEM_SYSTEME_DPX5000_SPIX_CC_VERSION_02 #Eifdef ELEM_SYSTEME_DPX5000_SPIX_CC_VERSION_02 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A F F E C T A T I O N S : */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* La structure des procedures qui */ /* suivent est tres "pointue" et elles */ /* ne peuvent etre modifiees "a la legere". */ /* En particulier l'ordre des directives */ /* qui les composent, l'absence de lignes */ /* suite a la fin ou encore les changements */ /* de ligne (en '$PASSE_2') ne peuvent etre */ /* modifiees sans reflexion ni test exhaustif... */ /* */ /*************************************************************************************************************************************/ #define RACINE_DE_LA_SAUVEGARDE_DES_VALEURS_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES \ ValeurParDefautDe /* Introduit le 20071110094509. Le 20071114110538, le nom a ete "prolonge"... */ /* */ /* ATTENTION : 'ValeurParDefautDe' ne doit pas etre sur une ligne suite et ce afin */ /* d'eviter des problemes de concatenation par la suite... */ #ifndef RACINE_DU_NOM_DE_LA_LISTE_DES_ARGUMENTS_IMPLICITES /* Ceci fut introduit le 20071117114933. On notera que l'on ne peut pas remplacer cette */ /* sequence conditionnelle {#ifndef,#Aifndef,#Eifndef} et le '#define' qui suit par un */ /* '#TestADef' car, en effet, ce '#define' est (au moins provisoirement...) un '#nodefine'. */ /* Ceci fut introduit afin de permettre de d'activer selectivement ce dispositif dans les */ /* librairies de '$xb'... */ # define RACINE_DU_NOM_DE_LA_LISTE_DES_ARGUMENTS_IMPLICITES \ ListeDesArgumentsImplicites /* Introduit le 20071114104738. On notera que le 'nodefine' permet de ne pas generer le */ /* dispositif defini ci-apres de reinitialisation des arguments implicites... */ /* */ /* ATTENTION : 'ListeDesArgumentsImplicites' ne doit pas etre sur une ligne suite car, en */ /* effet, dans le cas contraire un espace est insere entre ce symbole et '__COMPTEUR8__A__' */ /* dans 'LISTE_DES_ARGUMENTS_IMPLICITES'... */ /* */ /* Le 20071117150525, le '#nodefine' devient un '#define'. Mais etant donnee la remarque */ /* ci-dessus ('v $xil/defi_c1$vv$DEF 20071117114933'), les {#ifndef,#Aifndef,#Eifndef} */ /* encadrant ce '#define' et l'ensemble n'est pas remplace par un '#TestADef'... */ #Aifndef RACINE_DU_NOM_DE_LA_LISTE_DES_ARGUMENTS_IMPLICITES #Eifndef RACINE_DU_NOM_DE_LA_LISTE_DES_ARGUMENTS_IMPLICITES #ifdef RACINE_DU_NOM_DE_LA_LISTE_DES_ARGUMENTS_IMPLICITES @ define VERSION__RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES /* Introduit le 20071117122849 pour 'v $xccp/xbVERSION$vv$I 20071117113750'... */ # define LISTE_DES_ARGUMENTS_IMPLICITES \ RACINE_DU_NOM_DE_LA_LISTE_DES_ARGUMENTS_IMPLICITES`__COMPTEUR8__A__ # define ReStOr(x) \ EGAL(x,RACINE_DE_LA_SAUVEGARDE_DES_VALEURS_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES`````x); # define GENERATION_D_UNE_LISTE_DES_ARGUMENTS_IMPLICITES(x) \ %ifndef LISTE_DES_ARGUMENTS_IMPLICITES \ __PLUS1__A__ \ %define LISTE_DES_ARGUMENTS_IMPLICITES ReStOr(x) \ __MOINS1__A__ \ %Aifndef \ __PLUS1__A__ \ %define LISTE_DES_ARGUMENTS_IMPLICITES __MOINS1__A__ LISTE_DES_ARGUMENTS_IMPLICITES ReStOr(x) \ __PLUS1__A__ \ %Eifndef \ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ /* Procedures introduites le 20071112125255 "pour le plaisir". La premiere permet de */ /* mettre 'x' en queue de la liste courante, alors que la seconde edite le contenu de */ /* la liste courante (et donc, en particulier, son etat final...). */ /* */ /* Le 20071112110511, j'avais note qu'il etait possible de generer des listes des 'x's */ /* definis via 'SINS(...)' et 'SINT(...)'. C'est ce qu'implante la procedure baptisee */ /* 'GENERATION_D_UNE_LISTE_DES_ARGUMENTS_IMPLICITES(...)'. A la fin de ce processus, un : */ /* */ /* LISTE_DES_ARGUMENTS_IMPLICITES */ /* */ /* quelque part fera apparaitre la liste des arguments implicites ainsi construite. On */ /* notera qu'ainsi on genere en fait autant de symboles "RACINE_DU_NOM_DE_...`NNNNNNNN" */ /* qu'il y a d'arguments implicites (ou "NNNNNNNN" represente une valeur decimale debutant */ /* a 1 ; en fait l'existence de l'element 0 est testee pour initialiser la liste, mais */ /* aucune valeur ne lui est attribuee...). */ /* */ /* On notera le 20071227180827 que la valeur "NNNNNNNN" n'est jamais remise a zero meme lors */ /* du 'INITIALISATION_DE_LA_RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES', */ /* ce qui evite des problemes de redefinition (via '%define'...). Par contre, le symbole */ /* 'courant" 'LISTE_DES_ARGUMENTS_IMPLICITES' (pour une certaine valeur de "NNNNNNNN") */ /* lors de cette initialisation, ce qui reinitialise en quelque sorte la liste courante... */ /* On trouvera donc ainsi, par exemple : */ /* */ /* ...`00000001 = {(VPD_V1=V1);} */ /* ...`00000002 = {(VPD_V1=V1);(VPD_V2=V2);} */ /* ...`00000003 = {(VPD_V1=V1);(VPD_V2=V2);(VPD_V3=V3);} */ /* ...`00000004 = {(VPD_V1=V1);(VPD_V2=V2);(VPD_V3=V3);(VPD_V4=V4);} */ /* */ /* puis ici, reinitialisation de la liste : */ /* */ /* ...`00000005 = {(VPD_W1=W1);} */ /* ...`00000006 = {(VPD_W1=W1);(VPD_W2=W2);} */ /* ...`00000007 = {(VPD_W1=W1);(VPD_W2=W2);(VPD_W3=W3);} */ /* ...`00000008 = {(VPD_W1=W1);(VPD_W2=W2);(VPD_W3=W3);(VPD_W4=W4);} */ /* */ /* et ainsi de suite (en supposant dans cet exemple, qu'il y a systematiquement quatre */ /* variables {?1,?2,?3,?4} a sauvegarder ; au passage "VPD" signifie ValeurParDefautDe" */ /* et "?" symbolise "V" ou "W"...). */ /* */ /* ATTENTION : la double occurence de '_____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____' */ /* est imperative si l'on ne veut pas que le '%Eifndef' "absorbe" en quelque sorte ce qui */ /* le suit. Cela est lie a la gestion de '$Z_UNDERSCORE' dans 'v $xccp/ChangeLigne$sed'... */ /* En notant "FCLP2" le symbole "_____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____", on */ /* trouve ici, juste avant l'application de 'v $xcc/cpp$Z ChangeLigne.sed', des lignes du */ /* type (ceci ayant ete observe et compris le 20071113083932) : */ /* */ /* CHAINE1 %Eifndef FCLP2 FCLP2 CHAINE2 $ */ /* ; */ /* */ /* ou '$' est en fait '$Z_UNDERSCORE'. L'application de 'v $xcc/cpp$Z ChangeLigne.sed' */ /* donne alors : */ /* */ /* CHAINE1 %Eifndef $ */ /* (vrai saut de ligne sans '$') */ /* CHAINE2 $ */ /* ; */ /* */ /* soit apres le '$xcp/recollage$X' qui suivra : */ /* */ /* CHAINE1 %Eifndef */ /* CHAINE2 ; */ /* */ /* et ainsi, '%Eifndef' n'a pas "absorbe" la chaine "CHAINE2"... */ /* */ /* ATTENTION : on notera l'absence de l'argument 'LISTE_DES_ARGUMENTS_IMPLICITES' */ /* relatif aux {%Aifndef,%Eifndef} ; en effet pour '%Eifndef' le compteur '__COMPTEUR8__A__' */ /* n'est pas a jour (il vaut une unite de trop a cause du '__PLUS1__A__' qui le precede et */ /* qui est essentiel...). Cet argument est donc supprime pour '%Eifndef' et aussi pour */ /* %Aifndef', par symetrie (on rappelle que de toutes facons cet argument ne sert a rien */ /* pour les directives {%Aifndef,%Eifndef}, n'etant utile que pour '%ifndef'...). */ /* */ /* ATTENTION : on notera d'autre part que les directives {__PLUS1__A__,__MOINS1__A__} sont */ /* interpretees meme a l'interieur d'une alternance fausse d'un test... */ /* */ /* Avant le 20071114104738, on trouvait ci-dessus : */ /* */ /* x */ /* __MOINS1__A__ LISTE_DES_ARGUMENTS_IMPLICITES%&&%x */ /* */ /* pour les deux : */ /* */ /* %define LISTE_DES_ARGUMENTS_IMPLICITES */ /* */ /* ci-dessus, mais a cette date fut introduite 'ReStOr(...)'... */ # define INITIALISATION_DE_LA_RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES \ %ifdef LISTE_DES_ARGUMENTS_IMPLICITES \ %undef LISTE_DES_ARGUMENTS_IMPLICITES \ %Aifdef LISTE_DES_ARGUMENTS_IMPLICITES \ %Eifdef LISTE_DES_ARGUMENTS_IMPLICITES \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ # define RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES(restaurer) \ %ifdef LISTE_DES_ARGUMENTS_IMPLICITES \ /* Introduit le 20080111091737 a cause de 'v $xrv/UNI2.11$K GENERE__FonctionF_UNI2_02' qui */ \ /* n'utilise pas 'SINT(...)'... */ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ /* Ces deux '_____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____' ont ete introduits le */ \ /* 20081028121321 car, en effet, a cette date, le '%ifdef LISTE_DES_ARGUMENTS_IMPLICITES' */ \ /* et tout ce qui suit etaient sur la meme ligne... Je ne comprends pas a cette date depuis */ \ /* quand ce dispositif ne fonctionnait plus. En fait, le 20081028131554 j'ai compris : c'est */ \ /* certainement parce que la modification du 20080111091737 (ci-dessus) n'avait pas ete */ \ /* testee (sauf evidemment pour 'v $xrv/UNI2.11$K GENERE__FonctionF_UNI2_02'... */ \ Bblock \ Test(IL_FAUT(restaurer)) \ Bblock \ LISTE_DES_ARGUMENTS_IMPLICITES; \ RETU(OK); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ \ %Aifdef LISTE_DES_ARGUMENTS_IMPLICITES \ %Eifdef LISTE_DES_ARGUMENTS_IMPLICITES \ \ INITIALISATION_DE_LA_RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES /* Procedures introduites le 20071114104738 afin de pouvoir restaurer automatiquement la */ /* valeur par defaut des arguments implicites. L'utilisation sera la suivante pour chaque */ /* fonction concernee ou l'on trouvera d'abord ('v $xil/defi_K2$vv$DEF VraiBeginFonction') : */ /* */ /* INITIALISATION_DE_LA_RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES */ /* */ /* afin de reinitialiser 'LISTE_DES_ARGUMENTS_IMPLICITES', puis une suite de 'SINS(...)' */ /* et ou de 'SINT(...)' definissant les arguments implicites et enfin tout a fait au */ /* debut du code de la fonction courante un : */ /* */ /* RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES(indic); */ /* */ /* qui, si 'indic' est VRAI, provoquera la remise a l'etat "par defaut" des arguments */ /* implicites et la sortie IMMEDIATE de la fonction correspondante (via un 'RETU(OK)' */ /* que je reprouve evidemment, puisque dans mon modele de programmation il ne doit y */ /* avoir qu'un seul RETU(...)' par fonction ; mais, enfin, je ne peux pas faire autrement, */ /* sachant qu'une telle heresie se rencontre aussi avec 'v $xig/fonct$vv$DEF Exit.OK.'...). */ /* */ /* 'INITIALISATION_DE_LA_RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES' */ /* doit etre le dernier element de cette definition et ne pas etre une ligne suite : cela */ /* est IMPERATIF si l'on veut que tout fonctionne correctement... */ #Aifdef RACINE_DU_NOM_DE_LA_LISTE_DES_ARGUMENTS_IMPLICITES # define LISTE_DES_ARGUMENTS_IMPLICITES \ VIDE # define GENERATION_D_UNE_LISTE_DES_ARGUMENTS_IMPLICITES(x) \ VIDE # define INITIALISATION_DE_LA_RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES \ VIDE # define RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES(restaurer) \ Bblock \ BLOC(VIDE;); \ Eblock #Eifdef RACINE_DU_NOM_DE_LA_LISTE_DES_ARGUMENTS_IMPLICITES #define INIS(x,a) \ x = a \ /* Pour initialiser par exemple une variable 'x' lors de sa definition, mais */ \ /* attention, sans les parentheses : c'est obligatoire pour les chaines de */ \ /* caracteres et dans les 'DenumerXX(...)', ainsi que pour les 'IstructLXX(...)' */ \ /* et les 'IchaineXX(...)'. */ #define ZINS(x,a) \ INIS(x,a)%&&%INIS(RACINE_DE_LA_SAUVEGARDE_DES_VALEURS_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES`````x,a) \ /* Introduit par symetrie avec 'ZINT(...)', ceci etant particulierement destine aux */ \ /* declarations du type : */ \ /* */ \ /* DEFV(Common,DEFV(...,ZINS(...))); */ \ /* ------ */ \ /* */ \ /* hors de {BFonction...,EFonction...}. Ceci fut introduit le 20100521151536. */ \ /* */ \ /* Je note le 20180328143053 que c'est la concatenation de 'RACINE_DE_LA_SAUVEGARDE...' */ \ /* et de 'x,a' qui provoque 'v $xig/fonct$vv$FON 20180328140252'... */ #define PINS(x,a) \ ZINS(x,a) \ /* Synonyme de 'ZINS(...)' reserve aux arguments implicites des procedures '#define's */ \ /* et mis en place par "symetrie" avec 'PINT(...)' (introduit le 20120630094408). */ #define SINS(x,a) \ GENERATION_D_UNE_LISTE_DES_ARGUMENTS_IMPLICITES(x) \ /* Lorsque cette procedure est utilisee, il est imperatif qu'elle precede 'INIS(...)' */ \ /* afin de garantir que le ";" qui le suit necessairement ne soit pas rattache au */ \ /* '%Eifndef' ici genere (voir 'v $xil/defi_c1$vv$DEF 20071113083932'). */ \ ZINS(x,a) \ /* Introduit par symetrie avec 'SINT(...)', ceci etant particulierement destine aux */ \ /* declarations du type : */ \ /* */ \ /* DEFV(Common,DEFV(...,SINS(...))); */ \ /* ------ */ \ /* */ \ /* a l'interieur de {BFonction...,EFonction...}. Ceci fut introduit le 20071109084132. */ \ /* */ \ /* On notera le 20071110112711 que pour inhiber ce dispositif de sauvegarde des valeurs */ \ /* initiales, il suffira de mettre ci-dessus la definition suivante : */ \ /* */ \ /* #define SINS(x,a) \ */ \ /* INIS(x,a) */ \ /* */ \ /* et le tour sera joue sans avoir a modifier tous les '$FON's de '$xi' qui utilisent */ \ /* 'SINS(...)' ('v $xau/LACT16.L1$Z')... */ \ /* */ \ /* Le 20071112110511, on notera qu'il est possible de generer des listes des 'x' definis */ \ /* via 'SINS(...)' et 'SINT(...)' ('v $xil/defi_c1$vv$DEF 20071112110511' ci-apres...). */ #define INIT(x,a) \ INIS(x,PARE(a)) \ /* Pour initialiser par exemple une variable 'x' lors de sa definition (mais */ \ /* avec les parentheses cette fois-ci...). */ \ /* */ \ /* Usage de {PINS,PINT,ZINS,ZINT,SINS,SINT} : */ \ /* */ \ /* 1-Arguments implicites d'une procedure '#define' : */ \ /* */ \ /* #define PROCEDURE (...) */ \ /* (...) */ \ /* DEFV(Common,DEFV(...,PINS(...))); */ \ /* DEFV(Common,DEFV(...,PINT(...))); */ \ /* (...) */ \ /* */ \ /* */ \ /* 2-Arguments implicites d'une serie de fonctions et donc HORS {BFonction?,EFonction?} : */ \ /* */ \ /* (...) */ \ /* DEFV(Common,DEFV(...,ZINS(...))); */ \ /* DEFV(Common,DEFV(...,ZINT(...))); */ \ /* (...) */ \ /* */ \ /* */ \ /* 3-Arguments implicites d'une fonction et donc a l'INTERIEUR de {BFonction?,EFonction?} : */ \ /* */ \ /* BFonction? */ \ /* (...) */ \ /* DEFV(Common,DEFV(...,SINS(...))); */ \ /* DEFV(Common,DEFV(...,SINT(...))); */ \ /* (...) */ \ /* EFonction? */ \ /* */ #define ZINT(x,a) \ INIT(x,a)%&&%INIT(RACINE_DE_LA_SAUVEGARDE_DES_VALEURS_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES`````x,a) \ /* Pour initialiser par exemple une variable 'x' lors de sa definition (mais */ \ /* avec les parentheses cette fois-ci...), tout en sauvegardant la valeur initiale, */ \ /* cette sauvegarde ne pouvant jamais etre modifiee, ceci etant particulierement destine */ \ /* aux declarations du type : */ \ /* */ \ /* DEFV(Common,DEFV(...,ZINT(...))); */ \ /* ------ */ \ /* */ \ /* hors de {BFonction...,EFonction...}. Ceci fut introduit le 20100521151536. */ \ /* */ \ /* Je note le 20180328143053 que c'est la concatenation de 'RACINE_DE_LA_SAUVEGARDE...' */ \ /* et de 'x,a' qui provoque 'v $xig/fonct$vv$FON 20180328140252'... */ #define PINT(x,a) \ ZINT(x,a) \ /* Synonyme de 'ZINT(...)' reserve aux arguments implicites des procedures '#define's */ \ /* et utilise par 'v $xcc/GLFonctions$vv$Z PINT' (introduit le 20120630094408). */ #define SINT(x,a) \ GENERATION_D_UNE_LISTE_DES_ARGUMENTS_IMPLICITES(x) \ /* Lorsque cette procedure est utilisee, il est imperatif qu'elle precede 'INIT(...)' */ \ /* afin de garantir que le ";" qui le suit necessairement ne soit pas rattache au */ \ /* '%Eifndef' ici genere (voir 'v $xil/defi_c1$vv$DEF 20071113083932'). */ \ ZINT(x,a) \ /* Pour initialiser par exemple une variable 'x' lors de sa definition (mais */ \ /* avec les parentheses cette fois-ci...), tout en sauvegardant la valeur initiale, */ \ /* cette sauvegarde ne pouvant jamais etre modifiee, ceci etant particulierement destine */ \ /* aux declarations du type : */ \ /* */ \ /* DEFV(Common,DEFV(...,SINT(...))); */ \ /* ------ */ \ /* */ \ /* a l'interieur de {BFonction...,EFonction...}. Ceci fut introduit le 20071108110308. */ \ /* */ \ /* On notera l'impossibilite d'ecrire directement : */ \ /* */ \ /* INIT(x,a),INIT(sauvegarde_de`````x,a) */ \ /* */ \ /* a cause des operateurs de "typage" qui demandent un nombre exact d'arguments et la */ \ /* solution ci-dessus introduirait finalement un argument supplementaire. D'ou */ \ /* l'introduction de '$SeparateurListe_2' ('v $xcc/cpp$Z SeparateurListe_2') qui opere */ \ /* apres la '$PASSE_2' (a laquelle appartiennent les operateurs de "typage", tel 'Float' */ \ /* par exemple...). */ \ /* */ \ /* Le 20071108130245, il a fallu remplacer "/--/" par "%&&%" et ce a cause de */ \ /* 'v $xcp/decoupage$K K_MOINS' et 'v $xcp/decoupage$K K_SLASH'. La chaine */ \ /* "%&&%" doit etre insecable... */ \ /* */ \ /* On notera le 20071108134827 que pour inhiber ce dispositif de sauvegarde des valeurs */ \ /* initiales, il suffira de mettre ci-dessus la definition suivante : */ \ /* */ \ /* #define SINT(x,a) \ */ \ /* INIT(x,a) */ \ /* */ \ /* et le tour sera joue sans avoir a modifier tous les '$FON's de '$xi' qui utilisent */ \ /* 'SINT(...)' ('v $xau/LACT16.L1$Z')... */ \ /* */ \ /* Le 20071109083457, "SauvegardeDe" fut change en "ValeurParDefautDe" qui correspond */ \ /* beaucoup mieux a la vocation de ce type de variable... */ \ /* */ \ /* Le 20071109084132, avec l'introduction de 'SINS(...)', le nom 'SINI(...)' fut change */ \ /* en 'SINT(...)'... */ \ /* */ \ /* Mais ATTENTION, je note le 20071109091647 que cela ne peut etre utilise, par exemple, */ \ /* ainsi : */ \ /* */ \ /* DEFV(Common,DEFV(CHAR,SINT(POINTERc(chaine),... */ \ /* */ \ /* car, en effet, les procedures de type 'POINTER' mettent entre parentheses le nom de la */ \ /* variable, ce qui generera ci dessus le symbole suivant : */ \ /* */ \ /* ValeurParDefautDe_____*(chaine) */ \ /* */ \ /* ce qui est peu correct... */ #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # define ccCHAR(constante_chaine) \ Finitialisation_d_une_constante_chaine_de_caracteres(constante_chaine) \ /* Pour donner le type 'CHAR' (donc 'unsigned char') a une constante chaine... */ \ /* */ \ /* ATTENTION : on n'oubliera pas d'aller modifier '$xig/fonct$vv$FON', et de regenerer */ \ /* ensuite les fichiers '$xig/fonct$vv$ARG' et '$xig/fonct$vv$EXT'... */ #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # define ccCHAR(constante_chaine) \ RIEN(constante_chaine) \ /* Pour donner le type 'CHAR' (donc 'unsigned char') a une constante chaine. On notera */ \ /* que l'on n'ecrit pas : */ \ /* */ \ /* NEUT(constante_chaine) */ \ /* */ \ /* parce qu'en toute generalite, il est impossible de parentheser une constante chaine, */ \ /* par exemple, lors d'une initialisation... */ #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) #define INIC(x,a) \ INIS(x,ccCHAR(a)) \ /* Pour initialiser par exemple une variable 'x' de type 'DEFV(CHAR,INIC(POINTERc(...)))'. */ \ /* Cette procedure 'INIC(...)' a ete introduite a cause de certains SYSTEMEs n'acceptant */ \ /* pas qu'une variable 'CHAR' (donc 'unsigned char') soit initialisee avec une constante */ \ /* chaine... */ #define EGAL(y,x) \ PARE(INIT(y,x)) \ /* Pour affecter la valeur de l'expression 'x' a la variable 'y'. */ /* chaine... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 DIVI(a,b) \ gDIVI(a,b) \ /* Division des deux nombres 'a' et 'b'. */ #if ( (defined(BUG_SYSTEME_VAX9000_ULTRIX_GCC_division_de_zero)) \ ) # undef DIVI # define DIVI(a,b) \ COND(IZNE(a) \ ,gDIVI(a,b) \ ,ZERO \ ) \ /* Division des deux nombres 'a' et 'b'. On notera que ce probleme ne se rencontre qu'en */ \ /* flottant, mais que je ne sais pas faire ici la difference avec les entiers. Cette */ \ /* methode n'etant pas fausse (bien entendu) pour les entiers, elle est utilisee */ \ /* universellement... */ #Aif ( (defined(BUG_SYSTEME_VAX9000_ULTRIX_GCC_division_de_zero)) \ ) #Eif ( (defined(BUG_SYSTEME_VAX9000_ULTRIX_GCC_division_de_zero)) \ ) #define REST(a,b) \ PARE(PARE(a) % PARE(b)) \ /* Reste de la division entiere de 'a' et 'b'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R L U T T E R C O N T R E L E S V I C E S D U C O M P I L A T E U R ' R C ' */ /* S O U S L E S Y S T E M E ' S P S 9 - R O S ' : */ /* */ /*************************************************************************************************************************************/ #if ( (defined(SYSTEME_SPS9_ROS_RC)) \ ) # TestADef BUG_SYSTEME_SPS9_ROS_RC_VIC1 \ /* Le compilateur 'rc' genere incorrectement certaines expressions, ce qui peut se */ \ /* corriger en leur appliquant l'operateur 'VIC1(...)'... */ #Aif ( (defined(SYSTEME_SPS9_ROS_RC)) \ ) #Eif ( (defined(SYSTEME_SPS9_ROS_RC)) \ ) #define VIC1(x) \ PARE(x) \ /* "Valeur" par defaut de 'VIC1' : la valeur utilise par le compilateur */ \ /* pour la variable 'x' est correcte... */ #if ( (defined(BUG_SYSTEME_SPS9_ROS_RC_VIC1)) \ ) # undef VIC1 # define VIC1(x) \ ADD2(x \ ,PRED(DIVI(SUCC(ADD2(eval_dummy,NEGA(eval_dummy))) \ ,SUCC(ADD2(NEGA(eval_dummy),eval_dummy)) \ ) \ ) \ ) \ /* Le compilateur 'rc' utilise est vicieux, et pour acceder a la bonne valeur de */ \ /* l'expression 'x', il faut la placer dans une suite d'operations ; on utilise */ \ /* a cette fin, une expression dont la valeur est toujours nulle calculee a partir */ \ /* de la variable 'eval_dummy'... */ #Aif ( (defined(BUG_SYSTEME_SPS9_ROS_RC_VIC1)) \ ) #Eif ( (defined(BUG_SYSTEME_SPS9_ROS_RC_VIC1)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S L O G I Q U E S B I N A I R E S ( B I T A B I T ) : */ /* */ /*************************************************************************************************************************************/ #define OUIN(a,b) \ PARE(INTE(a) | INTE(b)) \ /* OU INclusif. */ #define OUEX(a,b) \ PARE(INTE(a) ^ INTE(b)) \ /* OU EXclusif. */ #define ETLO(a,b) \ PARE(INTE(a) & INTE(b)) \ /* ET LOgique. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E C A L A G E S : */ /* */ /*************************************************************************************************************************************/ #define DECD(champ,amplitude) \ PARE(PARE(champ) >> INTE(amplitude)) \ /* Decalage general a droite. ATTENTION, il y avait autrefois : */ \ /* */ \ /* #define DECD(champ,amplitude) \ */ \ /* PARE(PARE(champ) >> PARE(amplitude)) */ \ /* */ \ /* Or, ceci associe au commentaire de la definition de 'SIZE_GENERAL(...)' etait responsable */ \ /* de la mauvaise generation du 'BLANC' dans '$xiiD/definit.2$DEF', et non pas un probleme */ \ /* de decalage arithmetique... */ #define DECG(champ,amplitude) \ PARE(PARE(champ) << INTE(amplitude)) \ /* Decalage general a gauche. ATTENTION, il y avait autrefois : */ \ /* */ \ /* #define DECG(champ,amplitude) \ */ \ /* PARE(PARE(champ) << PARE(amplitude)) */ \ /* */ \ /* Or, ceci associe au commentaire de la definition de 'SIZE_GENERAL(...)' etait responsable */ \ /* de la mauvaise generation du 'BLANC' dans '$xiiD/definit.2$DEF', et non pas un probleme */ \ /* de decalage arithmetique... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S T R U C T U R E S D E T E S T B I N A I R E : */ /* */ /*************************************************************************************************************************************/ #define Test(conditions) \ BblockV \ if (conditions) \ Bblock \ /* On fait preceder le "if" d'un debut de block, afin que la fin du "Test" */ \ /* (c'est-a-dire le "ETes") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee. On notera aussi la dissymetrie au niveau des 'Bblock'/'Eblock' */ \ /* entre 'ATes' et 'ETes', et ce afin de rendre obligatoire le triplet (Test,ATes,ETes). */ #define ATes \ Eblock \ else \ Bblock \ BblockV \ BblockV \ /* Alternative du 'Test'. */ \ /* */ \ /* Le 20051118155011, fut rajoute un niveau de 'BblockV' apres que j'ai decouvert un */ \ /* probleme bizarre dans 'v $xig/fonct$vv$FON Test.IFEQ.caractere_courant.K_LF' ou, pour */ \ /* ce 'Test(...)', les {ATes,ETes} associes etaient dans l'ordre inverse {ETes,ATes} sans */ \ /* que '$Cc' s'en rende compte... */ #define ETes \ EblockV \ EblockV \ Eblock \ EblockV \ /* Fin du 'Test'. */ \ /* */ \ /* Le 20051118155011, fut rajoute un niveau de 'EblockV' apres que j'ai decouvert un */ \ /* probleme bizarre dans 'v $xig/fonct$vv$FON Test.IFEQ.caractere_courant.K_LF' ou, pour */ \ /* ce 'Test(...)', les {ATes,ETes} associes etaient dans l'ordre inverse {ETes,ATes} sans */ \ /* que '$Cc' s'en rende compte... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S D E T E S T B I N A I R E : */ /* */ /*************************************************************************************************************************************/ #define IFOU(condition_1,condition_2) \ PARE(PARE(condition_1) || PARE(condition_2)) \ /* 'OU' binaire a 2 conditions, */ #define IFET(condition_1,condition_2) \ PARE(PARE(condition_1) && PARE(condition_2)) \ /* 'ET' binaire a 2 conditions, */ #define IFEQ(x,a) \ PARE(PARE(x) == PARE(a)) \ /* Test de 'x = a'. */ #define IFNE(x,a) \ PARE(PARE(x) != PARE(a)) \ /* Test de 'x # a'. */ #define IFGE(x,a) \ PARE(PARE(x) >= PARE(a)) \ /* Test de 'x >= a'. */ #define IFGT(x,a) \ PARE(PARE(x) > PARE(a)) \ /* Test de 'x > a'. */ #define IFLE(x,a) \ PARE(PARE(x) <= PARE(a)) \ /* Test de 'x <= a'. */ #define IFLT(x,a) \ PARE(PARE(x) < PARE(a)) \ /* Test de 'x < a'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R D E S E L E C T I O N C O N D I T I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ #define COND(condition,valeur_si_VRAI,valeur_si_FAUX) \ PARE(PARE(condition) ? PARE(valeur_si_VRAI) : PARE(valeur_si_FAUX)) \ /* Operation conditionnelle. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I D E N T I T E D ' U N O B J E T : */ /* */ /*************************************************************************************************************************************/ #define aIDENTITE(objet) \ ADRESSE(objet) \ /* Acces a l'identite "directe" d'un objet. */ #define IDENTITE(objet) \ NEUT(objet) \ /* Acces a l'identite "indirecte" d'un objet. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R D I C T I O N D U " g o t o " : */ /* */ /*************************************************************************************************************************************/ #define goto \ Cachez_ce_GOTO_que_je_ne_saurais_voir \ /* Le 'goto' est completement proscrit... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S T R U C T U R E S D E C O N T R O L E D E S A L T E R N A T I V E S " C A S E " : */ /* */ /*************************************************************************************************************************************/ #define Brek \ break \ /* Sortie de l'instruction 'Choi' en fin de traitement d'un cas. */ #define Choi(expression) \ BblockV \ BblockV \ switch(expression) \ /* On fait preceder le "switch" de deux debuts de block, afin que la fin du "Choi" */ \ /* (c'est-a-dire le "ECho") et la presence du traitement par default (c'est-a-dire */ \ /* 'Defo') puissent etre detectes par le compilateur ; en effet, s'il s'agissait */ \ /* d'une instruction vide, son absence ne serait pas diagnostiquee !!! */ #define Case(constante) \ case PARE(constante) : \ Bblock \ /* Traitement du cas courant. ATTENTION, il est de loin preferable de ne pas ecrire : */ \ /* */ \ /* case INTE(constante) : */ \ /* */ \ /* car, en effet, si par erreur, des constantes "reellement" flottantes etaient utilisees, */ \ /* elles seraient alors tronquees, et cela pourrait introduire un comportement anormal de */ \ /* certains programmes (voir par exemple le cas ou l'on testerait successivement les */ \ /* valeurs 1.1, 1.2, 1.3,... qui se rameneraient alors toutes a 1...). */ \ PRINT_ATTENTION("utiliser 'Ca1e(constante)' plutot que 'Case(constante)'"); \ /* ATTENTION : je rappelle le 20101117140830 qu'au lieu de : */ \ /* */ \ /* Case(constante) */ \ /* */ \ /* il est de loin preferable d'utiliser : */ \ /* */ \ /* Ca1e(constante) */ \ /* */ \ /* qui assure la "symetrie" avec 'Ca2e(...)', 'Ca3e(...)', 'Ca4e(...)',... d'ou le message */ \ /* d'attention introduit a cette date... */ #define ECas \ PRINT_ATTENTION("utiliser 'ECa1' plutot que 'ECas'"); \ Brek; \ Eblock \ /* Fin de traitement du cas courant. */ \ /* */ \ /* Le message d'attention a ete introduit le 20101117140830... */ #define Ca1e(c1) \ case PARE(c1) : \ Bblock #define ECa1 \ Brek; \ Eblock /* Traitement de 01 cas courant (introduit le 20100322185519). */ #define Ca2e(c1,c2) \ case PARE(c1) : \ case PARE(c2) : \ Bblock \ BblockV #define ECa2 \ Brek; \ EblockV \ Eblock /* Traitement de 02 cas courants (introduit le 20100322185519). */ #define Ca3e(c1,c2,c3) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ Bblock \ BblockV \ BblockV #define ECa3 \ Brek; \ EblockV \ EblockV \ Eblock /* Traitement de 03 cas courants (introduit le 20100322185519). */ #define Ca4e(c1,c2,c3,c4) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ Bblock \ BblockV \ BblockV \ BblockV #define ECa4 \ Brek; \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 04 cas courants (introduit le 20100322185519). */ #define Ca5e(c1,c2,c3,c4,c5) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV #define ECa5 \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 05 cas courants (introduit le 20100322185519). */ #define Ca6e(c1,c2,c3,c4,c5,c6) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECa6 \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 06 cas courants (introduit le 20100322185519). */ #define Ca7e(c1,c2,c3,c4,c5,c6,c7) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ case PARE(c7) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECa7 \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 07 cas courants (introduit le 20100322185519). */ #define Ca8e(c1,c2,c3,c4,c5,c6,c7,c8) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ case PARE(c7) : \ case PARE(c8) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECa8 \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 08 cas courants (introduit le 20100322185519). */ #define Ca9e(c1,c2,c3,c4,c5,c6,c7,c8,c9) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ case PARE(c7) : \ case PARE(c8) : \ case PARE(c9) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECa9 \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 09 cas courants (introduit le 20100322185519). */ #define CaAe(c1,c2,c3,c4,c5,c6,c7,c8,c9,cA) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ case PARE(c7) : \ case PARE(c8) : \ case PARE(c9) : \ case PARE(cA) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECaA \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 10 cas courants (introduit le 20100322185519). */ #define CaBe(c1,c2,c3,c4,c5,c6,c7,c8,c9,cA,cB) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ case PARE(c7) : \ case PARE(c8) : \ case PARE(c9) : \ case PARE(cA) : \ case PARE(cB) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECaB \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 11 cas courants (introduit le 20100322185519). */ #define CaCe(c1,c2,c3,c4,c5,c6,c7,c8,c9,cA,cB,cC) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ case PARE(c7) : \ case PARE(c8) : \ case PARE(c9) : \ case PARE(cA) : \ case PARE(cB) : \ case PARE(cC) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECaC \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 12 cas courants (introduit le 20100322185519). */ #define CaDe(c1,c2,c3,c4,c5,c6,c7,c8,c9,cA,cB,cC,cD) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ case PARE(c7) : \ case PARE(c8) : \ case PARE(c9) : \ case PARE(cA) : \ case PARE(cB) : \ case PARE(cC) : \ case PARE(cD) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECaD \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 13 cas courants (introduit le 20100322185519). */ #define CaEe(c1,c2,c3,c4,c5,c6,c7,c8,c9,cA,cB,cC,cD,cE) \ case PARE(c1) : \ case PARE(c2) : \ case PARE(c3) : \ case PARE(c4) : \ case PARE(c5) : \ case PARE(c6) : \ case PARE(c7) : \ case PARE(c8) : \ case PARE(c9) : \ case PARE(cA) : \ case PARE(cB) : \ case PARE(cC) : \ case PARE(cD) : \ case PARE(cE) : \ Bblock \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV \ BblockV #define ECaE \ Brek; \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ EblockV \ Eblock /* Traitement de 14 cas courants (introduit le 20120118120309). */ #define Defo \ default : \ Bblock \ /* Traitement du cas par defaut, */ #define EDef \ Brek; \ Eblock \ EblockV \ /* Fin de traitement du cas par defaut. */ #define ECho \ EblockV \ /* Fin de l'instruction 'Choi'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T R U C T E U R S D ' I T E R A T I O N S : */ /* */ /*************************************************************************************************************************************/ #define Tant(conditions) \ BblockV \ while (conditions) \ /* On fait preceder le "while" d'un debut de block, afin que la fin du "Tant" */ \ /* (c'est-a-dire le "ETan") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee !!! */ \ Bblock #define ETan \ Eblock \ EblockV #define Bouc(initialisation,test_de_continuation,action_iterative) \ for (initialisation ; test_de_continuation ; action_iterative) \ /* Definition generale de l'iteration... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T A N T E S E N T I E R E S : */ /* */ /*************************************************************************************************************************************/ #ifndef NO_DEFINE_____premiers_entiers_naturels /* Pour simplifier 'v $xrd/spectre.01$K NO_DEFINE_____premiers_entiers_naturels', ce tests */ /* a ete introduit le 20230731114914... */ Den48(INIS(_1,BIT) ,_2 ,_3 ,_4 ,_5 ,_6 ,_7 ,_8 ,_9 ,_10 ,_11 ,_12 ,_13 ,_14 ,_15 ,_16 ,_17 ,_18 ,_19 ,_20 ,_21 ,_22 ,_23 ,_24 ,_25 ,_26 ,_27 ,_28 ,_29 ,_30 ,_31 ,_32 ,_33 ,_34 ,_35 ,_36 ,_37 ,_38 ,_39 ,_40 ,_41 ,_42 ,_43 ,_44 ,_45 ,_46 ,_47 ,DERNIER_NOMBRE_ENTIER ,premiers_entiers_naturels ); /* Passage de 'Denumer17(...)' a 'Den48(...)' le 20210307105730... */ #Aifndef NO_DEFINE_____premiers_entiers_naturels #Eifndef NO_DEFINE_____premiers_entiers_naturels /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S C A R A C T E R E S : */ /* */ /*************************************************************************************************************************************/ #define K_NULL \ '\0' \ /* Definition du caractere "null". */ #define END_OF_CHAIN \ K_NULL \ /* Caractere de fin de chaine. */ #define K_BACKSPACE \ '\b' \ /* Caractere <BACKSPACE>. */ #define K_TABULATION \ '\t' \ /* Caractere <TAB>. */ #define K_LF \ '\n' \ /* Caractere <NEW-LINE>. */ #define K_RC \ '\r' \ /* Caractere <RETOUR-CHARRIOT>. */ #define K_ESC \ 0x1b \ /* Caractere <ESCAPE>. */ #define K_BLANC \ ' ' \ /* Caractere 'BLANC' ou 'ESPACE'. */ #define K_UNDEF \ K_BLANC \ /* Definition d'un caractere indefini (le code utilise est relativement 'neutre', en */ \ /* particulier, on ne peut utiliser 'K_NULL'). */ #define K_EXCLAMATION \ '!' #define K_QUOTE \ '\"' \ /* Caractere d'encadrement des chaines de caracteres... */ #define K_VERITABLE_QUOTE \ PREMIER_CARACTERE_ITb0(Gvar("K_QD")) \ /* Introduit le 20070228122854... */ #define K_DIESE \ '#' #define K_DOLLAR \ '$' #define K_POUR_CENT \ '%' #define K_ET \ '&' #define K_APOSTROPHE \ '\'' \ /* Caractere d'encadrement des caracteres... */ #define K_VERITABLE_APOSTROPHE \ PREMIER_CARACTERE_ITb0(Gvar("K_QS")) \ /* Introduit le 20070228122854... */ #define K_PG \ '(' #define K_PD \ ')' #define K_ETOILE \ '*' #define K_PLUS \ '+' #define K_VIRGULE \ ',' #define K_MOINS \ '-' #define K_POINT \ '.' #define K_SLASH \ '/' #define K_0 \ '0' #define K_1 \ '1' #define K_2 \ '2' #define K_3 \ '3' #define K_4 \ '4' #define K_5 \ '5' #define K_6 \ '6' #define K_7 \ '7' #define K_8 \ '8' #define K_9 \ '9' #define K_DEUX_POINTS \ ':' #define K_POINT_VIRGULE \ ';' \ /* Caractere de fin d'expression. */ #define K_INFERIEUR \ '<' #define K_EGAL \ '=' #define K_SUPERIEUR \ '>' #define K_INTERROGATION \ '?' #define K_A_ROND \ '@' \ /* Delimitation entre les caracteres alphabetiques et les autres... */ #define K_A \ 'A' #define K_B \ 'B' #define K_C \ 'C' #define K_D \ 'D' #define K_E \ 'E' #define K_F \ 'F' #define K_G \ 'G' #define K_H \ 'H' #define K_I \ 'I' #define K_J \ 'J' #define K_K \ 'K' #define K_L \ 'L' #define K_M \ 'M' #define K_N \ 'N' #define K_O \ 'O' #define K_P \ 'P' #define K_Q \ 'Q' #define K_R \ 'R' #define K_S \ 'S' #define K_T \ 'T' #define K_U \ 'U' #define K_V \ 'V' #define K_W \ 'W' #define K_X \ 'X' #define K_Y \ 'Y' #define K_Z \ 'Z' #define K_CG \ '[' #define K_ANTI_SLASH \ '\\' #define K_CD \ ']' #define K_CIRCONFLEXE \ '^' #define K_UNDERSCORE \ '_' \ /* Underscore (et substitut de l'ESPACE' parfois...). */ #define K_ANTI_QUOTE \ '`' \ /* ATTENTION : 'K_ANTI_QUOTE' ne doit jamais etre utilise, car en effet le caractere "`" */ \ /* est utilise en tant que remplacement du caractere "_" afin de permettre au pre-processeur */ \ /* 'cpp' de manipuler des morceaux de symboles : par exemple on utilisera dans la definition */ \ /* d'une macro "MACRO" une variable muette "NOM" de la facon suivante : */ \ /* */ \ /* #define MACRO(NOM) NOM`XXXX */ \ /* */ \ /* puis l'appel : */ \ /* */ \ /* MACRO(nom) */ \ /* */ \ /* generera : */ \ /* */ \ /* nom`XXXX */ \ /* */ \ /* puis : */ \ /* */ \ /* nom_XXXX */ \ /* */ \ /* qui correspond a une variable reelle "nom_XXXX". */ #define K_VERITABLE_ANTI_QUOTE \ PREMIER_CARACTERE_ITb0(Gvar("K_QA")) \ /* Introduit le 20070228122854... */ #define K_a \ 'a' #define K_b \ 'b' #define K_c \ 'c' #define K_d \ 'd' #define K_e \ 'e' #define K_f \ 'f' #define K_g \ 'g' #define K_h \ 'h' #define K_i \ 'i' #define K_j \ 'j' #define K_k \ 'k' #define K_l \ 'l' #define K_m \ 'm' #define K_n \ 'n' #define K_o \ 'o' #define K_p \ 'p' #define K_q \ 'q' #define K_r \ 'r' #define K_s \ 's' #define K_t \ 't' #define K_u \ 'u' #define K_v \ 'v' #define K_w \ 'w' #define K_x \ 'x' #define K_y \ 'y' #define K_z \ 'z' #define K_AG \ '{' #define K_PIPE \ '|' #define K_AD \ '}' #define K_TILDA \ '~' /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S C H A I N E S E L E M E N T A I R E S : */ /* */ /*************************************************************************************************************************************/ #define C_VIDE \ "" \ /* Chaine vide. */ #define C_LF \ "\n" \ /* Chaine <NEW-LINE>. */ #define C_BLANC \ " " #define C_EXCLAMATION \ "!" #define C_QUOTE \ "\"" #define C_VERITABLE_QUOTE \ Gvar("K_QD") \ /* Introduit le 20061225143630... */ #define C_DIESE \ "#" #define C_DOLLAR \ "$" #define C_POUR_CENT \ "%" #define C_ET \ "&" #define C_APOSTROPHE \ "\'" #define C_VERITABLE_APOSTROPHE \ Gvar("K_QS") \ /* Introduit le 20061225143630... */ #define C_PG \ "(" #define C_PD \ ")" #define C_ETOILE \ "*" #define C_PLUS \ "+" #define C_VIRGULE \ "," #define C_MOINS \ "-" #define C_POINT \ "." #define C_SLASH \ "/" #define C_0 \ "0" #define C_1 \ "1" #define C_2 \ "2" #define C_3 \ "3" #define C_4 \ "4" #define C_5 \ "5" #define C_6 \ "6" #define C_7 \ "7" #define C_8 \ "8" #define C_9 \ "9" #define C_DEUX_POINTS \ ":" #define C_POINT_VIRGULE \ ";" #define C_INFERIEUR \ "<" #define C_EGAL \ "=" #define C_SUPERIEUR \ ">" #define C_INTERROGATION \ "?" #define C_A_ROND \ "@" #define C_A \ "A" #define C_B \ "B" #define C_C \ "C" #define C_D \ "D" #define C_E \ "E" #define C_F \ "F" #define C_G \ "G" #define C_H \ "H" #define C_I \ "I" #define C_J \ "J" #define C_K \ "K" #define C_L \ "L" #define C_M \ "M" #define C_N \ "N" #define C_O \ "O" #define C_P \ "P" #define C_Q \ "Q" #define C_R \ "R" #define C_S \ "S" #define C_T \ "T" #define C_U \ "U" #define C_V \ "V" #define C_W \ "W" #define C_X \ "X" #define C_Y \ "Y" #define C_Z \ "Z" #define C_CG \ "[" #define C_ANTI_SLASH \ "\\" #define C_CD \ "]" #define C_CIRCONFLEXE \ "^" #define C_UNDERSCORE \ "_" #nodefine C_ANTI_QUOTE \ "`" \ /* ATTENTION : 'C_ANTI_QUOTE' ne doit jamais etre utilise, car en effet le caractere "`" */ \ /* est utilise en tant que remplacement du caractere "_" afin de permettre au pre-processeur */ \ /* 'cpp' de manipuler des morceaux de symboles : par exemple on utilisera dans la definition */ \ /* d'une macro "MACRO" une variable muette "NOM" de la facon suivante : */ \ /* */ \ /* #define MACRO(NOM) NOM`XXXX */ \ /* */ \ /* puis l'appel : */ \ /* */ \ /* MACRO(nom) */ \ /* */ \ /* generera : */ \ /* */ \ /* nom`XXXX */ \ /* */ \ /* puis : */ \ /* */ \ /* nom_XXXX */ \ /* */ \ /* qui correspond a une variable reelle "nom_XXXX". */ \ /* */ \ /* On utilisera a la place 'C_VERITABLE_ANTI_QUOTE'... */ \ /* */ \ /* A cause de 'v $xcp/conversion_UTF_8$K C_VERITABLE_ANTI_QUOTE', pour eviter de nouvelles */ \ /* erreurs, le 'define' est devenu un 'nodefine' le 20250129180222... */ #define C_VERITABLE_ANTI_QUOTE \ Gvar("K_QA") \ /* Introduit le 20061225143630... */ #define C_a \ "a" #define C_b \ "b" #define C_c \ "c" #define C_d \ "d" #define C_e \ "e" #define C_f \ "f" #define C_g \ "g" #define C_h \ "h" #define C_i \ "i" #define C_j \ "j" #define C_k \ "k" #define C_l \ "l" #define C_m \ "m" #define C_n \ "n" #define C_o \ "o" #define C_p \ "p" #define C_q \ "q" #define C_r \ "r" #define C_s \ "s" #define C_t \ "t" #define C_u \ "u" #define C_v \ "v" #define C_w \ "w" #define C_x \ "x" #define C_y \ "y" #define C_z \ "z" #define C_AG \ "{" #define C_PIPE \ "|" #define C_AD \ "}" #define C_TILDA \ "~" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U E L Q U E S C H A I N E S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define C_VRAI____ \ "VRAI" #define C_VRAI_____ABREGE \ COND(LE_MODE_EST_INTERACTIF,"V",C_VRAI____) #define C_EXIST___ \ "EXIST" #define C_EXIST____ABREGE \ COND(LE_MODE_EST_INTERACTIF,"EX",C_EXIST___) #define C_ACTIF___ \ "ACTIF" #define C_ACTIF____ABREGE \ COND(LE_MODE_EST_INTERACTIF,"AC",C_ACTIF___) #define C_AUTORISE \ "AUTORISE" #define C_AUTORISE_ABREGE \ COND(LE_MODE_EST_INTERACTIF,"AU",C_AUTORISE) #define C_VALIDE__ \ "VALIDE" #define C_VALIDE___ABREGE \ COND(LE_MODE_EST_INTERACTIF,"VA",C_VALIDE__) #define C_FAUX____ \ "FAUX" #define C_FAUX_____ABREGE \ COND(LE_MODE_EST_INTERACTIF,"F",C_FAUX____) #define C_NEXIST__ \ "NEXIST" #define C_NEXIST___ABREGE \ COND(LE_MODE_EST_INTERACTIF,"NEX",C_NEXIST__) #define C_INACTIF_ \ "INACTIF" #define C_INACTIF__ABREGE \ COND(LE_MODE_EST_INTERACTIF,"INA",C_INACTIF_) #define C_INTERDIT \ "INTERDIT" #define C_INTERDIT_ABREGE \ COND(LE_MODE_EST_INTERACTIF,"INT",C_INTERDIT) #define C_INVALIDE \ "INVALIDE" #define C_INVALIDE_ABREGE \ COND(LE_MODE_EST_INTERACTIF,"INV",C_INVALIDE) #define C_UNDEF \ "UNDEF" /* Les versions abregees ont ete introduites le 20050128215454 et rendues conditionnelles */ /* vis a vis de l'interactivite le 20070302091102 (et donc autorisees uniquement en mode */ /* interactif a compter de cette date et ce pour des questions d'esthetique...). */ /* */ /* La chaine 'C_UNDEF' a ete introduite le 20150203132551... */ /* */ /* Les chaines C_{EXIST,ACTIF,AUTORISE,VALIDE} et C_{EXIST,ACTIF,AUTORISE,VALIDE}_ABREGE */ /* ont ete introduites le 20170717160748... */ #define C_JFC \ "JFC" #define C_LACTAMME \ "LACTAMME" #define C_GSV_LACTAMME \ "GSV-LACTAMME" #define C_DATE \ "date" #define C_DATE_NUMERIQUE \ "DATE" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E A D R E S S E I N E X I S T A N T E : */ /* */ /*************************************************************************************************************************************/ #define ADRESSE_UNDEF \ ADRESSE(NIL) \ /* Est l'equivalent de 'UNDEF' pour les pointeurs... */ #define ADRESSE_NON_DEFINIE \ ZERO \ /* Pour donner une valeur a une adresse qui ne sera pas definie. Malheureusement, */ \ /* 'ADRESSE_UNDEF' ne peut pratiquement pas etre utilisee pour des question de typage, */ \ /* d'ou cette nouvelle definition... */ #define ADRESSE_NON_ENCORE_DEFINIE \ ADRESSE_NON_DEFINIE \ /* Pour donner une valeur a une adresse qui n'est pas encore definie. */ #define ADRESSE_PLUS_DEFINIE \ ADRESSE_NON_DEFINIE \ /* Pour donner une valeur a une adresse qui n'est plus definie (introduit le 20050221164301 */ \ /* pour etre utilise conjointement avec les procedures 'FdTb?(...)'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E C H A I N E Q U E L C O N Q U E I N E X I S T A N T E : */ /* */ /*************************************************************************************************************************************/ #define CHAINE_UNDEF \ cNIL \ /* Est l'equivalent de 'UNDEF' pour les chaines de caracteres en general... */ \ /* */ \ /* ATTENTION, il y avait autrefois : */ \ /* */ \ /* DEFV(Common,DEFV(CHAR,INIT(cNIL,K_UNDEF))); */ \ /* */ \ /* ainsi que : */ \ /* */ \ /* #define CHAINE_UNDEF \ */ \ /* ADRESSE(cNIL) */ \ /* */ \ /* dans '$xil/defi_c1$vv$DEF'. L'introduction de la possibilite d'editer les parametres */ \ /* reellement utilisees dans une commande ('$xig/fonct$vv$DEF' et '$xig/fonct$vv$FON') a */ \ /* contraint a ces changements... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N N O M I N E X I S T A N T : */ /* */ /*************************************************************************************************************************************/ #define NOM_UNDEF \ CHAINE_UNDEF \ /* Est l'equivalent de 'UNDEF' pour les noms. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A P P E L D E T Y P E " S O U S - P R O G R A M M E " D ' U N E F O N C T I O N : */ /* */ /*************************************************************************************************************************************/ #define CALS(fonction) \ Bblock \ fonction; \ Eblock \ /* Pour effectuer l'appel d'une fonction comme un sous-programme (type FORTRAN). */ \ /* ATTENTION : cette definition doit etre ici parce qu'elle est utilisee ci-dessous pour */ \ /* une definition de '$PASSE_2' ('Return(...)' via 'Exit(...)')... */ #define CALZ(fonction) \ CALS(fonction); \ /* Pour distinguer les appels a des fonctions "Zystemes" (introduit le 20120624100636)... */ \ /* */ \ /* Le 20180317125300, 'CALZ(...)' est passe de '$PASSE_1' a '$PASSE_2' afin de simplifier */ \ /* 'v $xig/fonct$vv$DEF EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE', mais cela n'etait */ \ /* pas une bonne idee et je suis donc revenu immediatement en arriere... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E N V O I D E S V A L E U R S D E S F O N C T I O N S : */ /* */ /*************************************************************************************************************************************/ #define NbreAcces \ _____Fcompteur_DAppel #if ( (! defined(DEFINITION_DE__BeginFonction__RETU_VERSION_01)) \ && (! defined(DEFINITION_DE__BeginFonction__RETU_VERSION_02)) \ ) /* Introduit le 20180412074717 afin de permettre des redefinitions locales, par exemple, */ /* dans les differentes bibliotheques de '$xb'... */ # nodefine DEFINITION_DE__BeginFonction__RETU_VERSION_01 # define DEFINITION_DE__BeginFonction__RETU_VERSION_02 /* Introduit le 20180411181723... */ #Aif ( (! defined(DEFINITION_DE__BeginFonction__RETU_VERSION_01)) \ && (! defined(DEFINITION_DE__BeginFonction__RETU_VERSION_02)) \ ) #Eif ( (! defined(DEFINITION_DE__BeginFonction__RETU_VERSION_01)) \ && (! defined(DEFINITION_DE__BeginFonction__RETU_VERSION_02)) \ ) #ifdef DEFINITION_DE__BeginFonction__RETU_VERSION_01 # define RETU_comptage_acces_eventuel \ BLOC(VIDE;); # nodefine RETU_comptage_acces_eventuel_fictif \ BLOC(VIDE;); #Aifdef DEFINITION_DE__BeginFonction__RETU_VERSION_01 #Eifdef DEFINITION_DE__BeginFonction__RETU_VERSION_01 #ifdef DEFINITION_DE__BeginFonction__RETU_VERSION_02 # define RETU_comptage_acces_eventuel_general(incrementation) \ &ifdef CompteurDeLaFonctionCourante \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ BLOC(incrementation); \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ &undef CompteurDeLaFonctionCourante \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ &Aifdef CompteurDeLaFonctionCourante \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ &Eifdef CompteurDeLaFonctionCourante \ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ /* Introduit le 20180411104629... */ # define RETU_comptage_acces_eventuel \ RETU_comptage_acces_eventuel_general(BLOC(INCR(NomDeLaFonctionCourante QD@@__ NbreAcces,I);)) # nodefine RETU_comptage_acces_eventuel_fictif \ RETU_comptage_acces_eventuel_general(BLOC(VIDE;)) /* Introduit le 20180412165322... */ #Aifdef DEFINITION_DE__BeginFonction__RETU_VERSION_02 #Eifdef DEFINITION_DE__BeginFonction__RETU_VERSION_02 #define RETU(valeur) \ RETU_comptage_acces_eventuel; \ Return(valeur) /* Renvoi d'une valeur par une fonction. La valeur de 'Return(...)' est definie ci-apres */ /* dans la passe '$PASSE_2' et peut d'ailleurs etre redefinie par 'BCommande'... */ =define Return(valeur) return(valeur) /* Renvoi d'une valeur par une fonction. Cette definition peut etre modifiee par la fonction */ /* 'BCommande' toujours dans la passe '$PASSE_2', et ce afin de mettre en place 'exit(...)'. */ /* On notera l'absence d'anti-slash '\' ci-dessus due au fait qu'on est ici en '$PASSE_2'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O T S C L E F S P O U R L E S F O N C T I O N S : */ /* */ /*************************************************************************************************************************************/ #define ARGUMENT_POINTEUR(argument) \ argument \ /* Permet d'indiquer visuellement qu'un argument d'appel est un pointeur */ \ /* sur une structure par exemple, et a l'appel, on utilisera ADRESSE(argument). */ #define ARGUMENT_POINTERc(argument) \ ARGUMENT_POINTEUR(argument) \ /* Permet d'indiquer visuellement qu'un argument d'appel est un pointeur */ \ /* sur une chaine de caracteres, et a l'appel, on utilisera ADRESSE(argument). */ #define ARGUMENT_POINTERp(argument) \ ARGUMENT_POINTEUR(argument) \ /* Permet d'indiquer visuellement qu'un argument d'appel est un pointeur */ \ /* sur une image, et a l'appel, on utilisera ADRESSE(argument). */ #define ARGUMENT_POINTERs(argument) \ ARGUMENT_POINTEUR(argument) \ /* Permet d'indiquer visuellement qu'un argument d'appel est un pointeur */ \ /* sur une structure, et a l'appel, on utilisera ADRESSE(argument). */ #define ARGUMENT_FONCTION(argument) \ ARGUMENT_POINTEUR(argument) \ /* Permet d'indiquer visuellement qu'un argument d'appel est un nom de fonction, */ \ /* et a l'appel, on utilisera aFONCTION(nom). */ #define fETOILE(argument) \ *argument \ /* Permet de generer les pointeurs, mais aussi les 'CAST' sur des structures ; c'est a */ \ /* a cause de ces derniers que l'on ecrit '*argument' et non pas '*PARE(argument)'... */ #define POINTEUR(argument) \ fETOILE(PARE(argument)) \ /* Permet de generer un pointeur, par exemple dans la definition des */ \ /* arguments d'une fonction ou bien pour indiquer qu'une fonction renvoie */ \ /* un pointeur... */ #define POINTERv(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers un type 'Void'... */ #define POINTERc(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers une chaine de caracteres, par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur... */ #define POINTERi(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers un nombre entier, par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur... */ #define POINTERl(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers un nombre logique, par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur... */ #define POINTERf(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers un nombre flottant, par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur... */ #define POINTERs(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers une structure, par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur... */ #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_ES9000_AIX_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_HP705_HPUX_CC)) \ || (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_RS6000_AIX_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # define POINTERbp(argument) \ DTb0(PARE(POINTEUR(argument))) \ /* Permet de generer un pointeur vers un tableau monodimensionnel, par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur. On notera que 'POINTERbp(...)' sera en */ \ /* general associe a 'DTbp(...)' et 'ITbp(...)'. */ #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_ES9000_AIX_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_HP705_HPUX_CC)) \ || (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_RS6000_AIX_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # define POINTERbp(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers un tableau monodimensionnel, par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur. On notera que 'POINTERbp(...)' sera en */ \ /* general associe a 'DTbp(...)' et 'ITbp(...)'. */ #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_ES9000_AIX_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_HP705_HPUX_CC)) \ || (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_RS6000_AIX_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) #define fPOINTEUR(nom_de_la_fonction) \ PARE(POINTEUR(nom_de_la_fonction)) \ /* Permet de generer un pointeur vers une fonction, afin de l'appeler ; on notera la */ \ /* chose tres importante suivante : */ \ /* */ \ /* POINTERx(fonction(...)) designe une fonction renvoyant un pointeur sur */ \ /* un certain type d'objets ('c' : chaine de */ \ /* caracteres, 'p' : image, 's' : structure), */ \ /* */ \ /* alors que : */ \ /* */ \ /* fPOINTEUR(fonction)(...) designe un pointeur vers une fonction... */ \ /* */ #define afPOINTEUR(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)() \ /* Permet de generer un pointeur vers une fonction, afin de la definir en tant */ \ /* qu'argument d'une autre par un 'DEFV', ou lors de la generation d'une variable */ \ /* pointant vers une fonction (telle 'Fvariable'). */ #ifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_01 /* Introduit le 20040625152717... */ # nodefine afPOINTEUR_1(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)() \ /* Cette procedure introduite le 20040618142923 est necessaire pour traiter l'argument, */ \ /* en 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', des pointeurs de */ \ /* fonctions definis par 'v $ximd/operator.2$DEF DEFINITION_D_UN_APPLY'... */ \ /* */ \ /* On notera que cette definition ne sert plus a compter du 20180428004005... */ # define afPOINTEUR_1p(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)() \ /* Introduit le 20180428004005 pour 'v $ximd/operator.2$DEF DEFINITION_D_UN_APPLY'... */ # nodefine afPOINTEUR_2(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)() \ /* De meme, le 20040618154052, pour les pointeurs de fonctions a deux arguments... */ \ /* */ \ /* On notera que cette definition ne sert plus a compter du 20180428004005... */ # define afPOINTEUR_2p(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)() \ /* Introduit le 20180428004005 pour 'v $xiipf/fonction.2$FON Fvariable'... */ #Aifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_01 #Eifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_01 #ifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02 /* Introduit le 20040625152717... */ # nodefine afPOINTEUR_1(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)(arg1) \ /* Cette procedure introduite le 20040618142923 est necessaire pour traiter l'argument, */ \ /* en 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', des pointeurs de */ \ /* fonctions definis par 'v $ximd/operator.2$DEF DEFINITION_D_UN_APPLY'... */ \ /* */ \ /* On notera que cette definition ne sert plus a compter du 20180428004005... */ # define afPOINTEUR_1p(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)(DEFV(Argument,DEFV(genere_p,arg1))) \ /* Introduit le 20180428004005 pour 'v $ximd/operator.2$DEF DEFINITION_D_UN_APPLY'... */ # nodefine afPOINTEUR_2(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)(arg1,arg2) \ /* De meme, le 20040618154052, pour les pointeurs de fonctions a deux arguments... */ \ /* */ \ /* On notera que cette definition ne sert plus a compter du 20180428004005... */ # define afPOINTEUR_2p(nom_de_la_fonction) \ fPOINTEUR(nom_de_la_fonction)(DEFV(Argument,DEFV(genere_p,arg1)),DEFV(Argument,DEFV(genere_p,arg2))) \ /* Introduit le 20180428004005 pour 'v $xiipf/fonction.2$FON Fvariable'... */ #Aifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02 #Eifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02 #define INDIRECT(argument) \ POINTEUR(argument) \ /* Permet de faire une operation indirecte, et par exemple un "EGAL". */ #define PINDIRECT(argument) \ PARE(INDIRECT(argument)) \ /* Cette definition est rendue necessaire, par exemple, dans 'IdTb1(...)' et 'ITbp(...)'. */ #if ( (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ ) # nTestADef BUG_SYSTEME_CRAY_C_ADRESSE \ /* Actuellement, avec le compilateur 'scc', ecrire ('x' designant une variable declaree */ \ /* 'float' ou 'double') : */ \ /* */ \ /* &x --> donne correctement l'adresse de 'x', */ \ /* &(x) --> donne un resultat faux... */ \ /* */ #Aif ( (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ ) #Eif ( (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ ) #define ADRESSE(argument) \ PARE(&PARE(argument)) \ /* Permet de recuperer l'adresse de l'argument, par exemple dans un */ \ /* appel de fonction, on mettra f(ADRESSE(argument))... */ #if ( (defined(BUG_SYSTEME_CRAY_C_ADRESSE)) \ ) # undef ADRESSE # define ADRESSE(argument) \ PARE(&argument) \ /* Permet de recuperer l'adresse de l'argument, par exemple dans un */ \ /* appel de fonction, on mettra f(ADRESSE(argument))... */ #Aif ( (defined(BUG_SYSTEME_CRAY_C_ADRESSE)) \ ) #Eif ( (defined(BUG_SYSTEME_CRAY_C_ADRESSE)) \ ) #if ( (defined(SYSTEME_DPX5000_SPIX_CC)) \ ) # define aFONCTION(nom_de_la_fonction) \ ADRESSE(nom_de_la_fonction(||||)) \ /* Permet de recuperer l'adresse d'une fonction argument, par exemple dans */ \ /* l'appel d'une autre fonction, on mettra f1(aFONCTION(f2))... */ #Aif ( (defined(SYSTEME_DPX5000_SPIX_CC)) \ ) # define aFONCTION(nom_de_la_fonction) \ nom_de_la_fonction(||||) \ /* Permet de recuperer l'adresse d'une fonction argument, par exemple dans */ \ /* l'appel d'une autre fonction, on mettra f1(aFONCTION(f2)). On notera l'ecriture '(||||)' */ \ /* destinee en fait uniquement a '$xcp/cpp$X' afin qu'il trouve les parentheses obligatoires */ \ /* pour chaque appel de procedure ; ensuite, '$xcc/cpp$D/fARGUMENT$sed' fait disparaitre */ \ /* tout cela. D'ailleur, autrefois, on trouvait 'nom_de_la_fonction' seul... */ #Eif ( (defined(SYSTEME_DPX5000_SPIX_CC)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A S P A R T I C U L I E R D E S P O I N T E U R S S U R L E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) # if ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) # define POINTERp(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers une image (ou matrice...), par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur... */ # Aif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) # define POINTERp(argument) \ POINTEUR(POINTEUR(argument)) \ /* Permet de generer un pointeur vers une image (ou matrice...), par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur... */ \ /* valeur par defaut. */ # Eif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # define POINTERp(argument) \ POINTEUR(argument) \ /* Permet de generer un pointeur vers une image (ou matrice...), par exemple */ \ /* dans la definition des arguments d'une fonction ou bien pour indiquer */ \ /* qu'une fonction renvoie un pointeur... */ \ /* valeur par defaut. */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) /* ATTENTION, l'ajout d'une nouvelle definition de type 'POINTER?(...)' implique en general */ /* la modification des commandes '$xcg/gen.arg$Z' et '$xcg/gen.ext$Z', ainsi que de leurs */ /* directories '$D' associes... */ #define POINTERC(argument) \ POINTERp(argument) #define POINTERI(argument) \ POINTERp(argument) #define POINTERU(argument) \ POINTERp(argument) #define POINTERF(argument) \ POINTERp(argument) #define POINTERD(argument) \ POINTERp(argument) #define POINTERJ(argument) \ POINTERp(argument) #define POINTERHJ(argument) \ POINTERp(argument) #define POINTERHHJ(argument) \ POINTERp(argument) /* Identique a 'POINTERp(...)' mais pour des types d'images non standard, de type "imageC", */ /* "imageI", "imageU", "imageF", "imageD", "imageJ", "imageHJ" et "imageHHJ" respectivement. */ /* */ /* Le pointeur 'POINTERHHJ(...)' a ete introduit le 20150227110009... */ /* ATTENTION, l'ajout d'une nouvelle definition de type 'POINTER?(...)' implique en general */ /* la modification des commandes '$xcg/gen.arg$Z' et '$xcg/gen.ext$Z', ainsi que de leurs */ /* directories '$D' associes... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O T S C L E F S P O U R L E S C O M M A N D E S : */ /* */ /*************************************************************************************************************************************/ #define Main \ main \ /* Nom du point d'entree dans le programme principal... */ #define BEntry \ BFonctionIB \ /* Le 'BFonctionI' a ete introduite le 20071116084209 car il manquait et remplace par */ \ /* 'BFonctionIB' le 20100317143109... */ \ DEFV(FonctionIB,Main()) \ /* "Programme principal". */ #define EEntry \ EFonctionIB \ /* Et fin de "programme principal"... */ #define BCommande(nombre_d_arguments,arguments) \ /* Permet d'introduire le programme principal pour une commande. */ \ BFonctionIB \ /* Le 'BFonctionI' a ete introduite le 20071116084209 car il manquait et remplace par */ \ /* 'BFonctionIB' le 20100317143109... */ \ DEFV(FonctionIB,Main(Argument_____nombre_d_arguments,Argument_____arguments)) \ DEFV(Argument,DEFV(Int,Argument_____nombre_d_arguments)); \ /* Nombre d'arguments recus, y compris son nom. */ \ DEFV(Argument,DEFV(CHAR,POINTERc(DTb0(Argument_____arguments)))); \ /* Liste des arguments, y compris la commande ; mais ATTENTION, il y avait autrefois */ \ /* */ \ /* DEFV(CHAR,POINTERc(POINTERc(DTb0(arguments)))); */ \ /* */ \ /* qui m'a pose des problemes considerables en passant sur le CRAY2, je suis donc revenu */ \ /* a une version plus orthodoxe... */ \ \ /* ATTENTION : tout ce qui suit doit absolument preceder 'NOMBRE`D`ARGUMENTS' car, sinon, */ \ /* '$xcc/cpp$Z' le perd... */ \ \ Bblock \ /* Le 20241120150941, sur '$LACT19' je note qulque chose de mysterieux avec la commande : */ \ /* */ \ /* $ssh_q_X $LACT1A "date ; $xci/convol.01$X" */ \ /* */ \ /* qui donne : */ \ /* */ \ /* la date... */ \ /* bash: line 1: 15862 Segmentation fault /home/colonna/commandes/images/convol.01.x */ \ /* */ \ /* (le message "...Segmentation fault,,," n'apparaissant pas en l'absence de la date !). */ \ /* */ \ /* En mettant juste ici un "fprintf(...)" et en utilisant de plus 'strace' : */ \ /* */ \ /* $ssh_q_X $LACT1A "date ; strace $xci/convol.01$X" */ \ /* */ \ /* on voit que c'est ici qu'apparait la violation memoire : */ \ /* */ \ /* munmap(0x7f6df972f000, 147181) */ \ /* --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7ffc86ec5950} --- */ \ /* +++ killed by SIGSEGV +++ */ \ /* */ \ /* car, en effet, le "fprintf(...)" devrait se voir juste apres le 'munmap(...)'. */ \ /* */ \ /* Au passage, on notera que cela apparait avec 'v $xci/convol.01$X', 'v $xci/convol.04$X' */ \ /* et 'v $xci/convol.05$X' mais pas avec 'v $xci/convol.02$X' et 'v $xci/convol.03$X'... */ \ /* De plus, on notera aussi que : */ \ /* */ \ /* $ssh_q_X $LACT1A "date ; $xci/convol.01$X" */ \ /* */ \ /* executee sur '$LACT1A' elle-meme donne le meme message de 'Segmentation fault'... */ \ /* */ \ /* Alors d'ou vient de 'SIGSEGV' ? */ \ /* */ \ /* Le 20241120172524, j'ai trouve, il s'agit des '$K's suivants : */ \ /* */ \ /* $xci/CompteVoi.01$K */ \ /* $xci/MarqueVoi.01$K */ \ /* $xci/accumule.12$K */ \ /* $xci/bouche_trou$K */ \ /* $xci/convol.01$K */ \ /* $xci/convol.04$K */ \ /* $xci/convol.05$K */ \ /* $xci/dilate.01$K */ \ /* $xci/dimension.02$K */ \ /* $xci/distance.02$K */ \ /* $xci/inertie.01$K */ \ /* $xci/inertie.02$K */ \ /* $xci/maxima_local$K */ \ /* $xci/minima_local$K */ \ /* $xci/montagne.02$K */ \ /* $xci/nettete.01$K */ \ /* $xci/pt_isole.01$K */ \ /* */ \ /* qui contiennent tous les lignes suivantes : */ \ /* */ \ /* DEFV(Float,DTb1(noyau,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION)); */ \ /* DEFV(Logical,DTb1(inhibition_du_noyau,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION)); */ \ /* */ \ /* qui font de "grosse"s allocations memoire statiques. La solution va vonc etre de passer */ \ /* en allocation dynamique. Oui, mais le 20241120175518 je note que cela va etre complique, */ \ /* puisque l'acces devrait devenir indirect via 'IdTb1(...)'. Donc le plus simple va etre */ \ /* de diminuer 'TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION', or ce probleme a deja ete */ \ /* rencontre (voir le bug 'BUG_SYSTEME_APC_GCC_too_large_stack_frames') et j'ai donc cree */ \ /* le nouveau bug 'BUG_SYSTEME_APC_GCC_tableaux_statiques_trop_volumineux_1' pour ce faire */ \ /* le 20241120180440... */ \ \ EGAL(arguments,Argument_____arguments); \ EGAL(nombre_d_arguments,Argument_____nombre_d_arguments); \ /* Le 20230405101804, j'ai tente de remplacer les deux instructions precedentes par : */ \ /* */ \ /* DEFV(CHAR,INIT(POINTERc(Complement_____arguments) */ \ /* ,Gvar(NOM_SYNTHETIQUE_DU_FICHIER_COURANT) */ \ /* ) */ \ /* ); */ \ /* EGAp(arguments */ \ /* ,chain_Aconcaten3(Argument_____arguments */ \ /* ,C_BLANC */ \ /* ,Complement_____arguments */ \ /* ) */ \ /* ); */ \ /* EGAL(nombre_d_arguments */ \ /* ,ADD2(Argument_____nombre_d_arguments */ \ /* ,TRMU(chain_comptage_des_occurences_d_un_caractere(Complement_____arguments */ \ /* ,K_BLANC */ \ /* ) */ \ /* ) */ \ /* ) */ \ /* ); */ \ /* */ \ /* afin d'assurer la concatenation des arguments "interactifs" de la commande */ \ /* (c'est-a-dire ceux qui figurent sur la ligne de commande) avec la valeur d'une */ \ /* eventuelle variable d'environnement de nom 'NOM_SYNTHETIQUE_DU_FICHIER_COURANT' */ \ /* qui aurait pu contenir une suite d'arguments. Par exemple, cela aurait pu etre */ \ /* utilise a la place de 'v $xiirv/.HILB.11.$U _____ParticulePara1' via la variable */ \ /* d'environnement '$xrv_particule_10'... */ \ /* */ \ /* Mais malheureusement, cela ne marche pas car, en effet, 'Argument_____arguments' n'est */ \ /* pas une chaine de caracteres, mais un tableau de chaines de caracteres ! */ \ /* */ \ /* La bonne solution a ete trouvee le 20230405140116 et implementee ci-apres... */ \ \ EGAL(nombre_d_arguments_non_compris_le_nom,PRED(nombre_d_arguments)); \ /* Introduits le 20221113114253 afin de pouvoir etre utilises dans des fonctions de */ \ /* 'v $xig/fonct$vv$FON 20221112133942'... */ \ /* */ \ /* Ceci a ete valide grace a 'v $xtc/argc_argv.12$c'... */ \ \ EGAp(nom_de_la_commande_courante,chain_Acopie(NOM_DE_LA_COMMANDE)); \ /* Afin de pouvoir editer le nom de la commande courante dans 'gPRINT_DEFAUT(...)'. */ \ /* */ \ /* Ce 'chain_Acopie(...)' appelle 'allocation_memoire_et_generation_des_format_EGAr(...)' */ \ /* ('v $xig/fonct$vv$FON 20180401123053') qui permet donc d'initialiser les formats dans */ \ /* le cas des '$X's n'ayant pas ete recompiles avec cette version de 'BCommande' qui a */ \ /* priori fait un 'allocation_memoire_et_generation_des_format_EGAr(...)' ci-apres. Cela */ \ /* assure donc la transition... */ \ /* */ \ /* ATTENTION, je note le 20180406101245 qu'il ne faut pas faire de (a la fin...) : */ \ /* */ \ /* CALZ_FreCC(nom_de_la_commande_courante); */ \ /* */ \ /* dans 'v $xil/defi_K2$vv$DEF RETU_Commande' car, en effet, 'nom_de_la_commande_courante' */ \ /* est utile dans partout et en particulier dans 'PRINT_DEFAUT(...)'... */ \ /* */ \ /* En fait, le 20180407103819, je l'ai introduit "a la derniere minute", c'est-a-dire */ \ /* juste avant le 'RETU_ERROR' final... */ \ \ begin_nouveau_block \ /* Introduit le 20050905162854... */ \ Bblock \ \ Bclock(C_VIDE,FAUX); \ /* Le chronometrage de la commande courante est a priori initialise, meme si son edition */ \ /* n'est peut-etre pas demandee (introduit le 20170518113625)... */ \ /* */ \ /* ATTENTION : on notera que ce 'Bclock(...)' n'est pas au meme niveau de {Bblock,Eblock} */ \ /* que le 'Eclock(...)' associe ('v $xil/defi_K2$vv$DEF Eclock') associe : */ \ /* */ \ /* BCommande(...) <-- Bclock(...) */ \ /* Bblock */ \ /* (....) */ \ /* RETU_Commande; <-- Eclock(...) */ \ /* Eblock */ \ /* ECommande */ \ /* */ \ /* Cela parait donc quasiment impossible de les mettre au meme niveau. Au passage, c'est */ \ /* cela qui explique la suppression d'un 'Bblock' en tete de 'Bclock(...)' et d'un 'Eblock' */ \ /* en queue de 'Eclock(...)'. */ \ \ CALS(allocation_memoire_et_generation_des_format_EGAr()); \ /* Definition des 'format_EGAr's utiles (introduit le 20180330120506)... */ \ \ /* ATTENTION : la definition de 'NOMBRE`D`ARGUMENTS' doit etre absolument en derniere */ \ /* position dans 'BCommande(...)' car, sinon, '$xcc/cpp$Z' perd ce qui suivrait... */ \ \ begin_nouveau_block \ /* Sequence introduite le 20230405140116... */ \ Bblock \ DEFV(CHAR,INIT(POINTERc(Complement_____arguments),Gvar(NOM_SYNTHETIQUE_DU_FICHIER_COURANT))); \ /* Recuperation des arguments eventuels contenus dans la variable d'environnement de */ \ /* nom 'NOM_SYNTHETIQUE_DU_FICHIER_COURANT'... */ \ \ Test(IFNE_chaine(Complement_____arguments,VALEUR_D_UNE_VARIABLE_UNDEF)) \ Bblock \ DEFV(CHAR,INIC(POINTERc(commande_courante_effective),CHAINE_UNDEF)); \ \ RECONSTITUTION_DE_LA_COMMANDE_COURANTE(commande_courante_effective); \ /* Reconstitution de la commande courante telle qu'elle est apparue en ligne de commande... */ \ \ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten6("unset " \ ,NOM_SYNTHETIQUE_DU_FICHIER_COURANT \ ," ; " \ ,commande_courante_effective \ ,C_BLANC \ ,Complement_____arguments \ ) \ ); \ /* Generation d'une nouvelle commande completee du type : */ \ /* */ \ /* unset NOM_SYNTHETIQUE_DU_FICHIER_COURANT ; */ \ /* CommandeEffective ComplementsArguments */ \ /* */ \ /* On notera le 'unset' executee au prealable (sous '$SH') afin de ne pas boucler lors de */ \ /* la rerentree dans la commande ainsi completee... */ \ \ RETU_Commande; \ /* On notera le 20230406095735 que la valeur de 'CODE_ERREUR' peut avoir une valeur */ \ /* etrange dans le cas ou la commande provoquerait une erreur. Cela s'est vu a cette */ \ /* date avec 'v $xcg/ADD2.01$K' en ajoutant un argument non reconnu : */ \ /* */ \ /* #include <stdio.h> */ \ /* void main() */ \ /* { */ \ /* printf("=%d=\n",system("~colonna/commandes/generales/ADD2.01$X xxxx")); */ \ /* } */ \ /* */ \ /* qui donne un '$status' egal a 8448 c'est-a-dire 256*33, en notant que 33 correspond tres */ \ /* logiquement a 'v $xil/defi_K2$vv$DEF ERREUR33' qui se retrouve mysterieusement decale */ \ /* de 8 bits a gauche. La modification 'v $xil/defi_c1$vv$DEF SLRS.CODE_ERREUR' a corrige */ \ /* cela a cette date... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ end_nouveau_block \ \ & define NOMBRE`D`ARGUMENTS _____BEAUCOUP \ /* Au cas ou des compilations conditionnelles feraient que 'NOMBRE_D_ARGUMENTS' n'est pas */ \ /* defini ; ce peut etre le cas de 'v $xci/display$K' par exemple, lorsque 'X-Window' */ \ /* n'existe pas. ATTENTION : on notera qu'il n'y a pas de sequences : */ \ /* */ \ /* & ifdef NOMBRE_D_ARGUMENTS */ \ /* & define NOMBRE_D_ARGUMENTS _____BEAUCOUP */ \ /* & Aifdef NOMBRE_D_ARGUMENTS */ \ /* & Eifdef NOMBRE_D_ARGUMENTS */ \ /* */ \ /* puisqu'en effet le symbole 'NOMBRE_D_ARGUMENTS' est defini dans '$PASSE_1' en general, */ \ /* et qu'ici nous sommes dans '$PASSE_4', et qu'alors les symboles de '$PASSE_1' ne peuvent */ \ /* etre testes. Enfin, on ecrit 'NOMBRE`D`ARGUMENTS' et non pas 'NOMBRE_D_ARGUMENTS' afin */ \ /* que lors de '$PASSE_1 il n'y est pas substitution de 'NOMBRE_D_ARGUMENTS' par sa valeur */ \ /* s'il existe, ce qui lors de '$PASSE_4' donnerait le message "illegal macro name"... */ \ /* */ \ /* Le 20040323125010, je note que l'ecriture 'NOMBRE`D`ARGUMENTS' interdit les definitions */ \ /* suivantes : */ \ /* */ \ /* #define NOMBRE ... */ \ /* #define D ... */ \ /* #define ARGUMENTS ... */ \ /* */ \ /* dans un source quelconque. A cette date, la commande 'vs' a montre que ces trois symboles */ \ /* n'existaient pas... */ \ \ /* Definition du point d'entree d'une commande et quelques initialisations essentielles... */ #define ECommande \ Eblock \ end_nouveau_block \ /* Introduit le 20050905162854... */ \ Eblock \ EFonctionIB \ /* Et fin de commande... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E G E S T I O N D E L ' E S P A C E M E M O I R E : */ /* */ /*************************************************************************************************************************************/ TypedefP(TailleMalo,size_t) /* Introduit le 20120201181546 (bien tardivement...) pour definir l'argument d'appel a */ /* 'vrai_Malo_de_base(...)' et 'vrai_Calo_de_base(...)'. */ DEFV(Extern,DEFV(CHAR,POINTERc(malloc()))); #define vrai_Malo_de_base(taille_en_octets) \ malloc(taille_en_octets) DEFV(Extern,DEFV(CHAR,POINTERc(calloc()))); #define vrai_Calo_de_base(taille_en_octets) \ calloc(taille_en_octets,UN) \ /* La fonction 'calloc(...)' a ete introduite le 20051208165517... */ #define vrai_Malo_de_base_effectif(taille_en_octets) \ vrai_Malo_de_base(taille_en_octets) \ /* Introduit le 20051208170523 pour permettre de passer facilement de 'malloc(...)' a */ \ /* 'calloc(...)' et inversement... */ #define Malo(taille_en_octets) \ allocation_memoire_avec_validation(INTE(taille_en_octets) \ ,nom_de_la_commande_courante \ ,FICHIER_COURANT_ABSOLU_x \ ,NomDeLaFonctionCourante \ ,LIGNE_COURANTE \ ) \ /* Definition de l'allocateur memoire general. Sur 'SYSTEME_APC_LinuxRedHat_GCC', faire : */ \ /* */ \ /* setenv MALLOC_CHECK_ 1 */ \ /* */ \ /* permet de faire en "temps reel" des validations d'allocation/desallocation memoire... */ \ /* */ \ /* ATTENTION, jusqu'au 20000224152926, 'Malo(...)' etait defini par : */ \ /* */ \ /* malloc(taille_en_octets) */ \ /* */ \ /* mais il est plus sage de valider... */ \ /* */ \ /* Les arguments {FICHIER_COURANT_RELATIF,NomDeLaFonctionCourante,LIGNE_COURANTE} furent */ \ /* introduits le 20120113141332 ('v $xig/fonct$vv$FON 20120113140943')... */ \ /* */ \ /* Le 20120412092137, 'FICHIER_COURANT_ABSOLU_x' a remplace 'FICHIER_COURANT_RELATIF' */ \ /* suite a la modification 'v $Falias_vi 20120408185254' qui a supprime l'absolutisation */ \ /* des noms de fichier, si necessaire, sous 'vi'... */ #define PLUS_DE_MEMOIRE_LIBRE \ ZERO \ /* Valeur renvoyee lorsqu'il n'y a plus de memoire libre... */ #define tMalo(taille_en_octets,type) \ ptCAST(type,Malo(taille_en_octets)) \ /* Definition de l'allocateur memoire sur des structures de type donne. */ DEFV(Extern,DEFV(Void,free())); #define Free(pointeur) \ free(pointeur) \ /* Definition du desallocateur memoire. */ \ /* */ \ /* ATTENTION, le 20050103094711 je note que 'free(...)' ne renvoie pas de code de retour. */ \ /* Il est donc impossible de savoir si cela s'est bien passe et en particulier de savoir */ \ /* si 'pointeur' etait valide... */ \ /* */ \ /* Je note le 20120201075734 qu'il est regrettable que 'Free(...)' ne sache pas combien */ \ /* d'octets il libere ('v $xig/fonct$vv$FON 20120131183248')... */ =define FreCC(pointeur) \ Free(pointeur) =define FreDD(pointeur) \ Free(pointeur) =define FreFF(pointeur) \ Free(pointeur) =define FreII(pointeur) \ Free(pointeur) =define FreLL(pointeur) \ Free(pointeur) =define FrePP(pointeur) \ Free(pointeur) =define FreSS(pointeur) \ Free(pointeur) /* Definitions supplementaires introduites le 20051021165714 dans le but d'aider a la */ /* comprehension du probleme 'v $xig/fonct$vv$FON 20051019113924'. L'usage sera le suivant : */ /* */ /* operations sur Chaines --> FreCC(...) */ /* chain_Acopie*(...) */ /* chain_ANcopie(...) */ /* chain_Aconcaten?(...) */ /* */ /* Divers --> FreDD(...) */ /* */ /* operations sur Fichiers --> FreFF(...) */ /* */ /* operations les Listes --> FreLL(...) */ /* */ /* Structures en memoire --> FreSS(...) */ /* */ /* Le 20180315131728, ces definitions sont passees de '$PASSE_1' a '$PASSE_2' afin de */ /* favoriser et simplifier la programmattion de 'gCALZ_Free(...)' ci-apres... */ /* */ /* Le 20180406170731 ont ete introduits 'FreII(...)' (et non pas 'FreI(...)' et ce a */ /* cause de la definition 'v $xil/defi_K1$vv$DEF .define...I.') et de 'FrePP(...)' (et non */ /* 'FreP(...)' a cause de la definition 'v $xrq/particle.M0$K .define...I.')... */ #nodefine gCALZ_Free_VERSION_01 /* Version anterieure au 20221028172935... */ #define gCALZ_Free_VERSION_02 /* Version introduite le 20221028181016... */ /* */ /* On notera le 20221029115318 que cela permet de reduire la taille des '$c's et des '$X's */ /* ainsi qu'on peut le voir dans 'v $xcc/cpp$Z 20221029114820'... */ #ifdef gCALZ_Free_VERSION_01 # define gCALZ_Free(X,pointeur) \ Bblock \ CALZ(Fre ## X(pointeur)); \ EGAL(pointeur,ADRESSE_PLUS_DEFINIE); \ INCK(gCALZ_Free_____compteur_de_tous_les_gCALZ_Free); \ INCK(CALZ_Fre ## X ## _____compteur_de_tous_les_CALZ_Fre ## X); \ /* Le comptage des 'gCALZ_Free(...)' a ete introduit le 20180315090454... */ \ /* */ \ /* On notera que l'on ne peut ecrire : */ \ /* */ \ /* INCK(CALZ`FreX`____compteur_de_tous_les_CALZ`FreX); */ \ /* */ \ /* ou encore : */ \ /* */ \ /* INCK(CALZ_ ## FreX ## _____compteur_de_tous_les_CALZ_ ## FreX); */ \ /* */ \ /* car, en effet, 'FreX' est en fait le nom d'une procedure qui demande donc a sa suite */ \ /* des parentheses (et de meme pour 'CALZ(...)'). */ \ /* */ \ /* La solution a ete trouvee le 20180315130123 en remplacant l'argument 'FreX' par 'X', */ \ /* sachant que l'on ne peut pas utiliser 'Fre ## X' car, en effet, les procedures */ \ /* 'FreX(...)' ne sont pas des fonctions, mais des '#define's dont le nom ne peut etre */ \ /* genere ainsi dynamiquement, d'ou le passage de '$PASSE_1' a '$PASSE_2' des 'FreX(...)' */ \ /* pour permettre 'Fre ## X'... */ \ Eblock #Aifdef gCALZ_Free_VERSION_01 #Eifdef gCALZ_Free_VERSION_01 #ifdef gCALZ_Free_VERSION_02 # define gCALZ_Free(X,pointeur) \ Bblock \ CALS(FgCALZ_Free ## X ## (ADRESSE(CALZ_Fre ## X ## _____compteur_de_tous_les_CALZ_Fre ## X),pointeur)); \ /* Et ce afin d'economiser de la place pour les '$c's et les '$X's... */ \ EGAL(pointeur,ADRESSE_PLUS_DEFINIE); \ /* Introduit le 20240704135504, cette reinitialisation ne pouvant etre faite dans la */ \ /* fonction 'CALZ_FreSS(...)' ('v $xig/fonct$vv$FON 20240704122720' a ce propos...). */ \ Eblock #Aifdef gCALZ_Free_VERSION_02 #Eifdef gCALZ_Free_VERSION_02 #define CALZ_FreCC(pointeur) \ Bblock \ gCALZ_Free(CC,pointeur); \ Eblock #define CALZ_FreDD(pointeur) \ Bblock \ gCALZ_Free(DD,pointeur); \ Eblock #define CALZ_FreFF(pointeur) \ Bblock \ gCALZ_Free(FF,pointeur); \ Eblock #define CALZ_FreII(pointeur) \ Bblock \ gCALZ_Free(II,pointeur); \ Eblock #define CALZ_FreLL(pointeur) \ Bblock \ gCALZ_Free(LL,pointeur); \ Eblock #define CALZ_FrePP(pointeur) \ Bblock \ gCALZ_Free(PP,pointeur); \ Eblock #define CALZ_FreSS(pointeur) \ Bblock \ gCALZ_Free(SS,pointeur); \ Eblock /* Definitions introduites le 20180104094153 afin de memoriser le nouvel etat de 'pointeur'. */ /* */ /* Le 20180317125910, les 'CALZ_????(...)' sont passes de '$PASSE_1' a '$PASSE_2' afin de */ /* simplifier 'v $xig/fonct$vv$DEF EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE', mais */ /* cela n'etait pas une bonne idee et je suis donc revenu immediatement en arriere... */ /* */ /* Le 20180406141913, furent introduits 'CALZ_FreI(...)' et 'CALZ_FreP(...)' qui ont ete */ /* renommes 'CALZ_FreII(...)' et 'CALZ_FrePP(...)' le 20180406171209 (la raison en est */ /* donnee dans 'v $xil/defi_c1$vv$DEF 20180406170731'...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E G E S T I O N D E S P R O C E S S U S : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(vrai_Int_de_base,getpid())); #define Gpid() \ INTE(getpid()) \ /* Recuperation du "process identificator" du process courant. */ \ /* 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'... */ DEFV(Extern,DEFV(vrai_Int_de_base,fork())); #define Para() \ fork() \ /* Lancement en parallele d'un process... */ DEFV(Extern,DEFV(Void,exit())); /* Le 20090312112346 cette fonction est passee de 'vrai_Int_de_base' a 'Void' qui semble */ /* etre son type partout, bien que cela ne ce soit vu qu'a cette date lors d'experiences */ /* sur 'europe.polytechnique.fr' (qui remplace provisoirement 'trinite.polytechnique.fr' */ /* a cette date en tant que '$CMAP28') et sur laquelle on obtenait le message : */ /* */ /* ...: warning: incompatible implicit declaration of built-in function 'exit' */ /* */ /* et qui ne s'etait jamais vu ailleurs... */ #define Exit_simple(status) \ exit(status) \ /* "Auto-fin" d'un process. ATTENTION : cette definition doit etre ici parce qu'elle est */ \ /* utilisee ci-dessous pour une definition de '$PASSE_2' ('Return(...)'). Cette nouvelle */ \ /* definition a ete introduite le 19961017141050 ('v $xcp/substitue.01$K Exit_simple') ; */ \ /* en effet, pour des raisons de pre-processing, on ne peut utiliser 'Exit(...)' dans ce */ \ /* fichier. En fait, le 19961018115054, j'ai remplace l'appel a 'Exit_simple(...)' dans */ \ /* '$xcp/substitue.01$K' par 'CODE_ERROR(...)' ; malgre tout, je conserve cette nouvelle */ \ /* definition, on ne sait jamais... */ #define Exit(status) \ CALZ(Exit_simple(status)) \ /* "Auto-fin" d'un process. ATTENTION : cette definition doit etre ici parce qu'elle est */ \ /* utilisee ci-dessous pour une definition de '$PASSE_2' ('Return(...)')... */ #define Abort(status) \ Exit(status) \ /* "Auto-abort" d'un process (introduit le 20170620095409)... */ DEFV(Extern,DEFV(vrai_Int_de_base,kill())); #define Kill(identificateur_de_process,numero_du_signal) \ kill(identificateur_de_process,numero_du_signal) \ /* "Kill" d'un process... */ TypedefP(RemoteServeur,STRU(servent)) DEFV(Extern,DEFV(RemoteServeur,POINTERs(getservbyname()))); #define _GetServeurByName(service,protocole) \ getservbyname(service,protocole) #if ( (defined(BUG_SYSTEME_SYSTEME_APC_LinuxDebian_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxMandrake_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxRedHat_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_ICC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_ICC_numero_de_port)) \ ) /* Aux dernieres nouvelles ('v $Dcourrier_in/19990827180623 htons'), il ne s'agirait pas */ /* d'une erreur. On trouve dans 'v /usr/include/glib.h swapping' des procedures assurant */ /* les conversions utiles. */ /* */ /* Je conserve malgre tout 'BUG_SYSTEME_SYSTEME_APC_LinuxRedHat_GCC_numero_de_port'... */ # define PERMUTATION_EVENTUELLE_DES_OCTETS_DU_NUMERO_DE_PORT(numero_de_port) \ Bblock \ DEFV(Int,INIT(index_de_permutation,UNDEF)); \ \ DEFV(permutation_2_a_2_des_octets_d_un_mot,numero_de_port_converti); \ EGAL(ASD1(numero_de_port_converti,nombre_entier),POSI(numero_de_port)); \ /* Recuperation du numero de port a permuter. */ \ \ Test(EST_IMPAIR(NOCMO)) \ Bblock \ PRINT_ERREUR("'NOCMO' est impair, la permutation des octets 2 a 2 d'un numero de port est mauvaise"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ DoIn(index_de_permutation,INDEX0,LSTX(INDEX0,MOIT(NOCMO)),I) \ Bblock \ cSWAP(ITb1(ASD1(numero_de_port_converti,octets),DOUB(index_de_permutation)) \ ,ITb1(ASD1(numero_de_port_converti,octets),DOUP(index_de_permutation)) \ ); \ /* Permutation 2 a 2 des octets. */ \ Eblock \ EDoI \ \ EGAL(numero_de_port,POSI(ASD1(numero_de_port_converti,nombre_entier))); \ /* Renvoi du numero de port permute. */ \ Eblock \ /* Permutation 2 a 2 des octets d'un mot lorsque cela est necessaire. */ #Aif ( (defined(BUG_SYSTEME_SYSTEME_APC_LinuxDebian_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxMandrake_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxRedHat_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_ICC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_ICC_numero_de_port)) \ ) # define PERMUTATION_EVENTUELLE_DES_OCTETS_DU_NUMERO_DE_PORT(numero_de_port) \ Bblock \ BLOC(VIDE;); \ Eblock \ /* Recuperation des caracteristiques d'un serveur. */ #Eif ( (defined(BUG_SYSTEME_SYSTEME_APC_LinuxDebian_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxMandrake_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxRedHat_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_ICC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_ICC_numero_de_port)) \ ) #define GetServeurByName(caracteristiques_du_serveur,service,protocole) \ Bblock \ EGAL(caracteristiques_du_serveur,_GetServeurByName(service,protocole)); \ PERMUTATION_EVENTUELLE_DES_OCTETS_DU_NUMERO_DE_PORT(ASI1(caracteristiques_du_serveur,s_port)); \ Eblock \ /* Recuperation des caracteristiques d'un serveur. */ DEFV(Extern,DEFV(vrai_Int_de_base,rexec())); #define _RemoteCommande(machine,port,login,passwd,commande,stream_de_signalisation) \ rexec(machine,port,login,passwd,commande,stream_de_signalisation) #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ ) # TestADef BUG_SYSTEME_rexec_login_passwd_interactif \ /* Comme cela peut se voir avec 'v $xtc/remote.12$c Segmentation', lorsque l'un des */ \ /* parametres {login,passwd} est nul ('ADRESSE_NON_DEFINIE'), cela provoque de la part */ \ /* de 'rexec(...)' le message : */ \ /* */ \ /* Segmentation fault */ \ /* */ \ /* que je n'ai pas pu faire disparaitre. */ #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ ) #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE <= 503000000)) \ ) #define RemoteCommande(stream_de_communication,machine,port,login,passwd,commande,stream_de_signalisation) \ Bblock \ Conversion_CHAR_en_vrai_CHAR_de_base(machine_eventuellement_convertie,machine); \ Conversion_CHAR_en_vrai_CHAR_de_base(login_eventuellement_converti,login); \ Conversion_CHAR_en_vrai_CHAR_de_base(passwd_eventuellement_converti,passwd); \ Conversion_CHAR_en_vrai_CHAR_de_base(commande_eventuellement_convertie,commande); \ /* Cette manipulation a ete rendue necessaire par 'SYSTEME_APC_LinuxRedHat_GCC' qui sinon */ \ /* donnait lors de l'appel de 'rexec(...)' avec directement 'machine' comme argument un */ \ /* message du type : */ \ /* */ \ /* warning: passing arg 1 of `rexec' from incompatible pointer type */ \ /* */ \ /* qui disparait avec ce transfert... */ \ /* Puis, meme remarque mais pour 'SYSTEME_SGO200A2_IRIX_CC' pour {login,passwd,commande}. */ \ \ PERMUTATION_EVENTUELLE_DES_OCTETS_DU_NUMERO_DE_PORT(port); \ /* Conversion eventuelle inverse ; en effet, les problemes de '_GetServeurByName(...)' */ \ /* et de '_RemoteCommande(...)' en ce qui concerne le numero de port se compensent ainsi */ \ /* que je l'ai decouvert le 19990824163922. */ \ \ EGAL(stream_de_communication \ ,_RemoteCommande(ADRESSE(machine_eventuellement_convertie) \ ,port \ ,login_eventuellement_converti,passwd_eventuellement_converti \ ,commande_eventuellement_convertie \ ,COND(IFNE(stream_de_signalisation,ADRESSE_NON_DEFINIE) \ ,ADRESSE(stream_de_signalisation) \ ,ADRESSE_NON_DEFINIE \ ) \ ) \ ); \ Eblock \ /* Lancement a distance d'une commande. ATTENTION, on notera l'hyopthese de nullite de */ \ /* de 'ADRESSE_NON_ENCORE_DEFINIE' qui est faite ici ; celle-ci est validee dans */ \ /* 'v $xcp/Konstantes$K' et 'v $xcg/remote.01$K RemoteCommande' (ou elle est utilisee...). */ DEFV(Extern,DEFV(vrai_Int_de_base,shutdown())); #define ShutdownStream_RECEPTION \ ZERO #define ShutdownStream_EMISSION \ UN #define ShutdownStream_EMISSION_RECEPTION \ DEUX #define ShutdownStream(stream,mode) \ shutdown(stream,mode) \ /* Pour couper unilateralement un "stream" (avec les 3 codes possibles). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E G E S T I O N D E F I C H I E R S : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(vrai_Int_de_base,errno)); #define CodeDErreurSystemeCourant \ errno \ /* Recuperation du code d'erreur courant ('v /usr/include/asm/errno.h'). */ TypedefP(File,FILE) TypedefS(A___File,File) /* Definition de la structure definissant un fichier et a utiliser pour les acces aux */ /* fichiers par la fonction 'Fopen(...)'. En ce qui concerne les "stream"s standards, on */ /* pourra, par exemple, ecrire : */ /* */ /* DEFV(File,POINTERs(stream)); */ /* (...); */ /* EGAL(stream,STREAM_IN); */ /* (...); */ /* EGAL(stream,STREAM_OUT); */ /* (...); */ /* EGAL(stream,STREAM_ERREUR); */ /* */ /* Le type 'FILE' est defini dans 'v /usr/include/stdio$h typedef.struct._IO_FILE.FILE;' */ /* '_IO_FILE' etant lui-meme defini dans 'v /usr/include/libio$h struct._IO_FILE' (note le */ /* 20131004180504 sur '$LACT19'...). */ #define cFile(x) \ CAST(File,x) #define cpFile(x) \ ptCAST(File,x) /* Cast "File". */ #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) # TestADef BUG_SYSTEME_Linux_Sync_tres_lent \ /* Ceci a ete introduit le 20121024134358. En effet a cette date, j'observe que l'execution */ \ /* de '$xrr/N_corps.11$X' pour generer 'v $xiak/NCOR.x1$R16' est beaucoup plus lente sur */ \ /* '$LACT19' que sur '$LACT18' ; voici le resulat des 'time's correspondants : */ \ /* */ \ /* LACT18 : 91.117u 1.592s 1:52.95 82.0% 0+0k 0+0io 110pf+0w */ \ /* LACT19 : 49.790u 23.600s 3:28.12 35.2% 0+0k 2312+675848io 8pf+0w */ \ /* */ \ /* ou l'on voit que le calcul est deux fois plus rapide (49.790/91.117), mais qu'il y a un */ \ /* nombre tres eleve d'entrees-sorties. Tout venait du 'CALZ(Sync(...))' contenu dans la */ \ /* fonction v $xig/fonct$vv$FON Fmise_a_jour_du_systeme_de_gestion_de_fichiers'... */ \ /* */ \ /* Il aurait ete possible d'inhiber cela uniquement sur '$LACT19', mais d'une part l'appel */ \ /* a 'Sync(...)' n'a plus d'utilite aujourd'hui. D'autre part cela pourrait se retrouver */ \ /* sur d'autres MACHINEs (et d'ailleurs aux environs du 20121024171657 des tests ont montre */ \ /* que c'est cela qui etait, sur 'porte-brancion.polytechnique.fr', la cause des lenteurs */ \ /* que j'avais observees dans les entrees-sorties ('v $Fmachines ENTREES.SORTIES.LENTES')... */ \ /* */ \ /* Le 'time' a ensuite, apres l'introduction de ce bug, donne les valeurs suivantes : */ \ /* */ \ /* LACT18 : 85.553u 1.496s 1:42.88 84.6% 0+0k 0+0io 102pf+0w */ \ /* LACT19 : 50.550u 0.360s 0:51.49 98.8% 0+0k 0+675840io 0pf+0w */ \ /* */ \ /* ce qui est quand meme plus logique. On voit de plus qu'il y a aussi un gain sur '$LACT18' */ \ /* (mais moins impressionnant que sur '$LACT19'...). */ \ #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ ) #if ( ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ ) # TestADef BUG_SYSTEME_SGIND5_Sync_time_out \ /* Dans ce cas il y a un probleme ('v $Dbugs/SGIND524$D/IRIX$D/$Fnota fr61125'). En effet, */ \ /* la fonction 'sync(...)' une fois sur N ne rend pas la main tres vite mais ou au bout de */ \ /* plusieurs secondes ; cette duree, ainsi que le nombre 'N' semble etre fonction de la */ \ /* taille de l'executable referencant 'sync(...)' et aussi de la taille du dernier (des */ \ /* derniers ?) fichier ecrit. ATTENTION, malheureusement, il est impossible d'automatiser */ \ /* la gestion de 'BUG_SYSTEME_SGIND5_Sync_time_out' par '$xcp/Bugs$K' ; en effet, on */ \ /* pourrait croire qu'il suffirait de boucler un certain nombre de fois sur 'sync(...)' */ \ /* dans le programme '$xcp/Bugs$K' et de chronometrer la duree de l'execution de cette */ \ /* fonction mais alors sur les SYSTEMEs en cause, la duree du pre-processing '$xcc/cpp$Z' */ \ /* serait augmentee considerablement, ce qui n'est pas tolerable... */ #Aif ( ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ ) #Eif ( ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE == 602000000)) \ ) #if ( (! defined(BUG_SYSTEME_SGIND5_Sync_time_out)) \ ) DEFV(Extern,DEFV(Void,sync())); # define Sync \ sync \ /* Mise a jour du systeme de gestion de fichier sur les disques. */ #Aif ( (! defined(BUG_SYSTEME_SGIND5_Sync_time_out)) \ ) #Eif ( (! defined(BUG_SYSTEME_SGIND5_Sync_time_out)) \ ) DEFV(Extern,DEFV(vrai_Int_de_base,pipe())); #define Pipe(file_descriptor) \ pipe(file_descriptor) \ /* Definition du createur de "pipe". */ DEFV(Extern,DEFV(vrai_Int_de_base,fcntl())); #define Fflags_complets(file_descriptor) \ fcntl(file_descriptor,F_GETFL) #define Fflags(file_descriptor) \ ETLO(Fflags_complets(file_descriptor),OPEN_MODE) /* Acces aux "flags" d'un fichier ouvert ou ferme (voir le fichier 'v $xtc/files.11$c'). */ /* Le 20150310162758 fut introduit le 'OPEN_MODE' apres que j'ai decouvert a cette date */ /* qu'il y avait de plus le bit 'v /usr/include/asm-generic/fcntl$h O_LARGEFILE' (egal */ /* a '0x8000, soit 100000 en octal) positionne... */ /* */ /* La procedure 'Fflags_complets(...)' a ete introduite le 20191118154559 pour */ /* 'v $xcg/TestRedirection.01$K$INUTILE Fflags_complets'... */ TypedefP(FileStatus,STRU(stat)) /* Introduit le 20060520115459... */ DEFV(Extern,DEFV(vrai_Int_de_base,stat())); #define Feta(nom_du_fichier,file_status) \ stat(Cara(nom_du_fichier),ADRESSE(file_status)) \ /* Acces a l'etat d'un fichier ouvert ou ferme. */ \ /* */ \ /* ATTENTION, a compter du 20060520121632 il peut s'agir en fait de 'stat64(...)'... */ DEFV(Extern,DEFV(vrai_Int_de_base,fstat())); #define Fsta(file_descriptor,file_status) \ fstat(file_descriptor,ADRESSE(file_status)) \ /* Acces a l'etat d'un fichier deja ouvert. ATTENTION : cette fonction est a utiliser avec */ \ /* 'Open(...)' et 'Clos(...)'. */ \ /* */ \ /* ATTENTION, a compter du 20060520121632 il peut s'agir en fait de 'fstat64(...)'... */ DEFV(Extern,DEFV(vrai_Int_de_base,chmod())); #define Chmod(nom_du_fichier,mode) \ chmod(nom_du_fichier,CAST(mode_t,mode)) \ /* Changement du mode d'un fichier (introduit le 20110531132258). */ DEFV(Extern,DEFV(vrai_Int_de_base,fchmod())); #define Fchmod(file_descriptor,mode) \ fchmod(file_descriptor,CAST(mode_t,mode)) \ /* Changement du mode d'un fichier deja ouvert. ATTENTION : cette fonction est a utiliser */ \ /* avec 'Open(...)' et 'Clos(...)'. */ @include <utime.h> DEFV(Extern,DEFV(vrai_Int_de_base,utime())); #define Utime(nom_du_fichier,dates) \ utime(Cara(nom_du_fichier),ADRESSE(dates)) \ /* Changement des dates de dernier acces et de derniere modification d'un fichier. */ DEFV(Extern,DEFV(vrai_Int_de_base,creat())); #define Crea(nom_du_fichier,mode_de_creation) \ creat(Cara(nom_du_fichier),mode_de_creation) \ /* Creation d'un fichier. */ DEFV(Extern,DEFV(vrai_Int_de_base,rename())); #define Reno(ancien_nom,nouveau_nom) \ rename(Cara(ancien_nom),Cara(nouveau_nom)) \ /* Changement d'un nom (de fichier ou de directory)... */ /* ATTENTION : la fonction 'defined(...)' n'est pas utilisee ci-apres a cause du '@' ; on */ /* n'ecrit donc pas : */ /* */ /* @if ( (! defined(SYSTEME_CRAY2_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_ES9000_AIX_CC)) \ */ /* && (! defined(SYSTEME_RS6000_AIX_CC)) \ */ /* ) */ /* (...) */ /* @Aif ( (! defined(SYSTEME_CRAY2_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_ES9000_AIX_CC)) \ */ /* && (! defined(SYSTEME_RS6000_AIX_CC)) \ */ /* ) */ /* @Eif ( (! defined(SYSTEME_CRAY2_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ */ /* && (! defined(SYSTEME_ES9000_AIX_CC)) \ */ /* && (! defined(SYSTEME_RS6000_AIX_CC)) \ */ /* ) */ /* */ /* Ce qui suit est maintenant en commentaire, car en effet, l'adjonction de la PASSE 6 */ /* dans le pre-processing permet de simplifier les choses. On trouvait donc autrefois : */ /* */ /* @ifndef SYSTEME_CRAY2_UNICOS_SCC */ /* */ /* @ ifndef SYSTEME_CRAYYMP1_UNICOS_SCC */ /* */ /* @ ifndef SYSTEME_CRAYYMP2_UNICOS_SCC */ /* */ /* @ ifndef SYSTEME_CRAYYMP4_UNICOS_SCC */ /* */ /* @ ifndef SYSTEME_RS6000_AIX_CC */ /* */ DEFV(Extern,DEFV(vrai_Int_de_base,open())); /* ATTENTION : cette fonction peut donc avoir ete declaree dans '@ include <fcntl.h>'. */ /* */ /* @ Aifndef SYSTEME_RS6000_AIX_CC */ /* @ Eifndef SYSTEME_RS6000_AIX_CC */ /* */ /* @ Aifndef SYSTEME_CRAYYMP4_UNICOS_SCC */ /* */ /* ceci, est en prevision de la prochaine release du compilateur 'scc' (nous sommes */ /* aujourd'hui le 19901031...). */ /* */ /* @ Eifndef SYSTEME_CRAYYMP4_UNICOS_SCC */ /* */ /* @ Aifndef SYSTEME_CRAYYMP2_UNICOS_SCC */ /* */ /* ceci, est en prevision de la prochaine release du compilateur 'scc' (nous sommes */ /* aujourd'hui le 19901031...). */ /* */ /* @ Eifndef SYSTEME_CRAYYMP2_UNICOS_SCC */ /* */ /* @ Aifndef SYSTEME_CRAYYMP1_UNICOS_SCC */ /* */ /* ceci, est en prevision de la prochaine release du compilateur 'scc' (nous sommes */ /* aujourd'hui le 19901031...). */ /* */ /* @ Eifndef SYSTEME_CRAYYMP1_UNICOS_SCC */ /* */ /* @Aifndef SYSTEME_CRAY2_UNICOS_SCC */ /* */ /* ceci, est en prevision de la prochaine release du compilateur 'scc' (nous sommes */ /* aujourd'hui le 19901031...). */ /* */ /* @Eifndef SYSTEME_CRAY2_UNICOS_SCC */ /* */ #define Open(nom_du_fichier,file_status_flags) \ open(Cara(nom_du_fichier),file_status_flags) \ /* Ouverture d'un fichier. Le 'file_status_flags' prend une des valeurs suivantes : */ \ /* */ \ /* OPEN_READ, */ \ /* OPEN_WRITE, */ \ /* OPEN_READ_AND_WRITE, */ \ /* OPEN_READ_SANS_ATTENTE_EN_LECTURE_SI_LE_FICHIER_EST_VIDE, */ \ /* OPEN_READ_AND_WRITE_SANS_ATTENTE_EN_LECTURE_SI_LE_FICHIER_EST_VIDE, */ \ /* */ \ /* et cette fonction renvoie un descripteur de fichier qui est un 'vrai_Int_de_base'. */ #define OpenNew(nom_du_fichier,file_status_flags,mode_de_creation) \ open(Cara(nom_du_fichier),file_status_flags,mode_de_creation) \ /* Ouverture d'un nouveau fichier. Le 'file_status_flags' prend la valeur suivante : */ \ /* */ \ /* OPEN_READ_AND_WRITE_D_UN_FICHIER_INEXISTANT. */ \ /* */ \ /* Ceci fut introduit le 20070710110408 pour 'v $xig/fonct$vv$FON 20070710105610'... */ DEFV(Extern,DEFV(File,POINTERs(fopen()))); #define Fopen(nom_du_fichier,file_status_flags) \ fopen(Cara(nom_du_fichier),file_status_flags) \ /* Ouverture d'un fichier. Le 'file_status_flags' prend une des valeurs suivantes : */ \ /* */ \ /* file_Rmode, */ \ /* file_Wmode, */ \ /* file_Amode, */ \ /* file_RPmode, */ \ /* file_WPmode, */ \ /* file_APmode, */ \ /* */ \ /* et cette fonction renvoie un descripteur de fichier qui est un 'File'. */ #define DESCRIPTEUR_D_UN_FICHIER_INEXISTANT \ cpFile(ZERO) \ /* Valeur du pointeur renvoye par 'fopen(...)' pour un fichier inexistant... */ DEFV(Extern,DEFV(vrai_Int_de_base,read())); #define Read(file_descriptor,adresse_du_buffer,nombre_d_octets) \ read(file_descriptor,Cara(adresse_du_buffer),nombre_d_octets) \ /* Definition de la fonction de lecture sans format. ATTENTION : cette fonction est a */ \ /* utiliser avec 'Open(...)' et 'Clos(...)'. */ DEFV(Extern,DEFV(vrai_Int_de_base,fscanf())); #define vrai_Fscan(file_descriptor,format_de_lecture,variable_unique) \ fscanf(file_descriptor,Cara(format_de_lecture),variable_unique) #define Fscan(file_descriptor,format_de_lecture,variable_unique) \ vrai_Fscan(file_descriptor,format_de_lecture,ADRESSE(variable_unique)) /* Definition de la fonction de lecture avec format d'une seule variable (ceci est une */ /* restriction par rapport aux possibilites de 'fscanf(...)' mais permet d'avoir un nombre */ /* constant d'arguments). ATTENTION : cette fonction est a utiliser avec 'Fopen(...)' et */ /* 'FClos(...)'. */ /* */ /* La procedure 'vrai_Fscan(...)' a ete introduite le 19991123172246 lors de l'introduction */ /* des codes non numerique dans 'v $xig/fonct$vv$FON vrai_Fscan'. */ #if ( (defined(SYSTEME_APC_LinuxDebian)) \ || (defined(SYSTEME_APC_LinuxMandrake)) \ || (defined(SYSTEME_APC_LinuxRedHat)) \ || (defined(SYSTEME_APC_LinuxUbuntu)) \ ) /* ATTENTION : on ne peut pas etre plus selectif (en particulier en testant la valeur de */ /* 'nNOYAU_RELEASE') car, en effet, 'nNOYAU_RELEASE' est utilise a la compilation et non pas */ /* a l'execution. Or, malheureusement, la compilation et l'execution peuvent avoir lieu sur */ /* des MACHINEs 'SYSTEME_APC_Linux' de SYSTEMEs completement differents. On notera au */ /* passage que pour bien faire ce "bug" ne devrait etre "active" que pour des versions du */ /* noyau du type "204??????" (voir ulterieures lorsqu'elles existeront...). Ainsi, pour */ /* simplifier, ce "bug" est donc "active" pour tous les 'SYSTEME_APC_Linux'. */ # TestADef BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ \ /* Doit-on verifier par defaut dans 'Fstore_fichier_non_formatte(...)' que le contenu d'un */ \ /* fichier apres son ecriture est bien identique a ce qui devait etre ecrit ? */ \ /* */ \ /* Ceci a ete introduit le 20020430164907 a cause de problemes graves rencontres */ \ /* sur '$CMAP??' lors de la generation de la sequence : */ \ /* */ \ /* xivPdf 14 1 / 028237_028748 */ \ /* */ \ /* ou des blocs de '\000' apparaissent dans les fichiers '$xiim/REFL.Wb.????', la longueur */ \ /* de ces blocs etant un multiple de la taille des blocs declares pour le montage 'NFS' */ \ /* supportant '$xiim'. Bien que ce probleme semble ne se rencontrer qu'avec des fichiers */ \ /* de type 'NFS' supportes par '$CMAP31' et pour des clients 'Linux' d'une certaine version */ \ /* du noyau, il est difficile (voire dangereux car, en effet, on risquerait ainsi d'exclure */ \ /* des MACHINEs a probleme...) d'etre plus specifique qu'en testant '$SYSTEME'. */ \ /* */ \ /* Ce probleme est donc traite dans le fichier 'v $xig/fonct$vv$FON 20020429105701', mais */ \ /* aussi dans 'v $Falias_reference 20020502151257'... */ #Aif ( (defined(SYSTEME_APC_LinuxDebian)) \ || (defined(SYSTEME_APC_LinuxMandrake)) \ || (defined(SYSTEME_APC_LinuxRedHat)) \ || (defined(SYSTEME_APC_LinuxUbuntu)) \ ) #Eif ( (defined(SYSTEME_APC_LinuxDebian)) \ || (defined(SYSTEME_APC_LinuxMandrake)) \ || (defined(SYSTEME_APC_LinuxRedHat)) \ || (defined(SYSTEME_APC_LinuxUbuntu)) \ ) DEFV(Extern,DEFV(vrai_Int_de_base,write())); #define Writ(file_descriptor,adresse_du_buffer,nombre_d_octets) \ write(file_descriptor,Cara(adresse_du_buffer),nombre_d_octets) \ /* Definition de la fonction d'ecriture. ATTENTION : cette fonction est a utiliser avec */ \ /* 'Open(...)' et 'Clos(...)'. */ DEFV(Extern,DEFV(vrai_Int_de_base,fflush())); #define Fflush(file_descriptor) \ fflush(file_descriptor) \ /* "Vidage" des buffers d'un fichier ouvert par 'Fopen(...)' ; ceci est en particulier */ \ /* utilise avec 'stdout' et 'stderr', afin de garantir l'ordre et la sequentialite des */ \ /* sorties faites vers eux... */ DEFV(Extern,DEFV(vrai_Int_de_base,close())); #define Clos(file_descriptor) \ close(file_descriptor) \ /* Fermeture d'un fichier ouvert par 'Open(...)'. */ DEFV(Extern,DEFV(vrai_Int_de_base,fclose())); #define Fclos(file_descriptor) \ fclose(file_descriptor) \ /* Fermeture d'un fichier ouvert par 'Fopen(...)'. */ DEFV(Extern,DEFV(vrai_Int_de_base,unlink())); #define Unlink(nom_du_fichier) \ unlink(Cara(nom_du_fichier)) \ /* Destruction definitive d'un fichier. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U E L Q U E S V A R I A B L E S D ' E N V I R O N N E M E N T S T A N D A R D S : */ /* */ /*************************************************************************************************************************************/ #define Gvar_iHOTE \ Gvar("iHOTE") \ /* Recuperation de l'adresse 'IP' de la machine hote (introduit le 20070522151828 pour */ /* etre utilise dans 'v $xig/defin_2$vv$DEF Gvar_iHOTE'). */ #define Gvar_sHOTE \ Gvar("sHOTE") \ /* Recuperation du nom symbolique de la machine hote... */ #define Gvar_mHOTE \ Gvar("mHOTE") #define Gvar_vCOMPUTER \ Gvar("vCOMPUTER") #define Gvar_mHOTE_Force \ Gvar("mHOTE_Force") #define Gvar_amHOTE \ Gvar("amHOTE") /* Quelques definitions introduites le 20110531105919 pour 'v $xcg/PhaseCrit.01$K mHOTE'... */ #define Gvar_vCOMPUTERd \ GvarDefaut("vCOMPUTERd","vCOMPUTERd_NonDefini") \ /* Recuperation du vrai nom de la machine hote (introduit le 20070420112557)... */ #define Gvar_HOST \ GvarDefaut("HOST","HOST_NonDefini") \ /* Recuperation du vrai nom de la machine hote (introduit le 20070420120642)... */ #define Gvar_SYSTEME \ Gvar("SYSTEME") \ /* Recuperation du type de 'SYSTEME' hote... */ #define Gvar_INTERACTIF \ GvalDefaut("INTERACTIF",NEXIST) #define LE_MODE_EST_INTERACTIF \ PRESENT(Gvar_INTERACTIF) #define LE_MODE_N_EST_PAS_INTERACTIF \ ABSENT(Gvar_INTERACTIF) /* Recuperation du mode interactif ou pas (introduit le 20070302090750...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E U N I X ( C O M M A N D E S S Y S T E M E ) : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(vrai_Int_de_base,system())); #define SYSTEM(commande) \ system(Cara(commande)) \ /* Cette fonction intermediaire est introduite afin de favoriser la portabilite. On notera */ \ /* que le 'Cara(...)' a ete introduit a cause des SYSTEMEs 'SYSTEME_SGIND?08_IRIX_CC' et */ \ /* 'SYSTEME_SGIND?24_IRIX_CC'... */ #define EXECUTION_D_UN_FICHIER_SOUS_SH(nom_du_fichier) \ EGAs(chain_Aconcaten2(". ",nom_du_fichier)) \ /* Introduit le 20061225172208 pour 'v $xci/genere$K EXECUTION_D_UN_FICHIER_SOUS_SH'... */ #define DECALAGE_DES_CODES_D_ERREUR_SOUS_SH \ NBITOC \ /* Introduit le 20230406105959... */ #define EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(suite_de_commandes) \ Bblock \ CALS(FgEXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(suite_de_commandes)); \ Eblock \ /* Execution d'une suite de commandes sous '$SH' mis sous cette forme le 20221128102945 */ \ /* afin de reduire la taille des '$c's et des '$X's... */ #define gEXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(suite_de_commandes) \ Bblock \ DEFV(CHAR,INIC(POINTERc(suite_courante_de_commandes_sous_SH),suite_de_commandes)); \ /* Generation de la suite courante de commandes. */ \ \ Test(IL_FAUT(editer_les_commandes_avant_execution)) \ Bblock \ CAL3(Prme1("Commande[s]Secondaire[s]=%s\n",suite_courante_de_commandes_sous_SH)); \ /* Edition de la commande courante (dite "secondaire"...) avant son execution. */ \ /* */ \ /* On notera le remplacement de "CommandeSecondaire" par "Commande[s]Secondaire[s]" le */ \ /* 20041020112826 car, en effet, il n'y a qu'une seule "commande primaire" alors qu'il */ \ /* peut y avoir plusieurs "commandes secondaires"... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(CODE_ERREUR,SYSTEM(suite_courante_de_commandes_sous_SH)); \ /* Execution de la suite courante de commandes. */ \ /* */ \ /* Le positionnement de 'CODE_ERREUR' a ete introduit le 20230405173006 suite a */ \ /* la modification importante 'v $xil/defi_c1$vv$DEF 20230405140116'... */ \ \ Test(IL_Y_A_ERREUR(CODE_ERREUR)); \ Bblock \ PRINT_ERREUR("une suite de commandes sous '$SH' s'est mal executee"); \ CAL1(Prer0("cette suite de commandes est :\n")); \ CAL1(Prer1("%s\n",suite_courante_de_commandes_sous_SH)); \ CAL1(Prer0("\n")); \ /* La "fermeture" du message par un dernier "\n" a ete introduite le 20040115114013 suite */ \ /* aux modifications 'v $xcg/fichier_etat$K 20040115101933'... */ \ \ EGAL(CODE_ERREUR,SLRS(CODE_ERREUR,DECALAGE_DES_CODES_D_ERREUR_SOUS_SH)); \ /* Voir 'v $xil/defi_c1$vv$DEF 20230406095735' pour expliquer ce decalage... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ /* ATTENTION, avant le 20050102173617, il y avait ici par erreur : */ \ /* */ \ /* CALS(Free(suite_courante_de_commandes_sous_SH)); */ \ /* */ \ /* en effet, il ne serait necessaire que si 'suite_courante_de_commandes_sous_SH' etait */ \ /* definie via une allocation memoire (par exemple, via un 'chain_Aconcaten?(...)'), ce */ \ /* qui n'est pas le cas ici... */ \ Eblock \ /* Execution d'une suite de commandes sous '$SH'. */ #define LANCEMENT_D_UNE_COMMANDE_SOUS_SH_DE_BASE \ C_VIDE #define LANCEMENT_D_UNE_COMMANDE_SOUS_SH \ EGAs(chain_Aconcaten2(Gvar("SH")," -c ")) /* Pour lancer une commande sous '$SH'. Cette definition a ete introduite le 20091021094602 */ /* pour 'v $xcg/parallele.1N.K LANCEMENT_D_UNE_COMMANDE_SOUS_SH'... */ /* */ /* Le 20120115105031 'C_VIDE' a ete remplace par l'acces a '$SH' afin d'etre sur du "shell" */ /* qui sera utilise et d'avoir ainsi acces a la commande 'nice'. En effet, 'C_VIDE' donnait */ /* acces a '/bin/sh' qui est en fait '/bin/dash' ; or ce dernier ne dispose pas de 'nice'. */ /* Seul '/bin/bash' en dispose d'ou l'utilisation de '$SH' ci-dessus... */ /* */ /* Le 20120115112614 fut introduit 'LANCEMENT_D_UNE_COMMANDE_SOUS_SH_DE_BASE' car, c'est */ /* en effet utile pour 'v $xcg/parallele.1N$K compatibilite_20120115'... */ #define CHANGEMENT_DE_PRIORITE_D_UNE_COMMANDE_SOUS_SH \ "nice -n " \ /* Pour changer de priorite sous '$SH' (introduit le 20120115105311). */ #define LANCEMENT_D_UNE_COMMANDE_SOUS_CSH \ EGAs(chain_Aconcaten2(Gvar("CSH")," -c ")) \ /* Pour lancer une commande sous '$CSH'. Cette definition a ete deplacee le 20050102162501 */ \ /* depuis 'v $xig/fonct$vv$DEF'. */ #define CHANGEMENT_DE_PRIORITE_D_UNE_COMMANDE_SOUS_CSH \ "nice +" \ /* Pour changer de priorite sous '$CSH' (introduit le 20120115105311). */ #define PERMETTRE_UN_USAGE_NORMAL_DE_Mor \ "PasDe_stty= ; export PasDe_stty ; " \ /* Afin de resoudre le probleme evoque dans 'v $Fperipheriques 20030317173500'. Ceci a ete */ \ /* introduit le 20030317215230 dans 'v $xig/fonct$vv$DEF' et deplace ici le 20050102162501. */ #define FORCER_LE_MODE_NON_INTERACTIF \ "NonInteractif= ; export NonInteractif ; " \ /* Afin de permettre de forcer le mode non interactif. Cela fut introduit le 20060119155733 */ \ /* suite a un probleme rencontre sur '$LACT15' ou la commande '$xci/neutre$X' fut lancee */ \ /* avec l'option "Versions=VRAI" ('v $Dhistory/LACT15$D/20060119162208 20060119142234'), */ \ /* puis fut abortee alors que '$FCshrc' etait dans la phase critique de '$FsavehistS' dans */ \ /* laquelle il etait entre se croyant en mode '$INTERACTIF' ('v $FCshrc 20000224163431')... */ #define EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH(suite_de_commandes) \ Bblock \ CALS(FgEXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH(suite_de_commandes)); \ Eblock \ /* Execution d'une suite de commandes sous '$CSH' mis sous cette forme le 20221128102945 */ \ /* afin de reduire la taille des '$c's et des '$X's... */ #define gEXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH(suite_de_commandes) \ Bblock \ DEFV(CHAR,INIC(POINTERc(suite_courante_de_commandes_sous_CSH) \ ,chain_Aconcaten4(PERMETTRE_UN_USAGE_NORMAL_DE_Mor \ ,FORCER_LE_MODE_NON_INTERACTIF \ ,LANCEMENT_D_UNE_COMMANDE_SOUS_CSH \ ,suite_de_commandes \ ) \ ) \ ); \ /* Generation de la suite courante de commandes. */ \ \ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(suite_courante_de_commandes_sous_CSH); \ /* Execution de la suite courante de commandes. */ \ \ CALZ_FreCC(suite_courante_de_commandes_sous_CSH); \ /* Liberation de l'espace contenant la suite courante de commandes. */ \ Eblock \ /* Execution d'une suite de commandes sous '$CSH' (introduite le 20050102162501). */ #define EXECUTION_D_UNE_COMMANDE_AVEC_ARGUMENTS_SOUS_CSH(suite_de_commandes) \ Bblock \ CALS(FgEXECUTION_D_UNE_COMMANDE_AVEC_ARGUMENTS_SOUS_CSH(suite_de_commandes)); \ Eblock \ /* Execution d'une suite de commandes sous '$CSH' avec des arguments mis sous cette forme */ \ /* le 20221128102945 afin de reduire la taille des '$c's et des '$X's... */ #define gEXECUTION_D_UNE_COMMANDE_AVEC_ARGUMENTS_SOUS_CSH(suite_de_commandes) \ Bblock \ DEFV(CHAR,INIC(POINTERc(suite_courante_de_commandes_sous_CSH) \ ,chain_Aconcaten6(PERMETTRE_UN_USAGE_NORMAL_DE_Mor \ ,FORCER_LE_MODE_NON_INTERACTIF \ ,LANCEMENT_D_UNE_COMMANDE_SOUS_CSH \ ,C_APOSTROPHE \ ,suite_de_commandes \ ,C_APOSTROPHE \ ) \ ) \ ); \ /* Generation de la suite courante de commandes avec encadrement de la commande a */ \ /* par des 'K_VERITABLE_APOSTROPHE's lorsque celle-ci a des arguments comme c'est le */ \ /* cas avec 'v $xig/fonct$vv$DEF LibDynam",C_BLANC,NOM_DE_LA_COMMANDE'. Ceci a ete introduit */ \ /* le 20220825171755 et differencie de 'EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH(...)' */ \ /* le 20220825171755... */ \ \ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(suite_courante_de_commandes_sous_CSH); \ /* Execution de la suite courante de commandes. */ \ \ CALZ_FreCC(suite_courante_de_commandes_sous_CSH); \ /* Liberation de l'espace contenant la suite courante de commandes. */ \ Eblock \ /* Execution d'une suite de commandes sous '$CSH' avec des arguments (introduite */ \ /* le 20220825171755). */ #define C_SH__REDIRECTION_FICHIER \ EGAs(chain_Aconcaten3(C_BLANC,C_SUPERIEUR,C_BLANC)) #define C_SH__REDIRECTION_PROGRAMME \ EGAs(chain_Aconcaten3(C_BLANC,C_PIPE,C_BLANC)) #define C_CSH__REDIRECTION_FICHIER \ EGAs(chain_Aconcaten3(C_BLANC,C_SUPERIEUR,C_BLANC)) #define C_CSH__REDIRECTION_ERREUR_FICHIER \ EGAs(chain_Aconcaten4(C_BLANC,C_SUPERIEUR,C_ET,C_BLANC)) #define C_CSH__REDIRECTION_PROGRAMME \ EGAs(chain_Aconcaten3(C_BLANC,C_PIPE,C_BLANC)) #define C_CSH__REDIRECTION_ERREUR_PROGRAMME \ EGAs(chain_Aconcaten4(C_BLANC,C_PIPE,C_ET,C_BLANC)) /* Pour rediriger une entree-sortie vers un fichier ou un programme. Le 20101222085846 */ /* furent introduites les redirections incluant les erreurs. */ /* */ /* Le 20111117074059 fut faite la distinction entre '$SH' et '$CSH' d'ou les changements */ /* de nom. On notera que suivant que '$SH' est '/bin/sh' ou '/bin/bash', la syntaxe n'est */ /* pas la meme pour les erreurs : */ /* */ /* /bin/sh */ /* 1> OK */ /* 2> ERREUR */ /* */ /* /bin/bash */ /* > OK */ /* &> ERREUR */ /* */ /* si je ne me trompe pas... Il est donc quasiment impossible de definir sans ambiguite */ /* 'C_SH__REDIRECTION_ERREUR_FICHIER' et 'C_SH__REDIRECTION_ERREUR_PROGRAMME'... */ #define PAS_D_ENTREES_SORTIES \ GvarDefaut("nul","/dev/null") \ /* Pseudo-peripherique sur lequel il ne se passe rien... */ #define COMMANDE_COPIE \ "cp" \ /* Commande UNIX de copie d'un fichier (avec destruction de la copie */ \ /* anterieure si elle existe...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E U N I X ( E N T R E E S - S O R T I E S S T A N D A R D S ) : */ /* */ /* */ /* Nota : */ /* */ /* Le symbole 'NO_UNIX_INTERFACE' */ /* permet de definir ou pas les definitions */ /* des interfaces UNIX : on ne les fait pas */ /* s'il est defini... */ /* */ /*************************************************************************************************************************************/ #ifndef NO_UNIX_INTERFACE # define STREAM_IN \ stdin \ /* Entree standard pour la fonction 'FPrint(...)'. */ # define STREAM_OUT \ stdout \ /* Sortie standard pour la fonction 'FPrint(...)'. */ \ /* */ \ /* ATTENTION : reference dans 'v $xcc/cpp$Z STREAM_OUT'. */ # define STREAM_ERREUR \ stderr \ /* Erreur standard pour la fonction 'FPrint(...)'. */ # define STANDARD_IN \ ZERO \ /* Entree standard pour les fonctions 'Read(...)' et 'Writ(...)'. */ # define STANDARD_OUT \ SUCC(STANDARD_IN) \ /* Sortie standard pour les fonctions 'Read(...)' et 'Writ(...)'. */ # define STANDARD_ERREUR \ SUCC(STANDARD_OUT) \ /* Erreur standard pour les fonctions 'Read(...)' et 'Writ(...)'. */ # define STANDARD_IN_EST_UN_PIPE \ IFEQ(Fflags(STANDARD_IN),OPEN_READ) \ /* Afin de pouvoir tester si 'STANDARD_IN' est un "pipe" (introduit le 20051117101713). */ # define STANDARD_OUT_EST_UN_PIPE \ IFNE(Fflags(STANDARD_OUT),OPEN_READ_AND_WRITE) \ /* Afin de pouvoir tester si 'STANDARD_OUT' est un "pipe" (introduit le 20051117101713). */ \ /* */ \ /* Le 20210307181959, je note que 'STANDARD_OUT' peut etre aussi une redirection... */ # define STANDARD_ERREUR_EST_UN_PIPE \ IFNE(Fflags(STANDARD_ERREUR),OPEN_READ_AND_WRITE) \ /* Afin de pouvoir tester si 'STANDARD_ERREUR' est un "pipe" (introduit le 20051117101713). */ #Aifndef NO_UNIX_INTERFACE #Eifndef NO_UNIX_INTERFACE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E U N I X ( G E S T I O N D E F I C H I E R S ) : */ /* */ /* */ /* Nota : */ /* */ /* Le symbole 'NO_UNIX_INTERFACE' */ /* permet de definir ou pas les definitions */ /* des interfaces UNIX : on ne les fait pas */ /* s'il est defini... */ /* */ /*************************************************************************************************************************************/ #define SEPARATEUR_DES_COMPOSANTES_D_UN_NOM \ K_POINT \ /* Separateur utilise pour separer les differentes composantes d'un nom. Ceci fut */ \ /* introduit le 20070423120018... */ #define SEPARATEUR_DES_PATHS \ K_SLASH \ /* Separateur utilise pour separer les differentes composantes d'un "path". */ #define RACINE_DU_SYSTEME \ SEPARATEUR_DES_PATHS \ /* Nom de la racine du systeme de gestion de fichiers. */ #define DIRECTORY_COURANT \ K_POINT \ /* Nom du directory courant. */ #ifndef NO_UNIX_INTERFACE # define file_Rmode \ "r" \ /* Mode "open for reading". */ # define file_Wmode \ "w" \ /* Mode "truncate or create for writing". */ # define file_Amode \ "a" \ /* Mode "append" ("open for writing at end-of-file ou create for writing"). */ # define file_RPmode \ "r+" \ /* Mode "open for update" ("reading and writing"). */ # define file_WPmode \ "w+" \ /* Mode "truncate or create for update". */ # define file_APmode \ "a+" \ /* Mode "append" ("open or create for update at end-of-file"). */ # define MODE_CREAT \ PARE(0600) \ /* Mode de protection d'un fichier lors de sa creation. */ # define FICHIER_VIDE \ ZERO \ /* Nombre d'octets recuperes dans un fichier vide. */ /* ATTENTION, les definitions suivantes viennent de 'v /usr/include/sys/fcntl.h'. */ /* */ /* Je le note le 20191118143107 (certainement tres tardivement...) que les definitions */ /* suivantes sont en fait sur 'v /usr/include/asm-generic/fcntl$h' en ce qui concerne en */ /* particulier '$LACT19' et '$LACT1A' (et que la aussi elles sont exprimees en octal et */ /* non pas en hexadecimal...). */ # define OPEN_READ \ O_RDONLY \ /* Pour faire un open en lecture seule. */ # define OPEN_WRITE \ O_WRONLY \ /* Pour faire un open en ecriture seule. */ # define OPEN_READ_AND_WRITE \ O_RDWR \ /* Pour faire un open en lecture-ecriture. */ # define OPEN_MODE \ O_ACCMODE \ /* Semble etre un masque pour {OPEN_READ,OPEN_WRITE,OPEN_READ_AND_WRITE} (introduit */ \ /* le 20150310162758). */ # define OPEN_CREATION \ O_CREAT \ /* Pour faire un open en mode "creer le fichier s'il n'existe pas" (introduit le */ \ /* 20070710104559). */ # define OPEN_INEXISTANT \ O_EXCL \ /* Pour faire un open uniquement si le fichier n'existe pas (introduit le 20070710104559). */ # define OPEN_SANS_ATTENTE \ O_NDELAY \ /* Pour faire un open sans attente si le fichier est vide (introduit le 20070710104559). */ # define OPEN_LARGE_FILE \ O_LARGEFILE \ /* Je ne sais pas tres bien ce qu'il signifie (introduit le 20191118143934)... */ # define OPEN_READ_SANS_ATTENTE_EN_LECTURE_SI_LE_FICHIER_EST_VIDE \ OUIN(OPEN_READ,OPEN_SANS_ATTENTE) \ /* Pour faire un open en lecture seule sans attente en lecture si le fichier est vide. */ # define OPEN_READ_AND_WRITE_SANS_ATTENTE_EN_LECTURE_SI_LE_FICHIER_EST_VIDE \ OUIN(OPEN_READ_AND_WRITE,OPEN_SANS_ATTENTE) \ /* Pour faire un open en lecture-ecriture sans attente en lecture si le fichier est vide. */ # define OPEN_READ_AND_WRITE_D_UN_FICHIER_INEXISTANT \ OUI03(OPEN_READ_AND_WRITE,OPEN_CREATION,OPEN_INEXISTANT) \ /* Pour faire un open en lecture-ecriture d'un fichier inexistant (introduit le */ \ /* 20070710104559 pour 'v $xig/fonct$vv$FON OPEN_READ_AND_WRITE_D_UN_FICHIER_INEXISTANT'). */ #Aifndef NO_UNIX_INTERFACE #Eifndef NO_UNIX_INTERFACE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E N T R E E S - S O R T I E S D E C A R A C T E R E S : */ /* */ /*************************************************************************************************************************************/ /* A noter que 'getchar()', 'getc()', 'putchar()' et 'putc()' sont des */ /* macros definies dans "stdio.h". */ #ifndef getc DEFV(Extern,DEFV(vrai_Int_de_base,getc())); /* Introduit le 20120626170423 (avec quelques annees de retard, mais cela s'est vu lors de */ /* l'introduction de 'v $xcc/LFonctions$vv$D/definitions$vv$Y FiLeT_CaTaLoGuE_FS'...). */ #Aifndef getc #Eifndef getc #ifndef getchar DEFV(Extern,DEFV(vrai_Int_de_base,getchar())); /* Introduit le 20120626170423 (avec quelques annees de retard, mais cela s'est vu lors de */ /* l'introduction de 'v $xcc/LFonctions$vv$D/definitions$vv$Y FiLeT_CaTaLoGuE_FS'...). */ #Aifndef getchar #Eifndef getchar #define Getc \ getc #define Getchar \ getchar /* Entree d'un caractere. */ #define GetcharG(type,caractere) \ IFNE(type(EGAL(caractere,Getchar())),type(NEUT(PROBLEMES))) \ /* Recuperation du caractere courant dans le flot provenant de l'entree standard, avec */ \ /* un test de fin de flot (voir 'PROBLEMES') et ce quel que soit le type des informations. */ \ /* */ \ /* ATTENTION, on notera bien qu'en regle generale, le caractere 'caractere' sera de type */ \ /* 'Char' : */ \ /* */ \ /* DEFV(Char,INIT(caractere,K_UNDEF)); */ \ /* */ \ /* (voir par exemple les commandes contenues dans '$xcp'). Malgre tout, de temps en temps, */ \ /* il sera necessaire de le declarer de type 'Int' : */ \ /* */ \ /* DEFV(Int,INIT(caractere,UNDEF)); */ \ /* */ \ /* (voir par exemple les commandes 'v $xcg/chiffrage.11$K' et 'v $xcg/extract$K'), lorsque */ \ /* tous les codes possibles (de 0 a 255) sont potentiellement manipulables par le programme */ \ /* correspondant... */ #define GetcharT(caractere) \ GetcharG(CARA,caractere) \ /* Recuperation du caractere courant dans le flot provenant de l'entree standard, avec */ \ /* un test de fin de flot (voir 'PROBLEMES'). D'autre part, on notera les deux 'CARA(...)' */ \ /* qui sont rendus necessaires par certains systemes (afin de s'arreter un jour...). */ \ /* */ \ /* ATTENTION, on notera bien qu'en regle generale, le caractere 'caractere' sera de type */ \ /* 'Char' : */ \ /* */ \ /* DEFV(Char,INIT(caractere,K_UNDEF)); */ \ /* */ \ /* (voir par exemple les commandes contenues dans '$xcp'). Malgre tout, de temps en temps, */ \ /* il sera necessaire de le declarer de type 'Int' : */ \ /* */ \ /* DEFV(Int,INIT(caractere,UNDEF)); */ \ /* */ \ /* (voir par exemple les commandes 'v $xcg/chiffrage.11$K' et 'v $xcg/extract$K'), lorsque */ \ /* tous les codes possibles (de 0 a 255) sont potentiellement manipulables par le programme */ \ /* correspondant... */ #define GetcharQ(caractere) \ GetcharG(NEUT,caractere) \ /* Recuperation du caractere courant dans le flot provenant de l'entree standard, avec */ \ /* un test de fin de flot (voir 'PROBLEMES'). */ \ /* */ \ /* ATTENTION, on notera bien qu'en regle generale, le caractere 'caractere' sera de type */ \ /* 'Char' : */ \ /* */ \ /* DEFV(Char,INIT(caractere,K_UNDEF)); */ \ /* */ \ /* (voir par exemple les commandes contenues dans '$xcp'). Malgre tout, de temps en temps, */ \ /* il sera necessaire de le declarer de type 'Int' : */ \ /* */ \ /* DEFV(Int,INIT(caractere,UNDEF)); */ \ /* */ \ /* (voir par exemple les commandes 'v $xcg/chiffrage.11$K' et 'v $xcg/extract$K'), lorsque */ \ /* tous les codes possibles (de 0 a 255) sont potentiellement manipulables par le programme */ \ /* correspondant... */ #define Putc(caractere,stream) \ putc(caractere,stream) #define Putchar(caractere) \ Putc(caractere,STREAM_OUT) /* Sortie d'un caractere. On notera que jusqu'au 19990825120626, on avait : */ /* */ /* #define Putchar(caractere) \ */ /* putchar(caractere) */ /* */ /* mais ainsi, c'est plus "symetrique"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S E N T R E E S : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(vrai_Int_de_base,scanf())); #define vrai_Scan(format_de_lecture,variable_unique) \ scanf(Cara(format_de_lecture),variable_unique) #define Scan(format_de_lecture,variable_unique) \ vrai_Scan(format_de_lecture,variable_unique) /* Definition de la fonction de lecture avec format d'une seule variable sur 'STANDARD_IN'. */ /* Ceci a ete introduit le 20051111120041. On notera l'absence de 'ADRESSE(...)' en ce qui */ /* concerne 'variable_unique' ; cela est du a l'usage 'v $xig/fonct$vv$FON Scan' pour lequel */ /* 'variable_unique' est deja un pointeur sur une chaine de caracteres 'valeur_interactive'. */ DEFV(Extern,DEFV(vrai_Int_de_base,sscanf())); /* ATTENTION : cette fonction peut donc avoir ete declaree dans '@ include <stdio.h>'. */ /* La PASSE 6 du pre-processing a ete introduite pour traiter ce cas... */ #define SScan \ sscanf \ /* Definition de la fonction d'entrees ; on ne peut faire mieux, car a priori on */ \ /* ne connait pas le nombre d'arguments : ce ne peut donc etre une macro... */ /* ATTENTION, ci-dessous on n'ecrit pas : */ /* */ /* #define SScaX(chaine,format[,...]) \ */ /* */ /* -------------------------> Bblock \ */ /* | */ /* | SScan(Cara(chaine),Cara(format)[,...]); \ */ /* | */ /* | ---------------------> Eblock . \ */ /* | | /|\ */ /* | | | */ /* | | | */ /* */ /* car en effet, ces fonction peuvent etre utilisees dans une affectation ainsi qu'on pourra */ /* le voir pour 'SSca1(...)' dans 'v $xig/fonct$vv$FON'... */ #define SSca0(chaine,format) \ SScan(Cara(chaine),Cara(format)) #define SSca1(chaine,format,x1) \ SScan(Cara(chaine),Cara(format),x1) #define SSca2(chaine,format,x1,x2) \ SScan(Cara(chaine),Cara(format),x1,x2) #define SSca3(chaine,format,x1,x2,x3) \ SScan(Cara(chaine),Cara(format),x1,x2,x3) #define SSca4(chaine,format,x1,x2,x3,x4) \ SScan(Cara(chaine),Cara(format),x1,x2,x3,x4) /* Definition des fonctions d'entrees en fonction du nombre d'arguments... ATTENTION, on */ /* notera que l'on ne peut pas ecrire : */ /* */ /* ...,ADRESSE(xn)... */ /* */ /* car, en effet, 'xn' peut tres bien etre un pointeur sur une chaine de caracteres ; on */ /* verra a ce propos la fonction 'RECHERCHE_D_UNE_VALEUR(...)' dans 'xig/fonct$vv$FON' qui */ /* utilise 'SScan(...)' sur des scalaires et sur des chaines de caracteres... */ TypedefP(Float_SScan,_float) /* Malheureusement 'sscanf' autrefois ne connaissait pas la double precision */ /* (contrairement d'ailleurs aux autres fonctions qui ne connaissent que cela */ /* pour le passage des arguments flottants...). D'ou ce type qui peut toujours servir... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' I M P R E S S I O N : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(vrai_Int_de_base,printf())); /* ATTENTION : cette fonction peut donc avoir ete declaree dans '@ include <stdio.h>'. */ /* La PASSE 6 du pre-processing a ete introduite pour traiter ce cas... */ #define Print \ printf \ /* Definition de la fonction d'impression externe sur l'unite 'stdout' ; on ne peut faire */ \ /* mieux, car a priori on ne connait pas le nombre d'arguments : ce ne peut donc etre une */ \ /* macro... */ =define Prerr FPrint`STREAM_ERREUR` /* Definition de la fonction d'impression externe sur l'unite 'stderr' ; on ne peut faire */ /* mieux, car a priori on ne connait pas le nombre d'arguments : ce ne peut donc etre une */ /* macro. Cette fonction est provisoire, et destinee aux messages d'erreur. Le traitement */ /* complet sera effectue au cours de '$PASSE_4' ; dans l'etat actuel, on ne peut rien faire */ /* de plus simple, car en effet, les procedures du type 'Prerr' n'ont pas d'argument, et si */ /* elles en avaient, ce serait en nombre variable... */ /* ATTENTION : autrefois, il y avait ci-apres des definitions du type : */ /* */ /* #define Prer0(format) \ */ /* Prerr(format) */ /* */ /* Depuis l'utilisation de 'FPrin?(...)', la definition de 'Prerr' n'a plus beaucoup */ /* d'interet, mais je laissse, on ne sait jamais... */ DEFV(Extern,DEFV(vrai_Int_de_base,fprintf())); /* ATTENTION : cette fonction peut donc avoir ete declaree dans '@ include <stdio.h>'. */ /* La PASSE 6 du pre-processing a ete introduite pour traiter ce cas... */ #define FPrint \ fprintf \ /* Definition de la fonction d'impression externe sur une une unite arbitraire ; on ne peut */ \ /* faire mieux, car a priori on ne connait pas le nombre d'arguments : ce ne peut donc etre */ \ /* une macro... */ \ /* */ \ /* ATTENTION : reference dans 'v $xcc/cpp$Z FPrint'. */ #define FLUSHER_LE_FILE \ VRAI #define NE_PAS_FLUSHER_LE_FILE \ NOTL(FLUSHER_LE_FILE) /* Valeurs que peut prendre l'argument 'flusher_le_File' de 'Fflush_conditionnel(...)'. */ #define Fflush_conditionnel(File,flusher_le_File) \ Bblock \ Test(IL_FAUT(flusher_le_File)) \ Bblock \ CALZ(Fflush(File)); \ /* Lorsque le "flush" est demande, on le fait... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* "Flush" conditionnel d'un "File"... */ #define Ftraitement_des_formats_de_sortie_VERSION_01 \ /* Introduit le 20011203094157 pour 'v $xcc/cpp$Z D_TRAIT'. On notera au passage, qu'il */ \ /* est possible de considerer qu'anterieurement a cette date, 'Traitement(...)' etait */ \ /* defini par 'Cara(...)', meme si 'Cara(...)' figurait alors explicitement dans les */ \ /* definitions de 'FPrin?(...)'. En fait, suite a l'introduction le 20020418102555 de la */ \ /* variable 'format_effectivement_utilise_dans_FPrin' ci-apres, cette 'VERSION_01', plus */ \ /* "riche" que 'VERSION_02' a pu etre reactivee a cette date... */ #nodefine Ftraitement_des_formats_de_sortie_VERSION_02 \ /* Le 20020417101447, j'ai renonce a ce dispositif (provisoirement ?) lors de la generation */ \ /* de la sequence 'v _____xivPdf_14_1/027213_027724'. En effet, l'espace memoire de */ \ /* 'v $xrk/rdn_walk.52$K' croissait irreversiblement a cause de l'allocation memoire faite */ \ /* dans 'v $xig/fonct$vv$FON POINTERc.Ftraitement_des_formats_de_sortie' via la fonction */ \ /* 'chain_Acopie_avec_conversions_possibles_majuscules_minuscules(...)'. En effet, dans */ \ /* cette sequence le fichier 'v _____xivPdf_09_2/.REFL.v.11.$U LISTE_POINTS' est genere ; */ \ /* or celui-ci, pour etre genere, fait un nombre enorme de sorties via la procedure */ \ /* 'v $xrv/champs_5.11$I MEMORISATION_D_UN_POINT'. La fonction de traitement des formats */ \ /* de sortie fait donc de tres nombreuses allocations memoire sans que la liberation n'ait */ \ /* jamais lieu. Cette VERSION a donc ete desactivee le 20020418102555. */ #ifdef Ftraitement_des_formats_de_sortie_VERSION_01 # define Traitement \ Ftraitement_des_formats_de_sortie \ /* Ce commentaire est rendu obligatoire par la programmation de 'v $xcc/cpp$Z D_TRAIT'. */ #Aifdef Ftraitement_des_formats_de_sortie_VERSION_01 #Eifdef Ftraitement_des_formats_de_sortie_VERSION_01 #ifdef Ftraitement_des_formats_de_sortie_VERSION_02 # define Traitement \ ptCARA \ /* Ce commentaire est rendu obligatoire par la programmation de 'v $xcc/cpp$Z D_TRAIT'. */ \ /* Le 20020702094637, j'ai remplace le 'NEUT' par un 'ptCARA' car, d'apres la modification */ \ /* faite ci-apres le 20020701155821, il semble que cela soit ce qu'il faut pour qu'il n'y */ \ /* ait pas de problemes de compilation... */ #Eifdef Ftraitement_des_formats_de_sortie_VERSION_02 #define DEBUT_DE_Ftraitement_des_formats_de_sortie(format) \ Bblock \ DEFV(CHAR,INIT(POINTERc(format_initialement_demande_dans_FPrin),ptCARA(format))); \ /* Ceci a ete introduit le 20020629115636 afin de permettre le 'IFDI(...)' qui suit... */ \ /* On notera que la 20020701155821, j'ai remplace le 'NEUT(...)' par un 'ptCARA(...)' */ \ /* car, en effet, il y a quelques formats qui sont appeles via la procedure 'Cara(...)' */ \ /* ('v $xiida/fonction$FON CAL2.Prin1.Cara')... */ \ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ /* Introduit le 20040515115723 pour reduire la longueur des lignes manipulees lors de la */ \ /* gestion de 'v $xig/fonct$vv$DEF PAS DE VERSIONS RECENSEES POUR CE PROGRAMME' et de */ \ /* 'v $xig/fonct$vv$DEF PAS DE BUGS RECENSES POUR CE PROGRAMME' ; cela posait des problemes */ \ /* (message "Output line too long" dans '$SE') sur '$LACT12' en particulier... */ \ /* Au passage je me demande le 20040604151352 qu'elle est la difference avec le */ \ /* '__NEW_LINE__' de 'v $xcp/cpp$D/beau_cpp$c __NEW_LINE__' ; en fait il me semble qu'il n'y */ \ /* en a pas et que '_____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____' pourrait donc etre */ \ /* supprime. Le 20040604154113, je comprends la difference subtile : '__NEW_LINE__' */ \ /* s'applique des que l'on utilise '$xcp/cpp$X', alors que la clef ici utilisee */ \ /* '_____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____' s'applique en '$PASSE_2'. */ \ \ DEFV(CHAR,INIT(POINTERc(format_effectivement_utilise_dans_FPrin),Traitement(format))); \ /* ATTENTION : reference dans 'v $xcc/cpp$Z format_effectivement_utilise_dans_FPrin'. */ \ /* */ \ /* debut de traitement des formats de sortie... */ \ /* */ \ /* ATTENTION : je note le 20230314102135 que 'format_effectivement_utilise_dans_FPrin' est */ \ /* reference dans 'v $xcc/cpp$Z ChAiNe4=.format_effectivement_utilise_dans_FPrin.'. */ \ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ /* Idem au '_____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____' precedent... */ #ifdef Ftraitement_des_formats_de_sortie_VERSION_01 # define FIN_DE_Ftraitement_des_formats_de_sortie(format) \ Test(IFDI(format_effectivement_utilise_dans_FPrin,format_initialement_demande_dans_FPrin)) \ /* Ce test a ete introduit le 20020629115636, suite au probleme rencontre le 20020628163919 */ \ /* sur '$LACT14' avec une commande du type : */ \ /* */ \ /* $xrv/AXPB.01$X ne=0 fichier== */ \ /* */ \ /* qui donne le message : */ \ /* */ \ /* Segmentation fault */ \ /* */ \ /* juste apres le message "l'allocation memoire est impossible" emis par la fonction */ \ /* 'v $xig/fonct$vv$FON allocation_memoire_avec_validation'. Or, en effet, dans cette */ \ /* fonction 'Ftraitement_des_formats_de_sortie(...)' n'est pas encore definie et ne fait */ \ /* donc pas d'allocation memoire ; et donc le 'Free(...)' qui suit n'a pas de raison d'etre. */ \ /* */ \ /* On notera au passage que l'introduction des fonctions 'gFPrin?(...)' le 20020628163919 */ \ /* etait inutile, mais maintenant qu'elles sont la, je les conserve... */ \ Bblock \ CALZ_FreCC(format_effectivement_utilise_dans_FPrin); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Fin de traitement des formats de sortie... */ #Aifdef Ftraitement_des_formats_de_sortie_VERSION_01 #Eifdef Ftraitement_des_formats_de_sortie_VERSION_01 #ifdef Ftraitement_des_formats_de_sortie_VERSION_02 # define FIN_DE_Ftraitement_des_formats_de_sortie(format) \ Eblock \ /* Fin de traitement des formats de sortie... */ #Aifdef Ftraitement_des_formats_de_sortie_VERSION_02 #Eifdef Ftraitement_des_formats_de_sortie_VERSION_02 #define gFPrin0(File,flusher_le_File,format) \ Bblock \ CALZ(FPrint(File,Cara(format))); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin1(File,flusher_le_File,format,x1) \ Bblock \ CALZ(FPrint(File,Cara(format),x1)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin2(File,flusher_le_File,format,x1,x2) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin3(File,flusher_le_File,format,x1,x2,x3) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin4(File,flusher_le_File,format,x1,x2,x3,x4) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin5(File,flusher_le_File,format,x1,x2,x3,x4,x5) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin6(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin7(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin8(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin9(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8,x9)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin10(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8,x9,xA)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin11(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin12(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin13(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin14(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin15(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define gFPrin16(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF,xG) \ Bblock \ CALZ(FPrint(File,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF,xG)); \ CALZ(Fflush_conditionnel(File,flusher_le_File)); \ Eblock #define FPrin0(File,flusher_le_File,format) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin0(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin1(File,flusher_le_File,format,x1) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin1(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin2(File,flusher_le_File,format,x1,x2) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin2(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin3(File,flusher_le_File,format,x1,x2,x3) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin3(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin4(File,flusher_le_File,format,x1,x2,x3,x4) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin4(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin5(File,flusher_le_File,format,x1,x2,x3,x4,x5) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin5(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin6(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin6(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin7(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin7(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin8(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin8(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin9(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin9(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8,x9 \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin10(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin10(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin11(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin11(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin12(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin12(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin13(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin13(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin14(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin14(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin15(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin15(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock #define FPrin16(File,flusher_le_File,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF,xG) \ Bblock \ DEBUT_DE_Ftraitement_des_formats_de_sortie(format); \ CALZ(gFPrin16(File \ ,flusher_le_File \ ,format_effectivement_utilise_dans_FPrin \ ,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF,xG \ ) \ ); \ FIN_DE_Ftraitement_des_formats_de_sortie(format); \ Eblock /* Definition de la fonction d'impression externe sur une une unite arbitraire avec nombre */ /* d'arguments. ATTENTION : on notera l'introduction de la fonction 'Fflush(...)' ; elle */ /* est destinee a garantir que lors de sequences du type : */ /* */ /* Prin?(...); */ /* Prer?(...); */ /* Prin?(...); */ /* Prer?(...); */ /* Prin?(...); */ /* */ /* l'ordre des sorties (quelles que soient les redirections et les "pipes") soit le meme que */ /* celui qui est donne par cette sequence... */ DEFV(Extern,DEFV(vrai_Int_de_base,sprintf())); /* ATTENTION : cette fonction peut donc avoir ete declaree dans '@ include <stdio.h>'. */ /* La PASSE 6 du pre-processing a ete introduite pour traiter ce cas... */ #define SPrint \ sprintf \ /* Definition de la fonction d'impression interne ; on ne peut faire mieux, car a priori on */ \ /* ne connait pas le nombre d'arguments : ce ne peut donc etre une macro... */ #define SPrin0(chaine,format) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format))); \ Eblock #define SPrin1(chaine,format,x1) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format),x1)); \ Eblock #define SPrin2(chaine,format,x1,x2) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format),x1,x2)); \ Eblock #define SPrin3(chaine,format,x1,x2,x3) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format),x1,x2,x3)); \ Eblock #define SPrin4(chaine,format,x1,x2,x3,x4) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format),x1,x2,x3,x4)); \ Eblock #define SPrin5(chaine,format,x1,x2,x3,x4,x5) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format),x1,x2,x3,x4,x5)); \ Eblock #define SPrin6(chaine,format,x1,x2,x3,x4,x5,x6) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format),x1,x2,x3,x4,x5,x6)); \ Eblock #define SPrin7(chaine,format,x1,x2,x3,x4,x5,x6,x7) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format),x1,x2,x3,x4,x5,x6,x7)); \ Eblock #define SPrin8(chaine,format,x1,x2,x3,x4,x5,x6,x7,x8) \ Bblock \ CALZ(SPrint(Cara(chaine),Cara(format),x1,x2,x3,x4,x5,x6,x7,x8)); \ Eblock /* Definition de la fonction d'impression interne avec nombre d'arguments... */ DEFV(Extern,DEFV(vrai_Int_de_base,snprintf())); /* ATTENTION : cette fonction peut donc avoir ete declaree dans '@ include <stdio.h>'. */ /* La PASSE 6 du pre-processing a ete introduite pour traiter ce cas... */ #define SVPrint \ snprintf \ /* Definition de la fonction d'impression interne ; on ne peut faire mieux, car a priori on */ \ /* ne connait pas le nombre d'arguments : ce ne peut donc etre une macro. On notera la */ \ /* difference entre 'SPrint(...)' et 'SVPrint', cette derniere permettant de limiter le */ \ /* longueur de la chaine produite et donc de resoudre simplement le probleme de la */ \ /* pre-allocation memoire pour la chaine Resultante... */ #define SVPrin0(chaine,longueur_maximale,format) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format))); \ Eblock #define SVPrin1(chaine,longueur_maximale,format,x1) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format),x1)); \ Eblock #define SVPrin2(chaine,longueur_maximale,format,x1,x2) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format),x1,x2)); \ Eblock #define SVPrin3(chaine,longueur_maximale,format,x1,x2,x3) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format),x1,x2,x3)); \ Eblock #define SVPrin4(chaine,longueur_maximale,format,x1,x2,x3,x4) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format),x1,x2,x3,x4)); \ Eblock #define SVPrin5(chaine,longueur_maximale,format,x1,x2,x3,x4,x5) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format),x1,x2,x3,x4,x5)); \ Eblock #define SVPrin6(chaine,longueur_maximale,format,x1,x2,x3,x4,x5,x6) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format),x1,x2,x3,x4,x5,x6)); \ Eblock #define SVPrin7(chaine,longueur_maximale,format,x1,x2,x3,x4,x5,x6,x7) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format),x1,x2,x3,x4,x5,x6,x7)); \ Eblock #define SVPrin8(chaine,longueur_maximale,format,x1,x2,x3,x4,x5,x6,x7,x8) \ Bblock \ CALZ(SVPrint(Cara(chaine),longueur_maximale,Cara(format),x1,x2,x3,x4,x5,x6,x7,x8)); \ Eblock /* Definition de la fonction d'impression interne avec nombre d'arguments... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S M E S S A G E S D ' E R R E U R S : */ /* */ /*************************************************************************************************************************************/ #define MESSAGE_DE_MESSAGE \ "MESSAGE" \ /* Message "MESSAGE". */ #define MESSAGE_D_ATTENTION \ "ATTENTION" \ /* Message "ATTENTION". */ #define MESSAGE_D_AVERTISSEMENT \ "AVERTISSEMENT" \ /* Message "AVERTISSEMENT". */ #define MESSAGE_D_ERREUR \ "ERREUR" \ /* Message "ERREUR". */ #ifdef MODE_DEBUG # define MESSAGE_DE_DEBUG \ "DEBUG" \ /* Message "DEBUG". */ #Aifdef MODE_DEBUG #Eifdef MODE_DEBUG TypedefP(GetTime_t1,STRU(tm)) TypedefP(GetTime_t2,time_t) /* Structures definissant l'acces a la date et a l'heure. */ DEFV(Extern,DEFV(Char,POINTERc(asctime()))); DEFV(Extern,DEFV(GetTime_t1,POINTERs(localtime()))); DEFV(Extern,DEFV(GetTime_t2,time())); /* Fonctions utiles... */ #define TIME_000000_01011970(argument) \ time(argument) \ /* Introduit le 20220723115922, bien tardivement ! */ #define ACCES_A_LA_DATE_ET_A_L_HEURE_DU_DEFAUT \ ZERO \ /* Valeur de l'argument de la fonction 'time(...)' destine a recuperer le temps en secondes */ \ /* ecoule depuis une certaine date (en general le "00:00:00 UTC, January 1 1970"). */ #define EDITER_LES_MESSAGES_DE_PRINT_DEFAUT \ VRAI #define NE_PAS_EDITER_LES_MESSAGES_DE_PRINT_DEFAUT \ NOTL(EDITER_LES_MESSAGES_DE_PRINT_DEFAUT) /* Valeurs possibles de l'indicateur 'PRINT_DEFAUT_____editer_les_messages' qui est defini */ /* dans 'v $xig/common$STR'. */ #nodefine gPRINT_DEFAUT_VERSION_01 #nodefine gPRINT_DEFAUT_VERSION_02 #nodefine gPRINT_DEFAUT_VERSION_03 #nodefine gPRINT_DEFAUT_VERSION_04 #nodefine gPRINT_DEFAUT_VERSION_05 #define gPRINT_DEFAUT_VERSION_06 /* Choix de la version de 'gPRINT_DEFAUT(...)'. */ #ifdef gPRINT_DEFAUT_VERSION_01 # define gPRINT_DEFAUT(en_tete,message1,message2,commande_courante,fichier_courant,ligne_courante) \ Bblock \ Test(IL_FAUT(PRINT_DEFAUT_____editer_les_messages)) \ Bblock \ DEFV(GetTime_t2,INIT(date_et_heure_du_defaut_en_secondes \ ,TIME_000000_01011970(ACCES_A_LA_DATE_ET_A_L_HEURE_DU_DEFAUT) \ ) \ ); \ begin_nouveau_block \ Bblock \ /* Le changement de 'block' est destine a garantir l'ordre d'evaluation des variables : */ \ /* 'date_et_heure_du_defaut_en_secondes' puis 'date_et_heure_du_defaut' qui utilise pour */ \ /* son evaluation la premiere d'entre-elles... */ \ \ DEFV(Char,INIT(POINTERc(date_et_heure_du_defaut) \ ,asctime(localtime(ADRESSE(date_et_heure_du_defaut_en_secondes))) \ ) \ ); \ /* Recuperation de la date et heure du defaut. On notera que la conversion en ASCII faite */ \ /* par 'asctime(...)' introduit a la fin de la chaine un caractere 'K_LF' que l'on doit */ \ /* supprimer afin que tout soit sur la meme ligne ; ce nettoyage est fait grace a l'appel */ \ /* a 'PRED(NBRE(...))' dans le 'Prer9(...)' ci-apres... */ \ /* */ \ /* ATTENTION : les fonctions de '$xig/fonct$vv$FON' 'chain_recherche_premier_caractere(...)' */ \ /* et 'chain_recherche_dernier_caractere(...)' sont placees devant toutes les autres */ \ /* fonctions depuis l'edition de la date dans 'PRINT_DEFAUT(...)', ce qui autrement */ \ /* donnerait (sur 'SYSTEME_SGIND?GA_IRIX_CC') le message suivant : */ \ /* */ \ /* cfe: Error: fonction.c, line ...: redeclaration of 'chain_recherche_dernier_caractere'; */ \ /* previous declaration at line ... in file 'fonction.c' */ \ /* */ \ /* lors de la compilation du fichier '$xbg/fonction$K". */ \ \ CAL1(Prer9("\n['%s'][%.*s]['%s'][#%d][%s] %s : %s [%s].\n" \ ,Gvar_sHOTE \ ,PRED(NBRE(PREMIER_CARACTERE \ ,chain_recherche_dernier_caractere(date_et_heure_du_defaut,K_LF) \ ) \ ) \ ,date_et_heure_du_defaut \ ,fichier_courant \ ,ligne_courante \ ,MESSAGE_S \ ,en_tete \ ,message1 \ ,message2 \ ) \ ); \ \ /* Le changement de 'block' est destine a garantir l'ordre d'evaluation des variables : */ \ /* 'date_et_heure_du_defaut_en_secondes' puis 'date_et_heure_du_defaut' qui utilise pour */ \ /* son evaluation la premiere d'entre-elles... */ \ Eblock \ end_nouveau_block \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Macro generale d'edition d'un message de DEFAUT (ERREUR ou ATTENTION...) version '01'. */ #Aifdef gPRINT_DEFAUT_VERSION_01 #Eifdef gPRINT_DEFAUT_VERSION_01 #define CONVERSION_DUREE_DATE_TRANSLATION_DE_L_ANNEE \ PARE(1900) #define CONVERSION_DUREE_DATE_TRANSLATION_DU_MOIS \ UN #define CONVERSION_DUREE_DATE_TRANSLATION_DU_JOUR \ ZERO #define CONVERSION_DUREE_DATE_TRANSLATION_DE_L_HEURE \ ZERO #define CONVERSION_DUREE_DATE_TRANSLATION_DE_LA_MINUTE \ ZERO #define CONVERSION_DUREE_DATE_TRANSLATION_DE_LA_SECONDE \ ZERO #define CONVERSION_DUREE_DATE_NE_PAS_MODIFIER_LES_COMPOSANTES \ NEGA(UN) /* Translation des valeurs renvoyees par 'localtime(...)' et "anti-translation" dans le */ /* cas de la fonction 'mktime(...)'. */ #define DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DE_L_ANNEE \ QUATRE #define DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DU_MOIS \ DEUX #define DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DU_JOUR \ DEUX #define DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DE_L_HEURE \ DEUX #define DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DE_LA_MINUTE \ DEUX #define DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DE_LA_SECONDE \ DEUX /* Nombre de chiffres a utiliser pour editer chaque composante. */ #define CHOIX_DU_SEPARATEUR_DES_COMPOSANTES_DE_DATE(chaine) \ SE22(C_VIDE,chaine) #define SEPARATEUR_DATE_____AAAA_MM \ CHOIX_DU_SEPARATEUR_DES_COMPOSANTES_DE_DATE(C_SLASH) #define SEPARATEUR_DATE_____MM_JJ__ \ CHOIX_DU_SEPARATEUR_DES_COMPOSANTES_DE_DATE(C_SLASH) #define SEPARATEUR_DATE_____JJ_hh__ \ CHOIX_DU_SEPARATEUR_DES_COMPOSANTES_DE_DATE(SE22(C_BLANC,C_MOINS)) #define SEPARATEUR_DATE_____hh_mm__ \ CHOIX_DU_SEPARATEUR_DES_COMPOSANTES_DE_DATE(C_DEUX_POINTS) #define SEPARATEUR_DATE_____mm_ss__ \ CHOIX_DU_SEPARATEUR_DES_COMPOSANTES_DE_DATE(C_DEUX_POINTS) /* Afin de selectionner la presentation d'une date definie au format 'AAAAMMJJhhmmss' */ /* (introduit le 20191018140516)... */ #define MISE_DE_LA_DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss(date_AAAAMMJJhhmmss) \ Bblock \ DEFV(GetTime_t2,INIT(date_et_heure_defaut_en_secondes \ ,TIME_000000_01011970(ACCES_A_LA_DATE_ET_A_L_HEURE_DU_DEFAUT) \ ) \ ); \ /* Recuperation de la date et heure du defaut depuis le 19700101000000. */ \ DEFV(GetTime_t1,INIT(POINTERs(composantes_de_la_date_et_heure_defaut),ADRESSE_NON_ENCORE_DEFINIE)); \ /* "Deconcatenation" des composantes de la date et heure depuis le 19700101000000. */ \ \ EGAL(composantes_de_la_date_et_heure_defaut,localtime(ADRESSE(date_et_heure_defaut_en_secondes))); \ /* "Deconcatenation" des composantes de la date et heure depuis le 19700101000000. */ \ \ EGAL(date_AAAAMMJJhhmmss \ ,EGAs(chain_Aconcaten11(EGAs(chain_numero(bADD(ASI1(composantes_de_la_date_et_heure_defaut,tm_year) \ ,CONVERSION_DUREE_DATE_TRANSLATION_DE_L_ANNEE \ ) \ ,DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DE_L_ANNEE \ ) \ ) \ ,SEPARATEUR_DATE_____AAAA_MM \ ,EGAs(chain_numero(bADD(ASI1(composantes_de_la_date_et_heure_defaut,tm_mon) \ ,CONVERSION_DUREE_DATE_TRANSLATION_DU_MOIS \ ) \ ,DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DU_MOIS \ ) \ ) \ ,SEPARATEUR_DATE_____MM_JJ__ \ ,EGAs(chain_numero(bADD(ASI1(composantes_de_la_date_et_heure_defaut,tm_mday) \ ,CONVERSION_DUREE_DATE_TRANSLATION_DU_JOUR \ ) \ ,DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DU_JOUR \ ) \ ) \ ,SEPARATEUR_DATE_____JJ_hh__ \ ,EGAs(chain_numero(bADD(ASI1(composantes_de_la_date_et_heure_defaut,tm_hour) \ ,CONVERSION_DUREE_DATE_TRANSLATION_DE_L_HEURE \ ) \ ,DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DE_L_HEURE \ ) \ ) \ ,SEPARATEUR_DATE_____hh_mm__ \ ,EGAs(chain_numero(bADD(ASI1(composantes_de_la_date_et_heure_defaut,tm_min) \ ,CONVERSION_DUREE_DATE_TRANSLATION_DE_LA_MINUTE \ ) \ ,DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DE_LA_MINUTE \ ) \ ) \ ,SEPARATEUR_DATE_____mm_ss__ \ ,EGAs(chain_numero(bADD(ASI1(composantes_de_la_date_et_heure_defaut,tm_sec) \ ,CONVERSION_DUREE_DATE_TRANSLATION_DE_LA_SECONDE \ ) \ ,DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss_PRECISION_DE_LA_SECONDE \ ) \ ) \ ) \ ) \ ); \ Eblock \ /* Mise de la date courante au format AAAAMMJJhhmmss. Ceci fut introduit le 20070523090556 */ \ /* pour 'v $xig/defin_2$vv$DEF MISE_DE_LA_DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss'... */ #ifdef gPRINT_DEFAUT_VERSION_02 # define gPRINT_DEFAUT(en_tete,message1,message2,commande_courante,fichier_courant,ligne_courante) \ Bblock \ Test(IL_FAUT(PRINT_DEFAUT_____editer_les_messages)) \ Bblock \ CAL1(Prer9("\n[%s][%s]['%s'-'%s'][#%d][%s] %s : %s [%s].\n" \ ,mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss() \ ,Gvar_sHOTE \ ,commande_courante \ ,fichier_courant \ ,ligne_courante \ ,MESSAGE_S \ ,en_tete \ ,message1 \ ,message2 \ ) \ ); \ /* Edition des informations utiles au defaut. Jusqu'au 19970324173045, on trouvait dans */ \ /* l'ordre '$sHOTE' puis la date ; a compter du 19970324173045, c'est l'inverse qui est */ \ /* fait afin de trouver pour chaque message erreur une stricte hierarchie d'informations, */ \ /* des plus importantes (la date), aux moins importantes ('ligne_courante'). */ \ /* */ \ /* La fonction 'mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss(...)' a ete introduite */ \ /* le 20110531112429... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Macro generale d'edition d'un message de DEFAUT (ERREUR ou ATTENTION...) version '02'. */ #Aifdef gPRINT_DEFAUT_VERSION_02 #Eifdef gPRINT_DEFAUT_VERSION_02 #ifdef gPRINT_DEFAUT_VERSION_03 # define gPRINT_DEFAUT(en_tete,message1,message2,commande_courante,fichier_courant,ligne_courante) \ Bblock \ Test(IL_FAUT(PRINT_DEFAUT_____editer_les_messages)) \ Bblock \ DEFV(CHAR,INIT(POINTERc(Message1),CHAINE_UNDEF)); \ ckMalo(Message1,chain_taille(message1),print_defaut_____compteur_des_kMalo); \ /* Copie de 'message1' destine a mettre en majuscule son premier caractere (ce dispositif */ \ /* a ete introduit le 20011029133410). */ \ \ CALS(chain_copie(Message1,message1)); \ EGAL(PREMIER_CARACTERE_ITb0(Message1) \ ,conversion_d_un_caractere_minuscule_en_un_caractere_majuscule(PREMIER_CARACTERE_ITb0(Message1)) \ ); \ /* Mise en majuscule du premier caractere de 'message1'... */ \ \ CAL1(Prer9("\n[%s][%s]['%s'-'%s'][#%d][%s] %s : %s [%s].\n" \ ,mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss() \ ,Gvar_sHOTE \ ,commande_courante \ ,fichier_courant \ ,ligne_courante \ ,MESSAGE_S \ ,en_tete \ ,Message1 \ ,message2 \ ) \ ); \ /* Edition des informations utiles au defaut. Jusqu'au 19970324173045, on trouvait dans */ \ /* l'ordre '$sHOTE' puis la date ; a compter du 19970324173045, c'est l'inverse qui est */ \ /* fait afin de trouver pour chaque message erreur une stricte hierarchie d'informations, */ \ /* des plus importantes (la date), aux moins importantes ('ligne_courante'). */ \ /* */ \ /* La fonction 'mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss(...)' a ete introduite */ \ /* le 20110531112429... */ \ \ CALZ_FreDD(Message1); \ /* Liberation de l'espace contenant le message ameliore (introduit le 20031101192055 car, */ \ /* en effet, il manquait...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Macro generale d'edition d'un message de DEFAUT (ERREUR ou ATTENTION...) version '03'. */ #Aifdef gPRINT_DEFAUT_VERSION_03 #Eifdef gPRINT_DEFAUT_VERSION_03 #ifdef gPRINT_DEFAUT_VERSION_04 # define gPRINT_DEFAUT(en_tete,message1,message2,commande_courante,fichier_courant,fonction_courante,ligne_courante) \ /* Le nom de la fonction courante a ete introduit le 20051124085928... */ \ Bblock \ Test(IL_FAUT(PRINT_DEFAUT_____editer_les_messages)) \ Bblock \ DEFV(CHAR,INIT(POINTERc(Message1),CHAINE_UNDEF)); \ ckMalo(Message1,chain_taille(message1),print_defaut_____compteur_des_kMalo); \ /* Copie de 'message1' destine a mettre en majuscule son premier caractere (ce dispositif */ \ /* a ete introduit le 20011029133410). */ \ \ CALS(chain_copie(Message1,message1)); \ EGAL(PREMIER_CARACTERE_ITb0(Message1) \ ,conversion_d_un_caractere_minuscule_en_un_caractere_majuscule(PREMIER_CARACTERE_ITb0(Message1)) \ ); \ /* Mise en majuscule du premier caractere de 'message1'... */ \ \ Test(IL_FAUT(gPRINT_DEFAUT_____n_editer_que_le_message_principal)) \ Bblock \ CAL1(Prer2("\n%s : %s.\n" \ ,en_tete \ ,Message1 \ ) \ ); \ Eblock \ ATes \ Bblock \ CAL1(Prer11("\n[%s][%s=%s]['%s'-'%s']['%s(...)'#%d][%s] %s : %s [%s].\n" \ ,mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss() \ ,Gvar_sHOTE \ ,Gvar_HOST \ ,commande_courante \ ,fichier_courant \ ,fonction_courante \ ,ligne_courante \ ,MESSAGE_S \ ,en_tete \ ,Message1 \ ,message2 \ ) \ ); \ /* Edition des informations utiles au defaut. Jusqu'au 19970324173045, on trouvait dans */ \ /* l'ordre '$sHOTE' puis la date ; a compter du 19970324173045, c'est l'inverse qui est */ \ /* fait afin de trouver pour chaque message erreur une stricte hierarchie d'informations, */ \ /* des plus importantes (la date), aux moins importantes ('ligne_courante'). */ \ /* */ \ /* L'edition de '$vCOMPUTERd' a ete introduite le 20070420112557 et remplacee par '$HOST' */ \ /* le 20070420120642 (cette derniere variable etant plus "universelle" et, en particulier, */ \ /* dans le cas des MACHINEs de type 'sumix'...). */ \ /* */ \ /* La fonction 'mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss(...)' a ete introduite */ \ /* le 20110531112429... */ \ Eblock \ ETes \ \ CALZ_FreDD(Message1); \ /* Liberation de l'espace contenant le message ameliore (introduit le 20031101192055 car, */ \ /* en effet, il manquait...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Macro generale d'edition d'un message de DEFAUT (ERREUR ou ATTENTION...) version '04' */ \ /* introduit le 20030912140554 pour alleger, si besoin est, les sorties des messages de */ \ /* type {ATTENTION,ERREUR,...}. */ #Aifdef gPRINT_DEFAUT_VERSION_04 #Eifdef gPRINT_DEFAUT_VERSION_04 #ifdef gPRINT_DEFAUT_VERSION_05 # define gPRINT_DEFAUT(en_tete,message1,message2,commande_courante,fichier_courant,fonction_courante,ligne_courante) \ Bblock \ Test(IL_FAUT(PRINT_DEFAUT_____editer_les_messages)) \ Bblock \ DEFV(Logical,INIT(EN_TETE_Prin_Prer_Prme \ ,I3ET(IFEQ_chaine(en_tete,C_VIDE) \ ,IFEQ_chaine(message1,C_VIDE) \ ,IFEQ_chaine(message2,C_VIDE) \ ) \ ) \ ); \ /* Afin de savoir si l'appel a 'print_defaut(...)' vient de 'PRINT_DEFAUT(...)' ou */ \ /* de 'PRINT_EN_TETE_Prin_Prer_Prme(...)' (introduit le 20111121164545...). */ \ DEFV(CHAR,INIT(POINTERc(Message1),CHAINE_UNDEF)); \ ckMalo(Message1,chain_taille(message1),print_defaut_____compteur_des_kMalo); \ /* Copie de 'message1' destine a mettre en majuscule son premier caractere. */ \ \ CALS(chain_copie(Message1,message1)); \ EGAL(PREMIER_CARACTERE_ITb0(Message1) \ ,conversion_d_un_caractere_minuscule_en_un_caractere_majuscule(PREMIER_CARACTERE_ITb0(Message1)) \ ); \ /* Mise en majuscule du premier caractere de 'message1'... */ \ \ BSaveModifyVariable(Logical,Prer_____editer_les_messages_d_en_tete,FAUX); \ /* A cause des 'Prer?(...)' qui vont suivre... */ \ \ Test(IL_FAUT(gPRINT_DEFAUT_____n_editer_que_le_message_principal)) \ Bblock \ Test(EST_VRAI(EN_TETE_Prin_Prer_Prme)) \ Bblock \ Eblock \ ATes \ Bblock \ CAL1(Prer2("\n%s : %s.\n" \ ,en_tete \ ,Message1 \ ) \ ); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq____gPRINT_DEFAUT) \ ,chain_Aconcaten2("\n[%s][%s=%s][%s]['%s'-'%s']['%s(...)'#%d][%s] " \ ,COND(EST_VRAI(EN_TETE_Prin_Prer_Prme) \ ," : " \ ,"%s : %s [%s].\n" \ ) \ ) \ ) \ ); \ \ CAL1(Prer12(format_EGAq____gPRINT_DEFAUT \ ,mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss() \ ,Gvar_sHOTE \ ,Gvar_HOST \ ,identifiant_de_branches_paralleles \ ,commande_courante \ ,fichier_courant \ ,fonction_courante \ ,ligne_courante \ ,MESSAGE_S \ ,en_tete \ ,Message1 \ ,message2 \ ) \ ); \ /* Edition des informations utiles au defaut. */ \ /* */ \ /* L'edition de 'identifiant_de_branches_paralleles' a ete introduit le 20111121141723 afin */ \ /* de faciliter l'usage de 'execRVB' par exemple... */ \ /* */ \ /* Les 'IFEQ_chaine(...,C_VIDE)'s sont destines a detecter les usages de 'PRINT_DEFAUT(...)' */ \ /* pour 'DEBUT_DES_Prin(...)', 'DEBUT_DES_Prer(...)' et 'DEBUT_DES_Prme(...)'... */ \ \ CALZ_FreCC(format_EGAq____gPRINT_DEFAUT); \ Eblock \ ETes \ \ ESaveModifyVariable(Logical,Prer_____editer_les_messages_d_en_tete); \ \ CALZ_FreDD(Message1); \ /* Liberation de l'espace contenant le message ameliore (introduit le 20031101192055 car, */ \ /* en effet, il manquait...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Macro generale d'edition d'un message de DEFAUT (ERREUR ou ATTENTION...) version '05' */ \ /* introduit le 20111121143034 pour 'identifiant_de_branches_paralleles' et faciliter */ \ /* donc, par exemple, l'usage de 'execRVB'... */ #Aifdef gPRINT_DEFAUT_VERSION_05 #Eifdef gPRINT_DEFAUT_VERSION_05 #ifdef gPRINT_DEFAUT_VERSION_06 # define gPRINT_DEFAUT(en_tete,message1,message2,commande_courante,fichier_courant,fonction_courante,ligne_courante) \ Bblock \ Test(IL_FAUT(PRINT_DEFAUT_____editer_les_messages)) \ Bblock \ DEFV(Logical,INIT(EN_TETE_Prin_Prer_Prme \ ,I3ET(IFEQ_chaine(en_tete,C_VIDE) \ ,IFEQ_chaine(message1,C_VIDE) \ ,IFEQ_chaine(message2,C_VIDE) \ ) \ ) \ ); \ /* Afin de savoir si l'appel a 'print_defaut(...)' vient de 'PRINT_DEFAUT(...)' ou */ \ /* de 'PRINT_EN_TETE_Prin_Prer_Prme(...)'. */ \ DEFV(CHAR,INIT(POINTERc(Message1),CHAINE_UNDEF)); \ ckMalo(Message1,chain_taille(message1),print_defaut_____compteur_des_kMalo); \ /* Copie de 'message1' destine a mettre en majuscule son premier caractere. */ \ \ CALS(chain_copie(Message1,message1)); \ EGAL(PREMIER_CARACTERE_ITb0(Message1) \ ,conversion_d_un_caractere_minuscule_en_un_caractere_majuscule(PREMIER_CARACTERE_ITb0(Message1)) \ ); \ /* Mise en majuscule du premier caractere de 'message1'... */ \ \ BSaveModifyVariable(Logical,Prer_____editer_les_messages_d_en_tete,FAUX); \ /* A cause des 'Prer?(...)' qui vont suivre... */ \ \ Test(IL_FAUT(gPRINT_DEFAUT_____n_editer_que_le_message_principal)) \ Bblock \ Test(EST_VRAI(EN_TETE_Prin_Prer_Prme)) \ Bblock \ Eblock \ ATes \ Bblock \ CAL1(Prer2("\n%s : %s.\n" \ ,en_tete \ ,Message1 \ ) \ ); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq____gPRINT_DEFAUT) \ ,chain_Aconcaten2("\n[%s][%s=%s][pid=%d][%s]['%s'-'%s']['%s(...)'#%d][%s] " \ ,COND(EST_VRAI(EN_TETE_Prin_Prer_Prme) \ ," : " \ ,"%s : %s [%s].\n" \ ) \ ) \ ) \ ); \ \ CAL1(PrerD(format_EGAq____gPRINT_DEFAUT \ ,mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss() \ ,Gvar_sHOTE \ ,Gvar_HOST \ ,Gpid() \ ,identifiant_de_branches_paralleles \ ,commande_courante \ ,fichier_courant \ ,fonction_courante \ ,ligne_courante \ ,MESSAGE_S \ ,en_tete \ ,Message1 \ ,message2 \ ) \ ); \ /* Edition des informations utiles au defaut. */ \ \ CALZ_FreCC(format_EGAq____gPRINT_DEFAUT); \ Eblock \ ETes \ \ ESaveModifyVariable(Logical,Prer_____editer_les_messages_d_en_tete); \ \ CALZ_FreDD(Message1); \ /* Liberation de l'espace contenant le message ameliore. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Macro generale d'edition d'un message de DEFAUT (ERREUR ou ATTENTION...) version '06' */ \ /* introduite le 20181227120657 qui donne le 'pid' du process, ce qui est utile lorsque */ \ /* plusieurs commandes identiques se succedent (par exemple dans un '$Z')... */ #Aifdef gPRINT_DEFAUT_VERSION_06 #Eifdef gPRINT_DEFAUT_VERSION_05 #define PRINT_DEFAUT(en_tete,message1,message2,editer_ces_messages) \ Bblock \ print_defaut(en_tete,message1,message2 \ ,nom_de_la_commande_courante \ ,FICHIER_COURANT_ABSOLU_x \ ,NomDeLaFonctionCourante \ ,LIGNE_COURANTE \ ,editer_ces_messages \ ); \ /* Edition du message courant... */ \ /* */ \ /* Le nom de la fonction courante a ete introduit le 20051124085928... */ \ Eblock \ /* Macro d'edition d'un message de DEFAUT (ERREUR ou ATTENTION...). On notera le passage */ \ /* par la fonction 'print_defaut(...)' introduit le 1995040600 afin de reduire simultanement */ \ /* la taille des source '$c' et des executable '$X'. On notera l'utilisation du symbole */ \ /* 'FICHIER_COURANT' et non pas de 'PROGRAMME_COURANT_RELATIF_A_x' (malheureusement...), */ \ /* car, en effet, 'FICHIER_COURANT' est reellement le fichier courant (compte-tenu de */ \ /* l'imbrication des 'include's) alors que 'PROGRAMME_COURANT_RELATIF_A_x' est le nom du */ \ /* programme que l'on compile ('v $xcc/cpp$Z'). */ \ /* */ \ /* On notera le 20040924143541 le remplacement de 'FICHIER_COURANT_RELATIF' (qui en fait */ \ /* jusqu'au 20040924143237 s'appelait 'FICHIER_COURANT') par 'FICHIER_COURANT_ABSOLU' et */ \ /* ce afin de supprimer certaines ambiguites (par exemple entre les deux programmes */ \ /* 'v $xcg/scale$K' et 'v $xci/scale$K'). */ \ /* */ \ /* En fait, le 20040924152929 je reviens a 'FICHIER_COURANT_RELATIF' d'une part pour des */ \ /* raisons de portabilite et d'autre part parce que le probleme d'ambiguite evoque ci-dessus */ \ /* a ete regle grace a la modification 'v $xcc/cpp$Z 20040924141922'... */ \ /* */ \ /* Le 20120412092137, 'FICHIER_COURANT_ABSOLU_x' a remplace 'FICHIER_COURANT_RELATIF' */ \ /* suite a la modification 'v $Falias_vi 20120408185254' qui a supprime l'absolutisation */ \ /* des noms de fichier, si necessaire, sous 'vi'... */ #define PRINT_EN_TETE_Prin_Prer_Prme(editer_ces_messages) \ Bblock \ print_defaut(C_VIDE,C_VIDE,C_VIDE \ ,nom_de_la_commande_courante \ ,FICHIER_COURANT_ABSOLU_x \ ,NomDeLaFonctionCourante \ ,LIGNE_COURANTE \ ,editer_ces_messages \ ); \ /* Edition du message courant... */ \ Eblock \ /* Macro d'edition de l'en-tete eventuelle des 'Prin(...)'s, 'Prer(...)'s et 'Prme(...)'s */ \ /* introduite le 20111121155246... */ \ /* */ \ /* J'ai essaye d'introduire un indicateur 'EN_TETE_Prin_Prer_Prme' qui aurait fait la */ \ /* difference entre 'PRINT_DEFAUT(...)' et 'PRINT_EN_TETE_Prin_Prer_Prme(...)' dans la */ \ /* fonction 'print_defaut(...)'. Malheureusement cette fonction est appelee avant sa */ \ /* definition 'v $xig/fonct$vv$FON print_defaut'. Alors un argument valant 'VRAI' (ou */ \ /* 'FAUX') se retrouve avec le type 'int' tant que 'EN_TETE_Prin_Prer_Prme' n'a pas ete */ \ /* type 'long int' dans la definition de 'print_defaut(...)'. D'ou cette solution qui */ \ /* consiste a tester les chaines vides... */ \ /* */ \ /* Le 20120412092137, 'FICHIER_COURANT_ABSOLU_x' a remplace 'FICHIER_COURANT_RELATIF' */ \ /* suite a la modification 'v $Falias_vi 20120408185254' qui a supprime l'absolutisation */ \ /* des noms de fichier, si necessaire, sous 'vi'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R O B T E N I R L A D A T E : */ /* */ /*************************************************************************************************************************************/ TypedefP(SecondesMicroSecondes,STRU(timeval)) /* Structure definissant la duree ecoulee en {secondes,micro-secondes}. */ DEFV(Extern,DEFV(vrai_Int_de_base,gettimeofday())); #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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 GET_DUREE_ECOULEE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(SecondesMicroSecondes) \ gettimeofday(SecondesMicroSecondes,ARGUMENT_INUTILE) \ /* Acces a duree ecoulee en {secondes,micro-secondes}. */ #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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 GET_DUREE_ECOULEE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(SecondesMicroSecondes) \ gettimeofday(SecondesMicroSecondes) \ /* Acces a duree ecoulee en {secondes,micro-secondes}. */ #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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 LE_01_01_1970_A_00_00_00_ANNEE \ Gval("ANNEE_1970") #define LE_01_01_1970_A_00_00_00_MOIS \ INTE(01) #define LE_01_01_1970_A_00_00_00_JOUR \ INTE(01) #define LE_01_01_1970_A_00_00_00_HEURES \ INTE(00) #define LE_01_01_1970_A_00_00_00_MINUTES \ INTE(00) #define LE_01_01_1970_A_00_00_00_SECONDES \ INTE(00) #define LE_01_01_1970_A_00_00_00_TZ \ "UTC" /* Date de "naissance" de 'UNIX'. On notera que le fuseau horaire "UTC" correspond a une */ /* variable '$TZ' absente, c'est-a-dire pour laquelle a ete fait : */ /* */ /* unsetenv TZ */ /* */ /* ce qui est different du cas ou '$TZ' serait existante, mais vide. La notion de fuseau */ /* horaire explique pourquoi, jusqu'au 19991108174034, j'ai cru que la date de "naissance" */ /* de 'UNIX' etait le 01/01/1970 a 01:00:00, alors qu'elle est le 01/01/1970 a 00:00:00. */ /* */ /* A cause de 'v $xcg/dure01011970$K LE_01_01_1970_A_00_00_00_SECONDES' sur '$LACT19' qui */ /* donnait par exemple : */ /* */ /* duree en secondes ecoulee depuis le 01/01/1970 00:00:47695611822080 UTC = ... */ /* -------------- */ /* */ /* Cette anomalie etait liee de toute evidence au fait que les definitions precedentes */ /* (et en particulier 'LE_01_01_1970_A_00_00_00_SECONDES') etaient mal traitees dans les */ /* 'v $xcg/dure01011970$K CAL2.Prin7'... */ #define DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes,MicroSecondes) \ Bblock \ DEFV(SecondesMicroSecondes,duree_ecoulee); \ DEFV(SecondesMicroSecondes,INIT(POINTERs(Pduree_ecoulee),ADRESSE(duree_ecoulee))); \ /* Definition de la structure de recuperation de duree ecoulee en {secondes,micro-secondes}. */ \ \ CALZ(GET_DUREE_ECOULEE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Pduree_ecoulee)); \ /* Acces a duree ecoulee en {secondes,micro-secondes}. */ \ \ EGAL(Secondes,ASI1(Pduree_ecoulee,tv_sec)); \ /* Duree ecoulee depuis le 19700101000000 en secondes. */ \ EGAL(MicroSecondes,ASI1(Pduree_ecoulee,tv_usec)); \ /* Duree ecoulee depuis 00:00:00 ce jour en micro-secondes. */ \ Eblock \ /* Acces a duree ecoulee en {secondes,micro-secondes}. */ DEFV(Extern,DEFV(Char,POINTERc(ctime()))); #define CONVERSION_D_UNE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00_EN_UNE_DATE(Date,Secondes) \ Bblock \ DEFV(GetTime_t2,INIT(duree,Secondes)); \ /* Typage correct... */ \ \ EGAL(Date,ptCARA(ctime(ADRESSE(duree)))); \ Eblock \ /* Conversion d'une duree type */ \ /* 'GET_DUREE_ECOULEE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(...)' */ \ /* exprimee en secondes en une date en format "chaine de caracteres"... */ #define CRITERE_1_DE_BISSEXTILITE_DES_ANNEES \ PARE(400) #define CRITERE_2_DE_BISSEXTILITE_DES_ANNEES \ PARE(100) #define CRITERE_3_DE_BISSEXTILITE_DES_ANNEES \ PARE(4) #define PREMIERE_ANNEE_DU_CALENDRIER \ PARE(1900) #define DERNIERE_ANNEE_DU_CALENDRIER \ PARE(2037) /* Pour valider l'annee. */ #define PREMIER_MOIS_DE_L_ANNEE \ UN #define DERNIER_MOIS_DE_L_ANNEE \ DOUZE /* Pour valider le mois. */ #define PREMIER_JOUR_DU_MOIS \ UN #define DERNIER_JOUR_DU_MOIS \ longueur_du_mois_courant /* Pour valider le jour. */ #define PREMIERE_HEURE_DU_JOUR \ ZERO #define DERNIERE_HEURE_DU_JOUR \ PRED(HEURES_PAR_JOUR) /* Pour valider les heures. */ #define PREMIERE_MINUTE_DE_L_HEURE \ ZERO #define DERNIERE_MINUTE_DE_L_HEURE \ PRED(MINUTES_PAR_HEURE) /* Pour valider les minutes. */ #define PREMIERE_SECONDE_DE_LA_MINUTE \ ZERO #define DERNIERE_SECONDE_DE_LA_MINUTE \ PRED(SECONDES_PAR_MINUTE) /* Pour valider les secondes. */ DEFV(Extern,DEFV(GetTime_t2,mktime())); #define CONVERSION_D_UNE_DATE_EN_UNE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Duree,Annee,Mois,Jour,Heures,Minutes,Secondes) \ Bblock \ DEFV(GetTime_t1,date); \ /* Date que l'on cherche a convertir en une duree. */ \ DEFV(GetTime_t2,INIT(duree,UNDEF)); \ /* Duree ecoulee depuis le 01/01/1970. */ \ \ Test(IFEXff(Annee,PREMIERE_ANNEE_DU_CALENDRIER,DERNIERE_ANNEE_DU_CALENDRIER)) \ Bblock \ PRINT_ERREUR("l'annee est invalide"); \ CAL1(Prer2("elle doit etre dans [%d,%d]\n",PREMIERE_ANNEE_DU_CALENDRIER,DERNIERE_ANNEE_DU_CALENDRIER)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFEXff(Mois,PREMIER_MOIS_DE_L_ANNEE,DERNIER_MOIS_DE_L_ANNEE)) \ Bblock \ PRINT_ERREUR("le mois est invalide"); \ CAL1(Prer2("il doit etre dans [%d,%d]\n",PREMIER_MOIS_DE_L_ANNEE,PREMIER_MOIS_DE_L_ANNEE)); \ Eblock \ ATes \ Bblock \ DEFV(Logical,INIT(l_Annee_est_bissextile,LUNDEF)); \ /* L'annee 'Annee' est-elle bissextile ? */ \ DEFV(Int,INIT(nombre_de_mois_de_l_annee,UNDEF)); \ /* Nombre de mois de l'annee. */ \ DEFV(Int,INIT(longueur_du_mois_courant,UNDEF)); \ /* Longueur du mois courant... */ \ \ Test(IZEQ(REST(Annee,CRITERE_1_DE_BISSEXTILITE_DES_ANNEES))) \ Bblock \ EGAL(l_Annee_est_bissextile,VRAI); \ Eblock \ ATes \ Bblock \ Test(IZEQ(REST(Annee,CRITERE_2_DE_BISSEXTILITE_DES_ANNEES))) \ Bblock \ EGAL(l_Annee_est_bissextile,FAUX); \ Eblock \ ATes \ Bblock \ Test(IZEQ(REST(Annee,CRITERE_3_DE_BISSEXTILITE_DES_ANNEES))) \ Bblock \ EGAL(l_Annee_est_bissextile,VRAI); \ Eblock \ ATes \ Bblock \ EGAL(l_Annee_est_bissextile,FAUX); \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ETes \ \ Test(EST_FAUX(l_Annee_est_bissextile)) \ Bblock \ DEFV(Local,DEFV(Int \ ,INIS(DTb0(liste_des_mois_de_l_annee),IstructL12(31,28,31,30,31,30,31,31,30,31,30,31)) \ ) \ ); \ /* Definition des douze mois de l'annee non bissextile. L'utilisation de 'Local' est due */ \ /* a 'SYSTEME_HP???_HPUX_CC' qui sinon donne les messages : */ \ /* */ \ /* Automatic aggregate initialization is an ANSI feature. */ \ /* */ \ /* puis : */ \ /* */ \ /* Sizeof: zero size. */ \ /* */ \ /* ce qui est bien ennuyeux... */ \ \ EGAL(nombre_de_mois_de_l_annee,bDIV(SIZE_GENERAL(liste_des_mois_de_l_annee),size_Int)); \ /* Nombre de mois de l'annee afin de valider 'liste_des_mois_de_l_annee' definie ci-dessus. */ \ EGAL(longueur_du_mois_courant,ITb1(liste_des_mois_de_l_annee,INDX(Mois,PREMIER_MOIS_DE_L_ANNEE))); \ /* Longueur du mois courant de l'annee non bissextile... */ \ Eblock \ ATes \ Bblock \ DEFV(Local,DEFV(Int \ ,INIS(DTb0(liste_des_mois_de_l_annee),IstructL12(31,29,31,30,31,30,31,31,30,31,30,31)) \ ) \ ); \ /* Definition des douze mois de l'annee bissextile. L'utilisation de 'Local' est due */ \ /* a 'SYSTEME_HP???_HPUX_CC' qui sinon donne les messages : */ \ /* */ \ /* Automatic aggregate initialization is an ANSI feature. */ \ /* */ \ /* puis : */ \ /* */ \ /* Sizeof: zero size. */ \ /* */ \ /* ce qui est bien ennuyeux... */ \ \ EGAL(nombre_de_mois_de_l_annee,bDIV(SIZE_GENERAL(liste_des_mois_de_l_annee),size_Int)); \ /* Nombre de mois de l'annee afin de valider 'liste_des_mois_de_l_annee' definie ci-dessus. */ \ EGAL(longueur_du_mois_courant,ITb1(liste_des_mois_de_l_annee,INDX(Mois,PREMIER_MOIS_DE_L_ANNEE))); \ /* Longueur du mois courant de l'annee bissextile... */ \ Eblock \ ETes \ \ Test(IFNE(nombre_de_mois_de_l_annee,NBRE(PREMIER_MOIS_DE_L_ANNEE,DERNIER_MOIS_DE_L_ANNEE))) \ Bblock \ PRINT_ERREUR("les mois de l'annee sont en nombre incorrect"); \ CAL1(Prer1("il en faut %d\n",NBRE(PREMIER_MOIS_DE_L_ANNEE,DERNIER_MOIS_DE_L_ANNEE))); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFEXff(Jour,PREMIER_JOUR_DU_MOIS,DERNIER_JOUR_DU_MOIS)) \ Bblock \ PRINT_ERREUR("le jour est invalide"); \ CAL1(Prer2("il doit etre dans [%d,%d]\n",PREMIER_JOUR_DU_MOIS,DERNIER_JOUR_DU_MOIS)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ \ Test(IFEXff(Heures,PREMIERE_HEURE_DU_JOUR,DERNIERE_HEURE_DU_JOUR)) \ Bblock \ PRINT_ERREUR("les heures sont invalides"); \ CAL1(Prer2("elles doivent etre dans [%d,%d]\n",PREMIERE_HEURE_DU_JOUR,DERNIERE_HEURE_DU_JOUR)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFEXff(Minutes,PREMIERE_MINUTE_DE_L_HEURE,DERNIERE_MINUTE_DE_L_HEURE)) \ Bblock \ PRINT_ERREUR("les minutes sont invalides"); \ CAL1(Prer2("elles doivent etre dans [%d,%d]\n",PREMIERE_MINUTE_DE_L_HEURE,DERNIERE_MINUTE_DE_L_HEURE)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFEXff(Secondes,PREMIERE_SECONDE_DE_LA_MINUTE,DERNIERE_SECONDE_DE_LA_MINUTE)) \ Bblock \ PRINT_ERREUR("les secondes sont invalides"); \ CAL1(Prer2("elles doivent etre dans[ %d,%d]\n",PREMIERE_SECONDE_DE_LA_MINUTE,DERNIERE_SECONDE_DE_LA_MINUTE)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(ASD1(date,tm_year),bSOU(Annee,CONVERSION_DUREE_DATE_TRANSLATION_DE_L_ANNEE)); \ EGAL(ASD1(date,tm_mon),bSOU(Mois,CONVERSION_DUREE_DATE_TRANSLATION_DU_MOIS)); \ EGAL(ASD1(date,tm_mday),bSOU(Jour,CONVERSION_DUREE_DATE_TRANSLATION_DU_JOUR)); \ EGAL(ASD1(date,tm_hour),bSOU(Heures,CONVERSION_DUREE_DATE_TRANSLATION_DE_L_HEURE)); \ EGAL(ASD1(date,tm_min),bSOU(Minutes,CONVERSION_DUREE_DATE_TRANSLATION_DE_LA_MINUTE)); \ EGAL(ASD1(date,tm_sec),bSOU(Secondes,CONVERSION_DUREE_DATE_TRANSLATION_DE_LA_SECONDE)); \ EGAL(ASD1(date,tm_isdst),CONVERSION_DUREE_DATE_NE_PAS_MODIFIER_LES_COMPOSANTES); \ /* Initialisation correcte de la date... */ \ \ EGAL(duree,mktime(ADRESSE(date))); \ EGAL(Duree,INTE(duree)); \ /* Duree ecoulee depuis le 01/01/1970. ATTENTION, la capacite de 'mktime(...)' fait que */ \ /* la date argument ne peut etre ni anterieure au 01/01/1970 00:00:00 UTC, ni posterieure */ \ /* au 19/01/2038 03:14:07 UTC. */ \ Eblock \ /* Conversion d'une date au format "AAAA/MM/JJ/HH/mm/ss" en une duree en secondes de type */ \ /* 'GET_DUREE_ECOULEE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R F A I R E " D O D O " : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(Positive,sleep())); #define DODO(duree) \ Bblock \ Test(IZGT(duree)) \ Bblock \ CALZ(sleep(INTE(duree))); \ /* Definition de la mise en attente (non nulle). ATTENTION, on notera le 'INTE(...)' au */ \ /* cas ou la duree demandee contiendrait, par exemple, un operateur du type 'MOIT(...)'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Attente synchrone de 'duree' secondes. On notera que fut verifie a l'aide du programme */ \ /* 'v $xtc/minute$c' que la duree des attentes etait correcte (ce que l'on a vu en verifiant */ \ /* que 60 attentes d'une seconde duraient bien au total une minute, soit 60 secondes...). */ #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) TypedefP(NanoDuree,STRU(timespec)) /* Structure definissant la duree des "nano-attentes". */ DEFV(Extern,DEFV(vrai_Int_de_base,nanosleep())); # define PETIT_DODO(duree) \ /* La duree est exprimee en nano-secondes... */ \ Bblock \ DEFV(Int,INIT(duree_sec,DIVI(INTE(duree),nano_secondes))); \ DEFV(Int,INIT(duree_nsec,REST(INTE(duree),nano_secondes))); \ /* Definition de la duree en secondes et de la duree residuelle en nano-secondes... */ \ /* */ \ /* On notera le 20110531165758 qu'en fait la duree en secondes ne peut exceder deux secondes */ \ /* sous peine de debordement dans les 'INTE(...)'s ci-dessus... */ \ \ DODO(duree_sec); \ /* La possibilite d'avoir une attente superieure a une seconde a ete introduite le */ \ /* 20110531162555 pour 'v $xcg/PhaseCrit.01$K PETIT_DODO'. On notera que l'on utilise */ \ /* 'DODO(duree_sec)' plutot que 'EGAL(ASD1(petite_dureeA,tv_sec),duree_sec)' ci-dessous */ \ /* afin de na pas modifier le test vi-apres... */ \ \ Test(IFET(IZGE(duree_nsec),IFLE(duree_nsec,nano_secondes))) \ Bblock \ Test(IZGT(duree)) \ Bblock \ DEFV(NanoDuree,petite_dureeA); \ DEFV(NanoDuree,INIT(POINTERs(Ppetite_dureeA),ADRESSE(petite_dureeA))); \ /* Definition de la petite duree demandee Argument. */ \ DEFV(NanoDuree,petite_dureeR); \ DEFV(NanoDuree,INIT(POINTERs(Ppetite_dureeR),ADRESSE(petite_dureeR))); \ /* Definition de la petite duree demandee Resultat. */ \ \ EGAL(ASD1(petite_dureeA,tv_sec),ZERO); \ EGAL(ASD1(petite_dureeA,tv_nsec),duree_nsec); \ /* Initialisation sur la duree Argument. */ \ \ Tant(IL_Y_A_ERREUR(nanosleep(Ppetite_dureeA,Ppetite_dureeR))) \ Bblock \ EGAL(ASD1(petite_dureeA,tv_sec),ASD1(petite_dureeR,tv_sec)); \ EGAL(ASD1(petite_dureeA,tv_nsec),ASD1(petite_dureeR,tv_nsec)); \ /* Ainsi, on boucle tant que la duree demandee n'est pas completement ecoulee... */ \ Eblock \ ETan \ Eblock \ ATes \ Bblock \ /* Une duree nulle ne provoque aucune attente... */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("l'attente inferieure a une seconde demandee est negative ou superieure a une seconde"); \ Eblock \ ETes \ Eblock \ /* Attente synchrone de 'duree' nano-secondes. */ #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) # define PETIT_DODO(duree) \ Bblock \ PRINT_ATTENTION("la fonction d'attente inferieure a une seconde n'est pas implementee sur ce SYSTEME"); \ Eblock \ /* Attente synchrone de 'duree' nano-secondes. */ #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (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)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R U T I L I S E R L E C H R O N O M E T R E " C L O C K " E N S E C O N D E S : */ /* */ /*************************************************************************************************************************************/ #if ( (! defined(SYSTEME_NWS3000_NEWSOS)) \ ) TypedefP(Int_clock,clock_t) DEFV(Extern,DEFV(Int_clock,clock())); # define CLOK \ clock() \ /* Definition du chronometre. */ # define NOMBRE_DE_TOPS_D_HORLOGE_PAR_SECONDE \ CLOCKS_PER_SEC \ /* Definition de l'horloge. */ # define Bclock(commentaire,editer_le_chronometrage) \ /* A cause de l'introduction de 'v $xig/common$STR chronometrer_la_commande_courante', */ \ /* les deux membres du couple {Bclock,Eclock} ne sont plus necessairement au meme niveau */ \ /* des {Bblock,Eblock}. Le 'Bblock' qui figurait ici est donc supprime... */ \ DEFV(Int_clock,INIT(valeur_initiale_du_chronometre,CLOK)); \ /* On notera que pour eviter des problemes de format dans les 'Prin?(...)' qui suivent sur */ \ /* 'SYSTEME_SGO200A2_IRIX_CC', la variable 'valeur_initiale_du_chronometre' est passe du */ \ /* type 'LongInt' au type 'Int' le 19980925104908. */ \ Test(IL_FAUT(editer_le_chronometrage)) \ Bblock \ CAL3(Prme1("DEBUT DE CHRONOMETRAGE : %s\n" \ ,commentaire \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ /* Mise en route du chronometre. */ # define NOMBRE_DE_CHIFFRES_DES_SECONDES \ NOMBRE_DE_CHIFFRES_DECIMAUX(SECONDES_PAR_MINUTE) # define NOMBRE_DE_CHIFFRES_DES_MINUTES_ \ NOMBRE_DE_CHIFFRES_DECIMAUX(MINUTES_PAR_HEURE) # define NOMBRE_DE_CHIFFRES_DES_HEURES__ \ DEUX /* Definitions introduites le 20170518183325... */ # define Eclock(commentaire,editer_le_chronometrage) \ Test(IL_FAUT(editer_le_chronometrage)) \ Bblock \ DEFV(Int,INIT(nombre_de_secondes_pour_Eclock \ ,INTE(bDIV(bSOU(CLOK,valeur_initiale_du_chronometre),NOMBRE_DE_TOPS_D_HORLOGE_PAR_SECONDE)) \ ) \ ); \ DEFV(Int,INIT(nombre_de_milli_secondes_pour_Eclock \ ,FRAm1(INTE(REST(bSOU(CLOK,valeur_initiale_du_chronometre) \ ,NOMBRE_DE_TOPS_D_HORLOGE_PAR_SECONDE \ ) \ ) \ ) \ ) \ ); \ /* Je note le 20180504144955 que la precision des milli-secondes suffit (d'autant plus */ \ /* que le nombre de micro-secondes a toujours ete termine par "000"...). On notera au */ \ /* passage le 20180504145942 que le nombre de milli-secondes semble toujours se terminer */ \ /* par "0"... */ \ \ DEFV(Int,INIT(nombre_de_secondes,UNDEF)); \ DEFV(Int,INIT(nombre_de_minutes_,UNDEF)); \ DEFV(Int,INIT(nombre_d_heures___,UNDEF)); \ \ EGAL(nombre_de_secondes,REST(nombre_de_secondes_pour_Eclock,SECONDES_PAR_MINUTE)); \ EGAL(nombre_de_minutes_,QUOD(nombre_de_secondes_pour_Eclock,SECONDES_PAR_MINUTE)); \ EGAL(nombre_d_heures___,QUOD(nombre_de_minutes_,MINUTES_PAR_HEURE)); \ EGAL(nombre_de_minutes_,REST(nombre_de_minutes_,MINUTES_PAR_HEURE)); \ \ PRINT_MESSAGE(C_VIDE,"CHRONOMETRAGE"); \ CAL3(Prme11("FIN DE CHRONOMETRAGE : %s - temps ecoule : %d %s (%0*d:%0*d:%0*d) + %d %s.\n" \ ,commentaire \ ,nombre_de_secondes_pour_Eclock \ ,PLURIEL_S("seconde",nombre_de_secondes_pour_Eclock) \ ,NOMBRE_DE_CHIFFRES_DES_HEURES__,nombre_d_heures___ \ ,NOMBRE_DE_CHIFFRES_DES_MINUTES_,nombre_de_minutes_ \ ,NOMBRE_DE_CHIFFRES_DES_SECONDES,nombre_de_secondes \ ,nombre_de_milli_secondes_pour_Eclock \ ,PLURIEL_S("milli-seconde",nombre_de_milli_secondes_pour_Eclock) \ ) \ ); \ /* ATTENTION : je note le 20230314102135 que 'FIN DE CHRONOMETRAGE' est reference */ \ /* explicitement dans 'v $xcc/cpp$Z ChAiNe7=.FIN.DE.CHRONOMETRAGE..'. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ /* A cause de l'introduction de 'v $xig/common$STR chronometrer_la_commande_courante', */ \ /* les deux membres du couple {Bclock,Eclock} ne sont plus necessairement au meme niveau */ \ /* des {Bblock,Eblock}. Le 'Eblock' qui figurait ici est donc supprime... */ \ /* */ \ /* Le 20190111141455, j'ai introduit un "." en bout de ligne... */ \ \ /* Et enfin, edition du temps ecoule depuis la mise en route du chronometre. */ #Aif ( (! defined(SYSTEME_NWS3000_NEWSOS)) \ ) @ ifdef SYSTEME_NWS3000_NEWSOS /* Cette hierarchie un peu compliquee de tests est uniquement due a l'existence des fichiers */ /* de type "bootstrappables" (par exemple le '$c' issu de 'v $xbg/fonction$K'). Les */ /* includes suivants etant conditionnels, cette conditionnalite doit apparaitre dans les */ /* fichiers '$c'... */ @ include <sys/resource.h> @ Aifdef SYSTEME_NWS3000_NEWSOS @ Eifdef SYSTEME_NWS3000_NEWSOS TypedefP(Comptabilite,STRU(rusage)) /* Structure definissant la comptabilite. */ DEFV(Extern,DEFV(Void,getrusage())); # define CLOK(Pkomptabilite) \ getrusage(RUSAGE_SELF,Pkomptabilite) \ /* Definition du chronometre. */ # define Bclock(commentaire,editer_le_chronometrage) \ /* A cause de l'introduction de 'v $xig/common$STR chronometrer_la_commande_courante', */ \ /* les deux membres du couple {Bclock,Eclock} ne sont plus necessairement au meme niveau */ \ /* des {Bblock,Eblock}. Le 'Bblock' qui figurait ici est donc supprime... */ \ DEFV(Comptabilite,comptabilite); \ DEFV(Comptabilite,INIT(POINTERs(Pcomptabilite),ADRESSE(comptabilite))); \ /* Definition de la comptabilite a utiliser pour faire le chronometrage. */ \ DEFV(Int,INIT(valeur_initiale_du_chronometre,UNDEF)); \ DEFV(Int,INIT(valeur_finale_du_chronometre,UNDEF)); \ /* Definition du temps au debut et a la fin du chronometrage. */ \ CALZ(CLOK(Pcomptabilite)); \ EGAL(valeur_initiale_du_chronometre,ASI2(Pcomptabilite,ru_utime,tv_sec)); \ /* Memorisation du temps de debut du chronometrage. */ \ Test(IL_FAUT(editer_le_chronometrage)) \ Bblock \ CAL3(Prme1("DEBUT DE CHRONOMETRAGE : %s\n" \ ,commentaire \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ /* Mise en route du chronometre. */ # define Eclock(commentaire,editer_le_chronometrage) \ CALZ(CLOK(Pcomptabilite)); \ EGAL(valeur_finale_du_chronometre,ASI2(Pcomptabilite,ru_utime,tv_sec)); \ /* Memorisation du temps de fin du chronometrage. */ \ Test(IL_FAUT(editer_le_chronometrage)) \ Bblock \ DEFV(Int,INIT(nombre_de_secondes_pour_Eclock \ ,bSOU(valeur_finale_du_chronometre,valeur_initiale_du_chronometre) \ ) \ ); \ \ CAL3(Prme3("FIN DE CHRONOMETRAGE : %s - temps ecoule : %d %s\n" \ ,commentaire \ ,nombre_de_secondes_pour_Eclock \ ,PLURIEL_S("seconde",nombre_de_secondes_pour_Eclock) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ /* A cause de l'introduction de 'v $xig/common$STR chronometrer_la_commande_courante', */ \ /* les deux membres du couple {Bclock,Eclock} ne sont plus necessairement au meme niveau */ \ /* des {Bblock,Eblock}. Le 'Eblock' qui figurait ici est donc supprime... */ \ \ /* Et enfin, edition du temps ecoule depuis la mise en route du chronometre. */ #Eif ( (! defined(SYSTEME_NWS3000_NEWSOS)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S M A T H E M A T I Q U E S : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(vrai_Int_de_base,finite())); DEFV(Extern,DEFV(vrai_Int_de_base,isnan())); #define EST_UN_BON_Float_FINI(x) \ IZNE(finite(DPRE(x))) \ /* Verifie que 'x' est un bon nombre de type 'Float' (introduit le 20030213090838, le nom */ \ /* ayant ete change de 'EST_UN_NON_Float_FINI(...)' en 'EST_UN_BON_Float_FINI(...)' le */ \ /* 20030301101611, le nom precedent n'etant pas correct par rapport au 'IZNE(...)'). */ DEFV(Extern,DEFV(vrai_Double_de_base,floor())); #define AINT(x) \ FLOT(floor(DPRE(x))) \ /* Partie entiere exprimee en Double precision de 'x' lui-meme en double-precision. */ DEFV(Extern,DEFV(vrai_Double_de_base,fmod())); #define fREST(a,b) \ FLOT(fmod(DPRE(a),DPRE(b))) \ /* Reste "generalise" de la division de 'a' par 'b' en double-precision. On notera que */ \ /* 'fmod(...)' et donc 'fREST(a,b)' renvoient un reste du signe de 'a'. On notera que l'on */ \ /* a les proprietes suivantes : */ \ /* */ \ /* dividende = N*diviseur + reste */ \ /* */ \ /* 'N' representant un entier, */ \ /* */ \ /* |reste| < |diviseur| */ \ /* */ \ /* le dividende etant 'a' et le diviseur etant 'b'. */ DEFV(Extern,DEFV(vrai_Double_de_base,frexp())); #define xFLOT(x,exposant) \ FLOT(frexp(DPRE(x),ADRESSE(INT(exposant)))) \ /* Extraction de la mantisse et de l'exposant du nombre flottant 'x'. */ \ DEFV(Extern,DEFV(vrai_Double_de_base,ldexp())); #define cFLOT(mantisse,exposant) \ FLOT(ldexp(DPRE(mantisse),DPRE(exposant))) \ /* Construction d'un nombre flottant dont on se donne la mantisse et l'exposant. */ DEFV(Extern,DEFV(vrai_Double_de_base,sqrt())); #define RACD(x) \ FLOT(sqrt(DPRE(x))) \ /* Racine carree de 'x' en double-precision. */ DEFV(Extern,DEFV(vrai_Double_de_base,log10())); #define LO1D(x) \ FLOT(log10(DPRE(x))) \ /* Logarithme decimal de 'x' en double-precision. */ DEFV(Extern,DEFV(vrai_Double_de_base,log())); #define LOGD(x) \ FLOT(log(DPRE(x))) \ /* Logarithme neperien de 'x' en double-precision. */ DEFV(Extern,DEFV(vrai_Double_de_base,pow())); #define PUID(x,y) \ FLOT(pow(DPRE(x),DPRE(y))) \ /* Elevation de 'x' a la puissance 'y' en double-precision. */ #define MOND(x,n) \ FLOT(pow(DPRE(x),DPRE(n))) \ /* Elevation de 'x' a la puissance 'n' en double-precision ; cette subtilite a ete */ \ /* introduite uniquement pour permettre la derivation formelle de la fonction puissance */ \ /* entiere 'n' meme lorsque 'x' est negatif (voir a ce propos le commentaire relatif a */ \ /* 'd_PUIX(...)' dans '$xil/defi_K2$vv$DEF'). D'autre part, il ne suffisait pas de definir : */ \ /* */ \ /* #define MONX(x,n) \ */ \ /* PUID(x,n) */ \ /* */ \ /* dans '$xil/defi_K2$vv$DEF', et ce a cause du fichier '$xcc/cpp$D/derive_Fmath$sed' car */ \ /* alors de derivations d'ordre superieur a 1 on aurait vu 'MONX(...)' etre remplace par */ \ /* 'PUIX(...)' via 'PUID(...)'. Enfin, le nom 'MON' a ete choisi comme etant les premieres */ \ /* lettres de "monome"... */ DEFV(Extern,DEFV(vrai_Double_de_base,exp())); #define EXPD(x) \ FLOT(exp(DPRE(x))) #define d_EXPD(x) \ EXPD(x) /* Elevation de 'e' a la puissance 'x' en double-precision. */ /* */ /* Sa derivee fut introduite le 20230605141412 (elle avait ete oubliee...). */ DEFV(Extern,DEFV(vrai_Double_de_base,cos())); #define COSD(x) \ FLOT(cos(DPRE(x))) #define d_COSD(x) \ FLOT(NEGA(SIND(x))) /* Cosinus double-precision "de base" de l'angle 'x' exprime en radian, */ /* */ /* Sa derivee fut introduite le 20171016121953 par symetrie avec 'd_TANG(...)'. */ #if ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ ) # TestADef BUG_SYSTEME_SG_C_sin \ /* La fonction 'sin(...)' donne un resultat imprecis au voisinage des multiples de PI (voir */ \ /* le programme 'v $Dbugs/SGPCM801$D/IRIX$D/CC$D/sin.01$c'). */ #Aif ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ ) #Eif ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE >= 600010000)) \ ) DEFV(Extern,DEFV(vrai_Double_de_base,sin())); #define SIND(x) \ FLOT(sin(DPRE(x))) #define d_SIND(x) \ FLOT(NEUT(COSD(x))) /* Sinus double-precision "de base" de l'angle 'x' exprime en radian. */ /* */ /* Sa derivee fut introduite le 20171016121953 par symetrie avec 'd_TANG(...)'. */ DEFV(Extern,DEFV(vrai_Double_de_base,tan())); #define TANG(x) \ FLOT(tan(DPRE(x))) #define d_TANG(x) \ FLOT(ADD2(FU,EXP2(TANG(x)))) /* Tangente double-precision "de base" de l'angle 'x' exprime en radian. */ /* */ /* Sa derivee fut introduite le 20171016121953 pour 'v $xcg/TANX.01$K TANG'... */ DEFV(Extern,DEFV(vrai_Double_de_base,atan())); #define ATAD(x) \ FLOT(atan(DPRE(x))) \ /* Fonction inverse de 'TANG(...)' (introduite le 20120526193255). */ DEFV(Extern,DEFV(vrai_Double_de_base,atan2())); #if ( (defined(SYSTEME_CRAY2_UNICOS)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_HP705_HPUX_CC)) \ || (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ ) # define ARTG(y,x) \ COND(IFOU(IZNE(x),IZNE(y)) \ ,FLOT(atan2(DPRE(y),DPRE(x))) \ ,FZERO \ ) \ /* Arc-tangente de l'argument y/x dans [-PI,+PI] ; cas des SYSTEMEs qui n'acceptent pas */ \ /* le cas indetermine (soit x=y=0)... */ #Aif ( (defined(SYSTEME_CRAY2_UNICOS)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_HP705_HPUX_CC)) \ || (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ ) # define ARTG(y,x) \ FLOT(atan2(DPRE(y),DPRE(x))) \ /* Arc-tangente de l'argument y/x dans [-PI,+PI]. */ #Eif ( (defined(SYSTEME_CRAY2_UNICOS)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_HP705_HPUX_CC)) \ || (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ ) DEFV(Extern,DEFV(vrai_Double_de_base,acos())); #define ACOD(x) \ FLOT(acos(DPRE(x))) \ /* Arc-cosinus double-precision "de base" dans [0,pi]. */ DEFV(Extern,DEFV(vrai_Double_de_base,asin())); #define ASID(x) \ FLOT(asin(DPRE(x))) \ /* Arc-sinus double-precision "de base" dans [-pi/2,+pi/2]. */ /* ATTENTION : les fonctions trigonometriques hyperboliques de "base" ont ete introduites */ /* le 19991213090923 car, en effet, les definitions donnees par 'COHX(...)', 'SIHX(...)' et */ /* 'TAHX(...)' dans 'v $xil/defi_K2$vv$DEF COHX' utilisent explicitement 'EXPX(...)' et */ /* sont donc sujettes a des debordements tres "rapides"... */ DEFV(Extern,DEFV(vrai_Double_de_base,cosh())); #define COSH(x) \ FLOT(cosh(DPRE(x))) #define d_COSH(x) \ SINH(x) /* Cosinus hyperbolique double-precision "de base" de l'angle 'x' exprime en radian. */ /* */ /* Sa derivee fut introduite le 20130220100134 par "symetrie" avec 'TANH(...)'... */ DEFV(Extern,DEFV(vrai_Double_de_base,sinh())); #define SINH(x) \ FLOT(sinh(DPRE(x))) #define d_SINH(x) \ COSH(x) /* Sinus hyperbolique double-precision "de base" de l'angle 'x' exprime en radian. */ /* */ /* Sa derivee fut introduite le 20130220100134 par "symetrie" avec 'TANH(...)'... */ DEFV(Extern,DEFV(vrai_Double_de_base,tanh())); #define TANH(x) \ FLOT(tanh(DPRE(x))) #define d_TANH(x) \ INVE(EXP2(COSH(x))) /* Tangente hyperbolique double-precision "de base" de l'angle 'x' exprime en radian. */ /* */ /* Sa derivee fut introduite le 20130220100134 pour 'v $xrs/inflation.11$I TANH'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R A L E A T O I R E D I T " S T A N D A R D " : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(vrai_Double_de_base,drand48())); DEFV(Extern,DEFV(Void,srand48())); #define RDN_STANDARD \ FLOT(drand48()) \ /* Generateur aleatoire standard donnant une valeur aleatoire dans [0,1]. Cela fut */ \ /* deplace depuis 'v $ximf/aleatoires$FON' le 20230809101814 et ce afin d'etre utilise dans */ \ /* 'v $xrk/dominos.01$K RDN_STANDARD'... */ #define INITIALISATION_RDN_STANDARD(graine) \ Bblock \ CALS(srand48(graine)); \ Eblock \ /* Initialisation du generateur aleatoire standard avec une graine entiere signee. Cela fut */ \ /* deplace depuis 'v $ximf/aleatoires$FON' le 20230809101814 et ce afin d'etre utilise dans */ \ /* 'v $xrk/dominos.01$K RDN_STANDARD'... */