--- rpl/src/gestion_pile_systeme.c 2010/01/26 15:22:44 1.1 +++ rpl/src/gestion_pile_systeme.c 2010/06/24 09:21:43 1.12 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 + RPL/2 (R) version 4.0.16 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -260,5 +260,148 @@ depilement_pile_systeme(struct_processus 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) +{ + struct_liste_pile_systeme *l_element_courant; + + integer8 i; + + 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 : D=", i--); + + 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 "); + + if ((*l_element_courant).adresse_retour != 0) + { + fprintf(flux, "P=%lu", (*l_element_courant) + .adresse_retour); + } + } + else + { + fprintf(flux, "SEQ "); + + if ((*l_element_courant).pointeur_objet_retour != NULL) + { + fprintf(flux, "A=%X", (*l_element_courant) + .pointeur_objet_retour); + } + } + } + else + { + fprintf(flux, "NONE "); + + if ((*l_element_courant).origine_routine_evaluation == 'Y') + { + fprintf(flux, "EVL "); + + if ((*l_element_courant).adresse_retour != 0) + { + fprintf(flux, "P=%lu", (*l_element_courant) + .adresse_retour); + } + } + else + { + fprintf(flux, "SEQ "); + + if ((*l_element_courant).pointeur_objet_retour != NULL) + { + fprintf(flux, "A=%X", (*l_element_courant) + .pointeur_objet_retour); + } + } + } + + fprintf(flux, "\n"); + + l_element_courant = (*l_element_courant).suivant; + } + + fprintf(flux, "\n"); + funlockfile(flux); + + return; +} // vim: ts=4