--- rpl/src/instructions_f2.c 2010/02/10 10:14:22 1.3 +++ rpl/src/instructions_f2.c 2010/02/25 09:43:58 1.4 @@ -729,6 +729,12 @@ instruction_fleche_str(struct_processus struct_objet *s_objet_argument; struct_objet *s_objet_resultat; + unsigned char *ligne; + unsigned char *ptr_e; + unsigned char *ptr_l; + + unsigned long caracteres_echappement; + (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') @@ -781,15 +787,86 @@ instruction_fleche_str(struct_processus return; } - (*s_objet_resultat).objet = (void *) formateur(s_etat_processus, 0, - s_objet_argument); + ligne = formateur(s_etat_processus, 0, s_objet_argument); + caracteres_echappement = 0; + + // Reconstitution des caractères d'échappement + + ptr_l = ligne; + + while((*ptr_l) != d_code_fin_chaine) + { + switch(*ptr_l) + { + case '\"': + case '\b': + case '\n': + case '\t': + { + caracteres_echappement++; + break; + } + } + + ptr_l++; + } - if ((*s_objet_resultat).objet == NULL) + if (((*s_objet_resultat).objet = malloc((strlen(ligne) + 1 + + caracteres_echappement) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } + ptr_l = ligne; + ptr_e = (*s_objet_resultat).objet; + + while((*ptr_l) != d_code_fin_chaine) + { + switch(*ptr_l) + { + case '\"': + { + (*ptr_e) = '\\'; + (*(++ptr_e)) = '\"'; + break; + } + + case '\b': + { + (*ptr_e) = '\\'; + (*(++ptr_e)) = 'b'; + break; + } + + case '\n': + { + (*ptr_e) = '\\'; + (*(++ptr_e)) = 'n'; + break; + } + + case '\t': + { + (*ptr_e) = '\\'; + (*(++ptr_e)) = 't'; + break; + } + + default: + { + (*ptr_e) = (*ptr_l); + break; + } + } + + ptr_l++; + ptr_e++; + } + + (*ptr_e) = d_code_fin_chaine; + free(ligne); + liberation(s_etat_processus, s_objet_argument); if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),