--- rpl/src/rplexternals.h 2013/03/29 10:30:32 1.47 +++ rpl/src/rplexternals.h 2013/04/02 11:56:33 1.50 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 + RPL/2 (R) version 4.1.14 Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -960,19 +960,22 @@ #define setString(object, string) do { \ ifIsString(object) \ { \ - if ((*object).nombre_occurrences > 1) \ + if (string == NULL) executionError("Nullified string"); else \ { \ - struct_objet *__tmp_object; \ - if ((__tmp_object = copie_objet(object, 'O')) == NULL) \ + if ((*object).nombre_occurrences > 1) \ + { \ + struct_objet *__tmp_object; \ + if ((__tmp_object = copie_objet(object, 'O')) == NULL) \ + systemError("Memory allocation error"); \ + liberation(object); \ + object = __tmp_object; \ + } \ + free((unsigned char *) (*object).objet); \ + if (((*object).objet = malloc((strlen(string) + 1) * \ + sizeof(unsigned char))) == NULL) \ systemError("Memory allocation error"); \ - liberation(object); \ - object = __tmp_object; \ + strcpy((char *) (*object).objet, string); \ } \ - free((unsigned char *) (*object).objet); \ - if (((*object).objet = malloc((strlen(string) + 1) * \ - sizeof(unsigned char))) == NULL) \ - systemError("Memory allocation error"); \ - strcpy((char *) (*object).objet, string); \ } \ else executionError("Type mistmatch error"); } while(0) @@ -1071,18 +1074,32 @@ #define removeObjectFromList(list, object) do { \ ifIsList(list) \ { \ - if ((*object).objet == NULL) \ + if ((*list).objet != NULL) \ { \ - struct_objet *__tmp_object; \ - if ((__tmp_object = copie_objet(list, 'N')) == NULL) \ - systemError("Memory allocation error"); \ - liberation(object); \ - object = __tmp_object; \ - \ - \ - \ - \ - } \ + struct_liste_chainee *__current; \ + struct_liste_chainee *__previous; \ + __current = (*list).objet; \ + __previous = NULL; \ + if ((*__current).donnee == object) \ + { \ + (*list).objet = (*__current).suivant; \ + } \ + else \ + { \ + while(__current != NULL) \ + { \ + if ((*__current).donnee == object) \ + { \ + (*__previous).suivant = (*__current).suivant; \ + break; \ + } \ + __previous = __current; \ + __current = (*__current).suivant; \ + } \ + } \ + liberation((*__current).donnee); \ + free(__current); \ + } \ } \ else executionError("Type mistmatch error"); } while(0)