--- rpl/src/formateur_flux.c 2011/09/26 15:57:10 1.13 +++ rpl/src/formateur_flux.c 2011/11/17 22:21:16 1.14 @@ -241,4 +241,224 @@ formateur_flux(struct_processus *s_etat_ return(chaine); } + +/* +================================================================================ + Routine permettant de trouver le caractère suivant dans une chaîne +================================================================================ + Entrées : structure sur l'état du processus et chaîne courante +-------------------------------------------------------------------------------- + Sorties : pointeur sur le caractère suivant +-------------------------------------------------------------------------------- + Effets de bord : néant +================================================================================ +*/ + +static inline unsigned char * +prochain_caractere(struct_processus *s_etat_processus, unsigned char *chaine) +{ + unsigned char *suivant; + + if ((*chaine) == '\\') + { + if ((*(chaine + 1)) == '"') + { + suivant = chaine + 2; + } + else if ((*(chaine + 1)) == 'b') + { + suivant = chaine + 2; + } + else if ((*(chaine + 1)) == 'n') + { + suivant = chaine + 2; + } + else if ((*(chaine + 1)) == 't') + { + suivant = chaine + 2; + } + else if ((*(chaine + 1)) == 'x') + { + if ((*(chaine + 2)) != d_code_fin_chaine) + { + if ((*(chaine + 3)) != d_code_fin_chaine) + { + logical1 erreur; + + erreur = d_faux; + + switch(*(chaine + 2)) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + break; + + default: + erreur = d_vrai; + break; + } + + switch(*(chaine + 3)) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + break; + + default: + erreur = d_vrai; + break; + } + + if (erreur == d_vrai) + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : " + "Séquence d'échappement " + "inconnue [%d]\n", + (int) getpid()); + } + else + { + printf("+++Warning : Unknown " + "escape code " + "[%d]\n", (int) getpid()); + } + + return(NULL); + } + + suivant = chaine + 4; + } + else + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : " + "Séquence d'échappement " + "inconnue [%d]\n", (int) getpid()); + } + else + { + printf("+++Warning : Unknown escape code " + "[%d]\n", (int) getpid()); + } + + return(NULL); + } + } + else + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : " + "Séquence d'échappement " + "inconnue [%d]\n", (int) getpid()); + } + else + { + printf("+++Warning : Unknown escape code " + "[%d]\n", (int) getpid()); + } + + return(NULL); + } + } + else if ((*(chaine + 1)) == '\\') + { + suivant = chaine + 1; + } + else + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : Séquence d'échappement " + "inconnue [%d]\n", (int) getpid()); + } + else + { + printf("+++Warning : Unknown escape code " + "[%d]\n", (int) getpid()); + } + + return(NULL); + } + } + else + { + suivant = chaine + 1; + } + + return(suivant); +} + + +/* +================================================================================ + Routine donnant la longueur d'une chaîne de caractères +================================================================================ + Entrées : structure sur l'état du processus et chaîne +-------------------------------------------------------------------------------- + Sorties : longueur de la chaîne +-------------------------------------------------------------------------------- + Effets de bord : néant +================================================================================ +*/ + +integer8 +longueur_chaine(struct_processus *s_etat_processus, unsigned char *chaine) +{ + integer8 nombre_caracteres; + + unsigned char *pointeur; + + pointeur = chaine; + nombre_caracteres = 0; + + if ((*pointeur) == '\0') + { + return(0); + } + + do + { + if ((pointeur = prochain_caractere(s_etat_processus, pointeur)) == NULL) + { + return(0); + } + + nombre_caracteres++; + } while((*pointeur) != 0); + + return(nombre_caracteres); +} + // vim: ts=4