--- rpl/src/instructions_s2.c 2010/02/10 10:14:24 1.3 +++ rpl/src/instructions_s2.c 2010/02/26 19:22:05 1.4 @@ -1019,14 +1019,22 @@ instruction_sst(struct_processus *s_etat void instruction_str_fleche(struct_processus *s_etat_processus) { + logical1 drapeau45; + logical1 presence_chaine; + struct_objet *s_objet; struct_objet *s_sous_objet; unsigned char *commande; + unsigned char *chaine_convertie; + unsigned char *ptr_e; + unsigned char *ptr_l; unsigned char *registre_definitions_chainees; unsigned char *registre_instruction_courante; unsigned char registre_interruption; + unsigned char *tampon; + unsigned long nombre_caracteres_supplementaires; unsigned long position_courante; (*s_etat_processus).erreur_execution = d_ex; @@ -1090,8 +1098,91 @@ instruction_str_fleche(struct_processus registre_instruction_courante = (*s_etat_processus) .instruction_courante; - (*s_etat_processus).definitions_chainees = (unsigned char *) - (*s_objet).objet; + // Comptage des caractères à protéger. + + drapeau45 = test_cfsf(s_etat_processus, 45); + cf(s_etat_processus, 45); + + tampon = formateur(s_etat_processus, 0, s_objet); + + if (drapeau45 == d_vrai) + { + sf(s_etat_processus, 45); + } + else + { + cf(s_etat_processus, 45); + } + + ptr_l = tampon; + presence_chaine = d_faux; + nombre_caracteres_supplementaires = 0; + + while((*ptr_l) != d_code_fin_chaine) + { + if ((*ptr_l) == '"') + { + presence_chaine = (presence_chaine == d_faux) ? d_vrai : d_faux; + } + + if (presence_chaine == d_vrai) + { + if ((*ptr_l) == '\\') + { + nombre_caracteres_supplementaires++; + } + } + + ptr_l++; + } + + // Échappement des caractères et remplacement dans les chaînes + // de caractères incluses. Le seul caractère protégé est le '\' + // qui est doublé. + + if ((chaine_convertie = malloc((strlen(tampon) + + nombre_caracteres_supplementaires + 1) * sizeof(unsigned char))) + == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + ptr_l = tampon; + ptr_e = chaine_convertie; + presence_chaine = d_faux; + + while((*ptr_l) != d_code_fin_chaine) + { + if ((*ptr_l) == '"') + { + presence_chaine = (presence_chaine == d_faux) ? d_vrai : d_faux; + } + + (*ptr_e) = (*ptr_l); + + if (presence_chaine == d_vrai) + { + if ((*ptr_l) == '\\') + { + (*(++ptr_e)) = '\\'; + } + } + + ptr_l++; + ptr_e++; + } + + (*ptr_e) = d_code_fin_chaine; + + (*s_etat_processus).definitions_chainees = chaine_convertie; + free(tampon); + + if ((*s_etat_processus).definitions_chainees == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } if (analyse_syntaxique(s_etat_processus) == d_absence_erreur) { @@ -1102,7 +1193,8 @@ instruction_str_fleche(struct_processus return; } - sprintf(commande, "<< %s >>", (unsigned char *) (*s_objet).objet); + sprintf(commande, "<< %s >>", (*s_etat_processus) + .definitions_chainees); (*s_etat_processus).instruction_courante = commande; recherche_type(s_etat_processus); @@ -1111,6 +1203,9 @@ instruction_str_fleche(struct_processus { liberation(s_etat_processus, s_objet); + free((*s_etat_processus).definitions_chainees); + free((*s_etat_processus).instruction_courante); + (*s_etat_processus).definitions_chainees = registre_definitions_chainees; (*s_etat_processus).instruction_courante = @@ -1125,6 +1220,8 @@ instruction_str_fleche(struct_processus .l_base_pile), &s_sous_objet) == d_erreur) { liberation(s_etat_processus, s_objet); + free((*s_etat_processus).definitions_chainees); + free((*s_etat_processus).instruction_courante); (*s_etat_processus).definitions_chainees = registre_definitions_chainees; @@ -1143,49 +1240,43 @@ instruction_str_fleche(struct_processus if (evaluation(s_etat_processus, s_sous_objet, 'I') == d_erreur) { + liberation(s_etat_processus, s_sous_objet); + liberation(s_etat_processus, s_objet); + + free((*s_etat_processus).definitions_chainees); + free((*s_etat_processus).instruction_courante); + + (*s_etat_processus).definitions_chainees = + registre_definitions_chainees; + (*s_etat_processus).instruction_courante = + registre_instruction_courante; + (*s_etat_processus).position_courante = + position_courante; + (*s_etat_processus).traitement_interruptible = registre_interruption; if ((*s_etat_processus).erreur_systeme == d_es) { - liberation(s_etat_processus, s_objet); - - (*s_etat_processus).definitions_chainees = - registre_definitions_chainees; - (*s_etat_processus).instruction_courante = - registre_instruction_courante; - (*s_etat_processus).position_courante = - position_courante; - (*s_etat_processus).erreur_execution = d_ex_expression_invalide; - return; } else { - liberation(s_etat_processus, s_objet); - - (*s_etat_processus).definitions_chainees = - registre_definitions_chainees; - (*s_etat_processus).instruction_courante = - registre_instruction_courante; - (*s_etat_processus).position_courante = - position_courante; - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; } - } - - (*s_etat_processus).traitement_interruptible = - registre_interruption; - liberation(s_etat_processus, s_sous_objet); - free(commande); + return; + } } else { + liberation(s_etat_processus, s_objet); + + free((*s_etat_processus).definitions_chainees); + free((*s_etat_processus).instruction_courante); + (*s_etat_processus).definitions_chainees = registre_definitions_chainees; (*s_etat_processus).instruction_courante = @@ -1198,6 +1289,15 @@ instruction_str_fleche(struct_processus return; } + + (*s_etat_processus).traitement_interruptible = + registre_interruption; + + liberation(s_etat_processus, s_sous_objet); + + free((*s_etat_processus).definitions_chainees); + free((*s_etat_processus).instruction_courante); + (*s_etat_processus).definitions_chainees = registre_definitions_chainees; (*s_etat_processus).instruction_courante =