--- rpl/src/gestion_pile_systeme.c 2010/05/24 10:58:30 1.11 +++ rpl/src/gestion_pile_systeme.c 2010/06/24 09:21:43 1.12 @@ -285,4 +285,123 @@ effacement_pile_systeme(struct_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