--- rpl/src/instructions_s11.c 2011/08/29 07:43:02 1.1 +++ rpl/src/instructions_s11.c 2011/08/29 10:29:31 1.2 @@ -44,6 +44,9 @@ instruction_srev(struct_processus *s_eta unsigned char *ptr_e; unsigned char *ptr_l; + unsigned int i; + unsigned int saut; + if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n SREV "); @@ -93,18 +96,61 @@ instruction_srev(struct_processus *s_eta (*s_objet_argument).objet) + 1) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; } ptr_l = (unsigned char *) (*s_objet_argument).objet; ptr_e = ((unsigned char *) (*s_objet_resultat).objet) + strlen((unsigned char *) (*s_objet_argument).objet); - (*(ptr_e + 1)) = d_code_fin_chaine; + (*ptr_e) = d_code_fin_chaine; while((*ptr_l) != d_code_fin_chaine) { - (*ptr_e) = (*ptr_l); - ptr_l++; - ptr_e--; + if ((*ptr_l) == '\\') + { + // On n'inverse pas une séquence d'échappement. + // Les séquences d'échappement valides sont : + // '\\', '\"', '\b', '\n', '\t' et '\x??'. + + switch(*(ptr_l + 1)) + { + case '\\': + case '"': + case 'b': + case 'n': + case 't': + { + saut = 2; + break; + } + + case 'x': + { + saut = 4; + break; + } + } + + for(i = 0; i < saut; i++) + { + if (*(ptr_l + i) == d_code_fin_chaine) + { + saut = i; + break; + } + + (*((ptr_e - saut) + i)) = (*(ptr_l + i)); + } + + ptr_e -= saut; + ptr_l += saut; + } + else + { + ptr_e--; + (*ptr_e) = (*ptr_l); + ptr_l++; + } } liberation(s_etat_processus, s_objet_argument);