--- rpl/src/instructions_s11.c 2011/08/29 07:43:02 1.1 +++ rpl/src/instructions_s11.c 2019/02/03 14:41:01 1.38 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.3 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.31 + Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/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,67 @@ 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; + } + + default: + { + saut = 0; + 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);