--- rpl/src/instructions_r7.c 2015/11/26 11:44:39 1.31 +++ rpl/src/instructions_r7.c 2018/06/01 09:57:28 1.39 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.24 - Copyright (C) 1989-2015 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.29 + Copyright (C) 1989-2018 Dr. BERTRAND Joël This file is part of RPL/2. @@ -74,7 +74,7 @@ instruction_restart(struct_processus *s_ } envoi_signal_processus((*s_etat_processus).pid_processus_pere, - rpl_sigabort); + rpl_sigabort, d_faux); (*s_etat_processus).requete_arret = 'Y'; attente.tv_sec = 0; @@ -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 {