--- rpl/src/instructions_t1.c 2010/02/10 10:14:25 1.3 +++ rpl/src/instructions_t1.c 2010/07/13 09:39:14 1.12 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.11 + RPL/2 (R) version 4.0.17 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -214,6 +214,8 @@ instruction_then(struct_processus *s_eta struct_liste_chainee *s_registre; + struct_liste_pile_systeme *l_element_courant; + struct_objet *s_objet; unsigned char *instruction_majuscule; @@ -343,8 +345,7 @@ instruction_then(struct_processus *s_eta return; } - if (((*s_objet).type == INT) || - ((*s_objet).type == REL)) + if (((*s_objet).type == INT) || ((*s_objet).type == REL)) { if ((*s_objet).type == INT) { @@ -365,15 +366,33 @@ instruction_then(struct_processus *s_eta * THEN et ELSE ou END. */ - if (((*(*s_etat_processus).l_base_pile_systeme).clause != - 'K') && ((*(*s_etat_processus).l_base_pile_systeme) - .clause != 'C')) + if (((*(*s_etat_processus).l_base_pile_systeme).clause == + 'I') || ((*(*s_etat_processus).l_base_pile_systeme).clause + == 'X')) { (*(*s_etat_processus).l_base_pile_systeme).clause = 'T'; } else { - (*(*s_etat_processus).l_base_pile_systeme).clause = 'Q'; + if ((*s_etat_processus).l_base_pile_systeme == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_pile_vide; + return; + } + + l_element_courant = (*(*s_etat_processus).l_base_pile_systeme) + .suivant; + + while(l_element_courant != NULL) + { + if ((*l_element_courant).clause == 'K') + { + (*l_element_courant).clause = 'Q'; + break; + } + + l_element_courant = (*l_element_courant).suivant; + } } } else @@ -480,6 +499,7 @@ instruction_then(struct_processus *s_eta } else if (strcmp(instruction_majuscule, "END") == 0) { + instruction_end(s_etat_processus); drapeau_fin = d_vrai; } else @@ -592,9 +612,8 @@ instruction_then(struct_processus *s_eta if (((*(*s_etat_processus).l_base_pile_systeme) .clause != 'K') && ((*(*s_etat_processus) - .l_base_pile_systeme) .clause != 'C')) + .l_base_pile_systeme).clause != 'C')) { - /* * Traitement de IF/THEN/ELSEIF/THEN/ * ELSE/END @@ -640,6 +659,8 @@ instruction_then(struct_processus *s_eta } else if (fonction == instruction_end) { + fonction(s_etat_processus); + execution = d_vrai; drapeau_fin = d_vrai; } else @@ -699,7 +720,6 @@ instruction_then(struct_processus *s_eta } liberation(s_etat_processus, s_objet); - return; }