--- rpl/src/instructions_r7.c 2018/05/30 09:27:37 1.38 +++ rpl/src/instructions_r7.c 2018/06/01 09:57:28 1.39 @@ -112,6 +112,8 @@ instruction_restart(struct_processus *s_ void instruction_regex(struct_processus *s_etat_processus) { + integer8 longueur; + regex_t expression; struct_liste_chainee *l_element_courant_ecriture; @@ -121,6 +123,8 @@ instruction_regex(struct_processus *s_et struct_objet *s_objet_argument_2; struct_objet *s_objet_resultat; + unsigned char *exp; + (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') @@ -181,7 +185,14 @@ instruction_regex(struct_processus *s_et { // Renvoie 0 ou -1 - if (regcomp(&expression, (const char *) (*s_objet_argument_1).objet, + if ((exp = formateur_flux(s_etat_processus, (*s_objet_argument_1).objet, + &longueur)) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (regcomp(&expression, (const char *) exp, REG_EXTENDED | REG_NOSUB) != 0) { liberation(s_etat_processus, s_objet_argument_1); @@ -208,13 +219,21 @@ instruction_regex(struct_processus *s_et } regfree(&expression); + free(exp); } else if (((*s_objet_argument_1).type == CHN) && ((*s_objet_argument_2).type == LST)) { // Renvoie une liste de chaînes qui correspondent - if (regcomp(&expression, (const char *) (*s_objet_argument_1).objet, + if ((exp = formateur_flux(s_etat_processus, (*s_objet_argument_1).objet, + &longueur)) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (regcomp(&expression, (const char *) exp, REG_EXTENDED | REG_NOSUB) != 0) { liberation(s_etat_processus, s_objet_argument_1); @@ -306,6 +325,7 @@ instruction_regex(struct_processus *s_et } regfree(&expression); + free(exp); } else {