version 1.1, 2010/01/26 15:22:44
|
version 1.24.2.2, 2011/04/14 08:46:38
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.9 |
RPL/2 (R) version 4.0.23 |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
Copyright (C) 1989-2011 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 20
|
Line 20
|
*/ |
*/ |
|
|
|
|
#include "rpl.conv.h" |
#include "rpl-conv.h" |
|
|
|
|
/* |
/* |
Line 131 empilement_pile_systeme(struct_processus
|
Line 131 empilement_pile_systeme(struct_processus
|
(*(*s_etat_processus).l_base_pile_systeme).clause = ' '; |
(*(*s_etat_processus).l_base_pile_systeme).clause = ' '; |
(*(*s_etat_processus).l_base_pile_systeme).adresse_retour = 0; |
(*(*s_etat_processus).l_base_pile_systeme).adresse_retour = 0; |
(*(*s_etat_processus).l_base_pile_systeme).niveau_courant = 0; |
(*(*s_etat_processus).l_base_pile_systeme).niveau_courant = 0; |
|
(*(*s_etat_processus).l_base_pile_systeme).pointeur_adresse_retour = NULL; |
(*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N'; |
(*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N'; |
(*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL; |
(*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL; |
(*(*s_etat_processus).l_base_pile_systeme).limite_indice_boucle = NULL; |
(*(*s_etat_processus).l_base_pile_systeme).limite_indice_boucle = NULL; |
Line 260 depilement_pile_systeme(struct_processus
|
Line 261 depilement_pile_systeme(struct_processus
|
|
|
return; |
return; |
} |
} |
|
|
|
|
|
/* |
|
================================================================================ |
|
Procédure d'effacement de la pile système |
|
================================================================================ |
|
Entrée : |
|
-------------------------------------------------------------------------------- |
|
Sortie : |
|
-------------------------------------------------------------------------------- |
|
Effets de bord : néant |
|
================================================================================ |
|
*/ |
|
|
|
void |
|
effacement_pile_systeme(struct_processus *s_etat_processus) |
|
{ |
|
while((*s_etat_processus).l_base_pile_systeme != NULL) |
|
{ |
|
depilement_pile_systeme(s_etat_processus); |
|
} |
|
|
|
return; |
|
} |
|
|
|
|
|
/* |
|
================================================================================ |
|
Procédure d'affichage de la pile système |
|
================================================================================ |
|
Entrée : |
|
-------------------------------------------------------------------------------- |
|
Sortie : |
|
-------------------------------------------------------------------------------- |
|
Effets de bord : néant |
|
================================================================================ |
|
*/ |
|
|
|
void |
|
trace(struct_processus *s_etat_processus, FILE *flux) |
|
{ |
|
integer8 i; |
|
integer8 candidat; |
|
|
|
long delta; |
|
|
|
struct_liste_pile_systeme *l_element_courant; |
|
|
|
unsigned char *tampon; |
|
|
|
unsigned long p; |
|
unsigned long v; |
|
|
|
l_element_courant = (*s_etat_processus).l_base_pile_systeme; |
|
i = 0; |
|
|
|
while(l_element_courant != NULL) |
|
{ |
|
i++; |
|
l_element_courant = (*l_element_courant).suivant; |
|
} |
|
|
|
l_element_courant = (*s_etat_processus).l_base_pile_systeme; |
|
flockfile(flux); |
|
|
|
if ((flux == stderr) || (flux == stdout)) |
|
{ |
|
fprintf(flux, "+++Backtrace\n"); |
|
} |
|
|
|
while(l_element_courant != NULL) |
|
{ |
|
fprintf(flux, "%d : (%016X) D=", i--, l_element_courant); |
|
|
|
fprintf(flux, ((*l_element_courant).creation_variables_statiques |
|
== d_vrai) ? "1" : "0"); |
|
fprintf(flux, ((*l_element_courant).creation_variables_partagees |
|
== d_vrai) ? "1" : "0"); |
|
fprintf(flux, ((*l_element_courant).arret_si_exception == d_vrai) |
|
? "1" : "0"); |
|
fprintf(flux, ((*l_element_courant).evaluation_expression == d_vrai) |
|
? "1" : "0"); |
|
|
|
fprintf(flux, " F=%c%c L=%lu ", |
|
((*l_element_courant).clause == ' ') ? '-' : |
|
(*l_element_courant).clause, |
|
((*l_element_courant).type_cloture == ' ') ? '-' : |
|
(*l_element_courant).type_cloture, |
|
(*l_element_courant).niveau_courant); |
|
|
|
if ((*l_element_courant).retour_definition == 'Y') |
|
{ |
|
fprintf(flux, "RTRN "); |
|
|
|
if ((*l_element_courant).origine_routine_evaluation == 'Y') |
|
{ |
|
fprintf(flux, "EVL "); |
|
} |
|
else |
|
{ |
|
fprintf(flux, "SEQ "); |
|
|
|
if ((*l_element_courant).adresse_retour != 0) |
|
{ |
|
fprintf(flux, "P=%016X", (*l_element_courant) |
|
.adresse_retour); |
|
|
|
// Calcul de la routine de départ |
|
|
|
candidat = (*s_etat_processus) |
|
.longueur_definitions_chainees; |
|
p = 0; |
|
|
|
for(v = 0; v < (*s_etat_processus).nombre_variables; v++) |
|
{ |
|
if ((*s_etat_processus).s_liste_variables[v].niveau |
|
== 0) |
|
{ |
|
delta = (*l_element_courant).adresse_retour |
|
- (*((unsigned long *) |
|
((*(*s_etat_processus) |
|
.s_liste_variables[v].objet).objet))); |
|
|
|
if ((delta > 0) && (delta < candidat)) |
|
{ |
|
candidat = delta; |
|
p = v + 1; |
|
} |
|
} |
|
} |
|
|
|
if (p > 0) |
|
{ |
|
fprintf(flux, "\n Call from %s", (*s_etat_processus) |
|
.s_liste_variables[p - 1].nom); |
|
} |
|
else |
|
{ |
|
fprintf(flux, "\n Call from RPL/2 initialization"); |
|
} |
|
} |
|
else |
|
{ |
|
fprintf(flux, "RPL/2 initialization"); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
fprintf(flux, "NONE "); |
|
|
|
if ((*l_element_courant).origine_routine_evaluation == 'Y') |
|
{ |
|
fprintf(flux, "EVL "); |
|
} |
|
else |
|
{ |
|
fprintf(flux, "SEQ "); |
|
|
|
if ((*l_element_courant).pointeur_adresse_retour != NULL) |
|
{ |
|
fprintf(flux, "A=%016X ", (*l_element_courant) |
|
.pointeur_adresse_retour); |
|
|
|
// Calcul de la routine de départ |
|
|
|
p = 0; |
|
|
|
for(v = 0; v < (*s_etat_processus).nombre_variables; v++) |
|
{ |
|
if ((*s_etat_processus).s_liste_variables[v].niveau |
|
== 0) |
|
{ |
|
if ((*s_etat_processus).s_liste_variables[v].objet |
|
== (*l_element_courant) |
|
.pointeur_adresse_retour) |
|
{ |
|
p = v + 1; |
|
break; |
|
} |
|
} |
|
} |
|
|
|
if (p > 0) |
|
{ |
|
fprintf(flux, "\n Branch to %s", (*s_etat_processus) |
|
.s_liste_variables[p - 1].nom); |
|
} |
|
else |
|
{ |
|
fprintf(flux, "\n Branch to evaluation subroutine"); |
|
} |
|
} |
|
} |
|
} |
|
|
|
fprintf(flux, "\n"); |
|
|
|
if ((*l_element_courant).indice_boucle != NULL) |
|
{ |
|
tampon = formateur(s_etat_processus, 0, |
|
(*l_element_courant).indice_boucle); |
|
fprintf(flux, " Index = %s\n", tampon); |
|
free(tampon); |
|
} |
|
|
|
if ((*l_element_courant).limite_indice_boucle != NULL) |
|
{ |
|
tampon = formateur(s_etat_processus, 0, |
|
(*l_element_courant).limite_indice_boucle); |
|
fprintf(flux, " Limit = %s\n", tampon); |
|
free(tampon); |
|
} |
|
|
|
if ((*l_element_courant).objet_de_test != NULL) |
|
{ |
|
tampon = formateur(s_etat_processus, 0, |
|
(*l_element_courant).objet_de_test); |
|
fprintf(flux, " Test object = %s\n", tampon); |
|
free(tampon); |
|
} |
|
|
|
if ((*l_element_courant).nom_variable != NULL) |
|
{ |
|
fprintf(flux, " Variable name = %s\n", |
|
(*l_element_courant).nom_variable); |
|
} |
|
|
|
l_element_courant = (*l_element_courant).suivant; |
|
} |
|
|
|
fprintf(flux, "\n"); |
|
funlockfile(flux); |
|
|
|
return; |
|
} |
|
|
// vim: ts=4 |
// vim: ts=4 |