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