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