/*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D E C A R A C T E R E S C O D E S E N ' UTF-8 ' : */ /* */ /* */ /* Definition du codage 'UTF-8' : */ /* */ /* Ce code utilise 1, 2, 3 ou 4 octets et ce suivant la */ /* la valeur du premier d'entre-eux. Soit 'K1' celui-ci, */ /* on a alors (en hexa-decimal) : */ /* */ /* K1 dans [00,7F] : 1 octet {K1}, */ /* */ /* */ /* K1 dans [C2-DF] : 2 octets {K1,K2}, */ /* - - */ /* */ /* K1 dans [E0-EF] : 3 octets {K1,K2,K3}, */ /* - - */ /* */ /* K1 dans [F0-F4] : 4 octets {K1,K2,K3,K4}. */ /* - - */ /* */ /* */ /* Nota important : a cause de 'v $xiMd/xcp_____conversion_UTF_8$K.$m4', */ /* la suite des deux caracteres "&#" introduisant le code hexa-decimal */ /* sur 4 ou 5 chiffres est remplace dans les commentaires de ce '$K', */ /* ainsi que partout ailleurs ou c'est possible, par la chaine "ZZ". */ /* */ /* */ /* Code du caractere : K1 (Base16) : K1 (Base2) : K2 (Base2) : K3 (Base2) : K4 (Base2) : */ /* ----------------- ----------- ---------- ---------- ---------- ---------- */ /* */ /* ZZx0000; --> ZZx007F; 00 --> 7F 0bbb.bbbb */ /* */ /* ZZx0080; --> ZZx07FF; C2 --> DF 110b.bbbb 10bb.bbbb */ /* */ /* ZZx0800; --> ZZxFFFF; E0 --> EF 1110.bbbb 10bb.bbbb 10bb.bbbb */ /* */ /* ZZx10000; --> ZZx10FFFF; F0 --> F3 1111.00bb 10bb.bbbb 10bb.bbbb 10bb.bbbb */ /* F4 1111.0100 1000.bbbb 10bb.bbbb 10bb.bbbb */ /* */ /* */ /* Avec les notations suivantes : le caractere "." est un separateur entre */ /* les 2 groupes de 4 bits contenus dans un octet. Quant au caractere "b", */ /* il represente un bit quelconque ("0" ou "1"). */ /* */ /* Une suite de "b"s convertie en une valeur hexadecimale de 4 ou 5 chiffres */ /* definit le code "ZZx1234[5];" du caractere correspondant, utilisable directement */ /* en '$HTML'... */ /* */ /* (voir le WikiPedia de 'UTF8'). */ /* */ /* */ /* Author of '$xcp/conversion_UTF_8$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20241104113136). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 MODE_UTF_8 \ VRAI \ /* S'agit-il du mode 'UTF-8' ('VRAI') ou du mode 'ASCII' ('FAUX') ? */ #define EDITER_LE_MODE_ASCII_EN_HEXADECIMAL \ FAUX \ /* En mode 'ASCII' faut-il editer en hexadecimal ('VRAI') ou des caracteres ('FAUX') ? */ #define LONGUEUR_APPROXIMATIVE_DES_LIGNES \ CENT \ /* Longueur approximative des lignes a generer... */ #define GENERER_LES_CODES_NON_DEFINIS \ FAUX \ /* Faut-il generer ('VRAI') les codes non reconnus ou bien interrompre le processus */ \ /* ('FAUX') ? Ceci fut introduit le 20250207103836... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define GET_CARACTERE_SUIVANT(caractere_suivant) \ Bblock \ Test(GetcharT(caractere_suivant)) \ Bblock \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la fin du fichier est rencontree trop tot"); \ Exit(PROBLEMES); \ Eblock \ ETes \ Eblock #define DEBUT_CODES_CARACTERES_1_ \ 0x00 #define FIN___CODES_CARACTERES_1_ \ 0x7F #define MASQUE_CARACTERES_1__1 \ 0x7F /* Cas {K1} : */ /* */ /* 0bbb.bbbb */ /* --- ---- */ /* 7 F */ /* */ #define DEBUT_CODES_CARACTERES_2_ \ 0xC2 #define FIN___CODES_CARACTERES_2_ \ 0xDF #define MASQUE_CARACTERES_2__1 \ 0x1F #define MASQUE_CARACTERES_2__2 \ 0x3F /* Cas {K1,K2} : */ /* */ /* 110b.bbbb 10bb.bbbb */ /* - ---- -- ---- */ /* 1 F 3 F */ /* */ #define DEBUT_CODES_CARACTERES_3_ \ 0xE0 #define FIN___CODES_CARACTERES_3_ \ 0xEF #define MASQUE_CARACTERES_3__1 \ 0x0F #define MASQUE_CARACTERES_3__2 \ 0x3F #define MASQUE_CARACTERES_3__3 \ 0x3F /* Cas {K1,K2,K3} : */ /* */ /* 1110.bbbb 10bb.bbbb 10bb.bbbb */ /* ---- -- ---- -- ---- */ /* 0 F 3 F 3 F */ /* */ #define DEBUT_CODES_CARACTERES_41 \ 0xF0 #define FIN___CODES_CARACTERES_41 \ 0xF3 #define MASQUE_CARACTERES_41_1 \ 0x03 #define MASQUE_CARACTERES_41_2 \ 0x3F #define MASQUE_CARACTERES_41_3 \ 0x3F #define MASQUE_CARACTERES_41_4 \ 0x3F /* Cas {K1,K2,K3,K4} : */ /* */ /* 1111.00bb 10bb.bbbb 10bb.bbbb 10bb.bbbb */ /* -- -- ---- -- ---- -- ---- */ /* 0 3 3 F 3 F 3 F */ /* */ #define DEBUT_CODES_CARACTERES_42 \ 0xF4 #define FIN___CODES_CARACTERES_42 \ 0xF4 #define MASQUE_CARACTERES_42_1 \ 0x00 #define MASQUE_CARACTERES_42_2 \ 0x0F #define MASQUE_CARACTERES_42_3 \ 0x3F #define MASQUE_CARACTERES_42_4 \ 0x3F /* Cas {K1,K2,K3,K4} : */ /* */ /* 1111.0100 1000.bbbb 10bb.bbbb 10bb.bbbb */ /* ---- -- ---- -- ---- */ /* 0 0 0 F 3 F 3 F */ /* */ #define CODE_A_DEFINIR_ULTERIEUREMENT \ "<CodeNonReconnu>" #define EXTENSION_xiMoG(code_xiMoG) \ chain_Aconcaten3(C_SLASH,code_xiMoG,C_SLASH) #define EXTENSION_M4(code_M4) \ chain_Aconcaten3(C_VERITABLE_ANTI_QUOTE,code_M4,C_VERITABLE_APOSTROPHE) DEFV(Local,DEFV(Positive,INIT(compteur_de_caracteres_quelconques,ZERO))); DEFV(Local,DEFV(Positive,INIT(compteur_de_caracteres_K_QD,ZERO))); /* Differents compteurs de caracteres... */ #define EDITION_DU_CODE(code_xiMoG) \ Bblock \ Test(IFNE_chaine(code_xiMoG,C_VIDE)) \ /* Test introduit le 20241211101916 pour le code '0xA0'... */ \ Bblock \ CAL2(Prin1("%s",code_xiMoG)); \ /* On utilise 'Prin1(...)' de facon a n'utiliser que 'STREAM_OUT'... */ \ INCR(compteur_de_caracteres_quelconques,chain_Xtaille(code_xiMoG)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock #define CODAGE_AVEC_EXTENSION(code_hexadecimal,code_xiMoG) \ Ca1e(code_hexadecimal) \ Bblock \ EDITION_DU_CODE(EXTENSION_xiMoG(code_xiMoG)); \ Eblock \ ECa1 #define CODAGE_SANS_EXTENSION(code_hexadecimal,code_xiMoG) \ Ca1e(code_hexadecimal) \ Bblock \ EDITION_DU_CODE(code_xiMoG); \ Eblock \ ECa1 #define TRAITEMENT_DES_CODES_STANDARDS \ Bblock \ DEFV(CHAR,INIT(DTb0(conversion_caractere_chaine),"?")); \ \ INCR(compteur_de_caracteres_K_QD,COND(IFEQ(caractere_courant__,K_QUOTE),I,ZERO)); \ /* Comptage des 'K_QUOTE's afin de faire des decoupages corrects des lignes qui, en */ \ /* particulier ne doivent pas avoir lieu a l'interieur d'une chaine '"..."'. */ \ \ Test(I3ET(IFGE(compteur_de_caracteres_quelconques,longueur_approximative_des_lignes) \ ,IFEQ(caractere_courant__,K_BLANC) \ ,EST_PAIR(compteur_de_caracteres_K_QD) \ ) \ ) \ Bblock \ EGAL(caractere_courant__,K_LF); \ /* Introduction d'un changement de ligne lorsque cela est necessaire et possible... */ \ CLIR(compteur_de_caracteres_quelconques); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(ITb0(conversion_caractere_chaine,PREMIER_CARACTERE),caractere_courant__); \ /* Conversion du caractere courant en une petite chaine... */ \ EDITION_DU_CODE(conversion_caractere_chaine); \ Eblock #define TRAITEMENT_DU_CODE_ADDITION \ Bblock \ EDITION_DU_CODE(EXTENSION_xiMoG("AdDiTiOn")); \ Eblock #define TRAITEMENT_DU_CODE_VIRGULE \ Bblock \ EDITION_DU_CODE(EXTENSION_xiMoG("ViRgUlE")); \ Eblock #define TRAITEMENT_DES_CODES_ASCII \ Bblock \ Choi(caractere_courant__) \ Bblock \ CODAGE_AVEC_EXTENSION(0xE0,"aG"); \ CODAGE_AVEC_EXTENSION(0xE1,"aA"); \ CODAGE_AVEC_EXTENSION(0xE2,"aC"); \ CODAGE_AVEC_EXTENSION(0xE4,"aT"); \ CODAGE_AVEC_EXTENSION(0xE6,"aE"); \ CODAGE_AVEC_EXTENSION(0xE7,"cC"); \ CODAGE_AVEC_EXTENSION(0xE8,"eG"); \ CODAGE_AVEC_EXTENSION(0xE9,"eA"); \ CODAGE_AVEC_EXTENSION(0xEA,"eC"); \ CODAGE_AVEC_EXTENSION(0xEB,"eT"); \ CODAGE_AVEC_EXTENSION(0xEE,"iC"); \ CODAGE_AVEC_EXTENSION(0xEF,"iT"); \ CODAGE_AVEC_EXTENSION(0xF4,"oC"); \ CODAGE_AVEC_EXTENSION(0xF6,"oT"); \ CODAGE_AVEC_EXTENSION(0x9C,"oE"); \ CODAGE_AVEC_EXTENSION(0xF9,"uG"); \ CODAGE_AVEC_EXTENSION(0xFB,"uC"); \ CODAGE_AVEC_EXTENSION(0xFC,"uT"); \ CODAGE_AVEC_EXTENSION(0xC1,"Aa"); \ CODAGE_AVEC_EXTENSION(0xC0,"Ag"); \ CODAGE_AVEC_EXTENSION(0xC9,"Ea"); \ CODAGE_AVEC_EXTENSION(0xCA,"Ec"); \ CODAGE_AVEC_EXTENSION(0xC8,"Eg"); \ CODAGE_AVEC_EXTENSION(0xD4,"Oc"); \ CODAGE_AVEC_EXTENSION(0x23,"Er"); \ /* Ceci est un peu etrange : lors d'un copier-coller d'un "o dans l'e" d'un texte WORD, */ \ /* le resultat est le caractere '#' dont le code est '0x23', d'ou cette substitution qui */ \ /* est un peu ennuyeuse au cas ou un caractere '#' figurerait reellement dans le WORD. */ \ /* Cela s'est vu dans 'v $xiMd/SIlVousPlaitDessineMoiLInfini.01$FRANCAIS$m4 d.un.trou.noir' */ \ /* aux environs du 20241211121320... */ \ /* */ \ /* Le 20241212080916, je crois avoir compris : le caractere '#' apparait lors du */ \ /* copier-coller de certains caracteres dans un WORD et non pas uniquement avec le */ \ /* "o dans l'e". La solution est donc de le coder avec un code inexistant dans */ \ /* 'v $xiMoG/MotsClefs.1$vv$sed' de facon a le reperer lors du 'Gserveur' ce qui permet */ \ /* de corriger ensuite manuellement. Je choisis "Er" pour "Error"... */ \ CODAGE_SANS_EXTENSION(0xA0,C_VIDE); \ CODAGE_SANS_EXTENSION(0xAB,C_VERITABLE_QUOTE); \ /* Il s'agit de la quote "ouvrante"... */ \ CODAGE_SANS_EXTENSION(0xBB,C_VERITABLE_QUOTE); \ /* Il s'agit de la quote "fermante"... */ \ \ Ca1e(K_PLUS) \ Bblock \ TRAITEMENT_DU_CODE_ADDITION; \ Eblock \ ECa1 \ \ Ca1e(K_VIRGULE) \ Bblock \ TRAITEMENT_DU_CODE_VIRGULE; \ Eblock \ ECa1 \ \ Defo \ Bblock \ TRAITEMENT_DES_CODES_STANDARDS; \ Eblock \ EDef \ Eblock \ ECho \ Eblock #define EDITION_D_UN_CODE_2(caractere_1,caractere_2,code_a_generer) \ CAge(IFET(IFEQ(INTE(caractere_courant__),caractere_1) \ ,IFEQ(INTE(caractere_suivant_1),caractere_2) \ ) \ ) \ Bblock \ EDITION_DU_CODE(code_a_generer); \ Eblock \ ECAg #define EDITION_D_UN_CODE_3(caractere_1,caractere_2,caractere_3,code_a_generer) \ CAge(I3ET(IFEQ(INTE(caractere_courant__),caractere_1) \ ,IFEQ(INTE(caractere_suivant_1),caractere_2) \ ,IFEQ(INTE(caractere_suivant_2),caractere_3) \ ) \ ) \ Bblock \ EDITION_DU_CODE(code_a_generer); \ Eblock \ ECAg #define EDITION_D_UN_CODE_4(caractere_1,caractere_2,caractere_3,caractere_4,code_a_generer) \ CAge(I4ET(IFEQ(INTE(caractere_courant__),caractere_1) \ ,IFEQ(INTE(caractere_suivant_1),caractere_2) \ ,IFEQ(INTE(caractere_suivant_2),caractere_3) \ ,IFEQ(INTE(caractere_suivant_3),caractere_4) \ ) \ ) \ Bblock \ EDITION_DU_CODE(code_a_generer); \ Eblock \ ECAg /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S C O D E S N O N R E C O N N U S : */ /* */ /*************************************************************************************************************************************/ BFonctionV #define NOMBRE_MINIMAL_DE_CHIFFRES_HEXADECIMAUX \ QUATRE \ /* Constante arbitraire faisant partie de la norme 'UTF-8'... */ DEFV(Common,DEFV(FonctionV,Generation_des_codes_non_reconnus(Nombre_de_composantes,ListeDesCodes,ListeDesMasques))) /* Fonction inspiree de 'v $xtc/UTF_8.01$vv$c'... */ DEFV(Argument,DEFV(Int,Nombre_de_composantes)); DEFV(Argument,DEFV(CHAR,DTb0(ListeDesCodes))); DEFV(Argument,DEFV(CHAR,DTb0(ListeDesMasques))); /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(CumulDesMasques,MASQUE_VIDE)); DEFV(Int,INIT(CumulDesCodes,MASQUE_VIDE)); DEFV(Int,INIT(DecalageCourant,ZERO)); DEFV(Int,INIT(index,UNDEF)); DEFV(CHAR,DTb1(code_genere,chain_taille("ZZx12345;"))); /* Le code donne en exemple ("ZZx12345;") correspond a la plus grande longueur possible... */ /*..............................................................................................................................*/ DoDe(index,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,Nombre_de_composantes),I); Bblock DEFV(Positive,INIT(MasqueCourant,ITb0(ListeDesMasques,INDX(index,PREMIER_CARACTERE)))); DEFV(Positive,INIT(CodeCourant,ITb0(ListeDesCodes,INDX(index,PREMIER_CARACTERE)))); EGAL(CumulDesMasques,OUIN(CumulDesMasques,DECG(MasqueCourant,DecalageCourant))); EGAL(CumulDesCodes,OUIN(CumulDesCodes,DECG(ETLO(CodeCourant,MasqueCourant),DecalageCourant))); INCR(DecalageCourant,INTE(LO2X(FLOT(MASK_TO_P2(MasqueCourant))))); Eblock EDoD CALS(SPrin2(code_genere ,"&#x%0*lX;" ,SHOR(MAX2(NOMBRE_MINIMAL_DE_CHIFFRES_HEXADECIMAUX ,DIVI(INTE(LO2X(FLOT(MASK_TO_P2(CumulDesMasques)))),NBITHX) ) ) ,CumulDesCodes ) ); /* On notera que le "field width specifier '*'" attend un type 'int', d'ou le 'SHOR(...)'. */ EDITION_DU_CODE(code_genere); RETU_VIDE Eblock EFonctionV /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D E C A R A C T E R E S C O D E S E N ' UTF-8 ' : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(mode_UTF_8,MODE_UTF_8)); /* S'agit-il du mode 'UTF-8' ('VRAI') ou du mode 'ASCII' ('FAUX') ? */ DEFV(Logical,INIT(editer_le_mode_ascii_en_hexadecimal,EDITER_LE_MODE_ASCII_EN_HEXADECIMAL)); /* En mode 'ASCII' faut-il editer en hexadecimal ('VRAI') ou des caracteres ('FAUX') ? */ DEFV(Positive,INIT(longueur_approximative_des_lignes,LONGUEUR_APPROXIMATIVE_DES_LIGNES)); /* Longueur approximative des lignes a generer... */ DEFV(Logical,INIT(generer_les_codes_non_definis,GENERER_LES_CODES_NON_DEFINIS)); /* Faut-il generer ('VRAI') les codes non reconnus ou bien interrompre le processus */ /* ('FAUX') ? Ceci fut introduit le 20250207103836... */ /*..............................................................................................................................*/ EGAL(Prme_____changer_le_stream,VRAI); EGAL(Prer_____changer_le_stream,VRAI); /* Et ce afin que toutes les sorties utilisent le meme "stream"... */ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("UTF_8=""U8=",mode_UTF_8); GET_ARGUMENT_N("ASCII=""AS=",mode_UTF_8); GET_ARGUMENT_L("hexadecimal=""hexa=",editer_le_mode_ascii_en_hexadecimal); GET_ARGUMENT_I("longueur_lignes=""ll=",longueur_approximative_des_lignes); GET_ARGUMENT_L("generer_codes=",generer_les_codes_non_definis); ) ); begin_nouveau_block Bblock DEFV(CHAR,INIT(caractere_courant__,K_UNDEF)); /* Caractere courant. */ Tant(GetcharT(caractere_courant__)) Bblock /* Le caractere courant de l'entree courante est recupere ; et on boucle */ /* sur cette recuperation tant que l'on n'est pas au bout du fichier. */ Test(IL_FAUT(mode_UTF_8)) /* Cas du mode 'UTF-8' : */ Bblock Test(INCLff(INTE(caractere_courant__) ,DEBUT_CODES_CARACTERES_1_ ,FIN___CODES_CARACTERES_1_ ) ) Bblock Choi(caractere_courant__) Bblock Ca1e(K_PLUS) Bblock TRAITEMENT_DU_CODE_ADDITION; Eblock ECa1 Ca1e(K_VIRGULE) Bblock TRAITEMENT_DU_CODE_VIRGULE; Eblock ECa1 Defo Bblock /* Tous les caracteres "standards" sont transmis integralement, sauf 'K_BLANC' lorsqu'il */ /* y a decoupage des lignes trop longues... */ TRAITEMENT_DES_CODES_STANDARDS; /* Et ce afin d'unifier toutes les sorties... */ Eblock EDef Eblock ECho Eblock ATes Bblock Eblock ETes Test(INCLff(INTE(caractere_courant__) ,DEBUT_CODES_CARACTERES_2_ ,FIN___CODES_CARACTERES_2_ ) ) Bblock DEFV(CHAR,INIT(caractere_suivant_1,K_UNDEF)); GET_CARACTERE_SUIVANT(caractere_suivant_1); CHoi(VRAI) /* Le 'VRAI' est du au fait que les expressions logiques des 'CAge(...)' doivent etre */ /* vraies lorsqu'un double code est reconnu... */ Bblock EDITION_D_UN_CODE_2(0xC2,0xB2,EXTENSION_M4("MiseEnExposant(2)")); EDITION_D_UN_CODE_2(0xC2,0xB3,EXTENSION_M4("MiseEnExposant(3)")); EDITION_D_UN_CODE_2(0xC3,0x80,EXTENSION_xiMoG("Ag")); EDITION_D_UN_CODE_2(0xC3,0x81,EXTENSION_xiMoG("Aa")); EDITION_D_UN_CODE_2(0xC3,0x88,EXTENSION_xiMoG("Eg")); EDITION_D_UN_CODE_2(0xC3,0x89,EXTENSION_xiMoG("Ea")); EDITION_D_UN_CODE_2(0xC3,0x8A,EXTENSION_xiMoG("Ec")); EDITION_D_UN_CODE_2(0xC3,0x94,EXTENSION_xiMoG("Oc")); EDITION_D_UN_CODE_2(0xC3,0x97,"×"); EDITION_D_UN_CODE_2(0xC3,0x9C,EXTENSION_xiMoG("oE")); EDITION_D_UN_CODE_2(0xC3,0xA0,EXTENSION_xiMoG("aG")); EDITION_D_UN_CODE_2(0xC3,0xA1,EXTENSION_xiMoG("aA")); EDITION_D_UN_CODE_2(0xC3,0xA2,EXTENSION_xiMoG("aC")); EDITION_D_UN_CODE_2(0xC3,0xA4,EXTENSION_xiMoG("aT")); EDITION_D_UN_CODE_2(0xC3,0xA6,EXTENSION_xiMoG("aE")); EDITION_D_UN_CODE_2(0xC3,0xA7,EXTENSION_xiMoG("cC")); EDITION_D_UN_CODE_2(0xC3,0xA8,EXTENSION_xiMoG("eG")); EDITION_D_UN_CODE_2(0xC3,0xA9,EXTENSION_xiMoG("eA")); EDITION_D_UN_CODE_2(0xC3,0xAA,EXTENSION_xiMoG("eC")); EDITION_D_UN_CODE_2(0xC3,0xAB,EXTENSION_xiMoG("eT")); EDITION_D_UN_CODE_2(0xC3,0xAE,EXTENSION_xiMoG("iC")); EDITION_D_UN_CODE_2(0xC3,0xAF,EXTENSION_xiMoG("iT")); EDITION_D_UN_CODE_2(0xC3,0xB2,"ò"); EDITION_D_UN_CODE_2(0xC3,0xB3,"ó"); EDITION_D_UN_CODE_2(0xC3,0xB4,EXTENSION_xiMoG("oC")); EDITION_D_UN_CODE_2(0xC3,0xB6,EXTENSION_xiMoG("oT")); EDITION_D_UN_CODE_2(0xC3,0xB9,EXTENSION_xiMoG("uG")); EDITION_D_UN_CODE_2(0xC3,0xBB,EXTENSION_xiMoG("uC")); EDITION_D_UN_CODE_2(0xC3,0xBC,EXTENSION_xiMoG("uT")); EDITION_D_UN_CODE_2(0xC5,0x93,EXTENSION_xiMoG("oE")); EDITION_D_UN_CODE_2(0xCB,0x86,"ˆ"); EDITION_D_UN_CODE_2(0xCB,0x8A,"ˊ"); EDITION_D_UN_CODE_2(0xCB,0x8B,"ˋ"); EDITION_D_UN_CODE_2(0xCF,0x80,"π"); EDITION_D_UN_CODE_2(0xCF,0x81,"ρ"); EDITION_D_UN_CODE_2(0xCF,0x82,"ς"); EDITION_D_UN_CODE_2(0xCF,0x83,"σ"); EDITION_D_UN_CODE_2(0xCF,0x84,"τ"); EDITION_D_UN_CODE_2(0xCF,0x85,"υ"); EDITION_D_UN_CODE_2(0xCF,0x86,"φ"); EDITION_D_UN_CODE_2(0xCF,0x87,"χ"); EDITION_D_UN_CODE_2(0xCF,0x88,"ψ"); EDITION_D_UN_CODE_2(0xCF,0x89,"ω"); DEfo Bblock Test(IL_FAUT(generer_les_codes_non_definis)) /* Test introduit le 20250207103836... */ Bblock DEFV(CHAR,INIS(DTb0(ListeDesCodes) ,IstructL02(caractere_courant__ ,caractere_suivant_1 ) ) ); DEFV(CHAR,INIS(DTb0(ListeDesMasques) ,IstructL02(MASQUE_CARACTERES_2__1 ,MASQUE_CARACTERES_2__2 ) ) ); CALS(Generation_des_codes_non_reconnus(DEUX,ListeDesCodes,ListeDesMasques)); Eblock ATes Bblock PRINT_ERREUR("un double code de type 2 n'est pas reconnu"); CAL1(Prer4("(ce double code de type 2 vaut /0x%*X 0x%*X/)" ,NHXOC,INTE(caractere_courant__) ,NHXOC,INTE(caractere_suivant_1) ) ); Exit(PROBLEMES); Eblock ETes Eblock EDEf Eblock ECho Eblock ATes Bblock Eblock ETes Test(INCLff(INTE(caractere_courant__) ,DEBUT_CODES_CARACTERES_3_ ,FIN___CODES_CARACTERES_3_ ) ) Bblock DEFV(CHAR,INIT(caractere_suivant_1,K_UNDEF)); DEFV(CHAR,INIT(caractere_suivant_2,K_UNDEF)); GET_CARACTERE_SUIVANT(caractere_suivant_1); GET_CARACTERE_SUIVANT(caractere_suivant_2); CHoi(VRAI) /* Le 'VRAI' est du au fait que les expressions logiques des 'CAge(...)' doivent etre */ /* vraies lorsqu'un triple code est reconnu... */ Bblock EDITION_D_UN_CODE_3(0xE0,0x20,0x74,EXTENSION_xiMoG("aG")); EDITION_D_UN_CODE_3(0xE2,0x63,0x65,EXTENSION_xiMoG("aC")); EDITION_D_UN_CODE_3(0xE2,0x80,0x8B,EXTENSION_M4("Mathematiques_RACX")); EDITION_D_UN_CODE_3(0xE2,0x80,0x99,EXTENSION_xiMoG("QuOtE_SiMpLe")); EDITION_D_UN_CODE_3(0xE2,0x80,0x94,"—"); EDITION_D_UN_CODE_3(0xE2,0x82,0x80,EXTENSION_M4("MiseEnIndice(0)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x81,EXTENSION_M4("MiseEnIndice(1)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x82,EXTENSION_M4("MiseEnIndice(2)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x83,EXTENSION_M4("MiseEnIndice(3)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x84,EXTENSION_M4("MiseEnIndice(4)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x85,EXTENSION_M4("MiseEnIndice(5)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x86,EXTENSION_M4("MiseEnIndice(6)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x87,EXTENSION_M4("MiseEnIndice(7)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x88,EXTENSION_M4("MiseEnIndice(8)")); EDITION_D_UN_CODE_3(0xE2,0x82,0x89,EXTENSION_M4("MiseEnIndice(9)")); EDITION_D_UN_CODE_3(0xE2,0x84,0xB5,EXTENSION_M4("Mathematiques_ALEF")); EDITION_D_UN_CODE_3(0xE2,0x88,0x92,"−"); EDITION_D_UN_CODE_3(0xE2,0x89,0xA0,EXTENSION_M4("Mathematiques_NE")); EDITION_D_UN_CODE_3(0xE2,0x89,0xA5,EXTENSION_M4("Mathematiques_GE")); EDITION_D_UN_CODE_3(0xEE,0x80,0xA0,CODE_A_DEFINIR_ULTERIEUREMENT); DEfo Bblock Test(IL_FAUT(generer_les_codes_non_definis)) /* Test introduit le 20250207103836... */ Bblock DEFV(CHAR,INIS(DTb0(ListeDesCodes) ,IstructL03(caractere_courant__ ,caractere_suivant_1 ,caractere_suivant_2 ) ) ); DEFV(CHAR,INIS(DTb0(ListeDesMasques) ,IstructL03(MASQUE_CARACTERES_3__1 ,MASQUE_CARACTERES_3__2 ,MASQUE_CARACTERES_3__3 ) ) ); CALS(Generation_des_codes_non_reconnus(TROIS,ListeDesCodes,ListeDesMasques)); Eblock ATes Bblock PRINT_ERREUR("un triple code de type 3 n'est pas reconnu"); CAL1(Prer6("(ce triple code de type 3 vaut /0x%*X 0x%*X 0x%*X/)" ,NHXOC,INTE(caractere_courant__) ,NHXOC,INTE(caractere_suivant_1) ,NHXOC,INTE(caractere_suivant_2) ) ); /* La presence des 'INTE(...)'s est du aux formats 'X' (qui deviennent en fait des 'lX' */ /* dans 'v $ xig/xxxx$FON Ftraitement_des_formats_de_sortie') et qui faisait en l'absence */ /* des 'INTE(...)'s apparaitre le dernier caractere sous la forme '7FFF000000xx'... */ Exit(PROBLEMES); Eblock ETes Eblock EDEf Eblock ECHo Eblock ATes Bblock Eblock ETes Test(INCLff(INTE(caractere_courant__) ,DEBUT_CODES_CARACTERES_41 ,FIN___CODES_CARACTERES_41 ) ) Bblock DEFV(CHAR,INIT(caractere_suivant_1,K_UNDEF)); DEFV(CHAR,INIT(caractere_suivant_2,K_UNDEF)); DEFV(CHAR,INIT(caractere_suivant_3,K_UNDEF)); GET_CARACTERE_SUIVANT(caractere_suivant_1); GET_CARACTERE_SUIVANT(caractere_suivant_2); GET_CARACTERE_SUIVANT(caractere_suivant_3); CHoi(VRAI) /* Le 'VRAI' est du au fait que les expressions logiques des 'CAge(...)' doivent etre */ /* vraies lorsqu'un quadruple code est reconnu... */ Bblock EDITION_D_UN_CODE_4(0xF0,0x9D,0x94,0xA0,"c"); EDITION_D_UN_CODE_4(0xF0,0x9F,0x98,0x8A,"😊"); DEfo Bblock Test(IL_FAUT(generer_les_codes_non_definis)) /* Test introduit le 20250207103836... */ Bblock DEFV(CHAR,INIS(DTb0(ListeDesCodes) ,IstructL04(caractere_courant__ ,caractere_suivant_1 ,caractere_suivant_2 ,caractere_suivant_3 ) ) ); DEFV(CHAR,INIS(DTb0(ListeDesMasques) ,IstructL04(MASQUE_CARACTERES_41_1 ,MASQUE_CARACTERES_41_2 ,MASQUE_CARACTERES_41_3 ,MASQUE_CARACTERES_41_4 ) ) ); CALS(Generation_des_codes_non_reconnus(QUATRE,ListeDesCodes,ListeDesMasques)); Eblock ATes Bblock PRINT_ERREUR("un quadruple code de type 41 n'est pas reconnu"); CAL1(Prer8("(ce quadruple code de type 41 vaut /0x%*X 0x%*X 0x%*X 0x%*X/)" ,NHXOC,INTE(caractere_courant__) ,NHXOC,INTE(caractere_suivant_1) ,NHXOC,INTE(caractere_suivant_2) ,NHXOC,INTE(caractere_suivant_3) ) ); Exit(PROBLEMES); Eblock ETes Eblock EDEf Eblock ECHo Eblock ATes Bblock Eblock ETes Test(INCLff(INTE(caractere_courant__) ,DEBUT_CODES_CARACTERES_42 ,FIN___CODES_CARACTERES_42 ) ) Bblock DEFV(CHAR,INIT(caractere_suivant_1,K_UNDEF)); DEFV(CHAR,INIT(caractere_suivant_2,K_UNDEF)); DEFV(CHAR,INIT(caractere_suivant_3,K_UNDEF)); GET_CARACTERE_SUIVANT(caractere_suivant_1); GET_CARACTERE_SUIVANT(caractere_suivant_2); GET_CARACTERE_SUIVANT(caractere_suivant_3); CHoi(VRAI) /* Le 'VRAI' est du au fait que les expressions logiques des 'CAge(...)' doivent etre */ /* vraies lorsqu'un quadruple code est reconnu... */ Bblock DEfo Bblock Test(IL_FAUT(generer_les_codes_non_definis)) /* Test introduit le 20250207103836... */ Bblock DEFV(CHAR,INIS(DTb0(ListeDesCodes) ,IstructL04(caractere_courant__ ,caractere_suivant_1 ,caractere_suivant_2 ,caractere_suivant_3 ) ) ); DEFV(CHAR,INIS(DTb0(ListeDesMasques) ,IstructL04(MASQUE_CARACTERES_42_1 ,MASQUE_CARACTERES_42_2 ,MASQUE_CARACTERES_42_3 ,MASQUE_CARACTERES_42_4 ) ) ); CALS(Generation_des_codes_non_reconnus(QUATRE,ListeDesCodes,ListeDesMasques)); Eblock ATes Bblock PRINT_ERREUR("un quadruple code de type 42 n'est pas reconnu"); CAL1(Prer8("(ce quadruple code de type 42 vaut /0x%*X 0x%*X 0x%*X 0x%*X/)" ,NHXOC,INTE(caractere_courant__) ,NHXOC,INTE(caractere_suivant_1) ,NHXOC,INTE(caractere_suivant_2) ,NHXOC,INTE(caractere_suivant_3) ) ); Exit(PROBLEMES); Eblock ETes Eblock EDEf Eblock ECHo Eblock ATes Bblock Eblock ETes Eblock ATes /* Cas du mode 'ASCII' : */ Bblock Test(IL_FAUT(editer_le_mode_ascii_en_hexadecimal)) Bblock CAL2(Prin2("%02X = '%c'\n",caractere_courant__,caractere_courant__)); Eblock ATes TRAITEMENT_DES_CODES_ASCII; ETes Eblock ETes Eblock ETan Eblock end_nouveau_block RETU_Commande; Eblock ECommande