/* ================================================================================ RPL/2 (R) version 4.1.32 Copyright (C) 1989-2020 Dr. BERTRAND Joël This file is part of RPL/2. RPL/2 is free software; you can redistribute it and/or modify it under the terms of the CeCILL V2 License as published by the french CEA, CNRS and INRIA. RPL/2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License for more details. You should have received a copy of the CeCILL License along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ #include "rpl-conv.h" /* ================================================================================ Fonction 'rplcore' générant un fichier de débogage ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void rplcore(struct_processus *s_etat_processus) { file *fichier; logical1 erreur; logical1 fin_boucle; int longueur_lignes = 65; integer8 i; integer8 j; struct_liste_chainee *l_base_pile; struct_liste_chainee *l_element_courant; struct_objet *s_objet_last; unsigned char *expression; unsigned char *nom; unsigned char *message_erreur; unsigned char *pile; unsigned char *ptr; unsigned char *ptr_bis; unsigned char registre; unsigned char registre_langue; (*s_etat_processus).core = d_faux; cf(s_etat_processus, 34); sf(s_etat_processus, 37); sf(s_etat_processus, 38); sf(s_etat_processus, 39); sf(s_etat_processus, 40); sf(s_etat_processus, 41); sf(s_etat_processus, 42); cf(s_etat_processus, 43); cf(s_etat_processus, 44); sf(s_etat_processus, 45); cf(s_etat_processus, 48); cf(s_etat_processus, 49); cf(s_etat_processus, 50); cf(s_etat_processus, 53); cf(s_etat_processus, 54); cf(s_etat_processus, 55); cf(s_etat_processus, 56); sf(s_etat_processus, 60); registre_langue = (*s_etat_processus).langue; (*s_etat_processus).langue = 'E'; message_erreur = messages(s_etat_processus); (*s_etat_processus).langue = registre_langue; if ((nom = malloc((strlen(ds_rplcore) + 64 + 1) * sizeof(unsigned char))) == NULL) { free(message_erreur); return; } snprintf(nom, strlen(ds_rplcore) + 64 + 1, "%s-%llu-%llu", ds_rplcore, (unsigned long long) getpid(), (unsigned long long) pthread_self()); if ((fichier = fopen(nom, "w+")) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; free(message_erreur); free(nom); return; } free(nom); if (fprintf(fichier, "// RPL/2 version %s process image\n", d_version_rpl) < 0) { free(message_erreur); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (fprintf(fichier, "// Process %d\n", (int) getpid()) < 0) { free(message_erreur); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (fprintf(fichier, "// Source file : %s\n\n", (*s_etat_processus).nom_fichier_source) < 0) { free(message_erreur); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((*s_etat_processus).instruction_derniere_erreur == NULL) { if (fprintf(fichier, "// Error :\n%s [level %lld]\n\n", message_erreur, (*s_etat_processus).niveau_derniere_erreur) < 0) { free(message_erreur); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else if ((*s_etat_processus).instruction_derniere_erreur[0] == d_code_fin_chaine) { if (fprintf(fichier, "// Error :\n%s [level %lld]\n\n", message_erreur, (*s_etat_processus).niveau_derniere_erreur) < 0) { free(message_erreur); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else if (fprintf(fichier, "// Error :\n%s [%s at level %lld]\n\n", message_erreur, (*s_etat_processus).instruction_derniere_erreur, (*s_etat_processus).niveau_derniere_erreur) < 0) { free(message_erreur); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(message_erreur); if (fprintf(fichier, "// System stack\n\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } trace(s_etat_processus, fichier); if (fprintf(fichier, "// Process stack\n\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; i = 0; if (pthread_mutex_trylock(&((*s_etat_processus).mutex_pile_processus)) == 0) { while(l_element_courant != NULL) { if ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .processus_detache == d_vrai) { if (fprintf(fichier, "%d: Process [%d]\n", (int) i++, (int) (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).pid) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else { if (fprintf(fichier, "%ld: Thread [%llu] from [%d]\n", (int) i++, (unsigned long long) (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .tid, (int) (*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).pid) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } l_element_courant = (*l_element_courant).suivant; } if (fprintf(fichier, "%ld: Process [%d]\n\n", (int) i, (int) getpid()) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); } if (test_cfsf(s_etat_processus, 31) == d_vrai) { // LAST valide if (fprintf(fichier, "// Arguments\n\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } l_base_pile = NULL; while((*s_etat_processus).l_base_pile_last != NULL) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile_last), &s_objet_last) == d_erreur) { return; } if (empilement(s_etat_processus, &l_base_pile, s_objet_last) == d_erreur) { return; } } if ((*s_etat_processus).l_base_pile != NULL) { registre = (*s_etat_processus).autorisation_conversion_chaine; (*s_etat_processus).autorisation_conversion_chaine = 'N'; ecriture_pile(s_etat_processus, fichier, l_base_pile, 1); (*s_etat_processus).autorisation_conversion_chaine = registre; } else { if (fprintf(fichier, " No argument\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } while(l_base_pile != NULL) { if (depilement(s_etat_processus, &l_base_pile, &s_objet_last) == d_erreur) { return; } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile_last), s_objet_last) == d_erreur) { return; } } } else { // LAST invalide if (fprintf(fichier, "// Current stack (LAST disabled)\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } if (fprintf(fichier, "\n// Stack\n\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((*s_etat_processus).l_base_pile != NULL) { registre = (*s_etat_processus).autorisation_conversion_chaine; (*s_etat_processus).autorisation_conversion_chaine = 'N'; ecriture_pile(s_etat_processus, fichier, (*s_etat_processus).l_base_pile, 1); (*s_etat_processus).autorisation_conversion_chaine = registre; } else { if (fprintf(fichier, " Empty stack\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } if ((*s_etat_processus).s_objet_errone != NULL) { if (fprintf(fichier, "\n// Current evaluation\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } // L'objet ne peut être qu'une expression algébrique ou RPN if (((*(*s_etat_processus).s_objet_errone).type == RPN) || ((*(*s_etat_processus).s_objet_errone).type == ALG)) { l_element_courant = (*(*s_etat_processus).s_objet_errone).objet; if (fprintf(fichier, "\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } while(l_element_courant != NULL) { if ((*l_element_courant).donnee == (*s_etat_processus).s_objet_erreur) { if ((expression = formateur(s_etat_processus, 4, (*l_element_courant).donnee)) == NULL) { return; } if ((*(*l_element_courant).donnee).type == CHN) { if (fprintf(fichier, " -> \"%s\"\n", expression) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else { if (fprintf(fichier, " -> %s\n", expression) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } } else { if ((expression = formateur(s_etat_processus, 4, (*l_element_courant).donnee)) == NULL) { return; } if ((*(*l_element_courant).donnee).type == CHN) { if (fprintf(fichier, " \"%s\"\n", expression) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else { if (fprintf(fichier, " %s\n", expression) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } } free(expression); l_element_courant = (*l_element_courant).suivant; } } else { if ((expression = formateur(s_etat_processus, 4, (*s_etat_processus).s_objet_errone)) == NULL) { return; } if (fprintf(fichier, "\n%s\n", expression) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(expression); } } if ((*s_etat_processus).longueur_definitions_chainees != 0) { if (fprintf(fichier, "\n// Definitions\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } ptr = (*s_etat_processus).definitions_chainees; i = 0; erreur = d_faux; while(((*ptr) != d_code_fin_chaine) || (erreur == d_vrai)) { if ((i % longueur_lignes) == 0) { if (fprintf(fichier, "\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (erreur == d_vrai) { if (fprintf(fichier, "PC :") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((j = i - longueur_lignes) < 0) { j = 0; ptr_bis = (*s_etat_processus).definitions_chainees; } else { ptr_bis = ptr - longueur_lignes; } fin_boucle = d_faux; while(((*ptr_bis) != d_code_fin_chaine) && (fin_boucle == d_faux)) { if (j == (*s_etat_processus).position_courante) { if (fprintf(fichier, ">|<") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } fin_boucle = d_vrai; } else { if (fprintf(fichier, " ") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } j++; ptr_bis++; } if (fprintf(fichier, "\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } if ((*ptr) != d_code_fin_chaine) { if (erreur == d_vrai) { if (fprintf(fichier, "\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } if ((i <= (*s_etat_processus).position_courante) && ((i + longueur_lignes) > (*s_etat_processus) .position_courante)) { if (fprintf(fichier, "\nError : ") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } erreur = d_vrai; } else { if (fprintf(fichier, " ") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } erreur = d_faux; } } else { erreur = d_faux; } } if ((*ptr) != d_code_fin_chaine) { if (ufprintf(fichier, "%c", *ptr) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } ptr++; } i++; } if (fprintf(fichier, "\n// End of definitions\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } if (fprintf(fichier, "\n// Externals\n\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } instruction_externals(s_etat_processus); if (fprintf(fichier, "%s\n", pile = formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile) .donnee)) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(pile); if (fprintf(fichier, "\n// Variables\n\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } instruction_vars(s_etat_processus); if (fprintf(fichier, "%s\n", pile = formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile) .donnee)) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(pile); instruction_drop2(s_etat_processus); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free((*s_etat_processus).instruction_derniere_erreur); (*s_etat_processus).instruction_derniere_erreur = NULL; return; } // vim: ts=4