--- rpl/src/instructions_c1.c 2010/06/24 10:10:42 1.9 +++ rpl/src/instructions_c1.c 2010/07/12 15:55:00 1.10 @@ -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; }