version 1.37, 2012/10/04 15:21:26
|
version 1.77, 2025/04/15 10:17:51
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.1.11 |
RPL/2 (R) version 4.1.36 |
Copyright (C) 1989-2012 Dr. BERTRAND Joël |
Copyright (C) 1989-2025 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 25
|
Line 25
|
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Routine d'ajout d'un bouchon dans la liste des variables statiques |
|
================================================================================ |
|
Entrée : |
|
-------------------------------------------------------------------------------- |
|
Sortie : |
|
-------------------------------------------------------------------------------- |
|
Effets de bords : néant |
|
================================================================================ |
|
*/ |
|
|
|
// Routine ajoutant à la liste des variables statiques créées un 'bouchon' |
|
// qui est un enregistrement dont la variable est NULL. Cela permet |
|
// d'effacer les variables statiques créées dans une expression évaluées car, |
|
// l'adresse de ces variables changeant à chaque évaluation, elles ne sont |
|
// pas utilisables et constituent une fuite de mémoire |
|
|
|
logical1 |
|
ajout_bouchon_variable_statique(struct_processus *s_etat_processus) |
|
{ |
|
struct_liste_variables_statiques *l_tete_liste; |
|
|
|
l_tete_liste = (*s_etat_processus).l_liste_variables_statiques; |
|
|
|
if (((*s_etat_processus).l_liste_variables_statiques = |
|
malloc(sizeof(struct_liste_variables_statiques))) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return(d_erreur); |
|
} |
|
|
|
(*(*s_etat_processus).l_liste_variables_statiques).variable = NULL; |
|
(*(*s_etat_processus).l_liste_variables_statiques).suivant = l_tete_liste; |
|
(*(*s_etat_processus).l_liste_variables_statiques).precedent = NULL; |
|
(*l_tete_liste).precedent = (*s_etat_processus).l_liste_variables_statiques; |
|
|
|
return(d_absence_erreur); |
|
} |
|
|
|
|
|
/* |
|
================================================================================ |
|
Routine de retrait des variables statiques |
Routine de retrait des variables statiques |
================================================================================ |
================================================================================ |
Entrée : |
Entrée : |
Line 76 ajout_bouchon_variable_statique(struct_p
|
Line 35 ajout_bouchon_variable_statique(struct_p
|
================================================================================ |
================================================================================ |
*/ |
*/ |
|
|
// Cette routine libère toutes les variables statiques jusqu'au prochain |
// Cette routine libère toutes les variables statiques de niveau non |
// bouchon ou jusqu'à la fin de la liste si aucun bouchon n'est rencontré. |
// nul, donc attachées à une expression et non un programme. |
|
|
logical1 |
logical1 |
retrait_variables_statiques(struct_processus *s_etat_processus) |
retrait_variables_statiques_locales(struct_processus *s_etat_processus) |
{ |
{ |
|
struct_liste_variables_statiques *l_element_courant; |
|
struct_liste_variables_statiques *l_element_suivant; |
|
|
unsigned char registre_mode_execution; |
unsigned char registre_mode_execution; |
|
|
registre_mode_execution = (*s_etat_processus).mode_execution_programme; |
registre_mode_execution = (*s_etat_processus).mode_execution_programme; |
|
l_element_courant = (*s_etat_processus).l_liste_variables_statiques; |
|
|
while((*s_etat_processus).l_liste_variables_statiques != NULL) |
while(l_element_courant != NULL) |
{ |
{ |
|
l_element_suivant = (*l_element_courant).suivant; |
|
|
(*s_etat_processus).mode_execution_programme = |
(*s_etat_processus).mode_execution_programme = |
((*(*(*s_etat_processus).l_liste_variables_statiques) |
((*(*l_element_courant).variable).origine == 'P') ? 'Y' : 'N'; |
.variable).origine == 'P') ? 'Y' : 'N'; |
|
|
|
if ((*(*s_etat_processus).l_liste_variables_statiques).variable == NULL) |
if ((*(*l_element_courant).variable).niveau > 0) |
{ |
{ |
// On vient de tomber sur un bouchon... |
if (retrait_variable_statique(s_etat_processus, |
(*s_etat_processus).l_liste_variables_statiques = |
(*(*l_element_courant).variable).nom, |
(*(*s_etat_processus).l_liste_variables_statiques).suivant; |
(*(*l_element_courant).variable).variable_statique) |
free((*(*s_etat_processus).l_liste_variables_statiques).precedent); |
== d_erreur) |
(*(*s_etat_processus).l_liste_variables_statiques).precedent = NULL; |
{ |
break; |
(*s_etat_processus).mode_execution_programme = |
|
registre_mode_execution; |
|
return(d_erreur); |
|
} |
} |
} |
|
|
if (retrait_variable_statique(s_etat_processus, (*(*(*s_etat_processus) |
l_element_courant = l_element_suivant; |
.l_liste_variables_statiques).variable).nom, |
|
(*(*(*s_etat_processus).l_liste_variables_statiques).variable) |
|
.variable_statique) == d_erreur) |
|
{ |
|
(*s_etat_processus).mode_execution_programme = |
|
registre_mode_execution; |
|
return(d_erreur); |
|
} |
|
} |
} |
|
|
(*s_etat_processus).mode_execution_programme = registre_mode_execution; |
(*s_etat_processus).mode_execution_programme = registre_mode_execution; |
Line 134 logical1
|
Line 93 logical1
|
creation_variable_statique(struct_processus *s_etat_processus, |
creation_variable_statique(struct_processus *s_etat_processus, |
struct_variable_statique *s_variable) |
struct_variable_statique *s_variable) |
{ |
{ |
|
int i; |
|
|
struct_arbre_variables *l_variable_courante; |
struct_arbre_variables *l_variable_courante; |
|
|
struct_liste_variables_statiques *l_nouvel_element; |
struct_liste_variables_statiques *l_nouvel_element; |
Line 157 creation_variable_statique(struct_proces
|
Line 118 creation_variable_statique(struct_proces
|
} |
} |
|
|
(*(*l_nouvel_element).variable) = (*s_variable); |
(*(*l_nouvel_element).variable) = (*s_variable); |
|
|
(*l_nouvel_element).suivant = (*s_etat_processus) |
(*l_nouvel_element).suivant = (*s_etat_processus) |
.l_liste_variables_statiques; |
.l_liste_variables_statiques; |
(*(*s_etat_processus).l_liste_variables_statiques).precedent |
|
= l_nouvel_element; |
|
(*l_nouvel_element).precedent = NULL; |
(*l_nouvel_element).precedent = NULL; |
|
|
|
if ((*s_etat_processus).l_liste_variables_statiques != NULL) |
|
{ |
|
(*(*s_etat_processus).l_liste_variables_statiques).precedent |
|
= l_nouvel_element; |
|
} |
|
|
(*s_etat_processus).l_liste_variables_statiques = l_nouvel_element; |
(*s_etat_processus).l_liste_variables_statiques = l_nouvel_element; |
|
|
// Ajout de la variable à la feuille statique de l'arbre des variables |
// Ajout de la variable à la feuille statique de l'arbre des variables |
|
|
BUG((*s_etat_processus).s_arbre_variables == NULL, |
if ((*s_etat_processus).s_arbre_variables == NULL) |
uprintf("(*s_etat_processus).s_arbre_variables=NULL\n")); |
{ |
|
if (((*s_etat_processus).s_arbre_variables = |
|
allocation_noeud(s_etat_processus)) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return(d_erreur); |
|
} |
|
|
|
(*(*s_etat_processus).s_arbre_variables).feuille = NULL; |
|
(*(*s_etat_processus).s_arbre_variables).feuille_statique = NULL; |
|
(*(*s_etat_processus).s_arbre_variables).noeuds_utilises = 0; |
|
(*(*s_etat_processus).s_arbre_variables).indice_tableau_pere = -1; |
|
(*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL; |
|
|
|
if (((*(*s_etat_processus).s_arbre_variables).noeuds = |
|
allocation_tableau_noeuds(s_etat_processus)) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return(d_erreur); |
|
} |
|
|
|
for(i = 0; i < (*s_etat_processus).nombre_caracteres_variables; i++) |
|
{ |
|
(*(*s_etat_processus).s_arbre_variables).noeuds[i] = NULL; |
|
} |
|
} |
|
|
l_variable_courante = (*s_etat_processus).s_arbre_variables; |
l_variable_courante = (*s_etat_processus).s_arbre_variables; |
ptr = (*s_variable).nom; |
ptr = (*s_variable).nom; |
Line 178 creation_variable_statique(struct_proces
|
Line 170 creation_variable_statique(struct_proces
|
uprintf("Variable=\"%s\", (*ptr)='%c'\n", (*s_variable).nom, |
uprintf("Variable=\"%s\", (*ptr)='%c'\n", (*s_variable).nom, |
*ptr)); |
*ptr)); |
|
|
// La feuille doit préexister car la variable statique est toujours |
if ((*l_variable_courante).noeuds[(*s_etat_processus) |
// créée depuis une variable locale. |
.pointeurs_caracteres_variables[*ptr]] == NULL) |
|
{ |
|
// Le noeud n'existe pas encore, on le crée et on le marque |
|
// comme utilisé dans la structure parente. |
|
|
BUG((*l_variable_courante).noeuds[(*s_etat_processus) |
if (((*l_variable_courante).noeuds[(*s_etat_processus) |
.pointeurs_caracteres_variables[*ptr]] == NULL, |
.pointeurs_caracteres_variables[*ptr]] = |
uprintf("Variable=\"%s\", (*ptr)='%c', nullified folder\n")); |
allocation_noeud(s_etat_processus)) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return(d_erreur); |
|
} |
|
|
|
(*l_variable_courante).noeuds_utilises++; |
|
|
|
// La feuille est par défaut vide et aucun élément du tableau noeuds |
|
// (les branches qui peuvent être issues de ce nouveau noeud) |
|
// n'est encore utilisée. |
|
|
|
(*(*l_variable_courante).noeuds[(*s_etat_processus) |
|
.pointeurs_caracteres_variables[*ptr]]).feuille = NULL; |
|
(*(*l_variable_courante).noeuds[(*s_etat_processus) |
|
.pointeurs_caracteres_variables[*ptr]]).feuille_statique |
|
= NULL; |
|
(*(*l_variable_courante).noeuds[(*s_etat_processus) |
|
.pointeurs_caracteres_variables[*ptr]]).noeuds_utilises = 0; |
|
|
|
// Le champ noeud_pere de la structure créée pointe sur |
|
// la structure parente et l'indice tableau_pere correspond à la |
|
// position réelle dans le tableau noeuds[] de la structure parente |
|
// du noeud courant. Cette valeur sera utilisée lors de la |
|
// destruction du noeud pour annuler le pointeur contenu dans |
|
// le tableau noeuds[] de la structure parente. |
|
|
|
(*(*l_variable_courante).noeuds[(*s_etat_processus) |
|
.pointeurs_caracteres_variables[*ptr]]).noeud_pere = |
|
l_variable_courante; |
|
(*(*l_variable_courante).noeuds[(*s_etat_processus) |
|
.pointeurs_caracteres_variables[*ptr]]) |
|
.indice_tableau_pere = (*s_etat_processus) |
|
.pointeurs_caracteres_variables[*ptr]; |
|
|
|
// Allocation du tableau noeuds[] et initialisation à zéro de |
|
// tous les pointeurs. |
|
|
|
if (((*(*l_variable_courante).noeuds[(*s_etat_processus) |
|
.pointeurs_caracteres_variables[*ptr]]).noeuds = |
|
allocation_tableau_noeuds(s_etat_processus)) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return(d_erreur); |
|
} |
|
|
|
for(i = 0; i < (*s_etat_processus).nombre_caracteres_variables; i++) |
|
{ |
|
(*(*l_variable_courante).noeuds[(*s_etat_processus) |
|
.pointeurs_caracteres_variables[*ptr]]).noeuds[i] |
|
= NULL; |
|
} |
|
} |
|
|
l_variable_courante = (*l_variable_courante).noeuds |
l_variable_courante = (*l_variable_courante).noeuds |
[(*s_etat_processus).pointeurs_caracteres_variables[*ptr]]; |
[(*s_etat_processus).pointeurs_caracteres_variables[*ptr]]; |
Line 204 creation_variable_statique(struct_proces
|
Line 251 creation_variable_statique(struct_proces
|
|
|
(*l_nouvel_element).suivant = (*l_variable_courante).feuille_statique; |
(*l_nouvel_element).suivant = (*l_variable_courante).feuille_statique; |
(*l_nouvel_element).precedent = NULL; |
(*l_nouvel_element).precedent = NULL; |
(*(*l_nouvel_element).suivant).precedent = l_nouvel_element; |
|
|
if ((*l_nouvel_element).suivant != NULL) |
|
{ |
|
(*(*l_nouvel_element).suivant).precedent = l_nouvel_element; |
|
} |
|
|
(*l_nouvel_element).reference = |
(*l_nouvel_element).reference = |
(*s_etat_processus).l_liste_variables_statiques; |
(*s_etat_processus).l_liste_variables_statiques; |
(*l_nouvel_element).variable = (*(*s_etat_processus) |
(*l_nouvel_element).variable = (*(*s_etat_processus) |
.l_liste_variables_statiques).variable; |
.l_liste_variables_statiques).variable; |
(*l_variable_courante).feuille_statique = l_nouvel_element; |
(*l_variable_courante).feuille_statique = l_nouvel_element; |
|
(*l_nouvel_element).feuille = l_variable_courante; |
|
|
return(d_absence_erreur); |
return(d_absence_erreur); |
} |
} |
|
|
Line 251 retrait_variable_statique(struct_process
|
Line 304 retrait_variable_statique(struct_process
|
|
|
if ((*l_element_liste_a_supprimer).precedent != NULL) |
if ((*l_element_liste_a_supprimer).precedent != NULL) |
{ |
{ |
|
// L'élément à supprimer n'est pas le premier de la liste. |
|
|
(*(*l_element_liste_a_supprimer).precedent).suivant = |
(*(*l_element_liste_a_supprimer).precedent).suivant = |
(*l_element_liste_a_supprimer).suivant; |
(*l_element_liste_a_supprimer).suivant; |
} |
|
else |
|
{ |
|
(*(*l_element_liste_a_supprimer).suivant).precedent = NULL; |
|
} |
|
|
|
if ((*l_element_liste_a_supprimer).suivant != NULL) |
if ((*l_element_liste_a_supprimer).suivant != NULL) |
{ |
{ |
(*(*l_element_liste_a_supprimer).suivant).precedent = |
// Il y a un élément suivant. On le chaîne. |
(*l_element_liste_a_supprimer).precedent; |
(*(*l_element_liste_a_supprimer).suivant).precedent = NULL; |
|
} |
} |
} |
else |
else |
{ |
{ |
(*(*l_element_liste_a_supprimer).precedent).suivant = NULL; |
// L'élement est le premier de la liste. S'il y a un élément |
|
// suivant, on le chaîne. |
|
|
|
if ((*l_element_liste_a_supprimer).suivant != NULL) |
|
{ |
|
(*(*l_element_liste_a_supprimer).suivant).precedent = NULL; |
|
} |
|
|
|
(*s_etat_processus).l_liste_variables_statiques = |
|
(*l_element_liste_a_supprimer).suivant; |
} |
} |
|
|
free(l_element_liste_a_supprimer); |
free(l_element_liste_a_supprimer); |
Line 276 retrait_variable_statique(struct_process
|
Line 336 retrait_variable_statique(struct_process
|
|
|
if ((*l_element_a_supprimer).precedent != NULL) |
if ((*l_element_a_supprimer).precedent != NULL) |
{ |
{ |
|
// L'élément n'est pas le premier de la liste. |
|
|
(*(*l_element_a_supprimer).precedent).suivant = |
(*(*l_element_a_supprimer).precedent).suivant = |
(*l_element_a_supprimer).suivant; |
(*l_element_a_supprimer).suivant; |
} |
|
else |
|
{ |
|
(*(*l_element_a_supprimer).suivant).precedent = NULL; |
|
} |
|
|
|
if ((*l_element_a_supprimer).suivant != NULL) |
if ((*l_element_a_supprimer).suivant != NULL) |
{ |
{ |
(*(*l_element_a_supprimer).suivant).precedent = |
(*(*l_element_a_supprimer).suivant).precedent = |
(*l_element_a_supprimer).precedent; |
(*l_element_a_supprimer).precedent; |
|
} |
|
else |
|
{ |
|
(*(*l_element_a_supprimer).precedent).suivant = NULL; |
|
} |
} |
} |
else |
else |
{ |
{ |
(*(*l_element_a_supprimer).precedent).suivant = NULL; |
// L'élément est le premier de la liste. |
|
|
|
if ((*l_element_a_supprimer).suivant != NULL) |
|
{ |
|
(*(*l_element_a_supprimer).suivant).precedent = NULL; |
|
} |
|
|
|
(*(*l_element_a_supprimer).feuille).feuille_statique |
|
= (*l_element_a_supprimer).suivant; |
} |
} |
|
|
liberation(s_etat_processus, (*(*l_element_a_supprimer).variable) |
liberation(s_etat_processus, (*(*l_element_a_supprimer).variable) |
Line 308 retrait_variable_statique(struct_process
|
Line 378 retrait_variable_statique(struct_process
|
(*s_etat_processus).erreur_systeme = d_es_variable_introuvable; |
(*s_etat_processus).erreur_systeme = d_es_variable_introuvable; |
} |
} |
|
|
return erreur; |
return(erreur); |
} |
} |
|
|
|
|
Line 377 recherche_variable_statique(struct_proce
|
Line 447 recherche_variable_statique(struct_proce
|
((*(*l_element_courant).variable).origine == origine)) |
((*(*l_element_courant).variable).origine == origine)) |
{ |
{ |
(*s_etat_processus).pointeur_variable_statique_courante |
(*s_etat_processus).pointeur_variable_statique_courante |
= (*l_element_courant).variable; |
= (*l_element_courant).variable; |
return(l_element_courant); |
return(l_element_courant); |
} |
} |
} |
} |
Line 388 recherche_variable_statique(struct_proce
|
Line 458 recherche_variable_statique(struct_proce
|
((*(*l_element_courant).variable).origine == origine)) |
((*(*l_element_courant).variable).origine == origine)) |
{ |
{ |
(*s_etat_processus).pointeur_variable_statique_courante |
(*s_etat_processus).pointeur_variable_statique_courante |
= (*l_element_courant).variable; |
= (*l_element_courant).variable; |
return(l_element_courant); |
return(l_element_courant); |
} |
} |
} |
} |
|
|
|
l_element_courant = (*l_element_courant).suivant; |
} |
} |
} |
} |
|
|