--- rpl/src/instructions_g2.c 2013/02/27 17:11:42 1.43 +++ rpl/src/instructions_g2.c 2018/05/30 09:27:34 1.64 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 - Copyright (C) 1989-2013 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. @@ -48,9 +48,13 @@ instruction_get(struct_processus *s_etat struct_objet *s_objet_element; struct_objet *s_objet_resultat; - unsigned long indice_i; - unsigned long indice_j; - unsigned long nombre_dimensions; + integer8 indice_i; + integer8 indice_j; + integer8 nombre_dimensions; + + unsigned char *registre_instruction_courante; + unsigned char registre_instruction_valide; + unsigned char registre_test; (*s_etat_processus).erreur_execution = d_ex; @@ -1236,14 +1240,76 @@ instruction_get(struct_processus *s_etat return; } - if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), - s_objet_resultat) == d_erreur) + liberation(s_etat_processus, s_objet_1); + liberation(s_etat_processus, s_objet_2); + + if ((*s_objet_resultat).type == NOM) { - return; + if ((*((struct_nom *) (*s_objet_resultat).objet)).symbole == d_faux) + { + if (evaluation(s_etat_processus, s_objet_resultat, 'E') == d_erreur) + { + return; + } + } + else + { + if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), + s_objet_resultat) == d_erreur) + { + return; + } + } } + else if ((*s_objet_resultat).type == FCT) + { + registre_test = (*s_etat_processus).test_instruction; + registre_instruction_courante = (*s_etat_processus) + .instruction_courante; + registre_instruction_valide = (*s_etat_processus) + .instruction_valide; - liberation(s_etat_processus, s_objet_1); - liberation(s_etat_processus, s_objet_2); + (*s_etat_processus).test_instruction = 'Y'; + (*s_etat_processus).instruction_courante = + (*((struct_fonction *) (*s_objet_resultat).objet)).nom_fonction; + + analyse(s_etat_processus, NULL); + + (*s_etat_processus).test_instruction = registre_test; + (*s_etat_processus).instruction_courante = + registre_instruction_courante; + + if (((*s_etat_processus).instruction_valide == 'Y') && + (*s_etat_processus).constante_symbolique == 'Y') + { + if (evaluation(s_etat_processus, s_objet_resultat, 'E') == d_erreur) + { + (*s_etat_processus).instruction_valide = + registre_instruction_valide; + return; + } + } + else + { + if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), + s_objet_resultat) == d_erreur) + { + (*s_etat_processus).instruction_valide = + registre_instruction_valide; + return; + } + } + + (*s_etat_processus).instruction_valide = registre_instruction_valide; + } + else + { + if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), + s_objet_resultat) == d_erreur) + { + return; + } + } return; } @@ -1274,10 +1340,14 @@ instruction_geti(struct_processus *s_eta struct_objet *s_objet_3; struct_objet *s_objet_resultat; - unsigned long indice_i; - unsigned long indice_j; - unsigned long nombre_dimensions; - unsigned long nombre_elements; + integer8 indice_i; + integer8 indice_j; + integer8 nombre_dimensions; + integer8 nombre_elements; + + unsigned char *registre_instruction_courante; + unsigned char registre_instruction_valide; + unsigned char registre_test; (*s_etat_processus).erreur_execution = d_ex; @@ -2364,10 +2434,72 @@ instruction_geti(struct_processus *s_eta return; } - if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), - s_objet_resultat) == d_erreur) + if ((*s_objet_resultat).type == NOM) { - return; + if ((*((struct_nom *) (*s_objet_resultat).objet)).symbole == d_faux) + { + if (evaluation(s_etat_processus, s_objet_resultat, 'E') == d_erreur) + { + return; + } + } + else + { + if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), + s_objet_resultat) == d_erreur) + { + return; + } + } + } + else if ((*s_objet_resultat).type == FCT) + { + registre_test = (*s_etat_processus).test_instruction; + registre_instruction_courante = (*s_etat_processus) + .instruction_courante; + registre_instruction_valide = (*s_etat_processus) + .instruction_valide; + + (*s_etat_processus).test_instruction = 'Y'; + (*s_etat_processus).instruction_courante = + (*((struct_fonction *) (*s_objet_resultat).objet)).nom_fonction; + + analyse(s_etat_processus, NULL); + + (*s_etat_processus).test_instruction = registre_test; + (*s_etat_processus).instruction_courante = + registre_instruction_courante; + + if (((*s_etat_processus).instruction_valide == 'Y') && + (*s_etat_processus).constante_symbolique == 'Y') + { + if (evaluation(s_etat_processus, s_objet_resultat, 'E') == d_erreur) + { + (*s_etat_processus).instruction_valide = + registre_instruction_valide; + return; + } + } + else + { + if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), + s_objet_resultat) == d_erreur) + { + (*s_etat_processus).instruction_valide = + registre_instruction_valide; + return; + } + } + + (*s_etat_processus).instruction_valide = registre_instruction_valide; + } + else + { + if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), + s_objet_resultat) == d_erreur) + { + return; + } } return;