--- rpl/src/instructions_f1.c 2010/04/21 13:45:47 1.10 +++ rpl/src/instructions_f1.c 2021/03/13 12:50:43 1.86 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.15 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.33 + Copyright (C) 1989-2021 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -53,14 +53,16 @@ instruction_fleche(struct_processus *s_e logical1 fin_scrutation; logical1 presence_expression_algebrique; + pthread_mutexattr_t attributs_mutex; + union_position_variable position_variable; unsigned char instruction_valide; unsigned char *tampon; unsigned char test_instruction; - unsigned long i; - unsigned long nombre_variables; + integer8 i; + integer8 nombre_variables; void (*fonction)(); @@ -83,19 +85,19 @@ instruction_fleche(struct_processus *s_e " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" - " %s, %s\n", + " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SQL, d_SLB, d_PRC, d_MTX); + d_SQL, d_SLB, d_PRC, d_MTX, d_REC); printf(" ...\n"); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" - " %s, %s\n", + " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SQL, d_SLB, d_PRC, d_MTX); + d_SQL, d_SLB, d_PRC, d_MTX, d_REC); if ((*s_etat_processus).langue == 'F') { @@ -108,7 +110,9 @@ instruction_fleche(struct_processus *s_e printf(" -> (variables) %s\n\n", d_RPN); - printf(" -> (variables) %s\n", d_ALG); + printf(" -> (variables) %s\n\n", d_ALG); + + printf(" -> (variables) %s\n", d_NOM); return; } @@ -187,6 +191,7 @@ instruction_fleche(struct_processus *s_e if ((*s_etat_processus).instruction_valide == 'N') { + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex) @@ -221,9 +226,19 @@ instruction_fleche(struct_processus *s_e else if ((*((struct_nom *) (*(*(*s_etat_processus).l_base_pile) .donnee).objet)).symbole == d_vrai) { - (*s_etat_processus).erreur_execution = d_ex_nom_invalide; - (*s_etat_processus).instruction_courante = tampon; - return; + (*s_etat_processus).niveau_courant++; + fin_scrutation = d_vrai; + presence_expression_algebrique = d_vrai; + + if (depilement(s_etat_processus, &((*s_etat_processus) + .l_base_pile), &s_expression_algebrique) + == d_erreur) + { + (*s_etat_processus).erreur_execution = + d_ex_manque_argument; + (*s_etat_processus).instruction_courante = tampon; + return; + } } else { @@ -290,6 +305,15 @@ instruction_fleche(struct_processus *s_e (*s_etat_processus).erreur_execution = d_ex_nom_invalide; return; } + else if ((*((struct_nom *) (*(*l_element_courant).donnee).objet)) + .symbole == d_vrai) + { + (*s_etat_processus).niveau_courant++; + fin_scrutation = d_vrai; + presence_expression_algebrique = d_vrai; + + s_expression_algebrique = (*l_element_courant).donnee; + } else { if ((s_objet_elementaire = copie_objet(s_etat_processus, @@ -339,13 +363,13 @@ instruction_fleche(struct_processus *s_e { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Nombre de variables de niveau %lu : %lu\n", + printf("[%d] Nombre de variables de niveau %lld : %lld\n", (int) getpid(), (*s_etat_processus).niveau_courant, nombre_variables); } else { - printf("[%d] Number of level %lu variables : %lu\n", + printf("[%d] Number of level %lld variables : %lld\n", (int) getpid(), (*s_etat_processus).niveau_courant, nombre_variables); } @@ -357,6 +381,12 @@ instruction_fleche(struct_processus *s_e for(i = 0; i < nombre_variables; i++) { + if (l_emplacement_valeurs == NULL) + { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; + return; + } + l_emplacement_valeurs = (*l_emplacement_valeurs).suivant; } @@ -422,8 +452,7 @@ instruction_fleche(struct_processus *s_e if (recherche_variable(s_etat_processus, s_variable.nom) == d_vrai) { if ((*s_etat_processus).niveau_courant == - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].niveau) + (*(*s_etat_processus).pointeur_variable_courante).niveau) { liberation(s_etat_processus, s_objet); free(s_variable.nom); @@ -452,7 +481,7 @@ instruction_fleche(struct_processus *s_e if (recherche_variable_statique(s_etat_processus, s_variable.nom, position_variable, ((*s_etat_processus).mode_execution_programme == 'Y') - ? 'P' : 'E') == d_vrai) + ? 'P' : 'E') != NULL) { // Variable statique à utiliser @@ -465,12 +494,10 @@ instruction_fleche(struct_processus *s_e s_variable.origine = 'E'; } - s_variable.objet = (*s_etat_processus) - .s_liste_variables_statiques[(*s_etat_processus) - .position_variable_statique_courante].objet; - (*s_etat_processus).s_liste_variables_statiques - [(*s_etat_processus) - .position_variable_statique_courante].objet = NULL; + s_variable.objet = (*(*s_etat_processus) + .pointeur_variable_statique_courante).objet; + (*(*s_etat_processus).pointeur_variable_statique_courante) + .objet = NULL; } else { @@ -546,8 +573,7 @@ instruction_fleche(struct_processus *s_e (*s_etat_processus).objet_courant; } - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + if (pthread_mutex_lock(&mutex_creation_variable_partagee) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -556,12 +582,19 @@ instruction_fleche(struct_processus *s_e if (recherche_variable_partagee(s_etat_processus, s_variable.nom, position_variable, ((*s_etat_processus).mode_execution_programme == 'Y') - ? 'P' : 'E') == d_vrai) + ? 'P' : 'E') != NULL) { // Variable partagée à utiliser + if (pthread_mutex_unlock(&mutex_creation_variable_partagee) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -584,21 +617,13 @@ instruction_fleche(struct_processus *s_e } else { - // Variable partagée à utiliser - // Variable partagee à créer + // Variable partagée à créer (*s_etat_processus).erreur_systeme = d_es; if ((s_variable_partagee.nom = malloc((strlen(s_variable.nom) + 1) * sizeof(unsigned char))) == NULL) { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -639,30 +664,32 @@ instruction_fleche(struct_processus *s_e (*s_etat_processus).objet_courant; } + // Création du mutex + + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, + PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&(s_variable_partagee.mutex), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + s_variable_partagee.objet = (*l_emplacement_valeurs).donnee; (*l_emplacement_valeurs).donnee = NULL; if (creation_variable_partagee(s_etat_processus, &s_variable_partagee) == d_erreur) { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - return; } - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + s_variable.objet = NULL; + + if (pthread_mutex_unlock(&mutex_creation_variable_partagee) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } - - s_variable.objet = NULL; } } else @@ -721,21 +748,37 @@ instruction_fleche(struct_processus *s_e if (presence_expression_algebrique == d_vrai) { + // Si l'expression algébrique est réduite à un simple nom, il + // s'agit toujours d'un nom symbolique. Il faut alors lui retirer + // son caractère de constante symbolique pour faire remonter les + // erreurs de type 'variable indéfinie'. + + if ((*s_expression_algebrique).type == NOM) + { + (*((struct_nom *) (*s_expression_algebrique).objet)).symbole = + d_faux; + } + evaluation(s_etat_processus, s_expression_algebrique, 'N'); + if ((*s_expression_algebrique).type == NOM) + { + (*((struct_nom *) (*s_expression_algebrique).objet)).symbole = + d_vrai; + } + if ((*s_etat_processus).mode_execution_programme == 'Y') { liberation(s_etat_processus, s_expression_algebrique); } + (*s_etat_processus).autorisation_empilement_programme = 'Y'; (*s_etat_processus).niveau_courant--; - if (retrait_variable_par_niveau(s_etat_processus) == d_erreur) + if (retrait_variables_par_niveau(s_etat_processus) == d_erreur) { return; } - - (*s_etat_processus).autorisation_empilement_programme = 'Y'; } return; @@ -761,8 +804,8 @@ instruction_fleche_list(struct_processus struct_objet *s_objet; - signed long i; - signed long nombre_elements; + integer8 i; + integer8 nombre_elements; (*s_etat_processus).erreur_execution = d_ex; @@ -837,8 +880,7 @@ instruction_fleche_list(struct_processus return; } - if ((unsigned long) nombre_elements >= - (*s_etat_processus).hauteur_pile_operationnelle) + if (nombre_elements >= (*s_etat_processus).hauteur_pile_operationnelle) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; @@ -979,8 +1021,6 @@ instruction_for(struct_processus *s_etat } } - empilement_pile_systeme(s_etat_processus); - if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { @@ -1006,8 +1046,7 @@ instruction_for(struct_processus *s_etat return; } - if (((*s_objet_2).type != INT) && - ((*s_objet_2).type != REL)) + if (((*s_objet_2).type != INT) && ((*s_objet_2).type != REL)) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); @@ -1016,13 +1055,20 @@ instruction_for(struct_processus *s_etat return; } - tampon = (*s_etat_processus).instruction_courante; - test_instruction = (*s_etat_processus).test_instruction; - instruction_valide = (*s_etat_processus).instruction_valide; - (*s_etat_processus).test_instruction = 'Y'; + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return; + } if ((*s_etat_processus).mode_execution_programme == 'Y') { + tampon = (*s_etat_processus).instruction_courante; + test_instruction = (*s_etat_processus).test_instruction; + instruction_valide = (*s_etat_processus).instruction_valide; + (*s_etat_processus).test_instruction = 'Y'; + if (recherche_instruction_suivante(s_etat_processus) == d_erreur) { return; @@ -1037,21 +1083,29 @@ instruction_for(struct_processus *s_etat free((*s_etat_processus).instruction_courante); (*s_etat_processus).instruction_courante = tampon; + (*s_etat_processus).instruction_valide = instruction_valide; + (*s_etat_processus).test_instruction = test_instruction; + + depilement_pile_systeme(s_etat_processus); (*s_etat_processus).erreur_execution = d_ex_nom_reserve; return; } + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); free((*s_etat_processus).instruction_courante); (*s_etat_processus).instruction_courante = tampon; + (*s_etat_processus).instruction_valide = instruction_valide; + (*s_etat_processus).test_instruction = test_instruction; if ((*s_etat_processus).erreur_execution != d_ex) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); + depilement_pile_systeme(s_etat_processus); return; } @@ -1061,6 +1115,8 @@ instruction_for(struct_processus *s_etat liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } @@ -1072,6 +1128,7 @@ instruction_for(struct_processus *s_etat { if ((*s_etat_processus).expression_courante == NULL) { + depilement_pile_systeme(s_etat_processus); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } @@ -1096,6 +1153,8 @@ instruction_for(struct_processus *s_etat liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle; return; } @@ -1104,6 +1163,8 @@ instruction_for(struct_processus *s_etat liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle; return; } @@ -1129,9 +1190,6 @@ instruction_for(struct_processus *s_etat liberation(s_etat_processus, s_objet_3); - (*s_etat_processus).test_instruction = test_instruction; - (*s_etat_processus).instruction_valide = instruction_valide; - (*(*s_etat_processus).l_base_pile_systeme).limite_indice_boucle = s_objet_1; if ((*s_etat_processus).mode_execution_programme == 'Y') @@ -1828,7 +1886,7 @@ instruction_fact(struct_processus *s_eta for (i = 1; i <= (*((integer8 *) (*s_objet_argument).objet)); i++) { - produit *= i; + produit *= (real8) i; } if ((s_objet_resultat = allocation(s_etat_processus, REL)) @@ -2152,7 +2210,7 @@ instruction_floor(struct_processus *s_et return; } - (*((integer8 *) (*s_objet_resultat).objet)) = + (*((integer8 *) (*s_objet_resultat).objet)) = (integer8) floor((*((real8 *) (*s_objet_argument).objet))); if (!((((*((integer8 *) (*s_objet_resultat).objet)) < @@ -2784,7 +2842,7 @@ instruction_fix(struct_processus *s_etat return; } - (*((logical8 *) (*s_objet).objet)) = + (*((logical8 *) (*s_objet).objet)) = (logical8) (*((integer8 *) (*s_objet_argument).objet)); i43 = test_cfsf(s_etat_processus, 43); @@ -2822,15 +2880,15 @@ instruction_fix(struct_processus *s_etat { if (valeur_binaire[i] == '0') { - cf(s_etat_processus, j++); + cf(s_etat_processus, (unsigned char) j++); } else { - sf(s_etat_processus, j++); + sf(s_etat_processus, (unsigned char) j++); } } - for(; j <= 56; cf(s_etat_processus, j++)); + for(; j <= 56; cf(s_etat_processus, (unsigned char) j++)); sf(s_etat_processus, 49); cf(s_etat_processus, 50);