/* ================================================================================ RPL/2 (R) version 4.1.24 Copyright (C) 1989-2015 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 'draw' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_draw(struct_processus *s_etat_processus) { file *entree_standard; file *fichier; int dimensions; integer8 hauteur_pile; logical1 last_valide; logical1 premiere_iteration; logical1 retour_suite_erreur; real8 borne_maximale_x; real8 borne_maximale_y; real8 borne_minimale_x; real8 borne_minimale_y; real8 dernier_point_valide[3]; real8 r; real8 t; real8 x; real8 y; struct_fichier_graphique *l_fichier_courant; struct_fichier_graphique *l_fichier_precedent; struct_liste_chainee *l_element_courant; struct_liste_pile_systeme *l_position_normale; struct_objet *s_objet; struct_objet *s_objet_evalue; struct_variable s_variable_x; struct_variable s_variable_y; unsigned char mode_evaluation_expression; unsigned char *nom_fichier; unsigned char *nom_fichier_converti; unsigned char *nom_x; unsigned char *nom_y; integer8 niveau_courant; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n DRAW "); if ((*s_etat_processus).langue == 'F') { printf("(trace un graphe)\n\n"); printf(" Aucun argument\n"); } else { printf("(plot a graphic)\n\n"); printf(" No argument\n"); } return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } cf(s_etat_processus, 31); } /* * Tracé y=f(x) * Les bornes de variation de X sont données dans l'ordre * - soit sous la forme "{ X X_min X_max } INDEP" ; * - soit par les parties réelles de PMIN et PMAX. * INDEP et DEPND testent leurs arguments pour que les pointeurs * indep et depend désignent des objets de type NOM ou LST à * trois éléments. */ if ((strcmp((*s_etat_processus).type_trace_eq, "FONCTION") == 0) || (strcmp((*s_etat_processus).type_trace_eq, "ECHANTILLONS") == 0)) { dimensions = 2; /* * Vérification de la présence de la variable globale EQ */ if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux) { /* * Aucune variable "EQ" n'existe. */ if ((*s_etat_processus).erreur_execution == d_ex) { (*s_etat_processus).erreur_execution = d_ex_absence_equation; } (*s_etat_processus).erreur_systeme = d_es; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } return; } /* * Création du fichier graphique temporaire */ if ((nom_fichier = creation_nom_fichier(s_etat_processus, (*s_etat_processus).chemin_fichiers_temporaires)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((fichier = fopen(nom_fichier, "w+")) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * Récupération du domaine de variation de x */ if ((*(*s_etat_processus).indep).type == LST) { l_element_courant = (*(*s_etat_processus).indep).objet; if ((s_variable_x.nom = malloc((strlen((*((struct_nom *) (*(*l_element_courant).donnee).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant) .donnee).objet)).nom); if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(nom_x, s_variable_x.nom); l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_minimale_x = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_minimale_x = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_minimale_x = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet)); } else { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(s_variable_x.nom); free(nom_x); free(nom_fichier); liberation(s_etat_processus, s_objet_evalue); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_evalue); } l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_maximale_x = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_maximale_x = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_maximale_x = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet)); } else { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } liberation(s_etat_processus, s_objet_evalue); } } else { if ((s_variable_x.nom = malloc((strlen((*((struct_nom *) (*(*s_etat_processus) .indep).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(s_variable_x.nom, (*((struct_nom *) (*(*s_etat_processus) .indep).objet)).nom); if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(nom_x, s_variable_x.nom); if ((*s_etat_processus).systeme_axes == 0) { borne_minimale_x = (*s_etat_processus).x_min; borne_maximale_x = (*s_etat_processus).x_max; } else { borne_minimale_x = (*s_etat_processus).x2_min; borne_maximale_x = (*s_etat_processus).x2_max; } } /* * Création d'une variable locale du nom pointé par INDEP */ (*s_etat_processus).niveau_courant++; s_variable_x.niveau = (*s_etat_processus).niveau_courant; if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P') == d_erreur) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * L'erreur retournée ne peut être qu'une erreur système */ free(nom_fichier); return; } /* * Boucle de calcul des points de la fonction */ if (borne_maximale_x < borne_minimale_x) { x = borne_maximale_x; borne_maximale_x = borne_minimale_x; borne_minimale_x = x; } for(x = borne_minimale_x; x <= borne_maximale_x; x += (*s_etat_processus).resolution) { if (recherche_variable(s_etat_processus, nom_x) == d_vrai) { // La variable étant créée localement, elle n'est jamais // ni verrouillée ni partagée. BUG((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL); if ((*(*(*s_etat_processus).pointeur_variable_courante) .objet).type != REL) { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante) .objet); if (((*(*s_etat_processus).pointeur_variable_courante) .objet = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } (*((real8 *) (*(*(*s_etat_processus).pointeur_variable_courante) .objet).objet)) = x; } else { /* * La variable créée étant locale, l'utilisateur ne peut * pas l'effacer. On ne doit donc jamais passer par ici. Si * c'est néanmoins le cas, une erreur système est générée * provoquant l'arrêt du programme même dans une * structure IFERR. */ if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux) { /* * Aucune variable "EQ" n'existe. */ (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; /* * Retrait de la variable INDEP */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_x); free(nom_fichier); return; } /* * Evaluation de la fonction */ hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle; l_position_normale = (*s_etat_processus).l_base_pile_systeme; niveau_courant = (*s_etat_processus).niveau_courant; mode_evaluation_expression = (*s_etat_processus) .mode_evaluation_expression; (*s_etat_processus).mode_evaluation_expression = 'Y'; (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; if (evaluation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, 'N') == d_erreur) { (*s_etat_processus).mode_evaluation_expression = mode_evaluation_expression; if ((*s_etat_processus).erreur_systeme != d_es) { /* * Erreur système */ free(nom_fichier); return; } else { retour_suite_erreur = d_faux; (*s_etat_processus).niveau_courant = niveau_courant; /* * Restauration de la pile initiale */ while((*s_etat_processus).hauteur_pile_operationnelle > hauteur_pile) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; retour_suite_erreur = d_vrai; break; } liberation(s_etat_processus, s_objet); } /* * Restauration de la pile système */ while((*s_etat_processus).l_base_pile_systeme != l_position_normale) { depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { /* * Une pile vide provoque une erreur système */ free(nom_fichier); return; } } if (retour_suite_erreur == d_vrai) { /* * Retrait de la variable INDEP et retour */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } return; } } (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; } else { (*s_etat_processus).mode_evaluation_expression = mode_evaluation_expression; /* * Donnée valide à écrire dans le fichier */ if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { /* * Retrait de la variable INDEP et retour */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet).type == INT) { if (fprintf(fichier, "%f %f\n", x, (double) (*((integer8 *) (*s_objet).objet))) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else if ((*s_objet).type == REL) { if (fprintf(fichier, "%f %f\n", x, (*((real8 *) (*s_objet).objet))) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } liberation(s_etat_processus, s_objet); } } /* * Retrait de la variable locale */ (*s_etat_processus).niveau_courant--; if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_x); } /* * Tracé r=f(t) * Les bornes de variation de T sont données par une * liste "{ T T_min T_max } INDEP". * INDEP et DEPND testent leurs arguments pour que les pointeurs * indep et depend désignent des objets de type NOM ou LST à * trois éléments. */ else if (strcmp((*s_etat_processus).type_trace_eq, "POLAIRE") == 0) { dimensions = 2; /* * Vérification de la présence de la variable globale EQ */ if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux) { /* * Aucune variable "EQ" n'existe. */ if (last_valide == d_vrai) { sf(s_etat_processus, 31); } if ((*s_etat_processus).erreur_execution == d_ex) { (*s_etat_processus).erreur_execution = d_ex_absence_equation; } (*s_etat_processus).erreur_systeme = d_es; return; } /* * Création du fichier graphique temporaire */ if ((nom_fichier = creation_nom_fichier(s_etat_processus, (*s_etat_processus).chemin_fichiers_temporaires)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((fichier = fopen(nom_fichier, "w+")) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * Récupération du domaine de variation de x */ if ((*(*s_etat_processus).indep).type == LST) { l_element_courant = (*(*s_etat_processus).indep).objet; if ((s_variable_x.nom = malloc((strlen((*((struct_nom *) (*(*l_element_courant).donnee).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant) .donnee).objet)).nom); if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(nom_x, s_variable_x.nom); l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_minimale_x = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_minimale_x = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_minimale_x = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet)); } else { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(s_variable_x.nom); free(nom_x); liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } liberation(s_etat_processus, s_objet_evalue); } l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_maximale_x = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_maximale_x = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_maximale_x = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet)); } else { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } liberation(s_etat_processus, s_objet_evalue); } } else { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } /* * Création d'une variable locale du nom pointé par INDEP */ (*s_etat_processus).niveau_courant++; s_variable_x.niveau = (*s_etat_processus).niveau_courant; if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P') == d_erreur) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * L'erreur retournée ne peut être qu'une erreur système */ free(nom_fichier); return; } /* * Boucle de calcul des points de la fonction */ if (borne_maximale_x < borne_minimale_x) { t = borne_maximale_x; borne_maximale_x = borne_minimale_x; borne_minimale_x = t; } for(t = borne_minimale_x; t <= borne_maximale_x; t += (*s_etat_processus).resolution) { if (recherche_variable(s_etat_processus, nom_x) == d_vrai) { // La variable étant créée localement, elle n'est jamais // ni verrouillée ni partagée. BUG((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL); if ((*(*(*s_etat_processus).pointeur_variable_courante) .objet).type != REL) { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante) .objet); if (((*(*s_etat_processus).pointeur_variable_courante) .objet = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } (*((real8 *) (*(*(*s_etat_processus).pointeur_variable_courante) .objet).objet)) = t; } else { /* * La variable créée étant locale, l'utilisateur ne peut * pas l'effacer. On ne doit donc jamais passer par ici. Si * c'est néanmoins le cas, une erreur système est générée * provoquant l'arrêt du programme même dans une * structure IFERR. */ if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux) { /* * Aucune variable "EQ" n'existe. */ (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; /* * Retrait de la variable INDEP */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_x); free(nom_fichier); return; } /* * Evaluation de la fonction */ hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle; l_position_normale = (*s_etat_processus).l_base_pile_systeme; niveau_courant = (*s_etat_processus).niveau_courant; (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; if (evaluation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, 'N') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { /* * Erreur système */ free(nom_fichier); return; } else { retour_suite_erreur = d_faux; (*s_etat_processus).niveau_courant = niveau_courant; /* * Restauration de la pile initiale */ while((*s_etat_processus).hauteur_pile_operationnelle > hauteur_pile) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; retour_suite_erreur = d_vrai; break; } liberation(s_etat_processus, s_objet); } /* * Restauration de la pile système */ while((*s_etat_processus).l_base_pile_systeme != l_position_normale) { depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { /* * Une pile vide provoque une erreur système */ free(nom_fichier); return; } } if (retour_suite_erreur == d_vrai) { /* * Retrait de la variable INDEP et retour */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_x); free(nom_fichier); return; } } (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; } else { /* * Donnée valide à écrire dans le fichier */ if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { /* * Retrait de la variable INDEP et retour */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet).type == INT) { r = (double) (*((integer8 *) (*s_objet).objet)); if (fprintf(fichier, "%f %f\n", r * cos(t), r * sin(t)) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else if ((*s_objet).type == REL) { r = (double) (*((real8 *) (*s_objet).objet)); if (fprintf(fichier, "%f %f\n", r * cos(t), r * sin(t)) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } liberation(s_etat_processus, s_objet); } } /* * Retrait de la variable locale */ (*s_etat_processus).niveau_courant--; if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_x); } /* * Tracé { x=RE(f(t)), y=IM(f(t)) } * Les bornes de variation de T sont données par une * liste "{ T T_min T_max } INDEP". * INDEP et DEPND testent leurs arguments pour que les pointeurs * indep et depend désignent des objets de type NOM ou LST à * trois éléments. */ else if (strcmp((*s_etat_processus).type_trace_eq, "PARAMETRIQUE") == 0) { dimensions = 2; /* * Vérification de la présence de la variable globale EQ */ if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux) { /* * Aucune variable "EQ" n'existe. */ if ((*s_etat_processus).erreur_execution == d_ex) { (*s_etat_processus).erreur_execution = d_ex_absence_equation; } (*s_etat_processus).erreur_systeme = d_es; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } return; } /* * Création du fichier graphique temporaire */ if ((nom_fichier = creation_nom_fichier(s_etat_processus, (*s_etat_processus).chemin_fichiers_temporaires)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((fichier = fopen(nom_fichier, "w+")) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * Récupération du domaine de variation de x */ if ((*(*s_etat_processus).indep).type == LST) { l_element_courant = (*(*s_etat_processus).indep).objet; if ((s_variable_x.nom = malloc((strlen((*((struct_nom *) (*(*l_element_courant).donnee).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant) .donnee).objet)).nom); if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(nom_x, s_variable_x.nom); l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_minimale_x = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == INT) { borne_minimale_x = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_minimale_x = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet)); } else { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(s_variable_x.nom); free(nom_x); liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } liberation(s_etat_processus, s_objet_evalue); } l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_maximale_x = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_maximale_x = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_maximale_x = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet)); } else { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } liberation(s_etat_processus, s_objet_evalue); } } else { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; free(nom_fichier); return; } /* * Création d'une variable locale du nom pointé par INDEP */ (*s_etat_processus).niveau_courant++; s_variable_x.niveau = (*s_etat_processus).niveau_courant; if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P') == d_erreur) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * L'erreur retournée ne peut être qu'une erreur système. */ free(nom_fichier); return; } /* * Boucle de calcul des points de la fonction */ if (borne_maximale_x < borne_minimale_x) { t = borne_maximale_x; borne_maximale_x = borne_minimale_x; borne_minimale_x = t; } for(t = borne_minimale_x; t <= borne_maximale_x; t += (*s_etat_processus).resolution) { if (recherche_variable(s_etat_processus, nom_x) == d_vrai) { // La variable étant créée localement, elle n'est jamais // ni verrouillée ni partagée. BUG((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL); if ((*(*(*s_etat_processus).pointeur_variable_courante) .objet).type != REL) { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante) .objet); if (((*(*s_etat_processus).pointeur_variable_courante) .objet = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } (*((real8 *) (*(*(*s_etat_processus).pointeur_variable_courante) .objet).objet)) = t; } else { /* * La variable créée étant locale, l'utilisateur ne peut * pas l'effacer. On ne doit donc jamais passer par ici. Si * c'est néanmoins le cas, une erreur système est générée * provoquant l'arrêt du programme même dans une * structure IFERR. */ if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux) { /* * Aucune variable "EQ" n'existe. */ (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; /* * Retrait de la variable INDEP */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_x); free(nom_fichier); return; } /* * Evaluation de la fonction */ hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle; l_position_normale = (*s_etat_processus).l_base_pile_systeme; niveau_courant = (*s_etat_processus).niveau_courant; (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; if (evaluation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, 'N') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { /* * Erreur système */ free(nom_fichier); return; } else { retour_suite_erreur = d_faux; (*s_etat_processus).niveau_courant = niveau_courant; /* * Restauration de la pile initiale */ while((*s_etat_processus).hauteur_pile_operationnelle > hauteur_pile) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; retour_suite_erreur = d_vrai; break; } liberation(s_etat_processus, s_objet); } /* * Restauration de la pile système */ while((*s_etat_processus).l_base_pile_systeme != l_position_normale) { depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { /* * Une pile vide provoque une erreur système */ free(nom_fichier); return; } } if (retour_suite_erreur == d_vrai) { /* * Retrait de la variable INDEP et retour */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_x); free(nom_fichier); return; } } (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; } else { /* * Donnée valide à écrire dans le fichier */ if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { /* * Retrait de la variable INDEP et retour */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet).type == INT) { x = (double) (*((integer8 *) (*s_objet).objet)); y = 0; if (fprintf(fichier, "%f %f\n", x, y) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else if ((*s_objet).type == REL) { x = (double) (*((real8 *) (*s_objet).objet)); y = 0; if (fprintf(fichier, "%f %f\n", x, y) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else if ((*s_objet).type == CPL) { x = (*((complex16 *) (*s_objet).objet)).partie_reelle; y = (*((complex16 *) (*s_objet).objet)).partie_imaginaire; if (fprintf(fichier, "%f %f\n", x, y) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } liberation(s_etat_processus, s_objet); } } /* * Retrait de la variable locale */ (*s_etat_processus).niveau_courant--; if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_x); } /* * Tracé z=f(x,y) * Les bornes de variation de X sont données dans l'ordre * - soit sous la forme "{ X X_min X_max } INDEP" ; * - soit par les parties réelles de PMIN et PMAX. * Les bornes de variation de Y sont données dans l'ordre * - soit sous la forme "{ Y Y_min Y_max } DEPND" ; * - soit par les parties imaginaires de PMIN et PMAX. * INDEP et DEPND testent leurs arguments pour que les pointeurs * indep et depend désignent des objets de type NOM ou LST à * trois éléments. */ else if ((strcmp((*s_etat_processus).type_trace_eq, "GRILLE 3D") == 0) || (strcmp((*s_etat_processus).type_trace_eq, "COURBES DE NIVEAU") == 0)) { premiere_iteration = d_vrai; /* * Vérification de la présence de la variable globale EQ */ if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux) { /* * Aucune variable "EQ" n'existe. */ if ((*s_etat_processus).erreur_execution == d_ex) { (*s_etat_processus).erreur_execution = d_ex_absence_equation; } (*s_etat_processus).erreur_systeme = d_es; return; } /* * Création du fichier graphique temporaire */ if ((nom_fichier = creation_nom_fichier(s_etat_processus, (*s_etat_processus).chemin_fichiers_temporaires)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((fichier = fopen(nom_fichier, "w+")) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * Récupération du domaine de variation de x */ if ((*(*s_etat_processus).indep).type == LST) { l_element_courant = (*(*s_etat_processus).indep).objet; if ((s_variable_x.nom = malloc((strlen((*((struct_nom *) (*(*l_element_courant).donnee).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant) .donnee).objet)).nom); if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(nom_x, s_variable_x.nom); l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_minimale_x = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_minimale_x = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_minimale_x = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet)); } else { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(s_variable_x.nom); free(nom_x); free(nom_fichier); liberation(s_etat_processus, s_objet_evalue); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_evalue); } l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_maximale_x = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_maximale_x = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_maximale_x = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet)); } else { free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } liberation(s_etat_processus, s_objet_evalue); } } else { if ((s_variable_x.nom = malloc((strlen((*((struct_nom *) (*(*s_etat_processus) .indep).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(s_variable_x.nom, (*((struct_nom *) (*(*s_etat_processus) .indep).objet)).nom); if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(nom_x, s_variable_x.nom); if ((*s_etat_processus).systeme_axes == 0) { borne_minimale_x = (*s_etat_processus).x_min; borne_maximale_x = (*s_etat_processus).x_max; } else { borne_minimale_x = (*s_etat_processus).x2_min; borne_maximale_x = (*s_etat_processus).x2_max; } } /* * Création d'une variable locale du nom pointé par INDEP */ (*s_etat_processus).niveau_courant++; s_variable_x.niveau = (*s_etat_processus).niveau_courant; if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P') == d_erreur) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * L'erreur retournée ne peut être qu'une erreur système */ free(nom_fichier); return; } /* * Boucle de calcul des points de la fonction */ if (borne_maximale_x < borne_minimale_x) { x = borne_maximale_x; borne_maximale_x = borne_minimale_x; borne_minimale_x = x; } dernier_point_valide[0] = 0; dernier_point_valide[1] = 0; dernier_point_valide[2] = 0; for(x = borne_minimale_x; x <= borne_maximale_x; x += (*s_etat_processus).resolution) { /* * Récupération du domaine de variation de y, celui-ci peut dépendre * du domaine de variation de x. */ if ((*(*s_etat_processus).depend).type == LST) { l_element_courant = (*(*s_etat_processus).depend).objet; if ((s_variable_y.nom = malloc((strlen((*((struct_nom *) (*(*l_element_courant).donnee).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(s_variable_y.nom, (*((struct_nom *) (*(*l_element_courant).donnee).objet)).nom); if ((nom_y = malloc((strlen(s_variable_y.nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(nom_y, s_variable_y.nom); l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_minimale_y = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_minimale_y = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_y.nom); free(nom_y); free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_y.nom); free(nom_y); free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_minimale_y = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_minimale_y = (*((real8 *) (*s_objet_evalue).objet)); } else { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(s_variable_y.nom); free(nom_y); free(s_variable_x.nom); free(nom_x); free(nom_fichier); liberation(s_etat_processus, s_objet_evalue); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_evalue); } l_element_courant = (*l_element_courant).suivant; if ((*(*l_element_courant).donnee).type == INT) { borne_maximale_y = (real8) (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else if ((*(*l_element_courant).donnee).type == REL) { borne_maximale_y = (*((real8 *) (*(*l_element_courant) .donnee).objet)); } else { if (evaluation(s_etat_processus, (*l_element_courant).donnee, 'N') == d_erreur) { free(s_variable_y.nom); free(nom_y); free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_evalue) == d_erreur) { free(s_variable_y.nom); free(nom_y); free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if ((*s_objet_evalue).type == INT) { borne_maximale_y = (real8) (*((integer8 *) (*s_objet_evalue).objet)); } else if ((*s_objet_evalue).type == REL) { borne_maximale_y = (*((real8 *) (*s_objet_evalue).objet)); } else { free(s_variable_y.nom); free(nom_y); free(s_variable_x.nom); free(nom_x); if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } liberation(s_etat_processus, s_objet_evalue); } } else { if ((s_variable_y.nom = malloc((strlen((*((struct_nom *) (*(*s_etat_processus) .depend).objet)).nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(s_variable_y.nom, (*((struct_nom *) (*(*s_etat_processus) .depend).objet)).nom); if ((nom_y = malloc((strlen(s_variable_y.nom) + 1) * sizeof(unsigned char))) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy(nom_y, s_variable_y.nom); if ((*s_etat_processus).systeme_axes == 0) { borne_minimale_y = (*s_etat_processus).y_min; borne_maximale_y = (*s_etat_processus).y_max; } else { borne_minimale_y = (*s_etat_processus).y2_min; borne_maximale_y = (*s_etat_processus).y2_max; } } /* * Création d'une variable locale du nom pointé par DEPEND */ s_variable_y.niveau = (*s_etat_processus).niveau_courant; if ((s_variable_y.objet = allocation(s_etat_processus, REL)) == NULL) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (creation_variable(s_etat_processus, &s_variable_y, 'V', 'P') == d_erreur) { if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * L'erreur retournée ne peut être qu'une erreur système */ free(nom_fichier); return; } if (borne_maximale_y < borne_minimale_y) { y = borne_maximale_y; borne_maximale_y = borne_minimale_y; borne_minimale_y = y; } if (premiere_iteration == d_vrai) { dernier_point_valide[0] = borne_minimale_x; dernier_point_valide[1] = borne_minimale_y; dernier_point_valide[2] = 0; premiere_iteration = d_faux; } for(y = borne_minimale_y; y <= borne_maximale_y; y += (*s_etat_processus).resolution) { if (recherche_variable(s_etat_processus, nom_x) == d_vrai) { // La variable étant créée localement, elle n'est jamais // ni verrouillée ni partagee. BUG((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL); if ((*(*(*s_etat_processus).pointeur_variable_courante) .objet).type != REL) { liberation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet); if (((*(*s_etat_processus).pointeur_variable_courante) .objet = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } (*((real8 *) (*(*(*s_etat_processus) .pointeur_variable_courante).objet).objet)) = x; } else { /* * La variable créée étant locale, l'utilisateur ne peut * pas l'effacer. On ne doit donc jamais passer par ici. Si * c'est néanmoins le cas, une erreur système est générée * provoquant l'arrêt du programme même dans une * structure IFERR. */ if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (recherche_variable(s_etat_processus, nom_y) == d_vrai) { // La variable étant créée localement, elle n'est jamais // ni verrouillée ni partagée. BUG((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL); if ((*(*(*s_etat_processus).pointeur_variable_courante) .objet).type != REL) { liberation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet); if (((*(*s_etat_processus).pointeur_variable_courante) .objet = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } (*((real8 *) (*(*(*s_etat_processus) .pointeur_variable_courante).objet).objet)) = y; } else { /* * La variable créée étant locale, l'utilisateur ne peut * pas l'effacer. On ne doit donc jamais passer par ici. Si * c'est néanmoins le cas, une erreur système est générée * provoquant l'arrêt du programme même dans une * structure IFERR. */ if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_fichier); return; } if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux) { /* * Aucune variable "EQ" n'existe. */ (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; /* * Retrait des variables INDEP et DEPND */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_y); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } if (retrait_variable(s_etat_processus, nom_y, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_y); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } if (last_valide == d_vrai) { sf(s_etat_processus, 31); } free(nom_x); free(nom_y); free(nom_fichier); return; } /* * Evaluation de la fonction */ hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle; l_position_normale = (*s_etat_processus).l_base_pile_systeme; niveau_courant = (*s_etat_processus).niveau_courant; (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; if (evaluation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, 'N') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { /* * Erreur système */ free(nom_fichier); return; } else { retour_suite_erreur = d_faux; (*s_etat_processus).niveau_courant = niveau_courant; /* * Restauration de la pile initiale */ while((*s_etat_processus).hauteur_pile_operationnelle > hauteur_pile) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; retour_suite_erreur = d_vrai; break; } liberation(s_etat_processus, s_objet); } /* * Restauration de la pile système */ while((*s_etat_processus).l_base_pile_systeme != l_position_normale) { depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { /* * Une pile vide provoque une erreur système */ free(nom_fichier); return; } } if (retour_suite_erreur == d_vrai) { /* * Retrait des variables INDEP, DEPND et retour */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; } if (retrait_variable(s_etat_processus, nom_y, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; } free(nom_x); free(nom_y); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } return; } } (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; if (fprintf(fichier, "%f %f %f\n", dernier_point_valide[0], dernier_point_valide[1], dernier_point_valide[2]) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else { /* * Donnée valide à écrire dans le fichier */ if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { /* * Retrait des variables INDEP et DEPND et retour */ (*s_etat_processus).niveau_courant--; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_y); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } if (retrait_variable(s_etat_processus, nom_y, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_y); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_x); free(nom_y); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet).type == INT) { dernier_point_valide[0] = x; dernier_point_valide[1] = y; dernier_point_valide[2] = (real8) (*((integer8 *) (*s_objet).objet)); if (fprintf(fichier, "%f %f %f\n", x, y, (double) (*((integer8 *) (*s_objet).objet))) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else if ((*s_objet).type == REL) { dernier_point_valide[0] = x; dernier_point_valide[1] = y; dernier_point_valide[2] = (*((real8 *) (*s_objet).objet)); if (fprintf(fichier, "%f %f %f\n", x, y, (*((real8 *) (*s_objet).objet))) < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } liberation(s_etat_processus, s_objet); } } /* * Retrait de la variable locale DEPND */ if (retrait_variable(s_etat_processus, nom_y, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_y); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_y); /* * Saut de ligne dans le fichier pour commencer une nouvelle * trace. */ if (fprintf(fichier, "\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } /* * Retrait de la variable locale INDEP */ (*s_etat_processus).niveau_courant--; if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur) { if ((*s_etat_processus).erreur_systeme != d_es) { if ((*s_etat_processus).erreur_systeme == d_es_variable_introuvable) { (*s_etat_processus).erreur_systeme = d_es; } else { /* * Erreur système */ free(nom_fichier); return; } } free(nom_x); free(nom_fichier); if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; return; } free(nom_x); if (strcmp((*s_etat_processus).type_trace_eq, "COURBES DE NIVEAU") == 0) { // Conversion du graphe dimensions = 2; if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((entree_standard = popen("gnuplot", "w")) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (fprintf(entree_standard, "set nosurface\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (fprintf(entree_standard, "set contour\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (fprintf(entree_standard, "set cntrparam level ") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } l_element_courant = (struct_liste_chainee *) (*(*s_etat_processus) .parametres_courbes_de_niveau).objet; if (l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == CHN) { if (strcmp((unsigned char *) (*(*l_element_courant).donnee) .objet, "AUTOMATIC") == 0) { if (fprintf(entree_standard, "auto") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else if (strcmp((unsigned char *) (*(*l_element_courant) .donnee).objet, "DISCRETE") == 0) { if (fprintf(entree_standard, "discrete") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { if (fprintf(entree_standard, "incremental") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } l_element_courant = (*l_element_courant).suivant; if (l_element_courant != NULL) { if (fprintf(entree_standard, " ") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == INT) { if (fprintf(entree_standard, "%f", (double) (*((integer8 *) (*(*l_element_courant).donnee) .objet))) < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { if (fprintf(entree_standard, "%f", (double) (*((real8 *) (*(*l_element_courant).donnee) .objet))) < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } l_element_courant = (*l_element_courant).suivant; if (l_element_courant != NULL) { if (fprintf(entree_standard, ",") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } if (fprintf(entree_standard, "\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } if (fprintf(entree_standard, "set terminal table\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if ((nom_fichier_converti = creation_nom_fichier( s_etat_processus, (*s_etat_processus) .chemin_fichiers_temporaires)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (fprintf(entree_standard, "set output '%s'\n", nom_fichier_converti) < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (fprintf(entree_standard, "splot '%s'\n", nom_fichier) < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (fprintf(entree_standard, "set output\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (fprintf(entree_standard, "quit\n") < 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (pclose(entree_standard) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (destruction_fichier(nom_fichier) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((fichier = fopen(nom_fichier_converti, "r")) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } free(nom_fichier); nom_fichier = nom_fichier_converti; } else { dimensions = 3; } } /* * Type de tracé invalide */ else { if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_type_trace_invalide; return; } /* * Fermeture du fichier graphique */ if (fclose(fichier) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } /* * Chaînage du fichier temporaire à la liste des fichiers graphiques */ l_fichier_courant = (*s_etat_processus).fichiers_graphiques; if (l_fichier_courant == NULL) { if (((*s_etat_processus).fichiers_graphiques = malloc( sizeof(struct_fichier_graphique))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*s_etat_processus).fichiers_graphiques).suivant = NULL; (*(*s_etat_processus).fichiers_graphiques).nom = nom_fichier; (*(*s_etat_processus).fichiers_graphiques).legende = NULL; (*(*s_etat_processus).fichiers_graphiques).dimensions = dimensions; (*(*s_etat_processus).fichiers_graphiques).presence_axes = d_faux; (*(*s_etat_processus).fichiers_graphiques).systeme_axes = (*s_etat_processus).systeme_axes; strcpy((*(*s_etat_processus).fichiers_graphiques).type, (*s_etat_processus).type_trace_eq); } else { while(l_fichier_courant != NULL) { if ((*l_fichier_courant).dimensions != dimensions) { if (last_valide == d_vrai) { sf(s_etat_processus, 31); } (*s_etat_processus).erreur_execution = d_ex_dimensions_differentes; return; } l_fichier_precedent = l_fichier_courant; l_fichier_courant = (*l_fichier_courant).suivant; } l_fichier_courant = l_fichier_precedent; if (((*l_fichier_courant).suivant = malloc( sizeof(struct_fichier_graphique))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_fichier_courant = (*l_fichier_courant).suivant; (*l_fichier_courant).suivant = NULL; (*l_fichier_courant).nom = nom_fichier; (*l_fichier_courant).legende = NULL; (*l_fichier_courant).dimensions = dimensions; (*l_fichier_courant).presence_axes = d_faux; (*l_fichier_courant).systeme_axes = (*s_etat_processus).systeme_axes; strcpy((*l_fichier_courant).type, (*s_etat_processus).type_trace_eq); } /* * Affichage du graphique */ appel_gnuplot(s_etat_processus, 'N'); (*s_etat_processus).erreur_execution = d_ex; (*s_etat_processus).exception = d_ep; if (last_valide == d_vrai) { sf(s_etat_processus, 31); } return; } /* ================================================================================ Fonction 'drax' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_drax(struct_processus *s_etat_processus) { struct_fichier_graphique *l_fichier_courant; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n DRAX "); if ((*s_etat_processus).langue == 'F') { printf("(trace les axes)\n\n"); printf(" Aucun argument\n"); } else { printf("(plot axes)\n\n"); printf(" No argument\n"); } return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } } if ((*s_etat_processus).fichiers_graphiques != NULL) { l_fichier_courant = (*s_etat_processus).fichiers_graphiques; if (l_fichier_courant != NULL) { while((*l_fichier_courant).suivant != NULL) { l_fichier_courant = (*l_fichier_courant).suivant; } (*l_fichier_courant).presence_axes = d_vrai; } } if (test_cfsf(s_etat_processus, 52) == d_faux) { if ((*s_etat_processus).fichiers_graphiques != NULL) { appel_gnuplot(s_etat_processus, 'N'); } } return; } /* ================================================================================ Fonction 'depnd' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_depnd(struct_processus *s_etat_processus) { struct_liste_chainee *l_element_courant; struct_objet *s_objet; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n DEPND "); if ((*s_etat_processus).langue == 'F') { printf("(indication de la variable dépendante)\n\n"); } else { printf("(set dependant variable)\n\n"); } printf(" 1: %s, %s\n", d_NOM, d_LST); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet).type == NOM) { liberation(s_etat_processus, (*s_etat_processus).depend); (*s_etat_processus).depend = s_objet; } else if ((*s_objet).type == LST) { l_element_courant = (struct_liste_chainee *) (*s_objet).objet; if ((*(*l_element_courant).donnee).type != NOM) { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } (*((struct_nom *) (*(*l_element_courant).donnee).objet)).symbole = d_vrai; l_element_courant = (*l_element_courant).suivant; if (!(((*(*l_element_courant).donnee).type == INT) || ((*(*l_element_courant).donnee).type == REL) || ((*(*l_element_courant).donnee).type == NOM) || ((*(*l_element_courant).donnee).type == ALG) || ((*(*l_element_courant).donnee).type == RPN))) { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } l_element_courant = (*l_element_courant).suivant; if (!(((*(*l_element_courant).donnee).type == INT) || ((*(*l_element_courant).donnee).type == REL) || ((*(*l_element_courant).donnee).type == NOM) || ((*(*l_element_courant).donnee).type == ALG) || ((*(*l_element_courant).donnee).type == RPN))) { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } l_element_courant = (*l_element_courant).suivant; if (l_element_courant != NULL) { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } liberation(s_etat_processus, (*s_etat_processus).depend); (*s_etat_processus).depend = s_objet; } else { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } return; } // vim: ts=4