--- rpl/src/instructions_p4.c 2010/07/14 14:19:37 1.10 +++ rpl/src/instructions_p4.c 2020/01/10 11:15:47 1.74 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2020 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -254,8 +254,10 @@ instruction_prst(struct_processus *s_eta } } + routine_recursive = 2; impression_pile(s_etat_processus, (*s_etat_processus).l_base_pile, 'E', 1); + routine_recursive = 0; return; } @@ -333,8 +335,10 @@ instruction_prstc(struct_processus *s_et } } + routine_recursive = 2; impression_pile(s_etat_processus, (*s_etat_processus).l_base_pile, 'C', 1); + routine_recursive = 0; return; } @@ -414,37 +418,19 @@ instruction_prvar(struct_processus *s_et return; } - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet != NULL) + if ((*(*s_etat_processus).pointeur_variable_courante).objet != NULL) { - formateur_tex(s_etat_processus, (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet, 'N'); + formateur_tex(s_etat_processus, (*(*s_etat_processus) + .pointeur_variable_courante).objet, 'N'); } else { - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - if (recherche_variable_partagee(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].nom, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .variable_partagee, (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].origine) - == d_faux) + (*(*s_etat_processus).pointeur_variable_courante).nom, + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee, (*(*s_etat_processus) + .pointeur_variable_courante).origine) == 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; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; @@ -453,12 +439,10 @@ instruction_prvar(struct_processus *s_et } formateur_tex(s_etat_processus, (*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet, 'N'); + .pointeur_variable_partagee_courante).objet, 'N'); 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; @@ -486,9 +470,13 @@ instruction_prvar(struct_processus *s_et void instruction_prusr(struct_processus *s_etat_processus) { + integer8 i; + integer8 j; + integer8 nb_variables; + struct_objet s_objet; - unsigned long i; + struct_tableau_variables *tableau; (*s_etat_processus).erreur_execution = d_ex; @@ -523,26 +511,52 @@ instruction_prusr(struct_processus *s_et } } + nb_variables = nombre_variables(s_etat_processus); + + if ((tableau = malloc(((size_t) nb_variables) * + sizeof(struct_tableau_variables))) == NULL) + { + liberation_mutexes_arbre_variables_partagees(s_etat_processus, + (*(*s_etat_processus).s_arbre_variables_partagees)); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + nb_variables = liste_variables(s_etat_processus, tableau); s_objet.type = CHN; - for(i = 0; i < (*s_etat_processus).nombre_variables; i++) + for(i = 0; i < nb_variables; i++) { - if ((s_objet.objet = malloc((strlen((*s_etat_processus) - .s_liste_variables[i].nom) + 64) * sizeof(unsigned char))) - == NULL) + if ((s_objet.objet = malloc((strlen(tableau[i].nom) + 64) + * sizeof(unsigned char))) == NULL) { + for(j = i; j < nb_variables; j++) + { + if (tableau[j].mutex != NULL) + { + pthread_mutex_unlock(tableau[i].mutex); + } + } + + free(tableau); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - sprintf((unsigned char *) s_objet.objet, "\\noindent %s [%lu]\n", - (*s_etat_processus).s_liste_variables[i].nom, - (*s_etat_processus).s_liste_variables[i].niveau); + sprintf((unsigned char *) s_objet.objet, "\\\\noindent %s [%lld]\n", + tableau[i].nom, tableau[i].niveau); + + if (tableau[i].mutex != NULL) + { + pthread_mutex_unlock(tableau[i].mutex); + } formateur_tex(s_etat_processus, &s_objet, 'N'); free(s_objet.objet); } + free(tableau); return; } @@ -562,14 +576,13 @@ instruction_prusr(struct_processus *s_et void instruction_prmd(struct_processus *s_etat_processus) { + long i; + long j; long longueur_utile; long longueur_utile_limite; struct_objet s_objet; - unsigned long i; - unsigned long j; - (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') @@ -1288,7 +1301,7 @@ instruction_perm(struct_processus *s_eta return; } - if (fabs(c - floor(c)) < fabs(ceil(c) - c)) + if (abs(c - floor(c)) < fabs(ceil(c) - c)) { (*((integer8 *) (*s_objet_resultat).objet)) = (integer8) floor(c); @@ -1337,15 +1350,11 @@ instruction_perm(struct_processus *s_eta void instruction_psdev(struct_processus *s_etat_processus) { - logical1 presence_variable; - - long i; - struct_objet *s_objet_statistique; struct_objet *s_objet_resultat; struct_objet *s_objet_temporaire; - unsigned long nombre_colonnes; + integer8 nombre_colonnes; (*s_etat_processus).erreur_execution = d_ex; @@ -1384,75 +1393,38 @@ instruction_psdev(struct_processus *s_et * Recherche d'une variable globale référencée par SIGMA */ - if (recherche_variable(s_etat_processus, ds_sdat) == d_faux) + if (recherche_variable_globale(s_etat_processus, ds_sdat) == d_faux) { /* * Aucune variable SIGMA */ (*s_etat_processus).erreur_systeme = d_es; - (*s_etat_processus).erreur_execution = d_ex_absence_observations; - return; - } - else - { - /* - * Il existe une variable locale SIGMA. Reste à vérifier l'existence - * d'une variable SIGMA globale... - */ - i = (*s_etat_processus).position_variable_courante; - presence_variable = d_faux; - - while(i >= 0) + if ((*s_etat_processus).erreur_execution == d_ex) { - if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, - ds_sdat) == 0) && ((*s_etat_processus) - .s_liste_variables[i].niveau == 1)) - { - presence_variable = d_vrai; - break; - } - - i--; + (*s_etat_processus).erreur_execution = d_ex_absence_observations; } - if (presence_variable == d_faux) + return; + } + else + { + if (((*(*(*s_etat_processus).pointeur_variable_courante).objet) + .type != MIN) && ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).type != MRL)) { - (*s_etat_processus).erreur_execution = d_ex_absence_observations; + (*s_etat_processus).erreur_execution = + d_ex_matrice_statistique_invalide; return; } - else - { - (*s_etat_processus).position_variable_courante = i; - - if (((*s_etat_processus).s_liste_variables[i]).objet == NULL) - { - (*s_etat_processus).erreur_execution = - d_ex_variable_partagee; - return; - } - - if (((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet)) - .type != MIN) && ((*((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet)).type != MRL)) - { - (*s_etat_processus).erreur_execution = - d_ex_matrice_statistique_invalide; - return; - } - nombre_colonnes = (*((struct_matrice *) (*((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet)).objet)) - .nombre_colonnes; - } + nombre_colonnes = (*((struct_matrice *) (*(*(*s_etat_processus) + .pointeur_variable_courante).objet).objet)).nombre_colonnes; } - s_objet_statistique = ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]).objet; + s_objet_statistique = (*(*s_etat_processus).pointeur_variable_courante) + .objet; if (((*s_objet_statistique).type == MIN) || ((*s_objet_statistique).type == MRL)) @@ -1464,6 +1436,7 @@ instruction_psdev(struct_processus *s_et } if (((*s_objet_resultat).objet = ecart_type_statistique( + s_etat_processus, (struct_matrice *) (*s_objet_statistique).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -1555,15 +1528,11 @@ instruction_psdev(struct_processus *s_et void instruction_pvar(struct_processus *s_etat_processus) { - logical1 presence_variable; - - long i; - struct_objet *s_objet_statistique; struct_objet *s_objet_resultat; struct_objet *s_objet_temporaire; - unsigned long nombre_colonnes; + integer8 nombre_colonnes; (*s_etat_processus).erreur_execution = d_ex; @@ -1602,75 +1571,38 @@ instruction_pvar(struct_processus *s_eta * Recherche d'une variable globale référencée par SIGMA */ - if (recherche_variable(s_etat_processus, ds_sdat) == d_faux) + if (recherche_variable_globale(s_etat_processus, ds_sdat) == d_faux) { /* * Aucune variable SIGMA */ (*s_etat_processus).erreur_systeme = d_es; - (*s_etat_processus).erreur_execution = d_ex_absence_observations; - return; - } - else - { - /* - * Il existe une variable locale SIGMA. Reste à vérifier l'existence - * d'une variable SIGMA globale... - */ - - i = (*s_etat_processus).position_variable_courante; - presence_variable = d_faux; - while(i >= 0) + if ((*s_etat_processus).erreur_execution == d_ex) { - if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, - ds_sdat) == 0) && ((*s_etat_processus) - .s_liste_variables[i].niveau == 1)) - { - presence_variable = d_vrai; - break; - } - - i--; + (*s_etat_processus).erreur_execution = d_ex_absence_observations; } - if (presence_variable == d_faux) + return; + } + else + { + if (((*(*(*s_etat_processus).pointeur_variable_courante).objet) + .type != MIN) && ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).type != MRL)) { - (*s_etat_processus).erreur_execution = d_ex_absence_observations; + (*s_etat_processus).erreur_execution = + d_ex_matrice_statistique_invalide; return; } - else - { - (*s_etat_processus).position_variable_courante = i; - if (((*s_etat_processus).s_liste_variables[i]).objet == NULL) - { - (*s_etat_processus).erreur_execution = - d_ex_variable_partagee; - return; - } - - if (((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet)) - .type != MIN) && ((*((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet)).type != MRL)) - { - (*s_etat_processus).erreur_execution = - d_ex_matrice_statistique_invalide; - return; - } - - nombre_colonnes = (*((struct_matrice *) (*((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet)).objet)) - .nombre_colonnes; - } + nombre_colonnes = (*((struct_matrice *) (*(*(*s_etat_processus) + .pointeur_variable_courante).objet).objet)).nombre_colonnes; } - s_objet_statistique = ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]).objet; + s_objet_statistique = (*(*s_etat_processus).pointeur_variable_courante) + .objet; if (((*s_objet_statistique).type == MIN) || ((*s_objet_statistique).type == MRL)) @@ -1682,8 +1614,8 @@ instruction_pvar(struct_processus *s_eta return; } - if (((*s_objet_resultat).objet = variance_statistique((struct_matrice *) - (*s_objet_statistique).objet, 'P')) == NULL) + if (((*s_objet_resultat).objet = variance_statistique(s_etat_processus, + (struct_matrice *) (*s_objet_statistique).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return;