--- rpl/src/instructions_c1.c 2010/04/07 13:45:04 1.6 +++ rpl/src/instructions_c1.c 2011/05/09 13:52:13 1.18.2.3 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.14 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.0.24 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -670,6 +670,8 @@ instruction_ceil(struct_processus *s_eta void instruction_case(struct_processus *s_etat_processus) { + struct_liste_pile_systeme *l_element_courant; + struct_objet *s_objet; (*s_etat_processus).erreur_execution = d_ex; @@ -712,9 +714,28 @@ instruction_case(struct_processus *s_eta return; } - if ((*(*s_etat_processus).l_base_pile_systeme).clause == 'S') + l_element_courant = (*s_etat_processus).l_base_pile_systeme; + + while(l_element_courant != NULL) { + if (((*l_element_courant).clause == 'S') || + ((*l_element_courant).clause == 'C') || + ((*l_element_courant).clause == 'K')) + { + break; + } + l_element_courant = (*l_element_courant).suivant; + } + + if (l_element_courant == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_pile_vide; + return; + } + + if ((*l_element_courant).clause == 'S') + { /* * Première apparition de l'instruction CASE dans la structure de test. */ @@ -726,13 +747,12 @@ instruction_case(struct_processus *s_eta return; } - (*(*s_etat_processus).l_base_pile_systeme).objet_de_test = s_objet; - (*(*s_etat_processus).l_base_pile_systeme).clause = 'K'; + (*l_element_courant).objet_de_test = s_objet; + (*l_element_courant).clause = 'K'; } if ((s_objet = copie_objet(s_etat_processus, - (*(*s_etat_processus).l_base_pile_systeme) - .objet_de_test, 'P')) == NULL) + (*l_element_courant).objet_de_test, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -744,6 +764,21 @@ instruction_case(struct_processus *s_eta return; } + /* + * Empilement sur la pile système ne servant qu'à la bonne exécution + * des reprises sur erreur + */ + + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return; + } + + (*(*s_etat_processus).l_base_pile_systeme).clause = + (*l_element_courant).clause; + (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'K'; return; }