/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N A U T O M A T I Q U E D ' U N C - S H E L L - S C R I P T */
/* R E P E T A N T L A M E M E O P E R A T I O N P O U R U N E S E Q U E N C E D ' I M A G E S : */
/* S U I V A N T D E S N U M E R O S O U B I E N S U I V A N T L E S C O M P O S A N T E S { R , V , B } : */
/* */
/* */
/* Definition : */
/* */
/* Cette commande genere un 'C-Shell-script' contenant */
/* une ligne par numero, et repetant ainsi une meme operation */
/* pour une (ou plusieurs) sequences d'images. */
/* */
/* */
/* Exemple : */
/* */
/* $xci/genere$X C='$xci/vraies_C$X A=$xw1/s.%04d p=$xiP/p RR=$xw1/s$ROUGE.%04d RV=$xw1/s$VERTE.%04d RB=$xw1/s$BLEUE.%04d $formatI' */
/* */
/* \__/ \__/ \__/ \__/ */
/* || || || || */
/* || || || || */
/* ------------------------------------------------------------------------------------- */
/* | */
/* ATTENTION : | */
/* \|/ */
/* . */
/* */
/* La chaine "%04d" ne peut pas apparaitre */
/* plus de huit fois dans la commande Argument. */
/* Cette limite n'est pas infranchissable, elle */
/* est en effet imposee uniquement par la fonction */
/* 'GENERATION_DE_LA_COMMANDE_COURANTE(...)' qui */
/* est definie et utilisee plus bas... */
/* */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * ** * * * * * ** * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * ** * * * * * ** */
/* * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* */
/* ATTENTION : */
/* */
/* Dans un '$Z', il est imperatif que si '$xci/genere$X' */
/* fait l'objet d'un 'eval', tout soit sur la meme ligne a */
/* cause du couple '`...`'. On ecrira donc : */
/* */
/* eval `$xci/genere$X commande='(...)' en_tete=FAUX RVB=VRAI separateur=VRAI` */
/* */
/* afin de ne pas avoir le message : */
/* */
/* /bin/csh: Event not found. */
/* */
/* tres desagreable... */
/* */
/* */
/* Exemple : */
/* */
/* $xci/genere$X RVB=VRAI C='$xci/acces$X A=$xT/IMAGE.1%s R=$xT/IMAGE.2%s $formatI' */
/* */
/* */
/* Author of '$xci/genere$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1990??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R F A C E ' listG ' : */
/* */
/* */
/* :Debut_listG: */
/* :Fin_listG: */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */
/* */
/*************************************************************************************************************************************/
@define PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES
/* Ceci a ete introduit le 20030208113849 a cause de 'v $xcc/cpp$Z 20021212145057'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_MINI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define EDITER_L_EN_TETE_DU_C_SHELL_SCRIPT \
VRAI \
/* Indique si l'on doit editer l'en-tete "standard" du 'C-Shell-Script' ('VRAI') ou pas */ \
/* ('FAUX'). */
#define PARENTHESER_LES_COMMANDES \
FAUX \
/* Indique si l'on doit parentheser les commandes ('VRAI') ou pas ('FAUX'). Ceci a ete , */ \
/* introduit le 20091208144756... */
#define PAS_D_ATTENTE_PRELIMINAIRE \
ZERO \
/* Duree d'attente preliminaire destinee a eviter des charges exceptionnelles des MACHINEs */ \
/* lors d'utilisations paralleles ('v $xiirc/.MANE.41.4.$U execRVB....xci.accumule.42.X' */ \
/* par exemple). Ainsi on pourra decaler temporellement les differentes branches paralleles */ \
/* et eviter ainsi que plusieurs chargements d'albums aient lieu simultanement... */ \
/* Ceci fut introduit le 20111011210301... */
#define METTRE_UN_SEPARATEUR_DE_COMMANDE \
FAUX \
/* Indique si l'on doit editer un ";" de separation de commande ('VRAI') ou pas ('FAUX'), */ \
/* ceci pouvant servir lorsque l'on fait un : */ \
/* */ \
/* eval `$xci/genere$X ...` */ \
/* */
#define TRAITER_LES_COMPOSANTES_RVB_ET_NON_PAS_UNE_SEQUENCE \
FAUX \
/* Indique si l'on traite une sequence d'images numerotees ('FAUX'), ou bien les trois */ \
/* composantes {R,V,B} ('VRAI'). */
#define UTILISER_LE_SYSTEME_HLS_PLUTOT_QUE_LE_SYSTEME_RVB \
FAUX \
/* Indique si l'on utilise le systeme 'HLS' plutot que le systeme 'RVB' (introduit le */ \
/* 20111216105032). */
#define GENERER_LES_POSTFIXES_RVB_ou_HLS_ou_XYZ \
VRAI \
/* Indique, lorsque l'on traite les trois composantes {R,V,B}, si l'on doit editer les */ \
/* postfixes {$ROUGE,$VERTE,$BLEUE} ('VRAI') ou les noms {ROUGE,VERTE,BLEUE} ('FAUX'). */ \
/* Dans ce dernier cas, les postfixes {$ROUGE,$VERTE,$BLEUE} demeurent accessibles ; il */ \
/* suffit d'ecrire : */ \
/* */ \
/* $%s */ \
/* */ \
/* ce qui, grace au '$' qui les precede, permet de generer des references aux variables */ \
/* d'environnement {$ROUGE,$VERTE,$BLEUE}. Bien evidemment, la commande, ou tout du moins */ \
/* les chaines du type '$%s' doivent etre dans des quotes simples afin d'empecher le '$CSH' */ \
/* d'evaluer ces "$%s"... */
#define LES_COMPOSANTES_RVB_SONT_EN_FAIT_DES_COMPOSANTES_XYZ \
FAUX \
/* Lorsque le traitement des trois composantes {R,V,B} est demande, est-ce bien du {R,V,B} */ \
/* qui va etre genere ('FAUX') ou bien du {cX,cY,cZ} ('VRAI') ? Ceci fut introduit le */ \
/* 20050907092935 pour 'v $xrs/project2D.01$Z 20050907093830'. La valeur par defaut */ \
/* garantit la compatibilite anterieure... */
#define GENERER_DU_PARALLELISME_POUR_LES_COMPOSANTES_RVB \
FAUX \
/* Indique si l'on doit generer du parallelisme ('VRAI') ou pas ('FAUX') lors du traitement */ \
/* des composantes {R,V,B} (ou {cX,cY,cZ}) ? Ceci fut introduit le 20071214140707. */
#define TENTER_DE_CORRIGER_CERTAINES_FAUTES_DE_FORMAT \
VRAI \
/* Indique si l'on doit tenter de corriger certaines fautes de format ('VRAI') telle la */ \
/* fameuse "%S" (pour "%s") ou non ('VRAI'). Ceci fut introduit le 20061225100727, mais */ \
/* fut inhibe le 20070109101142 pour des raisons expliquees ci-apres, dans le commentaire */ \
/* 'v $xci/genere$K 20070109101142'. Grace a 'v $xig/fonct$vv$DEF 20070110091012, il a ete */ \
/* possible de revenir a 'VRAI' le 20070110091750... */ \
/* */ \
/* ATTENTION : je note le 20120814150208 que cette correction peut avoir des consequences */ \
/* desastreuses si la commande a executer contient des quotes ou encore des back-slashes */ \
/* comme cela s'est vu dans 'v $xiirv/.PART.4.15.$U corriger_certaines_fautes=FAUX'... */
#define POUR_parallele_1N_EXECUTER_LES_COMMANDES_SOUS_CSH \
FAUX \
/* La possibilite d'executer les commandes de 'v $xcg/parallele.1N$K CSH' a ete introduite */ \
/* le 20091021102302, la valeur par defaut etant compatible avec celle qui est fixee dans */ \
/* 'v $xcg/parallele.1N$K EXECUTER_LES_COMMANDES_SOUS_CSH'... */
#include xci/sequence.01.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define SELECTION__RVB_HLS_XYZ(element_RVB,element_HLS,element_XYZ) \
COND(EST_VRAI(les_composantes_RVB_sont_en_fait_des_composantes_XYZ) \
,element_XYZ \
,COND(EST_VRAI(utiliser_le_systeme_HLS_plutot_que_le_systeme_RVB) \
,element_HLS \
,element_RVB \
) \
) \
/* Afin de choisir entre le 'RVB' et le 'XYZ' (introduit le 20071214135136)... */
#define NOM_DES_COMPOSANTES(chaine_car_RVB,var_env_RVB,chaine_car_HLS,var_env_HLS,chaine_car_XYZ,var_env_XYZ) \
COND(IL_FAUT(generer_les_postfixes_RVB_ou_HLS_ou_XYZ) \
,Cara(SELECTION__RVB_HLS_XYZ(var_env_RVB,var_env_HLS,var_env_XYZ)) \
,Cara(SELECTION__RVB_HLS_XYZ(chaine_car_RVB,chaine_car_HLS,chaine_car_XYZ)) \
) \
/* Afin de choisir ce que l'on va editer en mode {R,V,B}. */
#include xci/genere.I"
/* Ce '$I' a ete cree le 20071227130205 a cause de la derivation formelle et plus */
/* particulierement du fichier 'v $xcc/cpp$Z INCLUDES_1.sed' qui "inhibe" temporairement */
/* les 'define's du niveau le plus bas des fichiers... */
#define GENERATION_DE_LA_COMMANDE_COURANTE(valeur_a_editer,c_est_la_derniere_commande,arguments_specifiques,temporisation_eventuelle) \
/* L'argument 'arguments_specifiques' a ete introduit le 20091208125349... */ \
/* */ \
/* L'argument 'temporisation_eventuelle' a ete introduit le 20111011210301... */ \
Bblock \
DEFV(Positive,INIT(nombre_de_K_POUR_CENT,chain_comptage_des_occurences_d_un_caractere(commande,K_POUR_CENT))); \
\
Choi(nombre_de_K_POUR_CENT) \
/* Sequence introduite le 20071227114214... */ \
Bblock \
GENERATION_D_UN_CAS(ZERO,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
GENERATION_D_UN_CAS(UN,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
GENERATION_D_UN_CAS(DEUX,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
GENERATION_D_UN_CAS(TROIS,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
GENERATION_D_UN_CAS(QUATRE,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
GENERATION_D_UN_CAS(CINQ,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
GENERATION_D_UN_CAS(SIX,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
GENERATION_D_UN_CAS(SEPT,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
GENERATION_D_UN_CAS(HUIT,valeur_a_editer,arguments_specifiques,temporisation_eventuelle); \
/* C'est a l'interieur de l'un de ces 'GENERATION_D_UN_CAS(...)'s que la commande */ \
/* 'commande' est editee ('v $xci/genere$I CAL2.GPrin'). */ \
Defo \
Bblock \
Test(EST_FAUX(le_message_d_erreur_a_deja_ete_emis)) \
/* Introduit le 20071228115524 afin de n'emettre le message relatif a trop de "%"s qu'une */ \
/* seule fois... */ \
Bblock \
PRINT_ERREUR("il y a trop de '%'s a generer dans la commande"); \
CAL1(Prer1("(ils sont au nombre de %d)\n",nombre_de_K_POUR_CENT)); \
\
EGAL(le_message_d_erreur_a_deja_ete_emis,VRAI); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
EDef \
Eblock \
ECho \
\
Test(IFET(IL_FAUT(mettre_un_separateur_de_commande),EST_FAUX(c_est_la_derniere_commande))) \
Bblock \
CAL2(Prin1(" %c",K_POINT_VIRGULE)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IFOU(IL_NE_FAUT_PAS(traiter_les_composantes_RVB_et_non_pas_une_sequence) \
,IFET(IL_FAUT(traiter_les_composantes_RVB_et_non_pas_une_sequence) \
,IL_NE_FAUT_PAS(generer_du_parallelisme_pour_les_composantes_RVB) \
) \
) \
) \
Bblock \
CAL2(Prin0("\n")); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
INITIALISATION_DE_LA_GENERATION_DE_LA_COMMANDE_COURANTE \
/* En effet, 'GENERATION_DE_LA_COMMANDE_COURANTE(...)' est appelee plusieurs fois de */ \
/* suite et il convient donc de reinitialiser 'v $xci/genere$I LISTE_DES_VALEURS' a chaque */ \
/* fois... */ \
Eblock \
/* Generation de la commande courante... */
#define GENERATION_EVENTUELLE_DU_PARALLELISME(chaine) \
Bblock \
Test(IL_FAUT(generer_du_parallelisme_pour_les_composantes_RVB)) \
Bblock \
CAL2(Prin1("%s",chaine)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Generation du code necessaire au parallelisme. */
#define COMMANDE_COURANTE \
chain_Aconcaten4(" commande",chain_numero(INCR(numero_de_la_commande_courante,I),UN),"=",C_VERITABLE_QUOTE) \
/* Pour numeroter automatiquement les commandes (introduit le 20071215112601). On notera */ \
/* qu'a priori UN seul chiffre suffit puisqu'il y a de 1 a 3 commandes... */ \
/* */ \
/* C'est donc ici que l'on genere les sequences : */ \
/* */ \
/* commande1=" */ \
/* commande2=" */ \
/* commande3=" */ \
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N A U T O M A T I Q U E D ' U N C - S H E L L - S C R I P T */
/* R E P E T A N T L A M E M E O P E R A T I O N P O U R U N E S E Q U E N C E D ' I M A G E S : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(commande),C_VIDE));
/* Chaine de caracteres donnant la commande a repeter... */
DEFV(Logical,INIT(editer_l_en_tete_du_C_shell_script,EDITER_L_EN_TETE_DU_C_SHELL_SCRIPT));
/* Indique si l'on doit editer l'en-tete "standard" du 'C-Shell-Script' ('VRAI') ou pas */
/* ('FAUX'). */
DEFV(Logical,INIT(traiter_les_composantes_RVB_et_non_pas_une_sequence,TRAITER_LES_COMPOSANTES_RVB_ET_NON_PAS_UNE_SEQUENCE));
/* Indique si l'on traite une sequence d'images numerotees ('FAUX'), ou bien les trois */
/* composantes {R,V,B} ('VRAI'). */
DEFV(Logical,INIT(utiliser_le_systeme_HLS_plutot_que_le_systeme_RVB,UTILISER_LE_SYSTEME_HLS_PLUTOT_QUE_LE_SYSTEME_RVB));
/* Indique si l'on utilise le systeme 'HLS' plutot que le systeme 'RVB' (introduit le */
/* 20111216105032). */
DEFV(Logical,INIT(generer_les_postfixes_RVB_ou_HLS_ou_XYZ,GENERER_LES_POSTFIXES_RVB_ou_HLS_ou_XYZ));
/* Indique, lorsque l'on traite les trois composantes {R,V,B}, si l'on doit editer les */
/* postfixes {$ROUGE,$VERTE,$BLEUE} ('VRAI') ou les noms {ROUGE,VERTE,BLEUE} ('FAUX'). */
/* Dans ce dernier cas, les postfixes {$ROUGE,$VERTE,$BLEUE} demeurent accessibles ; il */
/* suffit d'ecrire : */
/* */
/* $%s */
/* */
/* ce qui, grace au '$' qui les precede, permet de generer des references aux variables */
/* d'environnement {$ROUGE,$VERTE,$BLEUE}. Bien evidemment, la commande, ou tout du moins */
/* les chaines du type '$%s' doivent etre dans des quotes simples afin d'empecher le '$CSH' */
/* d'evaluer ces "$%s"... */
DEFV(Logical,INIT(les_composantes_RVB_sont_en_fait_des_composantes_XYZ,LES_COMPOSANTES_RVB_SONT_EN_FAIT_DES_COMPOSANTES_XYZ));
/* Lorsque le traitement des trois composantes {R,V,B} est demande, est-ce bien du {R,V,B} */
/* qui va etre genere ('FAUX') ou bien du {cX,cY,cZ} ('VRAI') ? Ceci fut introduit le */
/* 20050907092935 pour 'v $xrs/project2D.01$Z 20050907093830'. La valeur par defaut */
/* garantit la compatibilite anterieure... */
DEFV(Logical,INIT(generer_du_parallelisme_pour_les_composantes_RVB,GENERER_DU_PARALLELISME_POUR_LES_COMPOSANTES_RVB));
/* Indique si l'on doit generer du parallelisme ('VRAI') ou pas ('FAUX') lors du traitement */
/* des composantes {R,V,B} (ou {cX,cY,cZ}) ? Ceci fut introduit le 20071214140707. */
DEFV(CHAR,INIC(POINTERc(arguments_generaux),C_VIDE));
/* Arguments generaux (introduits le 20100412140113). */
DEFV(CHAR,INIC(POINTERc(arguments_specifiques_ROUGE_ou_TEINT_ou_X),C_VIDE));
DEFV(CHAR,INIC(POINTERc(arguments_specifiques_VERTE_ou_LUMIN_ou_Y),C_VIDE));
DEFV(CHAR,INIC(POINTERc(arguments_specifiques_BLEUE_ou_SATUR_ou_Z),C_VIDE));
/* Arguments specifiques a chacune des trois composantes {R,V,B} (ou {cX,cY,cZ}). Ceci fut */
/* introduit le 20091208125349. */
DEFV(Logical,INIT(parentheser_les_commandes,PARENTHESER_LES_COMMANDES));
/* Indique si l'on doit parentheser les commandes ('VRAI') ou pas ('FAUX'). Ceci a ete , */
/* introduit le 20091208144756... */
DEFV(Int,INIT(duree_d_attente_preliminaire_ROUGE_ou_TEINT_ou_X,PAS_D_ATTENTE_PRELIMINAIRE));
DEFV(Int,INIT(duree_d_attente_preliminaire_VERTE_ou_LUMIN_ou_Y,PAS_D_ATTENTE_PRELIMINAIRE));
DEFV(Int,INIT(duree_d_attente_preliminaire_BLEUE_ou_SATUR_ou_Z,PAS_D_ATTENTE_PRELIMINAIRE));
/* Durees d'attente preliminaire destinees a eviter des charges exceptionnelles des MACHINEs */
/* lors d'utilisations paralleles ('v $xiirc/.MANE.41.4.$U execRVB....xci.accumule.42.X' */
/* par exemple). Ainsi on pourra decaler temporellement les differentes branches paralleles */
/* et eviter ainsi que plusieurs chargements d'albums aient lieu simultanement... */
/* Ceci fut introduit le 20111011210301... */
DEFV(Logical,INIT(mettre_un_separateur_de_commande,METTRE_UN_SEPARATEUR_DE_COMMANDE));
/* Indique si l'on doit editer un ";" de separation de commande ('VRAI') ou pas ('FAUX'), */
/* ceci pouvant servir lorsque l'on fait un : */
/* */
/* eval `$xci/genere$X ...` */
DEFV(Logical,INIT(tenter_de_corriger_certaines_fautes_de_format,TENTER_DE_CORRIGER_CERTAINES_FAUTES_DE_FORMAT));
/* Indique si l'on doit tenter de corriger certaines fautes de format ('VRAI') telle la */
/* fameuse "%S" (pour "%s") ou non ('VRAI'). Ceci fut introduit le 20061225100727... */
/* */
/* ATTENTION : je note le 20120814150208 que cette correction peut avoir des consequences */
/* desastreuses si la commande a executer contient des quotes ou encore des back-slashes */
/* comme cela s'est vu dans 'v $xiirv/.PART.4.15.$U corriger_certaines_fautes=FAUX'... */
DEFV(Logical,INIT(pour_parallele_1N_executer_les_commandes_sous_CSH,POUR_parallele_1N_EXECUTER_LES_COMMANDES_SOUS_CSH));
/* La possibilite d'executer les commandes de 'v $xcg/parallele.1N$K CSH' a ete introduite */
/* le 20091021102302, la valeur par defaut etant compatible avec celle qui est fixee dans */
/* 'v $xcg/parallele.1N$K EXECUTER_LES_COMMANDES_SOUS_CSH'... */
DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE));
/* Numero de la premiere image, */
DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE));
/* Numero de la derniere image. */
DEFV(Int,INIT(numero_d_image,UNDEF));
/* Numero de l'image courante. */
DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES));
/* Pas de passage d'un numero d'image a une autre. */
DEFV(Logical,INIT(le_message_d_erreur_a_deja_ete_emis,FAUX));
/* Introduit le 20071228115524 afin de n'emettre le message relatif a trop de "%"s qu'une */
/* seule fois... */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("commande=""c=""C=",commande);
GET_ARGUMENT_L("et=""en_tete=""csh=",editer_l_en_tete_du_C_shell_script);
GET_ARGUMENT_L("parentheser=""parentheses=""parent=",parentheser_les_commandes);
/* Arguments introduits le 20091208144756... */
GET_ARGUMENT_L("RVB=",traiter_les_composantes_RVB_et_non_pas_une_sequence);
GET_ARGUMENT_L("HLS=",utiliser_le_systeme_HLS_plutot_que_le_systeme_RVB);
/* Argument introduit le 20111216105032... */
GET_ARGUMENT_L("postfixes_RVB=""postfixes_HLS=""postfixes_XYZ=""postfixes="
,generer_les_postfixes_RVB_ou_HLS_ou_XYZ
);
/* Les arguments {"postfixes_HLS=","postfixes_XYZ=","postfixes="} furent introduits le */
/* 20111216115048... */
GET_ARGUMENT_L("XYZ=",les_composantes_RVB_sont_en_fait_des_composantes_XYZ);
GET_ARGUMENT_L("parallelisme=""parallele=""para=",generer_du_parallelisme_pour_les_composantes_RVB);
GET_ARGUMENT_N("sequentiel=""seq=",generer_du_parallelisme_pour_les_composantes_RVB);
GET_ARGUMENT_L("separateur=""sep=""pv=",mettre_un_separateur_de_commande);
GET_ARGUMENT_C("arguments_generaux=""ag=",arguments_generaux);
/* Arguments introduits le 20100412140113, puis le 20100701101530 en ce qui concerne */
/* "sequentiel=" et "seq="... */
GET_ARGUMENT_C("arguments_specifiques_ROUGE=""asR=" ##
"arguments_specifiques_TEINT=""asH=" ##
"arguments_specifiques_X=""asX=" ##
"arguments_specifiques_1=""as1="
,arguments_specifiques_ROUGE_ou_TEINT_ou_X
);
GET_ARGUMENT_C("arguments_specifiques_VERTE=""asV=" ##
"arguments_specifiques_LUMIN=""asL=" ##
"arguments_specifiques_Y=""asY=" ##
"arguments_specifiques_2=""as2="
,arguments_specifiques_VERTE_ou_LUMIN_ou_Y
);
GET_ARGUMENT_C("arguments_specifiques_BLEUE=""asB=" ##
"arguments_specifiques_SATUR=""asS=" ##
"arguments_specifiques_Z=""asZ=" ##
"arguments_specifiques_3=""as3="
,arguments_specifiques_BLEUE_ou_SATUR_ou_Z
);
/* Les "arguments specifiques" ont ete introduits le 20091208125349... */
/* */
/* Le 20150430140514 ont ete introduits les arguments {1,2,3} afin de "symetriser" les */
/* commandes {execHLS,execRVB,execXYZ}... */
GET_ARGUMENT_I("attente_preliminaire_ROUGE=""apR=" ##
"attente_preliminaire_TEINT=""apH=" ##
"attente_preliminaire_X=""apX=" ##
"attente_preliminaire_1=""ap1="
,duree_d_attente_preliminaire_ROUGE_ou_TEINT_ou_X
);
GET_ARGUMENT_I("attente_preliminaire_VERTE=""apV=" ##
"attente_preliminaire_LUMIN=""apL=" ##
"attente_preliminaire_Y=""apY=" ##
"attente_preliminaire_2=""ap2="
,duree_d_attente_preliminaire_VERTE_ou_LUMIN_ou_Y
);
GET_ARGUMENT_I("attente_preliminaire_BLEUE=""apB=" ##
"attente_preliminaire_SATUR=""apS=" ##
"attente_preliminaire_Z=""apZ=" ##
"attente_preliminaire_3=""ap3="
,duree_d_attente_preliminaire_BLEUE_ou_SATUR_ou_Z
);
/* Les temporisations ont ete introduites le 20111011210301... */
/* */
/* Le 20150430140514 ont ete introduits les arguments {1,2,3} afin de "symetriser" les */
/* commandes {execHLS,execRVB,execXYZ}... */
GET_ARGUMENT_L("fautes=""corriger_les_formats=""corriger_certaines_fautes=""corriger="
,tenter_de_corriger_certaines_fautes_de_format
);
GET_ARGUMENT_L("CSH=""pCSH=""pcsh=",pour_parallele_1N_executer_les_commandes_sous_CSH);
GET_ARGUMENT_N("SH=""pSH=""psh=",pour_parallele_1N_executer_les_commandes_sous_CSH);
GET_ARGUMENT_I("premiere=""p=",premiere_image);
/* Abreviation introduite le 20070112190525... */
GET_ARGUMENT_I("derniere=""d=",derniere_image);
/* Abreviation introduite le 20070112190525... */
GET_ARGUMENT_I("pas=",pas_des_images);
)
);
Test(IL_NE_FAUT_PAS(tenter_de_corriger_certaines_fautes_de_format))
/* Test introduit le 20061225100727... */
Bblock
Test(IL_NE_FAUT_PAS(traiter_les_composantes_RVB_et_non_pas_une_sequence))
Bblock
Test(EST_VRAI(les_composantes_RVB_sont_en_fait_des_composantes_XYZ))
Bblock
PRINT_ERREUR("les options 'RVB=' et 'XYZ=' ne sont pas utilisees correctement");
CAL1(Prer2("(l'utilisation de 'XYZ=%s' necessite 'RVB=%s')\n"
,ETAT_LOGIQUE(NEUL(les_composantes_RVB_sont_en_fait_des_composantes_XYZ))
,ETAT_LOGIQUE(NOTL(traiter_les_composantes_RVB_et_non_pas_une_sequence))
)
);
/* Verification introduite le 20060617114831... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(editer_l_en_tete_du_C_shell_script))
Bblock
CAL2(Prin1("#!%s\n",Gvar("SHELL")));
CAL2(Prin0("\n"));
CAL2(Prin0("####################################################################"));
CAL2(Prin0("###################################################################\n"));
CAL2(Prin0("# "));
CAL2(Prin0(" #\n"));
CAL2(Prin0("# C - S H E L L - S C R I P T : "));
CAL2(Prin0(" #\n"));
CAL2(Prin0("# "));
CAL2(Prin0(" #\n"));
CAL2(Prin0("####################################################################"));
CAL2(Prin0("###################################################################\n"));
/* On met l'en-tete complete afin de generer un un 'C-Shell-script'. D'autre part, les */
/* lignes commentaires "#...#" ont ete coupees en deux afin de limiter la longueur des */
/* lignes de ce programme. */
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(traiter_les_composantes_RVB_et_non_pas_une_sequence))
Bblock
/* On notera que ci-apres, le 20071215105843, '$K_QS' a ete remplace par '$K_QD' (via */
/* 'C_VERITABLE_QUOTE') car, en effet, cela permet de placer des variables d'environnement */
/* dans les commandes tout en rendant possible leur interpretation... */
DEFV(Int,INIT(numero_de_la_commande_courante,ZERO));
/* Pour numeroter automatiquement (a priori de 1 a 3) les commandes Argument ("commande?=") */
/* de '$xcg/parallele.1N$X' (introduit le 20071215112601). */
GENERATION_EVENTUELLE_DU_PARALLELISME(chain_Aconcaten5("$xcg/parallele.1N$X"
," CSH="
,ETAT_LOGIQUE(pour_parallele_1N_executer_les_commandes_sous_CSH)
," "
,arguments_generaux
)
);
/* Le 20090415100503, la commande '$xcg/parallele.1N$X' a remplace '$xcg/parallele.14$X' */
/* etant plus generale... */
GENERATION_EVENTUELLE_DU_PARALLELISME(COMMANDE_COURANTE);
GENERATION_DE_LA_COMMANDE_COURANTE(NOM_DES_COMPOSANTES(ptCARA("ROUGE"),c_ROUGE
,ptCARA("TEINT"),c_TEINT
,ptCARA("COORD_X"),c_COORD_X
)
,FAUX
,arguments_specifiques_ROUGE_ou_TEINT_ou_X
,CASP_vrai_Int_de_base(duree_d_attente_preliminaire_ROUGE_ou_TEINT_ou_X)
);
/* Le 20111027084647, les durees d'attente ont fait l'objet de 'CASP_vrai_Int_de_base(...)' */
/* afin d'eviter les messages : */
/* */
/* ...warning: format '%d' expects type 'int', but argument ... has type 'long int' */
/* */
/* lors de la generattion des 'v $xci/genere$I .sleep %d'... On notera que le 20111027084647 */
/* j'ai essaye de remplacer les 'Int's par des 'vrai_Int_de_base's mais que cela ne marche */
/* pas a cause de 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_VALIDATION_DU_TYPE'... */
GENERATION_EVENTUELLE_DU_PARALLELISME(C_VERITABLE_QUOTE);
GENERATION_EVENTUELLE_DU_PARALLELISME(COMMANDE_COURANTE);
GENERATION_DE_LA_COMMANDE_COURANTE(NOM_DES_COMPOSANTES(ptCARA("VERTE"),c_VERTE
,ptCARA("LUMIN"),c_LUMIN
,ptCARA("COORD_Y"),c_COORD_Y
)
,FAUX
,arguments_specifiques_VERTE_ou_LUMIN_ou_Y
,CASP_vrai_Int_de_base(duree_d_attente_preliminaire_VERTE_ou_LUMIN_ou_Y)
);
/* Le 20111027084647, les durees d'attente ont fait l'objet de 'CASP_vrai_Int_de_base(...)' */
/* afin d'eviter les messages : */
/* */
/* ...warning: format '%d' expects type 'int', but argument ... has type 'long int' */
/* */
/* lors de la generattion des 'v $xci/genere$I .sleep %d'... On notera que le 20111027084647 */
/* j'ai essaye de remplacer les 'Int's par des 'vrai_Int_de_base's mais que cela ne marche */
/* pas a cause de 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_VALIDATION_DU_TYPE'... */
GENERATION_EVENTUELLE_DU_PARALLELISME(C_VERITABLE_QUOTE);
GENERATION_EVENTUELLE_DU_PARALLELISME(COMMANDE_COURANTE);
GENERATION_DE_LA_COMMANDE_COURANTE(NOM_DES_COMPOSANTES(ptCARA("BLEUE"),c_BLEUE
,ptCARA("SATUR"),c_SATUR
,ptCARA("COORD_Z"),c_COORD_Z
)
,VRAI
,arguments_specifiques_BLEUE_ou_SATUR_ou_Z
,CASP_vrai_Int_de_base(duree_d_attente_preliminaire_BLEUE_ou_SATUR_ou_Z)
);
/* Le 20111027084647, les durees d'attente ont fait l'objet de 'CASP_vrai_Int_de_base(...)' */
/* afin d'eviter les messages : */
/* */
/* ...warning: format '%d' expects type 'int', but argument ... has type 'long int' */
/* */
/* lors de la generattion des 'v $xci/genere$I .sleep %d'... On notera que le 20111027084647 */
/* j'ai essaye de remplacer les 'Int's par des 'vrai_Int_de_base's mais que cela ne marche */
/* pas a cause de 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_VALIDATION_DU_TYPE'... */
GENERATION_EVENTUELLE_DU_PARALLELISME(chain_Aconcaten2(C_VERITABLE_QUOTE,"\n"));
/* Le nom d'une couleur (ou coordonnee) peut apparaitre 8 fois dans la commande argument... */
Eblock
ATes
Bblock
DoQu(numero_d_image,premiere_image,derniere_image,pas_des_images)
Bblock
GENERATION_DE_LA_COMMANDE_COURANTE(numero_d_image
,IFEQ(numero_d_image,derniere_image)
,C_VIDE
,PAS_D_ATTENTE_PRELIMINAIRE
);
/* Le 'numero_d_image' peut donc apparaitre 8 fois dans la commande argument... */
Eblock
EDoI
Eblock
ETes
Eblock
ATes
Bblock
/* ATTENTION : je note le 20120814150208 que cette correction peut avoir des consequences */
/* desastreuses si la commande a executer contient des quotes ou encore des back-slashes */
/* comme cela s'est vu dans 'v $xiirv/.PART.4.15.$U corriger_certaines_fautes=FAUX'... */
/* */
/* ATTENTION : je note le 20140218105623 que c'est la sequence qui suit qui est responsable */
/* du probleme decrit dans 'v $xiMo/serveur.01$vv$Y 20121208081706'. C'est ce qui a induit */
/* les modifications 'v $Falias_CodexB 20140218104504' et 'v $Falias_CodexE 20140218104509'. */
/* Alors, est-ce 'C_SH__REDIRECTION_PROGRAMME' ou encore 'C_SH__REDIRECTION_FICHIER' qui est */
/* responsable ? */
/* */
/* Une "solution" pourrait etre de forcer : */
/* */
/* #define TENTER_DE_CORRIGER_CERTAINES_FAUTES_DE_FORMAT \ */
/* FAUX \ */
/* */
/* par defaut afin de minimiser les risques de blocage... */
DEFV(CHAR,INIC(POINTERc(commande_de_generation_corrigee),CHAINE_UNDEF));
/* Commande courante avec correction des eventuelles fautes... */
DEFV(CHAR,INIT(POINTERc(nom_du_fichier_de_manoeuvre),generation_d_un_nom_absolu_dans_xT_temporaire(Gvar("Y"))));
/* Definition d'un fichier de manoeuvre temporarire. On remarquera que '$Y' sera inclu */
/* dans le nom du fichier temporaire, mais qu'il n'en sera pas le postfixe : il sera en */
/* effet suivi de '$Wi'... */
CALS(Fdelete_fichier(nom_du_fichier_de_manoeuvre,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS));
/* Destruction initiale du fichier de manoeuvre au cas ou... */
RECONSTITUTION_DE_LA_COMMANDE_COURANTE_AVEC_QUOTAGE(commande_de_generation_corrigee);
/* Recuperation de la commande courante en "double quotant" ses arguments de facon a */
/* permettre les manipulations ci-apres... */
EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH
(chain_Aconcaten11("echo ",commande_de_generation_corrigee," corriger_les_formats=",C_FAUX____
,C_SH__REDIRECTION_PROGRAMME
,Gvar("SE")
,COND(IL_FAUT(traiter_les_composantes_RVB_et_non_pas_une_sequence)
,chain_Aconcaten8(" -e 's/\\(%\\)D/\\1s/g' "
," -e 's/\\(%\\)d/\\1s/g' "
," -e 's/\\(%\\)S/\\1s/g' "
," -e 's/\\(%\\)X/\\1s/g' "
," -e 's/\\(%\\)x/\\1s/g' "
," -e 's/\\(%\\)\\( \\)/\\1s\\2/g' "
," -e 's/\\(%\\)$/\\1s/' "
," -e 's/\\(%[0-9]*\\)[^ %0-9s]/\\1s/g' "
)
,chain_Aconcaten8(" -e 's/\\(%\\)D/\\1d/g' "
," -e 's/\\(%\\)O/\\1o/g' "
," -e 's/\\(%\\)S/\\1d/g' "
," -e 's/\\(%\\)s/\\1d/g' "
," -e 's/\\(%\\)X/\\1x/g' "
," -e 's/\\(%\\)\\( \\)/\\1d\\2/g' "
," -e 's/\\(%\\)$/\\1d/' "
," -e 's/\\(%[0-9]*\\)[^ %0-9dox]/\\1d/g' "
)
)
,C_SH__REDIRECTION_FICHIER,nom_du_fichier_de_manoeuvre
," ; "
,EXECUTION_D_UN_FICHIER_SOUS_SH(nom_du_fichier_de_manoeuvre)
)
);
/* Execution de la demande courante en ayant corrige, si besoin est, quelques fautes */
/* "classiques" concernant les formats "%"... */
/* */
/* Jusqu'au 20061225163121, j'ai desesperemment tente de faire fonctionner directement : */
/* */
/* `echo ... | $SE ...` */
/* */
/* qui aurait donc du executer la commande corrigee. Malheureusement, l'argument "commande=" */
/* contient en general des espaces ; cet argument ne conserve pas cette "forme" dans le */
/* "`...`" et les espaces sont consideres alors comme un separateur d'arguments. La seule */
/* solution semble donc etre de passer par un fichier intermediaire temporaire que l'on */
/* execute ensuite via "." (qui est a '$SH' ce que "source" est a '$CSH'...). */
/* */
/* ATTENTION, je note le 20070109095046 que ce dispositif interdit desormais des */
/* utilisations du type : */
/* */
/* $xci/genere$X commande='... $VARIABLE' ... */
/* */
/* car, en effet, la variable '$VARIABLE' ne sera pas interpretee par le '$CSH' puisque */
/* figurant entre deux '$K_QS'. La chaine '$VARIABLE' sera donc transmise au '$SH' qui, */
/* ne la connaissant pas, la remplacera par '$K_VIDE'. Il conviendra donc d'ecrire : */
/* */
/* $xci/genere$X commande="... $VARIABLE" ... */
/* */
/* (entre deux '$K_QD') systematiquement. Mais, il est finalement plus prudent (peut-etre */
/* provisoirement...) d'inhiber par defaut cette possibilite (le 20070109101142). Au */
/* passage, utiliser 'EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH(...)', tout en etant */
/* penalisant au niveau du temps d'execution, ne resoudrait pas le probleme en ce qui */
/* concerne les variables '$VARIABLE' ne faisant pas partie de l'environnement et qui sont */
/* temporaires ('v $xiMo/creation$Z .xci.genere.X.commande=...xci.neutre.X.A=.Image%s'). */
/* */
/* Le 20070109110652, je decouvre qu'il suffit que ces variables '$VARIABLE' soient definies */
/* par : */
/* */
/* setenv VARIABLE ... */
/* */
/* pour qu'elles soient tranmises au '$SH' et que tout fonctionne correctement, meme avec */
/* l'ecriture : */
/* */
/* $xci/genere$X commande='... $VARIABLE' ... */
/* */
/* Le 20070110091012, la solution fut trouvee grace a 'v $xig/fonct$vv$DEF 20070110091012', */
/* permettant de revenir a l'etat 'IL_FAUT(tenter_de_corriger_certaines_fautes_de_format)' */
/* par defaut le 20070110091750... */
/* */
/* Le 20071229094053, l'edition "octale" ("%o") a ete introduite... */
/* */
/* Le 20100704112426, les chaines "^0-9s" et "^0-9dox" ont ete remplaces respectivement */
/* par "^%0-9s" et "^%0-9dox" ce qui permet de ne pas traiter les occurences du type "%%" */
/* comme cela s'est vu dans 'v $Falias_execALBUM 20100703155111'... */
/* */
/* Le 20111117081809, passage de 'C_REDIRECTION_PROGRAMME' et 'C_REDIRECTION_FICHIER' */
/* a 'C_SH__REDIRECTION_PROGRAMME' et 'C_SH__REDIRECTION_FICHIER'... */
/* */
/* Le 20111216165752, les expressions : */
/* */
/* -e 's/\\(%[0-9]*\\)[^%0-9s]/\\1s/g' */
/* -e 's/\\(%[0-9]*\\)[^%0-9dox]/\\1d/g' */
/* */
/* ont evolue par l'introduction d'un espace dans la liste "[^...]" des exclusions suite */
/* a un probleme rencontre a cette date avec une commande du type : */
/* */
/* execRVB $xci/minmax$X A1=... A2=... R=...% */
/* */
/* ('v $Dhistory/LACT19$D/20111216170308 20111216162944') ou il n'y avait rien apres le "%". */
/* Il a donc fallu aussi remplacer donc "% " par "%s " ou "%d " suivant les cas. On notera */
/* au passage que "% s" (par exemple...) equivaut a "%s" avec le message : */
/* */
/* warning: repeated ' ' flag in format */
/* */
/* emis alors par '$Cc' autant de fois qu'il y a d'espaces apres le "%"... */
CALS(Fdelete_fichier(nom_du_fichier_de_manoeuvre,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS));
CALZ_FreCC(nom_du_fichier_de_manoeuvre);
/* Destruction de l'espace et liberation de l'espace du nom... */
CALZ_FreCC(commande_de_generation_corrigee);
Eblock
ETes
RETU_Commande;
Eblock
ECommande