File:  [local] / rpl / src / instructions_d3.c
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Thu Jun 24 10:10:42 2010 UTC (13 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_17, HEAD
En route pour la 4.0.17 !

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.17
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl.conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'draw'
   29: ================================================================================
   30:   Entrées : pointeur sur une structure struct_processus
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_draw(struct_processus *s_etat_processus)
   40: {
   41:     file                        *entree_standard;
   42:     file                        *fichier;
   43: 
   44:     int                         dimensions;
   45: 
   46:     logical1                    last_valide;
   47:     logical1                    premiere_iteration;
   48:     logical1                    presence_variable;
   49:     logical1                    retour_suite_erreur;
   50: 
   51:     long                        hauteur_pile;
   52:     long                        i;
   53: 
   54:     real8                       borne_maximale_x;
   55:     real8                       borne_maximale_y;
   56:     real8                       borne_minimale_x;
   57:     real8                       borne_minimale_y;
   58:     real8                       dernier_point_valide[3];
   59:     real8                       r;
   60:     real8                       t;
   61:     real8                       x;
   62:     real8                       y;
   63: 
   64:     struct_fichier_graphique    *l_fichier_courant;
   65:     struct_fichier_graphique    *l_fichier_precedent;
   66: 
   67:     struct_liste_chainee        *l_element_courant;
   68: 
   69:     struct_liste_pile_systeme   *l_position_normale;
   70: 
   71:     struct_objet                *s_objet;
   72:     struct_objet                *s_objet_evalue;
   73: 
   74:     struct_variable             s_variable_x;
   75:     struct_variable             s_variable_y;
   76: 
   77:     unsigned char               mode_evaluation_expression;
   78:     unsigned char               *nom_fichier;
   79:     unsigned char               *nom_fichier_converti;
   80:     unsigned char               *nom_x;
   81:     unsigned char               *nom_y;
   82: 
   83:     unsigned long               niveau_courant;
   84: 
   85:     (*s_etat_processus).erreur_execution = d_ex;
   86: 
   87:     if ((*s_etat_processus).affichage_arguments == 'Y')
   88:     {
   89:         printf("\n  DRAW ");
   90: 
   91:         if ((*s_etat_processus).langue == 'F')
   92:         {
   93:             printf("(trace un graphe)\n\n");
   94:             printf("  Aucun argument\n");
   95:         }
   96:         else
   97:         {
   98:             printf("(plot a graphic)\n\n");
   99:             printf("  No argument\n");
  100:         }
  101: 
  102:         return;
  103:     }
  104:     else if ((*s_etat_processus).test_instruction == 'Y')
  105:     {
  106:         (*s_etat_processus).nombre_arguments = -1;
  107:         return;
  108:     }
  109: 
  110:     if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
  111:     {
  112:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  113:         {
  114:             return;
  115:         }
  116: 
  117:         cf(s_etat_processus, 31);
  118:     }
  119: 
  120:     /*
  121:      * Tracé y=f(x)
  122:      * Les bornes de variation de X sont données dans l'ordre
  123:      * - soit sous la forme "{ X X_min X_max } INDEP" ;
  124:      * - soit par les parties réelles de PMIN et PMAX.
  125:      * INDEP et DEPND testent leurs arguments pour que les pointeurs
  126:      * indep et depend désignent des objets de type NOM ou LST à
  127:      * trois éléments.
  128:      */
  129: 
  130:     if ((strcmp((*s_etat_processus).type_trace_eq, "FONCTION") == 0) ||
  131:             (strcmp((*s_etat_processus).type_trace_eq, "ECHANTILLONS") == 0))
  132:     {
  133:         dimensions = 2;
  134: 
  135:         /*
  136:          * Vérification de la présence de la variable globale EQ
  137:          */
  138:         
  139:         if (recherche_variable(s_etat_processus, "EQ") == d_faux)
  140:         {
  141:             /*
  142:              * Aucune variable "EQ" n'existe.
  143:              */
  144: 
  145:             (*s_etat_processus).erreur_execution = d_ex_absence_equation;
  146:             (*s_etat_processus).erreur_systeme = d_es;
  147: 
  148:             if (last_valide == d_vrai)
  149:             {
  150:                 sf(s_etat_processus, 31);
  151:             }
  152: 
  153:             return;
  154:         }
  155: 
  156:         /*
  157:          * Recherche de la variable globale "EQ"
  158:          */
  159:         
  160:         i = (*s_etat_processus).position_variable_courante;
  161:         presence_variable = d_faux;
  162: 
  163:         while(i >= 0)
  164:         {
  165:             if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
  166:                     "EQ") == 0) && ((*s_etat_processus)
  167:                     .s_liste_variables[i].niveau == 1))
  168:             {
  169:                 presence_variable = d_vrai;
  170:                 break;
  171:             }
  172: 
  173:             i--;
  174:         }
  175: 
  176:         if (presence_variable == d_faux)
  177:         {
  178:             (*s_etat_processus).erreur_execution = d_ex_absence_equation;
  179: 
  180:             if (last_valide == d_vrai)
  181:             {
  182:                 sf(s_etat_processus, 31);
  183:             }
  184: 
  185:             return;
  186:         }
  187: 
  188:         if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
  189:         {
  190:             (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
  191:             return;
  192:         }
  193: 
  194:         /*
  195:          * Création du fichier graphique temporaire
  196:          */
  197: 
  198:         if ((nom_fichier = creation_nom_fichier(s_etat_processus,
  199:                 (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
  200:         {
  201:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  202:             return;
  203:         }
  204: 
  205:         if ((fichier = fopen(nom_fichier, "w+")) == NULL)
  206:         {
  207:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  208:             return;
  209:         }
  210: 
  211:         /*
  212:          * Récupération du domaine de variation de x
  213:          */
  214: 
  215:         if ((*(*s_etat_processus).indep).type == LST)
  216:         {
  217:             l_element_courant = (*(*s_etat_processus).indep).objet;
  218: 
  219:             if ((s_variable_x.nom = malloc((strlen((*((struct_nom *)
  220:                     (*(*l_element_courant).donnee).objet)).nom) + 1) *
  221:                     sizeof(unsigned char))) == NULL)
  222:             {
  223:                 if (fclose(fichier) != 0)
  224:                 {
  225:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  226:                     return;
  227:                 }
  228: 
  229:                 if (destruction_fichier(nom_fichier) == d_erreur)
  230:                 {
  231:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  232:                     return;
  233:                 }
  234: 
  235:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  236:                 return;
  237:             }
  238: 
  239:             strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant)
  240:                     .donnee).objet)).nom);
  241: 
  242:             if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
  243:                     sizeof(unsigned char))) == NULL)
  244:             {
  245:                 if (fclose(fichier) != 0)
  246:                 {
  247:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  248:                     return;
  249:                 }
  250: 
  251:                 if (destruction_fichier(nom_fichier) == d_erreur)
  252:                 {
  253:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  254:                     return;
  255:                 }
  256: 
  257:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  258:                 return;
  259:             }
  260: 
  261:             strcpy(nom_x, s_variable_x.nom);
  262: 
  263:             l_element_courant = (*l_element_courant).suivant;
  264: 
  265:             if ((*(*l_element_courant).donnee).type == INT)
  266:             {
  267:                 borne_minimale_x = (real8) (*((integer8 *)
  268:                         (*(*l_element_courant).donnee).objet));
  269:             }
  270:             else if ((*(*l_element_courant).donnee).type == REL)
  271:             {
  272:                 borne_minimale_x = (*((real8 *) (*(*l_element_courant)
  273:                         .donnee).objet));
  274:             }
  275:             else
  276:             {
  277:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
  278:                         'N') == d_erreur)
  279:                 {
  280:                     free(s_variable_x.nom);
  281:                     free(nom_x);
  282: 
  283:                     if (fclose(fichier) != 0)
  284:                     {
  285:                         (*s_etat_processus).erreur_systeme =
  286:                                 d_es_erreur_fichier;
  287:                         return;
  288:                     }
  289: 
  290:                     if (destruction_fichier(nom_fichier) == d_erreur)
  291:                     {
  292:                         (*s_etat_processus).erreur_systeme =
  293:                                 d_es_erreur_fichier;
  294:                         return;
  295:                     }
  296: 
  297:                     if (last_valide == d_vrai)
  298:                     {
  299:                         sf(s_etat_processus, 31);
  300:                     }
  301: 
  302:                     free(nom_fichier);
  303:                     return;
  304:                 }
  305: 
  306:                 if (depilement(s_etat_processus, &((*s_etat_processus)
  307:                         .l_base_pile), &s_objet_evalue) == d_erreur)
  308:                 {
  309:                     free(s_variable_x.nom);
  310:                     free(nom_x);
  311: 
  312:                     if (fclose(fichier) != 0)
  313:                     {
  314:                         (*s_etat_processus).erreur_systeme =
  315:                                 d_es_erreur_fichier;
  316:                         return;
  317:                     }
  318: 
  319:                     if (destruction_fichier(nom_fichier) == d_erreur)
  320:                     {
  321:                         (*s_etat_processus).erreur_systeme =
  322:                                 d_es_erreur_fichier;
  323:                         return;
  324:                     }
  325: 
  326:                     (*s_etat_processus).erreur_execution =
  327:                             d_ex_manque_argument;
  328: 
  329:                     if (last_valide == d_vrai)
  330:                     {
  331:                         sf(s_etat_processus, 31);
  332:                     }
  333: 
  334:                     free(nom_fichier);
  335:                     return;
  336:                 }
  337: 
  338:                 if ((*s_objet_evalue).type == INT)
  339:                 {
  340:                     borne_minimale_x = (real8) (*((integer8 *)
  341:                             (*s_objet_evalue).objet));
  342:                 }
  343:                 else if ((*s_objet_evalue).type == REL)
  344:                 {
  345:                     borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet));
  346:                 }
  347:                 else
  348:                 {
  349:                     if (fclose(fichier) != 0)
  350:                     {
  351:                         (*s_etat_processus).erreur_systeme =
  352:                                 d_es_erreur_fichier;
  353:                         return;
  354:                     }
  355: 
  356:                     if (destruction_fichier(nom_fichier) == d_erreur)
  357:                     {
  358:                         (*s_etat_processus).erreur_systeme =
  359:                                 d_es_erreur_fichier;
  360:                         return;
  361:                     }
  362: 
  363:                     free(s_variable_x.nom);
  364:                     free(nom_x);
  365:                     free(nom_fichier);
  366:                     liberation(s_etat_processus, s_objet_evalue);
  367: 
  368:                     if (last_valide == d_vrai)
  369:                     {
  370:                         sf(s_etat_processus, 31);
  371:                     }
  372: 
  373:                     (*s_etat_processus).erreur_execution =
  374:                             d_ex_erreur_type_argument;
  375:                     return;
  376:                 }
  377: 
  378:                 liberation(s_etat_processus, s_objet_evalue);
  379:             }
  380: 
  381:             l_element_courant = (*l_element_courant).suivant;
  382: 
  383:             if ((*(*l_element_courant).donnee).type == INT)
  384:             {
  385:                 borne_maximale_x = (real8) (*((integer8 *)
  386:                         (*(*l_element_courant).donnee).objet));
  387:             }
  388:             else if ((*(*l_element_courant).donnee).type == REL)
  389:             {
  390:                 borne_maximale_x = (*((real8 *) (*(*l_element_courant)
  391:                         .donnee).objet));
  392:             }
  393:             else
  394:             {
  395:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
  396:                         'N') == d_erreur)
  397:                 {
  398:                     free(s_variable_x.nom);
  399:                     free(nom_x);
  400: 
  401:                     if (fclose(fichier) != 0)
  402:                     {
  403:                         (*s_etat_processus).erreur_systeme =
  404:                                 d_es_erreur_fichier;
  405:                         return;
  406:                     }
  407: 
  408:                     if (destruction_fichier(nom_fichier) == d_erreur)
  409:                     {
  410:                         (*s_etat_processus).erreur_systeme =
  411:                                 d_es_erreur_fichier;
  412:                         return;
  413:                     }
  414: 
  415:                     if (last_valide == d_vrai)
  416:                     {
  417:                         sf(s_etat_processus, 31);
  418:                     }
  419: 
  420:                     free(nom_fichier);
  421:                     return;
  422:                 }
  423: 
  424:                 if (depilement(s_etat_processus, &((*s_etat_processus)
  425:                         .l_base_pile), &s_objet_evalue) == d_erreur)
  426:                 {
  427:                     free(s_variable_x.nom);
  428:                     free(nom_x);
  429: 
  430:                     if (fclose(fichier) != 0)
  431:                     {
  432:                         (*s_etat_processus).erreur_systeme =
  433:                                 d_es_erreur_fichier;
  434:                         return;
  435:                     }
  436: 
  437:                     if (destruction_fichier(nom_fichier) == d_erreur)
  438:                     {
  439:                         (*s_etat_processus).erreur_systeme =
  440:                                 d_es_erreur_fichier;
  441:                         return;
  442:                     }
  443: 
  444:                     (*s_etat_processus).erreur_execution =
  445:                             d_ex_manque_argument;
  446: 
  447:                     if (last_valide == d_vrai)
  448:                     {
  449:                         sf(s_etat_processus, 31);
  450:                     }
  451: 
  452:                     free(nom_fichier);
  453:                     return;
  454:                 }
  455: 
  456:                 if ((*s_objet_evalue).type == INT)
  457:                 {
  458:                     borne_maximale_x = (real8) (*((integer8 *)
  459:                             (*s_objet_evalue).objet));
  460:                 }
  461:                 else if ((*s_objet_evalue).type == REL)
  462:                 {
  463:                     borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet));
  464:                 }
  465:                 else
  466:                 {
  467:                     free(s_variable_x.nom);
  468:                     free(nom_x);
  469: 
  470:                     if (fclose(fichier) != 0)
  471:                     {
  472:                         (*s_etat_processus).erreur_systeme =
  473:                                 d_es_erreur_fichier;
  474:                         return;
  475:                     }
  476: 
  477:                     if (destruction_fichier(nom_fichier) == d_erreur)
  478:                     {
  479:                         (*s_etat_processus).erreur_systeme =
  480:                                 d_es_erreur_fichier;
  481:                         return;
  482:                     }
  483: 
  484:                     liberation(s_etat_processus, s_objet_evalue);
  485: 
  486:                     (*s_etat_processus).erreur_execution =
  487:                             d_ex_erreur_type_argument;
  488: 
  489:                     if (last_valide == d_vrai)
  490:                     {
  491:                         sf(s_etat_processus, 31);
  492:                     }
  493: 
  494:                     free(nom_fichier);
  495:                     return;
  496:                 }
  497: 
  498:                 liberation(s_etat_processus, s_objet_evalue);
  499:             }
  500:         }
  501:         else
  502:         {
  503:             if ((s_variable_x.nom =
  504:                     malloc((strlen((*((struct_nom *) (*(*s_etat_processus)
  505:                     .indep).objet)).nom) + 1) * sizeof(unsigned char))) == NULL)
  506:             {
  507:                 if (fclose(fichier) != 0)
  508:                 {
  509:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  510:                     return;
  511:                 }
  512: 
  513:                 if (destruction_fichier(nom_fichier) == d_erreur)
  514:                 {
  515:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  516:                     return;
  517:                 }
  518: 
  519:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  520:                 return;
  521:             }
  522: 
  523:             strcpy(s_variable_x.nom, (*((struct_nom *) (*(*s_etat_processus)
  524:                     .indep).objet)).nom);
  525: 
  526:             if ((nom_x = malloc((strlen(s_variable_x.nom) + 1)
  527:                     * sizeof(unsigned char))) == NULL)
  528:             {
  529:                 if (fclose(fichier) != 0)
  530:                 {
  531:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  532:                     return;
  533:                 }
  534: 
  535:                 if (destruction_fichier(nom_fichier) == d_erreur)
  536:                 {
  537:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  538:                     return;
  539:                 }
  540: 
  541:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  542:                 return;
  543:             }
  544: 
  545:             strcpy(nom_x, s_variable_x.nom);
  546: 
  547:             if ((*s_etat_processus).systeme_axes == 0)
  548:             {
  549:                 borne_minimale_x = (*s_etat_processus).x_min;
  550:                 borne_maximale_x = (*s_etat_processus).x_max;
  551:             }
  552:             else
  553:             {
  554:                 borne_minimale_x = (*s_etat_processus).x2_min;
  555:                 borne_maximale_x = (*s_etat_processus).x2_max;
  556:             }
  557:         }
  558: 
  559:         /*
  560:          * Création d'une variable locale du nom pointé par INDEP
  561:          */
  562: 
  563:         (*s_etat_processus).niveau_courant++;
  564:         s_variable_x.niveau = (*s_etat_processus).niveau_courant;
  565: 
  566:         if ((s_variable_x.objet = allocation(s_etat_processus, REL))
  567:                 == NULL)
  568:         {
  569:             if (fclose(fichier) != 0)
  570:             {
  571:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  572:                 return;
  573:             }
  574: 
  575:             if (destruction_fichier(nom_fichier) == d_erreur)
  576:             {
  577:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  578:                 return;
  579:             }
  580: 
  581:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  582:             return;
  583:         }
  584: 
  585:         if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P')
  586:                 == d_erreur)
  587:         {
  588:             if (fclose(fichier) != 0)
  589:             {
  590:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  591:                 return;
  592:             }
  593: 
  594:             if (destruction_fichier(nom_fichier) == d_erreur)
  595:             {
  596:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  597:                 return;
  598:             }
  599: 
  600:             /*
  601:              * L'erreur retournée ne peut être qu'une erreur système
  602:              */
  603: 
  604:             free(nom_fichier);
  605:             return;
  606:         }
  607: 
  608:         /*
  609:          * Boucle de calcul des points de la fonction
  610:          */
  611: 
  612:         if (borne_maximale_x < borne_minimale_x)
  613:         {
  614:             x = borne_maximale_x;
  615:             borne_maximale_x = borne_minimale_x;
  616:             borne_minimale_x = x;
  617:         }
  618: 
  619:         for(x = borne_minimale_x; x <= borne_maximale_x;
  620:                 x += (*s_etat_processus).resolution)
  621:         {
  622:             if (recherche_variable(s_etat_processus, nom_x)
  623:                     == d_vrai)
  624:             {
  625:                 // La variable étant créée localement, elle n'est jamais
  626:                 // ni verrouillée ni partagée.
  627: 
  628:                 BUG((*s_etat_processus).s_liste_variables
  629:                         [(*s_etat_processus).position_variable_courante]
  630:                         .objet == NULL);
  631: 
  632:                 if ((*((*s_etat_processus).s_liste_variables
  633:                         [(*s_etat_processus).position_variable_courante])
  634:                         .objet).type != REL)
  635:                 {
  636:                     liberation(s_etat_processus,
  637:                             ((*s_etat_processus).s_liste_variables
  638:                             [(*s_etat_processus).position_variable_courante])
  639:                             .objet);
  640: 
  641:                     if ((((*s_etat_processus).s_liste_variables
  642:                             [(*s_etat_processus).position_variable_courante])
  643:                             .objet = allocation(s_etat_processus, REL))
  644:                             == NULL)
  645:                     {
  646:                         (*s_etat_processus).erreur_systeme =
  647:                                 d_es_allocation_memoire;
  648:                         return;
  649:                     }
  650:                 }
  651: 
  652:                 (*((real8 *) (*((*s_etat_processus).s_liste_variables
  653:                         [(*s_etat_processus).position_variable_courante])
  654:                         .objet).objet)) = x;
  655:             }
  656:             else
  657:             {
  658:                 /*
  659:                  * La variable créée étant locale, l'utilisateur ne peut
  660:                  * pas l'effacer. On ne doit donc jamais passer par ici. Si
  661:                  * c'est néanmoins le cas, une erreur système est générée
  662:                  * provoquant l'arrêt du programme même dans une
  663:                  * structure IFERR.
  664:                  */
  665: 
  666:                 if (fclose(fichier) != 0)
  667:                 {
  668:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  669:                     return;
  670:                 }
  671: 
  672:                 if (destruction_fichier(nom_fichier) == d_erreur)
  673:                 {
  674:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  675:                     return;
  676:                 }
  677: 
  678:                 if (last_valide == d_vrai)
  679:                 {
  680:                     sf(s_etat_processus, 31);
  681:                 }
  682: 
  683:                 free(nom_fichier);
  684:                 return;
  685:             }
  686: 
  687:             if (recherche_variable(s_etat_processus, "EQ")
  688:                     == d_faux)
  689:             {
  690:                 /*
  691:                  * Aucune variable "EQ" n'existe.
  692:                  */
  693: 
  694:                 (*s_etat_processus).erreur_execution =
  695:                         d_ex_variable_non_definie;
  696: 
  697:                 /*
  698:                  * Retrait de la variable INDEP
  699:                  */
  700: 
  701:                 (*s_etat_processus).niveau_courant--;
  702: 
  703:                 if (fclose(fichier) != 0)
  704:                 {
  705:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  706:                     return;
  707:                 }
  708: 
  709:                 if (destruction_fichier(nom_fichier) == d_erreur)
  710:                 {
  711:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  712:                     return;
  713:                 }
  714: 
  715:                 if (retrait_variable(s_etat_processus, nom_x, 'L')
  716:                         == d_erreur)
  717:                 {
  718:                     if ((*s_etat_processus).erreur_systeme != d_es)
  719:                     {
  720:                         if ((*s_etat_processus).erreur_systeme ==
  721:                                 d_es_variable_introuvable)
  722:                         {
  723:                             (*s_etat_processus).erreur_systeme = d_es;
  724:                         }
  725:                         else
  726:                         {
  727: 
  728:                         /*
  729:                          * Erreur système
  730:                          */
  731: 
  732:                             free(nom_fichier);
  733:                             return;
  734:                         }
  735:                     }
  736: 
  737:                     free(nom_x);
  738:                     free(nom_fichier);
  739: 
  740:                     if (last_valide == d_vrai)
  741:                     {
  742:                         sf(s_etat_processus, 31);
  743:                     }
  744: 
  745:                     (*s_etat_processus).erreur_execution =
  746:                             d_ex_variable_non_definie;
  747:                     return;
  748:                 }
  749: 
  750:                 if (last_valide == d_vrai)
  751:                 {
  752:                     sf(s_etat_processus, 31);
  753:                 }
  754: 
  755:                 free(nom_x);
  756:                 free(nom_fichier);
  757:                 return;
  758:             }
  759: 
  760:             /*
  761:              * Recherche de la variable globale "EQ"
  762:              */
  763:             
  764:             i = (*s_etat_processus).position_variable_courante;
  765:             presence_variable = d_faux;
  766: 
  767:             while(i >= 0)
  768:             {
  769:                 if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
  770:                         "EQ") == 0) && ((*s_etat_processus)
  771:                         .s_liste_variables[i].niveau == 1))
  772:                 {
  773:                     presence_variable = d_vrai;
  774:                     break;
  775:                 }
  776: 
  777:                 i--;
  778:             }
  779: 
  780:             (*s_etat_processus).position_variable_courante = i;
  781: 
  782:             BUG((*s_etat_processus).s_liste_variables[i].objet == NULL);
  783: 
  784:             if (presence_variable == d_faux)
  785:             {
  786:                 /*
  787:                  * Retrait de la variable INDEP
  788:                  */
  789: 
  790:                 (*s_etat_processus).niveau_courant--;
  791: 
  792:                 if (fclose(fichier) != 0)
  793:                 {
  794:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  795:                     return;
  796:                 }
  797: 
  798:                 if (destruction_fichier(nom_fichier) == d_erreur)
  799:                 {
  800:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  801:                     return;
  802:                 }
  803: 
  804:                 if (retrait_variable(s_etat_processus, nom_x, 'L')
  805:                         == d_erreur)
  806:                 {
  807:                     if ((*s_etat_processus).erreur_systeme != d_es)
  808:                     {
  809:                         if ((*s_etat_processus).erreur_systeme ==
  810:                                 d_es_variable_introuvable)
  811:                         {
  812:                             (*s_etat_processus).erreur_systeme = d_es;
  813:                         }
  814:                         else
  815:                         {
  816: 
  817:                         /*
  818:                          * Erreur système
  819:                          */
  820: 
  821:                             free(nom_fichier);
  822:                             return;
  823:                         }
  824:                     }
  825: 
  826:                     free(nom_x);
  827:                     free(nom_fichier);
  828: 
  829:                     if (last_valide == d_vrai)
  830:                     {
  831:                         sf(s_etat_processus, 31);
  832:                     }
  833: 
  834:                     (*s_etat_processus).erreur_execution =
  835:                             d_ex_variable_non_definie;
  836:                     return;
  837:                 }
  838: 
  839:                 free(nom_x);
  840:                 free(nom_fichier);
  841: 
  842:                 if (last_valide == d_vrai)
  843:                 {
  844:                     sf(s_etat_processus, 31);
  845:                 }
  846: 
  847:                 (*s_etat_processus).erreur_execution =
  848:                         d_ex_variable_non_definie;
  849:                 return;
  850:             }
  851: 
  852:             /*
  853:              * Evaluation de la fonction
  854:              */
  855: 
  856:             hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle;
  857:             l_position_normale = (*s_etat_processus).l_base_pile_systeme;
  858:             niveau_courant = (*s_etat_processus).niveau_courant;
  859:             mode_evaluation_expression = (*s_etat_processus)
  860:                     .mode_evaluation_expression;
  861:             (*s_etat_processus).mode_evaluation_expression = 'Y';
  862: 
  863:             (*s_etat_processus).erreur_execution = d_ex;
  864:             (*s_etat_processus).exception = d_ep;
  865: 
  866:             if (evaluation(s_etat_processus, (*s_etat_processus)
  867:                     .s_liste_variables[(*s_etat_processus)
  868:                     .position_variable_courante].objet, 'N') == d_erreur)
  869:             {
  870:                 (*s_etat_processus).mode_evaluation_expression =
  871:                         mode_evaluation_expression;
  872: 
  873:                 if ((*s_etat_processus).erreur_systeme != d_es)
  874:                 {
  875:                     /*
  876:                      * Erreur système
  877:                      */
  878: 
  879:                     free(nom_fichier);
  880:                     return;
  881:                 }
  882:                 else
  883:                 {
  884:                     retour_suite_erreur = d_faux;
  885:                     (*s_etat_processus).niveau_courant = niveau_courant;
  886: 
  887:                     /*
  888:                      * Restauration de la pile initiale
  889:                      */
  890: 
  891:                     while((*s_etat_processus).hauteur_pile_operationnelle >
  892:                             (unsigned long) hauteur_pile)
  893:                     {
  894:                         if (depilement(s_etat_processus, &((*s_etat_processus)
  895:                                 .l_base_pile), &s_objet) == d_erreur)
  896:                         {
  897:                             (*s_etat_processus).erreur_execution =
  898:                                     d_ex_manque_argument;
  899:                             retour_suite_erreur = d_vrai;
  900:                             break;
  901:                         }
  902: 
  903:                         liberation(s_etat_processus, s_objet);
  904:                     }
  905: 
  906:                     /*
  907:                      * Restauration de la pile système
  908:                      */
  909: 
  910:                     while((*s_etat_processus).l_base_pile_systeme !=
  911:                             l_position_normale)
  912:                     {
  913:                         depilement_pile_systeme(s_etat_processus);
  914: 
  915:                         if ((*s_etat_processus).erreur_systeme != d_es)
  916:                         {
  917:                             /*
  918:                              * Une pile vide provoque une erreur système
  919:                              */
  920: 
  921:                             free(nom_fichier);
  922:                             return;
  923:                         }
  924:                     }
  925: 
  926:                     if (retour_suite_erreur == d_vrai)
  927:                     {
  928:                         /*
  929:                          * Retrait de la variable INDEP et retour
  930:                          */
  931: 
  932:                         (*s_etat_processus).niveau_courant--;
  933: 
  934:                         if (fclose(fichier) != 0)
  935:                         {
  936:                             (*s_etat_processus).erreur_systeme =
  937:                                     d_es_erreur_fichier;
  938:                             return;
  939:                         }
  940: 
  941:                         if (destruction_fichier(nom_fichier) == d_erreur)
  942:                         {
  943:                             (*s_etat_processus).erreur_systeme =
  944:                                     d_es_erreur_fichier;
  945:                             return;
  946:                         }
  947: 
  948:                         if (retrait_variable(s_etat_processus,
  949:                                 nom_x, 'L') == d_erreur)
  950:                         {
  951:                             if ((*s_etat_processus).erreur_systeme != d_es)
  952:                             {
  953:                                 if ((*s_etat_processus).erreur_systeme ==
  954:                                         d_es_variable_introuvable)
  955:                                 {
  956:                                     (*s_etat_processus).erreur_systeme =
  957:                                             d_es;
  958:                                 }
  959:                                 else
  960:                                 {
  961: 
  962:                                 /*
  963:                                  * Erreur système
  964:                                  */
  965: 
  966:                                     free(nom_fichier);
  967:                                     return;
  968:                                 }
  969:                             }
  970: 
  971:                             (*s_etat_processus).erreur_execution =
  972:                                     d_ex_variable_non_definie;
  973:                         }
  974: 
  975:                         free(nom_x);
  976:                         free(nom_fichier);
  977: 
  978:                         if (last_valide == d_vrai)
  979:                         {
  980:                             sf(s_etat_processus, 31);
  981:                         }
  982: 
  983:                         return;
  984:                     }
  985:                 }
  986: 
  987:                 (*s_etat_processus).erreur_execution = d_ex;
  988:                 (*s_etat_processus).exception = d_ep;
  989:             }
  990:             else
  991:             {
  992:                 (*s_etat_processus).mode_evaluation_expression =
  993:                         mode_evaluation_expression;
  994: 
  995:                 /*
  996:                  * Donnée valide à écrire dans le fichier
  997:                  */
  998: 
  999:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 1000:                         .l_base_pile), &s_objet) == d_erreur)
 1001:                 {
 1002: 
 1003:                     /*
 1004:                      * Retrait de la variable INDEP et retour
 1005:                      */
 1006: 
 1007:                     (*s_etat_processus).niveau_courant--;
 1008: 
 1009:                     if (fclose(fichier) != 0)
 1010:                     {
 1011:                         (*s_etat_processus).erreur_systeme =
 1012:                                 d_es_erreur_fichier;
 1013:                         return;
 1014:                     }
 1015: 
 1016:                     if (destruction_fichier(nom_fichier) == d_erreur)
 1017:                     {
 1018:                         (*s_etat_processus).erreur_systeme =
 1019:                                 d_es_erreur_fichier;
 1020:                         return;
 1021:                     }
 1022: 
 1023:                     if (retrait_variable(s_etat_processus, nom_x,
 1024:                             'L') == d_erreur)
 1025:                     {
 1026:                         if ((*s_etat_processus).erreur_systeme != d_es)
 1027:                         {
 1028:                             if ((*s_etat_processus).erreur_systeme ==
 1029:                                     d_es_variable_introuvable)
 1030:                             {
 1031:                                 (*s_etat_processus).erreur_systeme = d_es;
 1032:                             }
 1033:                             else
 1034:                             {
 1035: 
 1036:                             /*
 1037:                              * Erreur système
 1038:                              */
 1039: 
 1040:                                 free(nom_fichier);
 1041:                                 return;
 1042:                             }
 1043:                         }
 1044: 
 1045:                         free(nom_x);
 1046:                         free(nom_fichier);
 1047: 
 1048:                         if (last_valide == d_vrai)
 1049:                         {
 1050:                             sf(s_etat_processus, 31);
 1051:                         }
 1052: 
 1053:                         (*s_etat_processus).erreur_execution =
 1054:                                 d_ex_variable_non_definie;
 1055:                         return;
 1056:                     }
 1057: 
 1058:                     free(nom_x);
 1059:                     free(nom_fichier);
 1060: 
 1061:                     if (last_valide == d_vrai)
 1062:                     {
 1063:                         sf(s_etat_processus, 31);
 1064:                     }
 1065: 
 1066:                     (*s_etat_processus).erreur_execution =
 1067:                             d_ex_manque_argument;
 1068:                     return;
 1069:                 }
 1070: 
 1071:                 if ((*s_objet).type == INT)
 1072:                 {
 1073:                     if (fprintf(fichier, "%f %f\n", x,
 1074:                             (double) (*((integer8 *)
 1075:                             (*s_objet).objet))) < 0)
 1076:                     {
 1077:                         (*s_etat_processus).erreur_systeme =
 1078:                                 d_es_erreur_fichier;
 1079:                         return;
 1080:                     }
 1081:                 }
 1082:                 else if ((*s_objet).type == REL)
 1083:                 {
 1084:                     if (fprintf(fichier, "%f %f\n", x, (*((real8 *)
 1085:                             (*s_objet).objet))) < 0)
 1086:                     {
 1087:                         (*s_etat_processus).erreur_systeme =
 1088:                                 d_es_erreur_fichier;
 1089:                         return;
 1090:                     }
 1091:                 }
 1092: 
 1093:                 liberation(s_etat_processus, s_objet);
 1094:             }
 1095:         }
 1096: 
 1097:         /*
 1098:          * Retrait de la variable locale
 1099:          */
 1100: 
 1101:         (*s_etat_processus).niveau_courant--;
 1102: 
 1103:         if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
 1104:         {
 1105:             if ((*s_etat_processus).erreur_systeme != d_es)
 1106:             {
 1107:                 if ((*s_etat_processus).erreur_systeme ==
 1108:                         d_es_variable_introuvable)
 1109:                 {
 1110:                     (*s_etat_processus).erreur_systeme = d_es;
 1111:                 }
 1112:                 else
 1113:                 {
 1114:                     /*
 1115:                      * Erreur système
 1116:                      */
 1117: 
 1118:                     free(nom_fichier);
 1119:                     return;
 1120:                 }
 1121:             }
 1122: 
 1123:             free(nom_x);
 1124:             free(nom_fichier);
 1125: 
 1126:             if (last_valide == d_vrai)
 1127:             {
 1128:                 sf(s_etat_processus, 31);
 1129:             }
 1130: 
 1131:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 1132:             return;
 1133:         }
 1134: 
 1135:         free(nom_x);
 1136:     }
 1137: 
 1138:     /*
 1139:      * Tracé r=f(t)
 1140:      * Les bornes de variation de T sont données par une
 1141:      * liste "{ T T_min T_max } INDEP".
 1142:      * INDEP et DEPND testent leurs arguments pour que les pointeurs
 1143:      * indep et depend désignent des objets de type NOM ou LST à
 1144:      * trois éléments.
 1145:      */
 1146: 
 1147:     else if (strcmp((*s_etat_processus).type_trace_eq, "POLAIRE") == 0)
 1148:     {
 1149:         dimensions = 2;
 1150: 
 1151:         /*
 1152:          * Vérification de la présence de la variable globale EQ
 1153:          */
 1154:         
 1155:         if (recherche_variable(s_etat_processus, "EQ") == d_faux)
 1156:         {
 1157:             /*
 1158:              * Aucune variable "EQ" n'existe.
 1159:              */
 1160: 
 1161:             if (last_valide == d_vrai)
 1162:             {
 1163:                 sf(s_etat_processus, 31);
 1164:             }
 1165: 
 1166:             (*s_etat_processus).erreur_execution = d_ex_absence_equation;
 1167:             (*s_etat_processus).erreur_systeme = d_es;
 1168: 
 1169:             return;
 1170:         }
 1171: 
 1172:         /*
 1173:          * Recherche de la variable globale "EQ"
 1174:          */
 1175:         
 1176:         i = (*s_etat_processus).position_variable_courante;
 1177:         presence_variable = d_faux;
 1178: 
 1179:         while(i >= 0)
 1180:         {
 1181:             if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
 1182:                     "EQ") == 0) && ((*s_etat_processus)
 1183:                     .s_liste_variables[i].niveau == 1))
 1184:             {
 1185:                 presence_variable = d_vrai;
 1186:                 break;
 1187:             }
 1188: 
 1189:             i--;
 1190:         }
 1191: 
 1192:         if (presence_variable == d_faux)
 1193:         {
 1194:             if (last_valide == d_vrai)
 1195:             {
 1196:                 sf(s_etat_processus, 31);
 1197:             }
 1198: 
 1199:             (*s_etat_processus).erreur_execution = d_ex_absence_equation;
 1200:             return;
 1201:         }
 1202: 
 1203:         if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
 1204:         {
 1205:             (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
 1206:             return;
 1207:         }
 1208: 
 1209:         /*
 1210:          * Création du fichier graphique temporaire
 1211:          */
 1212: 
 1213:         if ((nom_fichier = creation_nom_fichier(s_etat_processus,
 1214:                 (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
 1215:         {
 1216:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1217:             return;
 1218:         }
 1219: 
 1220:         if ((fichier = fopen(nom_fichier, "w+")) == NULL)
 1221:         {
 1222:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1223:             return;
 1224:         }
 1225: 
 1226:         /*
 1227:          * Récupération du domaine de variation de x
 1228:          */
 1229: 
 1230:         if ((*(*s_etat_processus).indep).type == LST)
 1231:         {
 1232:             l_element_courant = (*(*s_etat_processus).indep).objet;
 1233: 
 1234:             if ((s_variable_x.nom = malloc((strlen((*((struct_nom *)
 1235:                     (*(*l_element_courant).donnee).objet)).nom) + 1) *
 1236:                     sizeof(unsigned char))) == NULL)
 1237:             {
 1238:                 if (fclose(fichier) != 0)
 1239:                 {
 1240:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1241:                     return;
 1242:                 }
 1243: 
 1244:                 if (destruction_fichier(nom_fichier) == d_erreur)
 1245:                 {
 1246:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1247:                     return;
 1248:                 }
 1249: 
 1250:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1251:                 return;
 1252:             }
 1253: 
 1254:             strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant)
 1255:                     .donnee).objet)).nom);
 1256: 
 1257:             if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
 1258:                     sizeof(unsigned char))) == NULL)
 1259:             {
 1260:                 if (fclose(fichier) != 0)
 1261:                 {
 1262:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1263:                     return;
 1264:                 }
 1265: 
 1266:                 if (destruction_fichier(nom_fichier) == d_erreur)
 1267:                 {
 1268:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1269:                     return;
 1270:                 }
 1271: 
 1272:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1273:                 return;
 1274:             }
 1275: 
 1276:             strcpy(nom_x, s_variable_x.nom);
 1277: 
 1278:             l_element_courant = (*l_element_courant).suivant;
 1279: 
 1280:             if ((*(*l_element_courant).donnee).type == INT)
 1281:             {
 1282:                 borne_minimale_x = (real8) (*((integer8 *)
 1283:                         (*(*l_element_courant).donnee).objet));
 1284:             }
 1285:             else if ((*(*l_element_courant).donnee).type == REL)
 1286:             {
 1287:                 borne_minimale_x = (*((real8 *) (*(*l_element_courant)
 1288:                         .donnee).objet));
 1289:             }
 1290:             else
 1291:             {
 1292:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
 1293:                         'N') == d_erreur)
 1294:                 {
 1295:                     free(s_variable_x.nom);
 1296:                     free(nom_x);
 1297: 
 1298:                     if (fclose(fichier) != 0)
 1299:                     {
 1300:                         (*s_etat_processus).erreur_systeme =
 1301:                                 d_es_erreur_fichier;
 1302:                         return;
 1303:                     }
 1304: 
 1305:                     if (destruction_fichier(nom_fichier) == d_erreur)
 1306:                     {
 1307:                         (*s_etat_processus).erreur_systeme =
 1308:                                 d_es_erreur_fichier;
 1309:                         return;
 1310:                     }
 1311: 
 1312:                     if (last_valide == d_vrai)
 1313:                     {
 1314:                         sf(s_etat_processus, 31);
 1315:                     }
 1316: 
 1317:                     free(nom_fichier);
 1318:                     return;
 1319:                 }
 1320: 
 1321:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 1322:                         .l_base_pile), &s_objet_evalue) == d_erreur)
 1323:                 {
 1324:                     free(s_variable_x.nom);
 1325:                     free(nom_x);
 1326: 
 1327:                     if (fclose(fichier) != 0)
 1328:                     {
 1329:                         (*s_etat_processus).erreur_systeme =
 1330:                                 d_es_erreur_fichier;
 1331:                         return;
 1332:                     }
 1333: 
 1334:                     if (destruction_fichier(nom_fichier) == d_erreur)
 1335:                     {
 1336:                         (*s_etat_processus).erreur_systeme =
 1337:                                 d_es_erreur_fichier;
 1338:                         return;
 1339:                     }
 1340: 
 1341:                     (*s_etat_processus).erreur_execution =
 1342:                             d_ex_manque_argument;
 1343: 
 1344:                     if (last_valide == d_vrai)
 1345:                     {
 1346:                         sf(s_etat_processus, 31);
 1347:                     }
 1348: 
 1349:                     free(nom_fichier);
 1350:                     return;
 1351:                 }
 1352: 
 1353:                 if ((*s_objet_evalue).type == INT)
 1354:                 {
 1355:                     borne_minimale_x = (real8) (*((integer8 *)
 1356:                             (*s_objet_evalue).objet));
 1357:                 }
 1358:                 else if ((*s_objet_evalue).type == REL)
 1359:                 {
 1360:                     borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet));
 1361:                 }
 1362:                 else
 1363:                 {
 1364:                     if (fclose(fichier) != 0)
 1365:                     {
 1366:                         (*s_etat_processus).erreur_systeme =
 1367:                                 d_es_erreur_fichier;
 1368:                         return;
 1369:                     }
 1370: 
 1371:                     if (destruction_fichier(nom_fichier) == d_erreur)
 1372:                     {
 1373:                         (*s_etat_processus).erreur_systeme =
 1374:                                 d_es_erreur_fichier;
 1375:                         return;
 1376:                     }
 1377: 
 1378:                     free(s_variable_x.nom);
 1379:                     free(nom_x);
 1380:                     liberation(s_etat_processus, s_objet_evalue);
 1381: 
 1382:                     (*s_etat_processus).erreur_execution =
 1383:                             d_ex_erreur_type_argument;
 1384: 
 1385:                     if (last_valide == d_vrai)
 1386:                     {
 1387:                         sf(s_etat_processus, 31);
 1388:                     }
 1389: 
 1390:                     free(nom_fichier);
 1391:                     return;
 1392:                 }
 1393: 
 1394:                 liberation(s_etat_processus, s_objet_evalue);
 1395:             }
 1396: 
 1397:             l_element_courant = (*l_element_courant).suivant;
 1398: 
 1399:             if ((*(*l_element_courant).donnee).type == INT)
 1400:             {
 1401:                 borne_maximale_x = (real8) (*((integer8 *)
 1402:                         (*(*l_element_courant).donnee).objet));
 1403:             }
 1404:             else if ((*(*l_element_courant).donnee).type == REL)
 1405:             {
 1406:                 borne_maximale_x = (*((real8 *) (*(*l_element_courant)
 1407:                         .donnee).objet));
 1408:             }
 1409:             else
 1410:             {
 1411:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
 1412:                         'N') == d_erreur)
 1413:                 {
 1414:                     free(s_variable_x.nom);
 1415:                     free(nom_x);
 1416: 
 1417:                     if (fclose(fichier) != 0)
 1418:                     {
 1419:                         (*s_etat_processus).erreur_systeme =
 1420:                                 d_es_erreur_fichier;
 1421:                         return;
 1422:                     }
 1423: 
 1424:                     if (destruction_fichier(nom_fichier) == d_erreur)
 1425:                     {
 1426:                         (*s_etat_processus).erreur_systeme =
 1427:                                 d_es_erreur_fichier;
 1428:                         return;
 1429:                     }
 1430: 
 1431:                     if (last_valide == d_vrai)
 1432:                     {
 1433:                         sf(s_etat_processus, 31);
 1434:                     }
 1435: 
 1436:                     free(nom_fichier);
 1437:                     return;
 1438:                 }
 1439: 
 1440:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 1441:                         .l_base_pile), &s_objet_evalue) == d_erreur)
 1442:                 {
 1443:                     free(s_variable_x.nom);
 1444:                     free(nom_x);
 1445: 
 1446:                     if (fclose(fichier) != 0)
 1447:                     {
 1448:                         (*s_etat_processus).erreur_systeme =
 1449:                                 d_es_erreur_fichier;
 1450:                         return;
 1451:                     }
 1452: 
 1453:                     if (destruction_fichier(nom_fichier) == d_erreur)
 1454:                     {
 1455:                         (*s_etat_processus).erreur_systeme =
 1456:                                 d_es_erreur_fichier;
 1457:                         return;
 1458:                     }
 1459: 
 1460:                     (*s_etat_processus).erreur_execution =
 1461:                             d_ex_manque_argument;
 1462: 
 1463:                     if (last_valide == d_vrai)
 1464:                     {
 1465:                         sf(s_etat_processus, 31);
 1466:                     }
 1467: 
 1468:                     free(nom_fichier);
 1469:                     return;
 1470:                 }
 1471: 
 1472:                 if ((*s_objet_evalue).type == INT)
 1473:                 {
 1474:                     borne_maximale_x = (real8) (*((integer8 *)
 1475:                             (*s_objet_evalue).objet));
 1476:                 }
 1477:                 else if ((*s_objet_evalue).type == REL)
 1478:                 {
 1479:                     borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet));
 1480:                 }
 1481:                 else
 1482:                 {
 1483:                     free(s_variable_x.nom);
 1484:                     free(nom_x);
 1485: 
 1486:                     if (fclose(fichier) != 0)
 1487:                     {
 1488:                         (*s_etat_processus).erreur_systeme =
 1489:                                 d_es_erreur_fichier;
 1490:                         return;
 1491:                     }
 1492: 
 1493:                     if (destruction_fichier(nom_fichier) == d_erreur)
 1494:                     {
 1495:                         (*s_etat_processus).erreur_systeme =
 1496:                                 d_es_erreur_fichier;
 1497:                         return;
 1498:                     }
 1499: 
 1500:                     liberation(s_etat_processus, s_objet_evalue);
 1501: 
 1502:                     (*s_etat_processus).erreur_execution =
 1503:                             d_ex_erreur_type_argument;
 1504: 
 1505:                     if (last_valide == d_vrai)
 1506:                     {
 1507:                         sf(s_etat_processus, 31);
 1508:                     }
 1509: 
 1510:                     free(nom_fichier);
 1511:                     return;
 1512:                 }
 1513: 
 1514:                 liberation(s_etat_processus, s_objet_evalue);
 1515:             }
 1516:         }
 1517:         else
 1518:         {
 1519:             if (fclose(fichier) != 0)
 1520:             {
 1521:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1522:                 return;
 1523:             }
 1524: 
 1525:             if (destruction_fichier(nom_fichier) == d_erreur)
 1526:             {
 1527:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1528:                 return;
 1529:             }
 1530: 
 1531:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1532: 
 1533:             if (last_valide == d_vrai)
 1534:             {
 1535:                 sf(s_etat_processus, 31);
 1536:             }
 1537: 
 1538:             free(nom_fichier);
 1539:             return;
 1540:         }
 1541: 
 1542:         /*
 1543:          * Création d'une variable locale du nom pointé par INDEP
 1544:          */
 1545: 
 1546:         (*s_etat_processus).niveau_courant++;
 1547:         s_variable_x.niveau = (*s_etat_processus).niveau_courant;
 1548: 
 1549:         if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL)
 1550:         {
 1551:             if (fclose(fichier) != 0)
 1552:             {
 1553:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1554:                 return;
 1555:             }
 1556: 
 1557:             if (destruction_fichier(nom_fichier) == d_erreur)
 1558:             {
 1559:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1560:                 return;
 1561:             }
 1562: 
 1563:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1564:             return;
 1565:         }
 1566: 
 1567:         if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P')
 1568:                 == d_erreur)
 1569:         {
 1570:             if (fclose(fichier) != 0)
 1571:             {
 1572:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1573:                 return;
 1574:             }
 1575: 
 1576:             if (destruction_fichier(nom_fichier) == d_erreur)
 1577:             {
 1578:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1579:                 return;
 1580:             }
 1581: 
 1582:             /*
 1583:              * L'erreur retournée ne peut être qu'une erreur système
 1584:              */
 1585: 
 1586:             free(nom_fichier);
 1587:             return;
 1588:         }
 1589: 
 1590:         /*
 1591:          * Boucle de calcul des points de la fonction
 1592:          */
 1593: 
 1594:         if (borne_maximale_x < borne_minimale_x)
 1595:         {
 1596:             t = borne_maximale_x;
 1597:             borne_maximale_x = borne_minimale_x;
 1598:             borne_minimale_x = t;
 1599:         }
 1600: 
 1601:         for(t = borne_minimale_x; t <= borne_maximale_x;
 1602:                 t += (*s_etat_processus).resolution)
 1603:         {
 1604:             if (recherche_variable(s_etat_processus, nom_x) == d_vrai)
 1605:             {
 1606:                 // La variable étant créée localement, elle n'est jamais
 1607:                 // ni verrouillée ni partagée.
 1608: 
 1609:                 BUG((*s_etat_processus).s_liste_variables
 1610:                         [(*s_etat_processus).position_variable_courante]
 1611:                         .objet == NULL);
 1612: 
 1613:                 if ((*((*s_etat_processus).s_liste_variables
 1614:                         [(*s_etat_processus).position_variable_courante])
 1615:                         .objet).type != REL)
 1616:                 {
 1617:                     liberation(s_etat_processus,
 1618:                             ((*s_etat_processus).s_liste_variables
 1619:                             [(*s_etat_processus).position_variable_courante])
 1620:                             .objet);
 1621: 
 1622:                     if ((((*s_etat_processus).s_liste_variables
 1623:                             [(*s_etat_processus).position_variable_courante])
 1624:                             .objet = allocation(s_etat_processus, REL))
 1625:                             == NULL)
 1626:                     {
 1627:                         (*s_etat_processus).erreur_systeme =
 1628:                                 d_es_allocation_memoire;
 1629:                         return;
 1630:                     }
 1631:                 }
 1632: 
 1633:                 (*((real8 *) (*((*s_etat_processus).s_liste_variables
 1634:                         [(*s_etat_processus).position_variable_courante])
 1635:                         .objet).objet)) = t;
 1636:             }
 1637:             else
 1638:             {
 1639:                 /*
 1640:                  * La variable créée étant locale, l'utilisateur ne peut
 1641:                  * pas l'effacer. On ne doit donc jamais passer par ici. Si
 1642:                  * c'est néanmoins le cas, une erreur système est générée
 1643:                  * provoquant l'arrêt du programme même dans une
 1644:                  * structure IFERR.
 1645:                  */
 1646: 
 1647:                 if (fclose(fichier) != 0)
 1648:                 {
 1649:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1650:                     return;
 1651:                 }
 1652: 
 1653:                 if (destruction_fichier(nom_fichier) == d_erreur)
 1654:                 {
 1655:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1656:                     return;
 1657:                 }
 1658: 
 1659:                 if (last_valide == d_vrai)
 1660:                 {
 1661:                     sf(s_etat_processus, 31);
 1662:                 }
 1663: 
 1664:                 free(nom_fichier);
 1665:                 return;
 1666:             }
 1667: 
 1668:             if (recherche_variable(s_etat_processus, "EQ")
 1669:                     == d_faux)
 1670:             {
 1671:                 /*
 1672:                  * Aucune variable "EQ" n'existe.
 1673:                  */
 1674: 
 1675:                 (*s_etat_processus).erreur_execution =
 1676:                         d_ex_variable_non_definie;
 1677: 
 1678:                 /*
 1679:                  * Retrait de la variable INDEP
 1680:                  */
 1681: 
 1682:                 (*s_etat_processus).niveau_courant--;
 1683: 
 1684:                 if (fclose(fichier) != 0)
 1685:                 {
 1686:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1687:                     return;
 1688:                 }
 1689: 
 1690:                 if (destruction_fichier(nom_fichier) == d_erreur)
 1691:                 {
 1692:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1693:                     return;
 1694:                 }
 1695: 
 1696:                 if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
 1697:                 {
 1698:                     if ((*s_etat_processus).erreur_systeme != d_es)
 1699:                     {
 1700:                         if ((*s_etat_processus).erreur_systeme ==
 1701:                                 d_es_variable_introuvable)
 1702:                         {
 1703:                             (*s_etat_processus).erreur_systeme = d_es;
 1704:                         }
 1705:                         else
 1706:                         {
 1707: 
 1708:                         /*
 1709:                          * Erreur système
 1710:                          */
 1711: 
 1712:                             free(nom_fichier);
 1713:                             return;
 1714:                         }
 1715:                     }
 1716: 
 1717:                     free(nom_x);
 1718:                     free(nom_fichier);
 1719: 
 1720:                     if (last_valide == d_vrai)
 1721:                     {
 1722:                         sf(s_etat_processus, 31);
 1723:                     }
 1724: 
 1725:                     (*s_etat_processus).erreur_execution =
 1726:                             d_ex_variable_non_definie;
 1727:                     return;
 1728:                 }
 1729: 
 1730:                 if (last_valide == d_vrai)
 1731:                 {
 1732:                     sf(s_etat_processus, 31);
 1733:                 }
 1734: 
 1735:                 free(nom_x);
 1736:                 free(nom_fichier);
 1737:                 return;
 1738:             }
 1739: 
 1740:             /*
 1741:              * Recherche de la variable globale "EQ"
 1742:              */
 1743:             
 1744:             i = (*s_etat_processus).position_variable_courante;
 1745:             presence_variable = d_faux;
 1746: 
 1747:             while(i >= 0)
 1748:             {
 1749:                 if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
 1750:                         "EQ") == 0) && ((*s_etat_processus)
 1751:                         .s_liste_variables[i].niveau == 1))
 1752:                 {
 1753:                     presence_variable = d_vrai;
 1754:                     break;
 1755:                 }
 1756: 
 1757:                 i--;
 1758:             }
 1759: 
 1760:             (*s_etat_processus).position_variable_courante = i;
 1761: 
 1762:             BUG((*s_etat_processus).s_liste_variables[i].objet == NULL);
 1763: 
 1764:             if (presence_variable == d_faux)
 1765:             {
 1766:                 /*
 1767:                  * Retrait de la variable INDEP
 1768:                  */
 1769: 
 1770:                 (*s_etat_processus).niveau_courant--;
 1771: 
 1772:                 if (fclose(fichier) != 0)
 1773:                 {
 1774:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1775:                     return;
 1776:                 }
 1777: 
 1778:                 if (destruction_fichier(nom_fichier) == d_erreur)
 1779:                 {
 1780:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1781:                     return;
 1782:                 }
 1783: 
 1784:                 if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
 1785:                 {
 1786:                     if ((*s_etat_processus).erreur_systeme != d_es)
 1787:                     {
 1788:                         if ((*s_etat_processus).erreur_systeme ==
 1789:                                 d_es_variable_introuvable)
 1790:                         {
 1791:                             (*s_etat_processus).erreur_systeme = d_es;
 1792:                         }
 1793:                         else
 1794:                         {
 1795: 
 1796:                         /*
 1797:                          * Erreur système
 1798:                          */
 1799: 
 1800:                             free(nom_fichier);
 1801:                             return;
 1802:                         }
 1803:                     }
 1804: 
 1805:                     free(nom_x);
 1806:                     free(nom_fichier);
 1807: 
 1808:                     if (last_valide == d_vrai)
 1809:                     {
 1810:                         sf(s_etat_processus, 31);
 1811:                     }
 1812: 
 1813:                     (*s_etat_processus).erreur_execution =
 1814:                             d_ex_variable_non_definie;
 1815:                     return;
 1816:                 }
 1817: 
 1818:                 (*s_etat_processus).erreur_execution =
 1819:                         d_ex_variable_non_definie;
 1820: 
 1821:                 if (last_valide == d_vrai)
 1822:                 {
 1823:                     sf(s_etat_processus, 31);
 1824:                 }
 1825: 
 1826:                 free(nom_fichier);
 1827:                 return;
 1828:             }
 1829: 
 1830:             /*
 1831:              * Evaluation de la fonction
 1832:              */
 1833: 
 1834:             hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle;
 1835:             l_position_normale = (*s_etat_processus).l_base_pile_systeme;
 1836:             niveau_courant = (*s_etat_processus).niveau_courant;
 1837: 
 1838:             (*s_etat_processus).erreur_execution = d_ex;
 1839:             (*s_etat_processus).exception = d_ep;
 1840: 
 1841:             if (evaluation(s_etat_processus, (*s_etat_processus)
 1842:                     .s_liste_variables[(*s_etat_processus)
 1843:                     .position_variable_courante].objet, 'N') == d_erreur)
 1844:             {
 1845:                 if ((*s_etat_processus).erreur_systeme != d_es)
 1846:                 {
 1847:                     /*
 1848:                      * Erreur système
 1849:                      */
 1850: 
 1851:                     free(nom_fichier);
 1852:                     return;
 1853:                 }
 1854:                 else
 1855:                 {
 1856:                     retour_suite_erreur = d_faux;
 1857:                     (*s_etat_processus).niveau_courant = niveau_courant;
 1858: 
 1859:                     /*
 1860:                      * Restauration de la pile initiale
 1861:                      */
 1862: 
 1863:                     while((*s_etat_processus).hauteur_pile_operationnelle >
 1864:                             (unsigned long) hauteur_pile)
 1865:                     {
 1866:                         if (depilement(s_etat_processus, &((*s_etat_processus)
 1867:                                 .l_base_pile), &s_objet) == d_erreur)
 1868:                         {
 1869:                             (*s_etat_processus).erreur_execution =
 1870:                                     d_ex_manque_argument;
 1871:                             retour_suite_erreur = d_vrai;
 1872:                             break;
 1873:                         }
 1874: 
 1875:                         liberation(s_etat_processus, s_objet);
 1876:                     }
 1877: 
 1878:                     /*
 1879:                      * Restauration de la pile système
 1880:                      */
 1881: 
 1882:                     while((*s_etat_processus).l_base_pile_systeme !=
 1883:                             l_position_normale)
 1884:                     {
 1885:                         depilement_pile_systeme(s_etat_processus);
 1886: 
 1887:                         if ((*s_etat_processus).erreur_systeme != d_es)
 1888:                         {
 1889:                             /*
 1890:                              * Une pile vide provoque une erreur système
 1891:                              */
 1892: 
 1893:                             free(nom_fichier);
 1894:                             return;
 1895:                         }
 1896:                     }
 1897: 
 1898:                     if (retour_suite_erreur == d_vrai)
 1899:                     {
 1900:                         /*
 1901:                          * Retrait de la variable INDEP et retour
 1902:                          */
 1903: 
 1904:                         (*s_etat_processus).niveau_courant--;
 1905: 
 1906:                         if (fclose(fichier) != 0)
 1907:                         {
 1908:                             (*s_etat_processus).erreur_systeme =
 1909:                                     d_es_erreur_fichier;
 1910:                             return;
 1911:                         }
 1912: 
 1913:                         if (destruction_fichier(nom_fichier) == d_erreur)
 1914:                         {
 1915:                             (*s_etat_processus).erreur_systeme =
 1916:                                     d_es_erreur_fichier;
 1917:                             return;
 1918:                         }
 1919: 
 1920:                         if (retrait_variable(s_etat_processus,
 1921:                                 nom_x, 'L') == d_erreur)
 1922:                         {
 1923:                             if ((*s_etat_processus).erreur_systeme != d_es)
 1924:                             {
 1925:                                 if ((*s_etat_processus).erreur_systeme ==
 1926:                                         d_es_variable_introuvable)
 1927:                                 {
 1928:                                     (*s_etat_processus).erreur_systeme =
 1929:                                             d_es;
 1930:                                 }
 1931:                                 else
 1932:                                 {
 1933: 
 1934:                                 /*
 1935:                                  * Erreur système
 1936:                                  */
 1937: 
 1938:                                     free(nom_fichier);
 1939:                                     return;
 1940:                                 }
 1941:                             }
 1942: 
 1943:                             (*s_etat_processus).erreur_execution =
 1944:                                     d_ex_variable_non_definie;
 1945:                         }
 1946: 
 1947:                         if (last_valide == d_vrai)
 1948:                         {
 1949:                             sf(s_etat_processus, 31);
 1950:                         }
 1951: 
 1952:                         free(nom_x);
 1953:                         free(nom_fichier);
 1954: 
 1955:                         return;
 1956:                     }
 1957:                 }
 1958: 
 1959:                 (*s_etat_processus).erreur_execution = d_ex;
 1960:                 (*s_etat_processus).exception = d_ep;
 1961:             }
 1962:             else
 1963:             {
 1964:                 /*
 1965:                  * Donnée valide à écrire dans le fichier
 1966:                  */
 1967: 
 1968:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 1969:                         .l_base_pile), &s_objet) == d_erreur)
 1970:                 {
 1971: 
 1972:                     /*
 1973:                      * Retrait de la variable INDEP et retour
 1974:                      */
 1975: 
 1976:                     (*s_etat_processus).niveau_courant--;
 1977: 
 1978:                     if (fclose(fichier) != 0)
 1979:                     {
 1980:                         (*s_etat_processus).erreur_systeme =
 1981:                                 d_es_erreur_fichier;
 1982:                         return;
 1983:                     }
 1984: 
 1985:                     if (destruction_fichier(nom_fichier) == d_erreur)
 1986:                     {
 1987:                         (*s_etat_processus).erreur_systeme =
 1988:                                 d_es_erreur_fichier;
 1989:                         return;
 1990:                     }
 1991: 
 1992:                     if (retrait_variable(s_etat_processus, nom_x,
 1993:                             'L') == d_erreur)
 1994:                     {
 1995:                         if ((*s_etat_processus).erreur_systeme != d_es)
 1996:                         {
 1997:                             if ((*s_etat_processus).erreur_systeme ==
 1998:                                     d_es_variable_introuvable)
 1999:                             {
 2000:                                 (*s_etat_processus).erreur_systeme = d_es;
 2001:                             }
 2002:                             else
 2003:                             {
 2004: 
 2005:                             /*
 2006:                              * Erreur système
 2007:                              */
 2008: 
 2009:                                 free(nom_fichier);
 2010:                                 return;
 2011:                             }
 2012:                         }
 2013: 
 2014:                         free(nom_x);
 2015:                         free(nom_fichier);
 2016: 
 2017:                         if (last_valide == d_vrai)
 2018:                         {
 2019:                             sf(s_etat_processus, 31);
 2020:                         }
 2021: 
 2022:                         (*s_etat_processus).erreur_execution =
 2023:                                 d_ex_variable_non_definie;
 2024:                         return;
 2025:                     }
 2026: 
 2027:                     free(nom_x);
 2028:                     free(nom_fichier);
 2029: 
 2030:                     if (last_valide == d_vrai)
 2031:                     {
 2032:                         sf(s_etat_processus, 31);
 2033:                     }
 2034: 
 2035:                     (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2036:                     return;
 2037:                 }
 2038: 
 2039:                 if ((*s_objet).type == INT)
 2040:                 {
 2041:                     r = (double) (*((integer8 *) (*s_objet).objet));
 2042: 
 2043:                     if (fprintf(fichier, "%f %f\n", r * cos(t), r * sin(t)) < 0)
 2044:                     {
 2045:                         (*s_etat_processus).erreur_systeme =
 2046:                                 d_es_erreur_fichier;
 2047:                         return;
 2048:                     }
 2049:                 }
 2050:                 else if ((*s_objet).type == REL)
 2051:                 {
 2052:                     r = (double) (*((real8 *) (*s_objet).objet));
 2053: 
 2054:                     if (fprintf(fichier, "%f %f\n", r * cos(t), r * sin(t)) < 0)
 2055:                     {
 2056:                         (*s_etat_processus).erreur_systeme =
 2057:                                 d_es_erreur_fichier;
 2058:                         return;
 2059:                     }
 2060:                 }
 2061: 
 2062:                 liberation(s_etat_processus, s_objet);
 2063:             }
 2064:         }
 2065: 
 2066:         /*
 2067:          * Retrait de la variable locale
 2068:          */
 2069: 
 2070:         (*s_etat_processus).niveau_courant--;
 2071: 
 2072:         if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
 2073:         {
 2074:             if ((*s_etat_processus).erreur_systeme != d_es)
 2075:             {
 2076:                 if ((*s_etat_processus).erreur_systeme ==
 2077:                         d_es_variable_introuvable)
 2078:                 {
 2079:                     (*s_etat_processus).erreur_systeme = d_es;
 2080:                 }
 2081:                 else
 2082:                 {
 2083:                     /*
 2084:                      * Erreur système
 2085:                      */
 2086: 
 2087:                     free(nom_fichier);
 2088:                     return;
 2089:                 }
 2090:             }
 2091: 
 2092:             free(nom_x);
 2093:             free(nom_fichier);
 2094: 
 2095:             if (last_valide == d_vrai)
 2096:             {
 2097:                 sf(s_etat_processus, 31);
 2098:             }
 2099: 
 2100:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 2101:             return;
 2102:         }
 2103: 
 2104:         free(nom_x);
 2105:     }
 2106: 
 2107:     /*
 2108:      * Tracé { x=RE(f(t)), y=IM(f(t)) }
 2109:      * Les bornes de variation de T sont données par une
 2110:      * liste "{ T T_min T_max } INDEP".
 2111:      * INDEP et DEPND testent leurs arguments pour que les pointeurs
 2112:      * indep et depend désignent des objets de type NOM ou LST à
 2113:      * trois éléments.
 2114:      */
 2115: 
 2116:     else if (strcmp((*s_etat_processus).type_trace_eq, "PARAMETRIQUE") == 0)
 2117:     {
 2118:         dimensions = 2;
 2119: 
 2120:         /*
 2121:          * Vérification de la présence de la variable globale EQ
 2122:          */
 2123:         
 2124:         if (recherche_variable(s_etat_processus, "EQ") == d_faux)
 2125:         {
 2126:             /*
 2127:              * Aucune variable "EQ" n'existe.
 2128:              */
 2129: 
 2130:             (*s_etat_processus).erreur_execution = d_ex_absence_equation;
 2131:             (*s_etat_processus).erreur_systeme = d_es;
 2132: 
 2133:             if (last_valide == d_vrai)
 2134:             {
 2135:                 sf(s_etat_processus, 31);
 2136:             }
 2137: 
 2138:             return;
 2139:         }
 2140: 
 2141:         /*
 2142:          * Recherche de la variable globale "EQ"
 2143:          */
 2144:         
 2145:         i = (*s_etat_processus).position_variable_courante;
 2146:         presence_variable = d_faux;
 2147: 
 2148:         while(i >= 0)
 2149:         {
 2150:             if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
 2151:                     "EQ") == 0) && ((*s_etat_processus)
 2152:                     .s_liste_variables[i].niveau == 1))
 2153:             {
 2154:                 presence_variable = d_vrai;
 2155:                 break;
 2156:             }
 2157: 
 2158:             i--;
 2159:         }
 2160: 
 2161:         if (presence_variable == d_faux)
 2162:         {
 2163:             if (last_valide == d_vrai)
 2164:             {
 2165:                 sf(s_etat_processus, 31);
 2166:             }
 2167: 
 2168:             (*s_etat_processus).erreur_execution = d_ex_absence_equation;
 2169:             return;
 2170:         }
 2171: 
 2172:         if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
 2173:         {
 2174:             (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
 2175:             return;
 2176:         }
 2177: 
 2178:         /*
 2179:          * Création du fichier graphique temporaire
 2180:          */
 2181: 
 2182:         if ((nom_fichier = creation_nom_fichier(s_etat_processus,
 2183:                 (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
 2184:         {
 2185:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2186:             return;
 2187:         }
 2188: 
 2189:         if ((fichier = fopen(nom_fichier, "w+")) == NULL)
 2190:         {
 2191:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2192:             return;
 2193:         }
 2194: 
 2195:         /*
 2196:          * Récupération du domaine de variation de x
 2197:          */
 2198: 
 2199:         if ((*(*s_etat_processus).indep).type == LST)
 2200:         {
 2201:             l_element_courant = (*(*s_etat_processus).indep).objet;
 2202: 
 2203:             if ((s_variable_x.nom = malloc((strlen((*((struct_nom *)
 2204:                     (*(*l_element_courant).donnee).objet)).nom) + 1) *
 2205:                     sizeof(unsigned char))) == NULL)
 2206:             {
 2207:                 if (fclose(fichier) != 0)
 2208:                 {
 2209:                     (*s_etat_processus).erreur_systeme =
 2210:                             d_es_erreur_fichier;
 2211:                     return;
 2212:                 }
 2213: 
 2214:                 if (destruction_fichier(nom_fichier) == d_erreur)
 2215:                 {
 2216:                     (*s_etat_processus).erreur_systeme =
 2217:                             d_es_erreur_fichier;
 2218:                     return;
 2219:                 }
 2220: 
 2221:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2222:                 return;
 2223:             }
 2224: 
 2225:             strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant)
 2226:                     .donnee).objet)).nom);
 2227: 
 2228:             if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
 2229:                     sizeof(unsigned char))) == NULL)
 2230:             {
 2231:                 if (fclose(fichier) != 0)
 2232:                 {
 2233:                     (*s_etat_processus).erreur_systeme =
 2234:                             d_es_erreur_fichier;
 2235:                     return;
 2236:                 }
 2237: 
 2238:                 if (destruction_fichier(nom_fichier) == d_erreur)
 2239:                 {
 2240:                     (*s_etat_processus).erreur_systeme =
 2241:                             d_es_erreur_fichier;
 2242:                     return;
 2243:                 }
 2244: 
 2245:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2246:                 return;
 2247:             }
 2248: 
 2249:             strcpy(nom_x, s_variable_x.nom);
 2250: 
 2251:             l_element_courant = (*l_element_courant).suivant;
 2252: 
 2253:             if ((*(*l_element_courant).donnee).type == INT)
 2254:             {
 2255:                 borne_minimale_x = (real8) (*((integer8 *)
 2256:                         (*(*l_element_courant).donnee).objet));
 2257:             }
 2258:             else if ((*(*l_element_courant).donnee).type == INT)
 2259:             {
 2260:                 borne_minimale_x = (*((real8 *) (*(*l_element_courant)
 2261:                         .donnee).objet));
 2262:             }
 2263:             else
 2264:             {
 2265:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
 2266:                         'N') == d_erreur)
 2267:                 {
 2268:                     free(s_variable_x.nom);
 2269:                     free(nom_x);
 2270: 
 2271:                     if (fclose(fichier) != 0)
 2272:                     {
 2273:                         (*s_etat_processus).erreur_systeme =
 2274:                                 d_es_erreur_fichier;
 2275:                         return;
 2276:                     }
 2277: 
 2278:                     if (destruction_fichier(nom_fichier) == d_erreur)
 2279:                     {
 2280:                         (*s_etat_processus).erreur_systeme =
 2281:                                 d_es_erreur_fichier;
 2282:                         return;
 2283:                     }
 2284: 
 2285:                     if (last_valide == d_vrai)
 2286:                     {
 2287:                         sf(s_etat_processus, 31);
 2288:                     }
 2289: 
 2290:                     free(nom_fichier);
 2291:                     return;
 2292:                 }
 2293: 
 2294:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 2295:                         .l_base_pile), &s_objet_evalue) == d_erreur)
 2296:                 {
 2297:                     free(s_variable_x.nom);
 2298:                     free(nom_x);
 2299: 
 2300:                     if (fclose(fichier) != 0)
 2301:                     {
 2302:                         (*s_etat_processus).erreur_systeme =
 2303:                                 d_es_erreur_fichier;
 2304:                         return;
 2305:                     }
 2306: 
 2307:                     if (destruction_fichier(nom_fichier) == d_erreur)
 2308:                     {
 2309:                         (*s_etat_processus).erreur_systeme =
 2310:                                 d_es_erreur_fichier;
 2311:                         return;
 2312:                     }
 2313: 
 2314:                     (*s_etat_processus).erreur_execution =
 2315:                             d_ex_manque_argument;
 2316: 
 2317:                     if (last_valide == d_vrai)
 2318:                     {
 2319:                         sf(s_etat_processus, 31);
 2320:                     }
 2321: 
 2322:                     free(nom_fichier);
 2323:                     return;
 2324:                 }
 2325: 
 2326:                 if ((*s_objet_evalue).type == INT)
 2327:                 {
 2328:                     borne_minimale_x = (real8) (*((integer8 *)
 2329:                             (*s_objet_evalue).objet));
 2330:                 }
 2331:                 else if ((*s_objet_evalue).type == REL)
 2332:                 {
 2333:                     borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet));
 2334:                 }
 2335:                 else
 2336:                 {
 2337:                     if (fclose(fichier) != 0)
 2338:                     {
 2339:                         (*s_etat_processus).erreur_systeme =
 2340:                                 d_es_erreur_fichier;
 2341:                         return;
 2342:                     }
 2343: 
 2344:                     if (destruction_fichier(nom_fichier) == d_erreur)
 2345:                     {
 2346:                         (*s_etat_processus).erreur_systeme =
 2347:                                 d_es_erreur_fichier;
 2348:                         return;
 2349:                     }
 2350: 
 2351:                     free(s_variable_x.nom);
 2352:                     free(nom_x);
 2353:                     liberation(s_etat_processus, s_objet_evalue);
 2354: 
 2355:                     (*s_etat_processus).erreur_execution =
 2356:                             d_ex_erreur_type_argument;
 2357: 
 2358:                     if (last_valide == d_vrai)
 2359:                     {
 2360:                         sf(s_etat_processus, 31);
 2361:                     }
 2362: 
 2363:                     free(nom_fichier);
 2364:                     return;
 2365:                 }
 2366: 
 2367:                 liberation(s_etat_processus, s_objet_evalue);
 2368:             }
 2369: 
 2370:             l_element_courant = (*l_element_courant).suivant;
 2371: 
 2372:             if ((*(*l_element_courant).donnee).type == INT)
 2373:             {
 2374:                 borne_maximale_x = (real8) (*((integer8 *)
 2375:                         (*(*l_element_courant).donnee).objet));
 2376:             }
 2377:             else if ((*(*l_element_courant).donnee).type == REL)
 2378:             {
 2379:                 borne_maximale_x = (*((real8 *) (*(*l_element_courant)
 2380:                         .donnee).objet));
 2381:             }
 2382:             else
 2383:             {
 2384:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
 2385:                         'N') == d_erreur)
 2386:                 {
 2387:                     free(s_variable_x.nom);
 2388:                     free(nom_x);
 2389: 
 2390:                     if (fclose(fichier) != 0)
 2391:                     {
 2392:                         (*s_etat_processus).erreur_systeme =
 2393:                                 d_es_erreur_fichier;
 2394:                         return;
 2395:                     }
 2396: 
 2397:                     if (destruction_fichier(nom_fichier) == d_erreur)
 2398:                     {
 2399:                         (*s_etat_processus).erreur_systeme =
 2400:                                 d_es_erreur_fichier;
 2401:                         return;
 2402:                     }
 2403: 
 2404:                     if (last_valide == d_vrai)
 2405:                     {
 2406:                         sf(s_etat_processus, 31);
 2407:                     }
 2408: 
 2409:                     free(nom_fichier);
 2410:                     return;
 2411:                 }
 2412: 
 2413:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 2414:                         .l_base_pile), &s_objet_evalue) == d_erreur)
 2415:                 {
 2416:                     free(s_variable_x.nom);
 2417:                     free(nom_x);
 2418: 
 2419:                     if (fclose(fichier) != 0)
 2420:                     {
 2421:                         (*s_etat_processus).erreur_systeme =
 2422:                                 d_es_erreur_fichier;
 2423:                         return;
 2424:                     }
 2425: 
 2426:                     if (destruction_fichier(nom_fichier) == d_erreur)
 2427:                     {
 2428:                         (*s_etat_processus).erreur_systeme =
 2429:                                 d_es_erreur_fichier;
 2430:                         return;
 2431:                     }
 2432: 
 2433:                     (*s_etat_processus).erreur_execution =
 2434:                             d_ex_manque_argument;
 2435: 
 2436:                     if (last_valide == d_vrai)
 2437:                     {
 2438:                         sf(s_etat_processus, 31);
 2439:                     }
 2440: 
 2441:                     free(nom_fichier);
 2442:                     return;
 2443:                 }
 2444: 
 2445:                 if ((*s_objet_evalue).type == INT)
 2446:                 {
 2447:                     borne_maximale_x = (real8) (*((integer8 *)
 2448:                             (*s_objet_evalue).objet));
 2449:                 }
 2450:                 else if ((*s_objet_evalue).type == REL)
 2451:                 {
 2452:                     borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet));
 2453:                 }
 2454:                 else
 2455:                 {
 2456:                     free(s_variable_x.nom);
 2457:                     free(nom_x);
 2458: 
 2459:                     if (fclose(fichier) != 0)
 2460:                     {
 2461:                         (*s_etat_processus).erreur_systeme =
 2462:                                 d_es_erreur_fichier;
 2463:                         return;
 2464:                     }
 2465: 
 2466:                     if (destruction_fichier(nom_fichier) == d_erreur)
 2467:                     {
 2468:                         (*s_etat_processus).erreur_systeme =
 2469:                                 d_es_erreur_fichier;
 2470:                         return;
 2471:                     }
 2472: 
 2473:                     liberation(s_etat_processus, s_objet_evalue);
 2474: 
 2475:                     (*s_etat_processus).erreur_execution =
 2476:                             d_ex_erreur_type_argument;
 2477: 
 2478:                     if (last_valide == d_vrai)
 2479:                     {
 2480:                         sf(s_etat_processus, 31);
 2481:                     }
 2482: 
 2483:                     free(nom_fichier);
 2484:                     return;
 2485:                 }
 2486: 
 2487:                 liberation(s_etat_processus, s_objet_evalue);
 2488:             }
 2489:         }
 2490:         else
 2491:         {
 2492:             if (fclose(fichier) != 0)
 2493:             {
 2494:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2495:                 return;
 2496:             }
 2497: 
 2498:             if (destruction_fichier(nom_fichier) == d_erreur)
 2499:             {
 2500:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2501:                 return;
 2502:             }
 2503: 
 2504:             if (last_valide == d_vrai)
 2505:             {
 2506:                 sf(s_etat_processus, 31);
 2507:             }
 2508: 
 2509:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2510: 
 2511:             free(nom_fichier);
 2512:             return;
 2513:         }
 2514: 
 2515:         /*
 2516:          * Création d'une variable locale du nom pointé par INDEP
 2517:          */
 2518: 
 2519:         (*s_etat_processus).niveau_courant++;
 2520:         s_variable_x.niveau = (*s_etat_processus).niveau_courant;
 2521: 
 2522:         if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL)
 2523:         {
 2524:             if (fclose(fichier) != 0)
 2525:             {
 2526:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2527:                 return;
 2528:             }
 2529: 
 2530:             if (destruction_fichier(nom_fichier) == d_erreur)
 2531:             {
 2532:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2533:                 return;
 2534:             }
 2535: 
 2536:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2537:             return;
 2538:         }
 2539: 
 2540:         if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P')
 2541:                 == d_erreur)
 2542:         {
 2543:             if (fclose(fichier) != 0)
 2544:             {
 2545:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2546:                 return;
 2547:             }
 2548: 
 2549:             if (destruction_fichier(nom_fichier) == d_erreur)
 2550:             {
 2551:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2552:                 return;
 2553:             }
 2554: 
 2555:             /*
 2556:              * L'erreur retournée ne peut être qu'une erreur système
 2557:              */
 2558: 
 2559:             free(nom_fichier);
 2560:             return;
 2561:         }
 2562: 
 2563:         /*
 2564:          * Boucle de calcul des points de la fonction
 2565:          */
 2566: 
 2567:         if (borne_maximale_x < borne_minimale_x)
 2568:         {
 2569:             t = borne_maximale_x;
 2570:             borne_maximale_x = borne_minimale_x;
 2571:             borne_minimale_x = t;
 2572:         }
 2573: 
 2574:         for(t = borne_minimale_x; t <= borne_maximale_x;
 2575:                 t += (*s_etat_processus).resolution)
 2576:         {
 2577:             if (recherche_variable(s_etat_processus, nom_x) == d_vrai)
 2578:             {
 2579:                 // La variable étant créée localement, elle n'est jamais
 2580:                 // ni verrouillée ni partagée.
 2581: 
 2582:                 BUG(((*s_etat_processus).s_liste_variables
 2583:                         [(*s_etat_processus).position_variable_courante])
 2584:                         .objet == NULL);
 2585: 
 2586:                 if ((*((*s_etat_processus).s_liste_variables
 2587:                         [(*s_etat_processus).position_variable_courante])
 2588:                         .objet).type != REL)
 2589:                 {
 2590:                     liberation(s_etat_processus,
 2591:                             ((*s_etat_processus).s_liste_variables
 2592:                             [(*s_etat_processus).position_variable_courante])
 2593:                             .objet);
 2594: 
 2595:                     if ((((*s_etat_processus).s_liste_variables
 2596:                             [(*s_etat_processus).position_variable_courante])
 2597:                             .objet = allocation(s_etat_processus, REL))
 2598:                             == NULL)
 2599:                     {
 2600:                         (*s_etat_processus).erreur_systeme =
 2601:                                 d_es_allocation_memoire;
 2602:                         return;
 2603:                     }
 2604:                 }
 2605: 
 2606:                 (*((real8 *) (*((*s_etat_processus).s_liste_variables
 2607:                         [(*s_etat_processus).position_variable_courante])
 2608:                         .objet).objet)) = t;
 2609:             }
 2610:             else
 2611:             {
 2612:                 /*
 2613:                  * La variable créée étant locale, l'utilisateur ne peut
 2614:                  * pas l'effacer. On ne doit donc jamais passer par ici. Si
 2615:                  * c'est néanmoins le cas, une erreur système est générée
 2616:                  * provoquant l'arrêt du programme même dans une
 2617:                  * structure IFERR.
 2618:                  */
 2619: 
 2620:                 if (fclose(fichier) != 0)
 2621:                 {
 2622:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2623:                     return;
 2624:                 }
 2625: 
 2626:                 if (destruction_fichier(nom_fichier) == d_erreur)
 2627:                 {
 2628:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2629:                     return;
 2630:                 }
 2631: 
 2632:                 if (last_valide == d_vrai)
 2633:                 {
 2634:                     sf(s_etat_processus, 31);
 2635:                 }
 2636: 
 2637:                 free(nom_fichier);
 2638:                 return;
 2639:             }
 2640: 
 2641:             if (recherche_variable(s_etat_processus, "EQ")
 2642:                     == d_faux)
 2643:             {
 2644:                 /*
 2645:                  * Aucune variable "EQ" n'existe.
 2646:                  */
 2647: 
 2648:                 (*s_etat_processus).erreur_execution =
 2649:                         d_ex_variable_non_definie;
 2650: 
 2651:                 /*
 2652:                  * Retrait de la variable INDEP
 2653:                  */
 2654: 
 2655:                 (*s_etat_processus).niveau_courant--;
 2656: 
 2657:                 if (fclose(fichier) != 0)
 2658:                 {
 2659:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2660:                     return;
 2661:                 }
 2662: 
 2663:                 if (destruction_fichier(nom_fichier) == d_erreur)
 2664:                 {
 2665:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2666:                     return;
 2667:                 }
 2668: 
 2669:                 if (retrait_variable(s_etat_processus, nom_x, 'L')
 2670:                         == d_erreur)
 2671:                 {
 2672:                     if ((*s_etat_processus).erreur_systeme != d_es)
 2673:                     {
 2674:                         if ((*s_etat_processus).erreur_systeme ==
 2675:                                 d_es_variable_introuvable)
 2676:                         {
 2677:                             (*s_etat_processus).erreur_systeme = d_es;
 2678:                         }
 2679:                         else
 2680:                         {
 2681: 
 2682:                         /*
 2683:                          * Erreur système
 2684:                          */
 2685: 
 2686:                             free(nom_fichier);
 2687:                             return;
 2688:                         }
 2689:                     }
 2690: 
 2691:                     free(nom_x);
 2692:                     free(nom_fichier);
 2693: 
 2694:                     if (last_valide == d_vrai)
 2695:                     {
 2696:                         sf(s_etat_processus, 31);
 2697:                     }
 2698: 
 2699:                     (*s_etat_processus).erreur_execution =
 2700:                             d_ex_variable_non_definie;
 2701:                     return;
 2702:                 }
 2703: 
 2704:                 if (last_valide == d_vrai)
 2705:                 {
 2706:                     sf(s_etat_processus, 31);
 2707:                 }
 2708: 
 2709:                 free(nom_x);
 2710:                 free(nom_fichier);
 2711:                 return;
 2712:             }
 2713: 
 2714:             /*
 2715:              * Recherche de la variable globale "EQ"
 2716:              */
 2717:             
 2718:             i = (*s_etat_processus).position_variable_courante;
 2719:             presence_variable = d_faux;
 2720: 
 2721:             while(i >= 0)
 2722:             {
 2723:                 if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
 2724:                         "EQ") == 0) && ((*s_etat_processus)
 2725:                         .s_liste_variables[i].niveau == 1))
 2726:                 {
 2727:                     presence_variable = d_vrai;
 2728:                     break;
 2729:                 }
 2730: 
 2731:                 i--;
 2732:             }
 2733: 
 2734:             (*s_etat_processus).position_variable_courante = i;
 2735: 
 2736:             BUG((*s_etat_processus).s_liste_variables[i].objet == NULL);
 2737: 
 2738:             if (presence_variable == d_faux)
 2739:             {
 2740:                 /*
 2741:                  * Retrait de la variable INDEP
 2742:                  */
 2743: 
 2744:                 (*s_etat_processus).niveau_courant--;
 2745: 
 2746:                 if (fclose(fichier) != 0)
 2747:                 {
 2748:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2749:                     return;
 2750:                 }
 2751: 
 2752:                 if (destruction_fichier(nom_fichier) == d_erreur)
 2753:                 {
 2754:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 2755:                     return;
 2756:                 }
 2757: 
 2758:                 if (retrait_variable(s_etat_processus, nom_x, 'L')
 2759:                         == d_erreur)
 2760:                 {
 2761:                     if ((*s_etat_processus).erreur_systeme != d_es)
 2762:                     {
 2763:                         if ((*s_etat_processus).erreur_systeme ==
 2764:                                 d_es_variable_introuvable)
 2765:                         {
 2766:                             (*s_etat_processus).erreur_systeme = d_es;
 2767:                         }
 2768:                         else
 2769:                         {
 2770: 
 2771:                         /*
 2772:                          * Erreur système
 2773:                          */
 2774: 
 2775:                             free(nom_fichier);
 2776:                             return;
 2777:                         }
 2778:                     }
 2779: 
 2780:                     free(nom_x);
 2781:                     free(nom_fichier);
 2782: 
 2783:                     if (last_valide == d_vrai)
 2784:                     {
 2785:                         sf(s_etat_processus, 31);
 2786:                     }
 2787: 
 2788:                     (*s_etat_processus).erreur_execution =
 2789:                             d_ex_variable_non_definie;
 2790:                     return;
 2791:                 }
 2792: 
 2793:                 free(nom_x);
 2794:                 free(nom_fichier);
 2795: 
 2796:                 if (last_valide == d_vrai)
 2797:                 {
 2798:                     sf(s_etat_processus, 31);
 2799:                 }
 2800: 
 2801:                 (*s_etat_processus).erreur_execution =
 2802:                         d_ex_variable_non_definie;
 2803:                 return;
 2804:             }
 2805: 
 2806:             /*
 2807:              * Evaluation de la fonction
 2808:              */
 2809: 
 2810:             hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle;
 2811:             l_position_normale = (*s_etat_processus).l_base_pile_systeme;
 2812:             niveau_courant = (*s_etat_processus).niveau_courant;
 2813: 
 2814:             (*s_etat_processus).erreur_execution = d_ex;
 2815:             (*s_etat_processus).exception = d_ep;
 2816: 
 2817:             if (evaluation(s_etat_processus, (*s_etat_processus)
 2818:                     .s_liste_variables[(*s_etat_processus)
 2819:                     .position_variable_courante].objet, 'N') == d_erreur)
 2820:             {
 2821:                 if ((*s_etat_processus).erreur_systeme != d_es)
 2822:                 {
 2823:                     /*
 2824:                      * Erreur système
 2825:                      */
 2826: 
 2827:                     free(nom_fichier);
 2828:                     return;
 2829:                 }
 2830:                 else
 2831:                 {
 2832:                     retour_suite_erreur = d_faux;
 2833:                     (*s_etat_processus).niveau_courant = niveau_courant;
 2834: 
 2835:                     /*
 2836:                      * Restauration de la pile initiale
 2837:                      */
 2838: 
 2839:                     while((*s_etat_processus).hauteur_pile_operationnelle >
 2840:                             (unsigned long) hauteur_pile)
 2841:                     {
 2842:                         if (depilement(s_etat_processus, &((*s_etat_processus)
 2843:                                 .l_base_pile), &s_objet) == d_erreur)
 2844:                         {
 2845:                             (*s_etat_processus).erreur_execution =
 2846:                                     d_ex_manque_argument;
 2847:                             retour_suite_erreur = d_vrai;
 2848:                             break;
 2849:                         }
 2850: 
 2851:                         liberation(s_etat_processus, s_objet);
 2852:                     }
 2853: 
 2854:                     /*
 2855:                      * Restauration de la pile système
 2856:                      */
 2857: 
 2858:                     while((*s_etat_processus).l_base_pile_systeme !=
 2859:                             l_position_normale)
 2860:                     {
 2861:                         depilement_pile_systeme(s_etat_processus);
 2862: 
 2863:                         if ((*s_etat_processus).erreur_systeme != d_es)
 2864:                         {
 2865:                             /*
 2866:                              * Une pile vide provoque une erreur système
 2867:                              */
 2868: 
 2869:                             free(nom_fichier);
 2870:                             return;
 2871:                         }
 2872:                     }
 2873: 
 2874:                     if (retour_suite_erreur == d_vrai)
 2875:                     {
 2876:                         /*
 2877:                          * Retrait de la variable INDEP et retour
 2878:                          */
 2879: 
 2880:                         (*s_etat_processus).niveau_courant--;
 2881: 
 2882:                         if (fclose(fichier) != 0)
 2883:                         {
 2884:                             (*s_etat_processus).erreur_systeme =
 2885:                                     d_es_erreur_fichier;
 2886:                             return;
 2887:                         }
 2888: 
 2889:                         if (destruction_fichier(nom_fichier) == d_erreur)
 2890:                         {
 2891:                             (*s_etat_processus).erreur_systeme =
 2892:                                     d_es_erreur_fichier;
 2893:                             return;
 2894:                         }
 2895: 
 2896:                         if (retrait_variable(s_etat_processus,
 2897:                                 nom_x, 'L') == d_erreur)
 2898:                         {
 2899:                             if ((*s_etat_processus).erreur_systeme != d_es)
 2900:                             {
 2901:                                 if ((*s_etat_processus).erreur_systeme ==
 2902:                                         d_es_variable_introuvable)
 2903:                                 {
 2904:                                     (*s_etat_processus).erreur_systeme =
 2905:                                             d_es;
 2906:                                 }
 2907:                                 else
 2908:                                 {
 2909: 
 2910:                                 /*
 2911:                                  * Erreur système
 2912:                                  */
 2913: 
 2914:                                     free(nom_fichier);
 2915:                                     return;
 2916:                                 }
 2917:                             }
 2918: 
 2919:                             (*s_etat_processus).erreur_execution =
 2920:                                     d_ex_variable_non_definie;
 2921:                         }
 2922: 
 2923:                         if (last_valide == d_vrai)
 2924:                         {
 2925:                             sf(s_etat_processus, 31);
 2926:                         }
 2927: 
 2928:                         free(nom_x);
 2929:                         free(nom_fichier);
 2930:                         return;
 2931:                     }
 2932:                 }
 2933: 
 2934:                 (*s_etat_processus).erreur_execution = d_ex;
 2935:                 (*s_etat_processus).exception = d_ep;
 2936:             }
 2937:             else
 2938:             {
 2939:                 /*
 2940:                  * Donnée valide à écrire dans le fichier
 2941:                  */
 2942: 
 2943:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 2944:                         .l_base_pile), &s_objet) == d_erreur)
 2945:                 {
 2946: 
 2947:                     /*
 2948:                      * Retrait de la variable INDEP et retour
 2949:                      */
 2950: 
 2951:                     (*s_etat_processus).niveau_courant--;
 2952: 
 2953:                     if (fclose(fichier) != 0)
 2954:                     {
 2955:                         (*s_etat_processus).erreur_systeme =
 2956:                                 d_es_erreur_fichier;
 2957:                         return;
 2958:                     }
 2959: 
 2960:                     if (destruction_fichier(nom_fichier) == d_erreur)
 2961:                     {
 2962:                         (*s_etat_processus).erreur_systeme =
 2963:                                 d_es_erreur_fichier;
 2964:                         return;
 2965:                     }
 2966: 
 2967:                     if (retrait_variable(s_etat_processus, nom_x,
 2968:                             'L') == d_erreur)
 2969:                     {
 2970:                         if ((*s_etat_processus).erreur_systeme != d_es)
 2971:                         {
 2972:                             if ((*s_etat_processus).erreur_systeme ==
 2973:                                     d_es_variable_introuvable)
 2974:                             {
 2975:                                 (*s_etat_processus).erreur_systeme = d_es;
 2976:                             }
 2977:                             else
 2978:                             {
 2979: 
 2980:                             /*
 2981:                              * Erreur système
 2982:                              */
 2983: 
 2984:                                 free(nom_fichier);
 2985:                                 return;
 2986:                             }
 2987:                         }
 2988: 
 2989:                         free(nom_x);
 2990:                         free(nom_fichier);
 2991: 
 2992:                         if (last_valide == d_vrai)
 2993:                         {
 2994:                             sf(s_etat_processus, 31);
 2995:                         }
 2996: 
 2997:                         (*s_etat_processus).erreur_execution =
 2998:                                 d_ex_variable_non_definie;
 2999:                         return;
 3000:                     }
 3001: 
 3002:                     free(nom_x);
 3003:                     free(nom_fichier);
 3004: 
 3005:                     if (last_valide == d_vrai)
 3006:                     {
 3007:                         sf(s_etat_processus, 31);
 3008:                     }
 3009: 
 3010:                     (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 3011:                     return;
 3012:                 }
 3013: 
 3014:                 if ((*s_objet).type == INT)
 3015:                 {
 3016:                     x = (double) (*((integer8 *) (*s_objet).objet));
 3017:                     y = 0;
 3018: 
 3019:                     if (fprintf(fichier, "%f %f\n", x, y) < 0)
 3020:                     {
 3021:                         (*s_etat_processus).erreur_systeme =
 3022:                                 d_es_erreur_fichier;
 3023:                         return;
 3024:                     }
 3025:                 }
 3026:                 else if ((*s_objet).type == REL)
 3027:                 {
 3028:                     x = (double) (*((real8 *) (*s_objet).objet));
 3029:                     y = 0;
 3030: 
 3031:                     if (fprintf(fichier, "%f %f\n", x, y) < 0)
 3032:                     {
 3033:                         (*s_etat_processus).erreur_systeme =
 3034:                                 d_es_erreur_fichier;
 3035:                         return;
 3036:                     }
 3037:                 }
 3038:                 else if ((*s_objet).type == CPL)
 3039:                 {
 3040:                     x = (*((complex16 *) (*s_objet).objet)).partie_reelle;
 3041:                     y = (*((complex16 *) (*s_objet).objet)).partie_imaginaire;
 3042: 
 3043:                     if (fprintf(fichier, "%f %f\n", x, y) < 0)
 3044:                     {
 3045:                         (*s_etat_processus).erreur_systeme =
 3046:                                 d_es_erreur_fichier;
 3047:                         return;
 3048:                     }
 3049:                 }
 3050: 
 3051:                 liberation(s_etat_processus, s_objet);
 3052:             }
 3053:         }
 3054: 
 3055:         /*
 3056:          * Retrait de la variable locale
 3057:          */
 3058: 
 3059:         (*s_etat_processus).niveau_courant--;
 3060: 
 3061:         if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
 3062:         {
 3063:             if ((*s_etat_processus).erreur_systeme != d_es)
 3064:             {
 3065:                 if ((*s_etat_processus).erreur_systeme ==
 3066:                         d_es_variable_introuvable)
 3067:                 {
 3068:                     (*s_etat_processus).erreur_systeme = d_es;
 3069:                 }
 3070:                 else
 3071:                 {
 3072:                     /*
 3073:                      * Erreur système
 3074:                      */
 3075: 
 3076:                     free(nom_fichier);
 3077:                     return;
 3078:                 }
 3079:             }
 3080: 
 3081:             free(nom_x);
 3082:             free(nom_fichier);
 3083: 
 3084:             if (last_valide == d_vrai)
 3085:             {
 3086:                 sf(s_etat_processus, 31);
 3087:             }
 3088: 
 3089:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 3090:             return;
 3091:         }
 3092: 
 3093:         free(nom_x);
 3094:     }
 3095: 
 3096:     /*
 3097:      * Tracé z=f(x,y)
 3098:      * Les bornes de variation de X sont données dans l'ordre
 3099:      * - soit sous la forme "{ X X_min X_max } INDEP" ;
 3100:      * - soit par les parties réelles de PMIN et PMAX.
 3101:      * Les bornes de variation de Y sont données dans l'ordre
 3102:      * - soit sous la forme "{ Y Y_min Y_max } DEPND" ;
 3103:      * - soit par les parties imaginaires de PMIN et PMAX.
 3104:      * INDEP et DEPND testent leurs arguments pour que les pointeurs
 3105:      * indep et depend désignent des objets de type NOM ou LST à
 3106:      * trois éléments.
 3107:      */
 3108: 
 3109:     else if ((strcmp((*s_etat_processus).type_trace_eq, "GRILLE 3D") == 0) ||
 3110:             (strcmp((*s_etat_processus).type_trace_eq, "COURBES DE NIVEAU")
 3111:             == 0))
 3112:     {
 3113:         premiere_iteration = d_vrai;
 3114: 
 3115:         /*
 3116:          * Vérification de la présence de la variable globale EQ
 3117:          */
 3118:         
 3119:         if (recherche_variable(s_etat_processus, "EQ") == d_faux)
 3120:         {
 3121:             /*
 3122:              * Aucune variable "EQ" n'existe.
 3123:              */
 3124: 
 3125:             (*s_etat_processus).erreur_execution = d_ex_absence_equation;
 3126:             (*s_etat_processus).erreur_systeme = d_es;
 3127: 
 3128:             return;
 3129:         }
 3130: 
 3131:         /*
 3132:          * Recherche de la variable globale "EQ"
 3133:          */
 3134:         
 3135:         i = (*s_etat_processus).position_variable_courante;
 3136:         presence_variable = d_faux;
 3137: 
 3138:         while(i >= 0)
 3139:         {
 3140:             if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
 3141:                     "EQ") == 0) && ((*s_etat_processus)
 3142:                     .s_liste_variables[i].niveau == 1))
 3143:             {
 3144:                 presence_variable = d_vrai;
 3145:                 break;
 3146:             }
 3147: 
 3148:             i--;
 3149:         }
 3150: 
 3151:         if (presence_variable == d_faux)
 3152:         {
 3153:             if (last_valide == d_vrai)
 3154:             {
 3155:                 sf(s_etat_processus, 31);
 3156:             }
 3157: 
 3158:             (*s_etat_processus).erreur_execution = d_ex_absence_equation;
 3159:             return;
 3160:         }
 3161: 
 3162:         if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
 3163:         {
 3164:             (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
 3165:             return;
 3166:         }
 3167: 
 3168:         /*
 3169:          * Création du fichier graphique temporaire
 3170:          */
 3171: 
 3172:         if ((nom_fichier = creation_nom_fichier(s_etat_processus,
 3173:                 (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
 3174:         {
 3175:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3176:             return;
 3177:         }
 3178: 
 3179:         if ((fichier = fopen(nom_fichier, "w+")) == NULL)
 3180:         {
 3181:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3182:             return;
 3183:         }
 3184: 
 3185:         /*
 3186:          * Récupération du domaine de variation de x
 3187:          */
 3188: 
 3189:         if ((*(*s_etat_processus).indep).type == LST)
 3190:         {
 3191:             l_element_courant = (*(*s_etat_processus).indep).objet;
 3192: 
 3193:             if ((s_variable_x.nom = malloc((strlen((*((struct_nom *)
 3194:                     (*(*l_element_courant).donnee).objet)).nom) + 1) *
 3195:                     sizeof(unsigned char))) == NULL)
 3196:             {
 3197:                 if (fclose(fichier) != 0)
 3198:                 {
 3199:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3200:                     return;
 3201:                 }
 3202: 
 3203:                 if (destruction_fichier(nom_fichier) == d_erreur)
 3204:                 {
 3205:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3206:                     return;
 3207:                 }
 3208: 
 3209:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3210:                 return;
 3211:             }
 3212: 
 3213:             strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant)
 3214:                     .donnee).objet)).nom);
 3215: 
 3216:             if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
 3217:                     sizeof(unsigned char))) == NULL)
 3218:             {
 3219:                 if (fclose(fichier) != 0)
 3220:                 {
 3221:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3222:                     return;
 3223:                 }
 3224: 
 3225:                 if (destruction_fichier(nom_fichier) == d_erreur)
 3226:                 {
 3227:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3228:                     return;
 3229:                 }
 3230: 
 3231:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3232:                 return;
 3233:             }
 3234: 
 3235:             strcpy(nom_x, s_variable_x.nom);
 3236: 
 3237:             l_element_courant = (*l_element_courant).suivant;
 3238: 
 3239:             if ((*(*l_element_courant).donnee).type == INT)
 3240:             {
 3241:                 borne_minimale_x = (real8) (*((integer8 *)
 3242:                         (*(*l_element_courant).donnee).objet));
 3243:             }
 3244:             else if ((*(*l_element_courant).donnee).type == REL)
 3245:             {
 3246:                 borne_minimale_x = (*((real8 *) (*(*l_element_courant)
 3247:                         .donnee).objet));
 3248:             }
 3249:             else
 3250:             {
 3251:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
 3252:                         'N') == d_erreur)
 3253:                 {
 3254:                     free(s_variable_x.nom);
 3255:                     free(nom_x);
 3256: 
 3257:                     if (fclose(fichier) != 0)
 3258:                     {
 3259:                         (*s_etat_processus).erreur_systeme =
 3260:                                 d_es_erreur_fichier;
 3261:                         return;
 3262:                     }
 3263: 
 3264:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3265:                     {
 3266:                         (*s_etat_processus).erreur_systeme =
 3267:                                 d_es_erreur_fichier;
 3268:                         return;
 3269:                     }
 3270: 
 3271:                     if (last_valide == d_vrai)
 3272:                     {
 3273:                         sf(s_etat_processus, 31);
 3274:                     }
 3275: 
 3276:                     free(nom_fichier);
 3277:                     return;
 3278:                 }
 3279: 
 3280:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 3281:                         .l_base_pile), &s_objet_evalue) == d_erreur)
 3282:                 {
 3283:                     free(s_variable_x.nom);
 3284:                     free(nom_x);
 3285: 
 3286:                     if (fclose(fichier) != 0)
 3287:                     {
 3288:                         (*s_etat_processus).erreur_systeme =
 3289:                                 d_es_erreur_fichier;
 3290:                         return;
 3291:                     }
 3292: 
 3293:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3294:                     {
 3295:                         (*s_etat_processus).erreur_systeme =
 3296:                                 d_es_erreur_fichier;
 3297:                         return;
 3298:                     }
 3299: 
 3300:                     (*s_etat_processus).erreur_execution =
 3301:                             d_ex_manque_argument;
 3302: 
 3303:                     if (last_valide == d_vrai)
 3304:                     {
 3305:                         sf(s_etat_processus, 31);
 3306:                     }
 3307: 
 3308:                     free(nom_fichier);
 3309:                     return;
 3310:                 }
 3311: 
 3312:                 if ((*s_objet_evalue).type == INT)
 3313:                 {
 3314:                     borne_minimale_x = (real8) (*((integer8 *)
 3315:                             (*s_objet_evalue).objet));
 3316:                 }
 3317:                 else if ((*s_objet_evalue).type == REL)
 3318:                 {
 3319:                     borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet));
 3320:                 }
 3321:                 else
 3322:                 {
 3323:                     if (fclose(fichier) != 0)
 3324:                     {
 3325:                         (*s_etat_processus).erreur_systeme =
 3326:                                 d_es_erreur_fichier;
 3327:                         return;
 3328:                     }
 3329: 
 3330:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3331:                     {
 3332:                         (*s_etat_processus).erreur_systeme =
 3333:                                 d_es_erreur_fichier;
 3334:                         return;
 3335:                     }
 3336: 
 3337:                     free(s_variable_x.nom);
 3338:                     free(nom_x);
 3339:                     free(nom_fichier);
 3340:                     liberation(s_etat_processus, s_objet_evalue);
 3341: 
 3342:                     if (last_valide == d_vrai)
 3343:                     {
 3344:                         sf(s_etat_processus, 31);
 3345:                     }
 3346: 
 3347:                     (*s_etat_processus).erreur_execution =
 3348:                             d_ex_erreur_type_argument;
 3349:                     return;
 3350:                 }
 3351: 
 3352:                 liberation(s_etat_processus, s_objet_evalue);
 3353:             }
 3354: 
 3355:             l_element_courant = (*l_element_courant).suivant;
 3356: 
 3357:             if ((*(*l_element_courant).donnee).type == INT)
 3358:             {
 3359:                 borne_maximale_x = (real8) (*((integer8 *)
 3360:                         (*(*l_element_courant).donnee).objet));
 3361:             }
 3362:             else if ((*(*l_element_courant).donnee).type == REL)
 3363:             {
 3364:                 borne_maximale_x = (*((real8 *) (*(*l_element_courant)
 3365:                         .donnee).objet));
 3366:             }
 3367:             else
 3368:             {
 3369:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
 3370:                         'N') == d_erreur)
 3371:                 {
 3372:                     free(s_variable_x.nom);
 3373:                     free(nom_x);
 3374: 
 3375:                     if (fclose(fichier) != 0)
 3376:                     {
 3377:                         (*s_etat_processus).erreur_systeme =
 3378:                                 d_es_erreur_fichier;
 3379:                         return;
 3380:                     }
 3381: 
 3382:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3383:                     {
 3384:                         (*s_etat_processus).erreur_systeme =
 3385:                                 d_es_erreur_fichier;
 3386:                         return;
 3387:                     }
 3388: 
 3389:                     if (last_valide == d_vrai)
 3390:                     {
 3391:                         sf(s_etat_processus, 31);
 3392:                     }
 3393: 
 3394:                     free(nom_fichier);
 3395:                     return;
 3396:                 }
 3397: 
 3398:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 3399:                         .l_base_pile), &s_objet_evalue) == d_erreur)
 3400:                 {
 3401:                     free(s_variable_x.nom);
 3402:                     free(nom_x);
 3403: 
 3404:                     if (fclose(fichier) != 0)
 3405:                     {
 3406:                         (*s_etat_processus).erreur_systeme =
 3407:                                 d_es_erreur_fichier;
 3408:                         return;
 3409:                     }
 3410: 
 3411:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3412:                     {
 3413:                         (*s_etat_processus).erreur_systeme =
 3414:                                 d_es_erreur_fichier;
 3415:                         return;
 3416:                     }
 3417: 
 3418:                     (*s_etat_processus).erreur_execution =
 3419:                             d_ex_manque_argument;
 3420: 
 3421:                     if (last_valide == d_vrai)
 3422:                     {
 3423:                         sf(s_etat_processus, 31);
 3424:                     }
 3425: 
 3426:                     free(nom_fichier);
 3427:                     return;
 3428:                 }
 3429: 
 3430:                 if ((*s_objet_evalue).type == INT)
 3431:                 {
 3432:                     borne_maximale_x = (real8) (*((integer8 *)
 3433:                             (*s_objet_evalue).objet));
 3434:                 }
 3435:                 else if ((*s_objet_evalue).type == REL)
 3436:                 {
 3437:                     borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet));
 3438:                 }
 3439:                 else
 3440:                 {
 3441:                     free(s_variable_x.nom);
 3442:                     free(nom_x);
 3443: 
 3444:                     if (fclose(fichier) != 0)
 3445:                     {
 3446:                         (*s_etat_processus).erreur_systeme =
 3447:                                 d_es_erreur_fichier;
 3448:                         return;
 3449:                     }
 3450: 
 3451:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3452:                     {
 3453:                         (*s_etat_processus).erreur_systeme =
 3454:                                 d_es_erreur_fichier;
 3455:                         return;
 3456:                     }
 3457: 
 3458:                     liberation(s_etat_processus, s_objet_evalue);
 3459: 
 3460:                     (*s_etat_processus).erreur_execution =
 3461:                             d_ex_erreur_type_argument;
 3462: 
 3463:                     if (last_valide == d_vrai)
 3464:                     {
 3465:                         sf(s_etat_processus, 31);
 3466:                     }
 3467: 
 3468:                     free(nom_fichier);
 3469:                     return;
 3470:                 }
 3471: 
 3472:                 liberation(s_etat_processus, s_objet_evalue);
 3473:             }
 3474:         }
 3475:         else
 3476:         {
 3477:             if ((s_variable_x.nom =
 3478:                     malloc((strlen((*((struct_nom *) (*(*s_etat_processus)
 3479:                     .indep).objet)).nom) + 1) * sizeof(unsigned char))) == NULL)
 3480:             {
 3481:                 if (fclose(fichier) != 0)
 3482:                 {
 3483:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3484:                     return;
 3485:                 }
 3486: 
 3487:                 if (destruction_fichier(nom_fichier) == d_erreur)
 3488:                 {
 3489:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3490:                     return;
 3491:                 }
 3492: 
 3493:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3494:                 return;
 3495:             }
 3496: 
 3497:             strcpy(s_variable_x.nom, (*((struct_nom *) (*(*s_etat_processus)
 3498:                     .indep).objet)).nom);
 3499: 
 3500:             if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
 3501:                     sizeof(unsigned char))) == NULL)
 3502:             {
 3503:                 if (fclose(fichier) != 0)
 3504:                 {
 3505:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3506:                     return;
 3507:                 }
 3508: 
 3509:                 if (destruction_fichier(nom_fichier) == d_erreur)
 3510:                 {
 3511:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3512:                     return;
 3513:                 }
 3514: 
 3515:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3516:                 return;
 3517:             }
 3518: 
 3519:             strcpy(nom_x, s_variable_x.nom);
 3520: 
 3521:             if ((*s_etat_processus).systeme_axes == 0)
 3522:             {
 3523:                 borne_minimale_x = (*s_etat_processus).x_min;
 3524:                 borne_maximale_x = (*s_etat_processus).x_max;
 3525:             }
 3526:             else
 3527:             {
 3528:                 borne_minimale_x = (*s_etat_processus).x2_min;
 3529:                 borne_maximale_x = (*s_etat_processus).x2_max;
 3530:             }
 3531:         }
 3532: 
 3533:         /*
 3534:          * Création d'une variable locale du nom pointé par INDEP
 3535:          */
 3536: 
 3537:         (*s_etat_processus).niveau_courant++;
 3538:         s_variable_x.niveau = (*s_etat_processus).niveau_courant;
 3539: 
 3540:         if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL)
 3541:         {
 3542:             if (fclose(fichier) != 0)
 3543:             {
 3544:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3545:                 return;
 3546:             }
 3547: 
 3548:             if (destruction_fichier(nom_fichier) == d_erreur)
 3549:             {
 3550:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3551:                 return;
 3552:             }
 3553: 
 3554:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3555:             return;
 3556:         }
 3557: 
 3558:         if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P')
 3559:                 == d_erreur)
 3560:         {
 3561:             if (fclose(fichier) != 0)
 3562:             {
 3563:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3564:                 return;
 3565:             }
 3566: 
 3567:             if (destruction_fichier(nom_fichier) == d_erreur)
 3568:             {
 3569:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3570:                 return;
 3571:             }
 3572: 
 3573:             /*
 3574:              * L'erreur retournée ne peut être qu'une erreur système
 3575:              */
 3576: 
 3577:             free(nom_fichier);
 3578:             return;
 3579:         }
 3580: 
 3581:         /*
 3582:          * Boucle de calcul des points de la fonction
 3583:          */
 3584: 
 3585:         if (borne_maximale_x < borne_minimale_x)
 3586:         {
 3587:             x = borne_maximale_x;
 3588:             borne_maximale_x = borne_minimale_x;
 3589:             borne_minimale_x = x;
 3590:         }
 3591: 
 3592:         dernier_point_valide[0] = 0;
 3593:         dernier_point_valide[1] = 0;
 3594:         dernier_point_valide[2] = 0;
 3595: 
 3596:         for(x = borne_minimale_x; x <= borne_maximale_x;
 3597:                 x += (*s_etat_processus).resolution)
 3598:         {
 3599:             /*
 3600:              * Récupération du domaine de variation de y, celui-ci peut dépendre
 3601:              * du domaine de variation de x.
 3602:              */
 3603: 
 3604:             if ((*(*s_etat_processus).depend).type == LST)
 3605:             {
 3606:                 l_element_courant = (*(*s_etat_processus).depend).objet;
 3607: 
 3608:                 if ((s_variable_y.nom = malloc((strlen((*((struct_nom *)
 3609:                         (*(*l_element_courant).donnee).objet)).nom) + 1) *
 3610:                         sizeof(unsigned char))) == NULL)
 3611:                 {
 3612:                     if (fclose(fichier) != 0)
 3613:                     {
 3614:                         (*s_etat_processus).erreur_systeme =
 3615:                                 d_es_erreur_fichier;
 3616:                         return;
 3617:                     }
 3618: 
 3619:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3620:                     {
 3621:                         (*s_etat_processus).erreur_systeme =
 3622:                                 d_es_erreur_fichier;
 3623:                         return;
 3624:                     }
 3625: 
 3626:                     (*s_etat_processus).erreur_systeme =
 3627:                             d_es_allocation_memoire;
 3628:                     return;
 3629:                 }
 3630: 
 3631:                 strcpy(s_variable_y.nom, (*((struct_nom *)
 3632:                         (*(*l_element_courant).donnee).objet)).nom);
 3633: 
 3634:                 if ((nom_y = malloc((strlen(s_variable_y.nom) + 1) *
 3635:                         sizeof(unsigned char))) == NULL)
 3636:                 {
 3637:                     if (fclose(fichier) != 0)
 3638:                     {
 3639:                         (*s_etat_processus).erreur_systeme =
 3640:                                 d_es_erreur_fichier;
 3641:                         return;
 3642:                     }
 3643: 
 3644:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3645:                     {
 3646:                         (*s_etat_processus).erreur_systeme =
 3647:                                 d_es_erreur_fichier;
 3648:                         return;
 3649:                     }
 3650: 
 3651:                     (*s_etat_processus).erreur_systeme =
 3652:                             d_es_allocation_memoire;
 3653:                     return;
 3654:                 }
 3655: 
 3656:                 strcpy(nom_y, s_variable_y.nom);
 3657: 
 3658:                 l_element_courant = (*l_element_courant).suivant;
 3659: 
 3660:                 if ((*(*l_element_courant).donnee).type == INT)
 3661:                 {
 3662:                     borne_minimale_y = (real8) (*((integer8 *)
 3663:                             (*(*l_element_courant).donnee).objet));
 3664:                 }
 3665:                 else if ((*(*l_element_courant).donnee).type == REL)
 3666:                 {
 3667:                     borne_minimale_y = (*((real8 *) (*(*l_element_courant)
 3668:                             .donnee).objet));
 3669:                 }
 3670:                 else
 3671:                 {
 3672:                     if (evaluation(s_etat_processus,
 3673:                             (*l_element_courant).donnee, 'N') == d_erreur)
 3674:                     {
 3675:                         free(s_variable_y.nom);
 3676:                         free(nom_y);
 3677: 
 3678:                         free(s_variable_x.nom);
 3679:                         free(nom_x);
 3680: 
 3681:                         if (fclose(fichier) != 0)
 3682:                         {
 3683:                             (*s_etat_processus).erreur_systeme =
 3684:                                     d_es_erreur_fichier;
 3685:                             return;
 3686:                         }
 3687: 
 3688:                         if (destruction_fichier(nom_fichier) == d_erreur)
 3689:                         {
 3690:                             (*s_etat_processus).erreur_systeme =
 3691:                                     d_es_erreur_fichier;
 3692:                             return;
 3693:                         }
 3694: 
 3695:                         if (last_valide == d_vrai)
 3696:                         {
 3697:                             sf(s_etat_processus, 31);
 3698:                         }
 3699: 
 3700:                         free(nom_fichier);
 3701:                         return;
 3702:                     }
 3703: 
 3704:                     if (depilement(s_etat_processus, &((*s_etat_processus)
 3705:                             .l_base_pile), &s_objet_evalue) == d_erreur)
 3706:                     {
 3707:                         free(s_variable_y.nom);
 3708:                         free(nom_y);
 3709: 
 3710:                         free(s_variable_x.nom);
 3711:                         free(nom_x);
 3712: 
 3713:                         if (fclose(fichier) != 0)
 3714:                         {
 3715:                             (*s_etat_processus).erreur_systeme =
 3716:                                     d_es_erreur_fichier;
 3717:                             return;
 3718:                         }
 3719: 
 3720:                         if (destruction_fichier(nom_fichier) == d_erreur)
 3721:                         {
 3722:                             (*s_etat_processus).erreur_systeme =
 3723:                                     d_es_erreur_fichier;
 3724:                             return;
 3725:                         }
 3726: 
 3727:                         (*s_etat_processus).erreur_execution =
 3728:                                 d_ex_manque_argument;
 3729: 
 3730:                         if (last_valide == d_vrai)
 3731:                         {
 3732:                             sf(s_etat_processus, 31);
 3733:                         }
 3734: 
 3735:                         free(nom_fichier);
 3736:                         return;
 3737:                     }
 3738: 
 3739:                     if ((*s_objet_evalue).type == INT)
 3740:                     {
 3741:                         borne_minimale_y = (real8) (*((integer8 *)
 3742:                                 (*s_objet_evalue).objet));
 3743:                     }
 3744:                     else if ((*s_objet_evalue).type == REL)
 3745:                     {
 3746:                         borne_minimale_y = (*((real8 *)
 3747:                                 (*s_objet_evalue).objet));
 3748:                     }
 3749:                     else
 3750:                     {
 3751:                         if (fclose(fichier) != 0)
 3752:                         {
 3753:                             (*s_etat_processus).erreur_systeme =
 3754:                                     d_es_erreur_fichier;
 3755:                             return;
 3756:                         }
 3757: 
 3758:                         if (destruction_fichier(nom_fichier) == d_erreur)
 3759:                         {
 3760:                             (*s_etat_processus).erreur_systeme =
 3761:                                     d_es_erreur_fichier;
 3762:                             return;
 3763:                         }
 3764: 
 3765:                         free(s_variable_y.nom);
 3766:                         free(nom_y);
 3767:                         free(s_variable_x.nom);
 3768:                         free(nom_x);
 3769:                         free(nom_fichier);
 3770:                         liberation(s_etat_processus, s_objet_evalue);
 3771: 
 3772:                         if (last_valide == d_vrai)
 3773:                         {
 3774:                             sf(s_etat_processus, 31);
 3775:                         }
 3776: 
 3777:                         (*s_etat_processus).erreur_execution =
 3778:                                 d_ex_erreur_type_argument;
 3779:                         return;
 3780:                     }
 3781: 
 3782:                     liberation(s_etat_processus, s_objet_evalue);
 3783:                 }
 3784: 
 3785:                 l_element_courant = (*l_element_courant).suivant;
 3786: 
 3787:                 if ((*(*l_element_courant).donnee).type == INT)
 3788:                 {
 3789:                     borne_maximale_y = (real8) (*((integer8 *)
 3790:                             (*(*l_element_courant).donnee).objet));
 3791:                 }
 3792:                 else if ((*(*l_element_courant).donnee).type == REL)
 3793:                 {
 3794:                     borne_maximale_y = (*((real8 *) (*(*l_element_courant)
 3795:                             .donnee).objet));
 3796:                 }
 3797:                 else
 3798:                 {
 3799:                     if (evaluation(s_etat_processus,
 3800:                             (*l_element_courant).donnee, 'N') == d_erreur)
 3801:                     {
 3802:                         free(s_variable_y.nom);
 3803:                         free(nom_y);
 3804:                         free(s_variable_x.nom);
 3805:                         free(nom_x);
 3806: 
 3807:                         if (fclose(fichier) != 0)
 3808:                         {
 3809:                             (*s_etat_processus).erreur_systeme =
 3810:                                     d_es_erreur_fichier;
 3811:                             return;
 3812:                         }
 3813: 
 3814:                         if (destruction_fichier(nom_fichier) == d_erreur)
 3815:                         {
 3816:                             (*s_etat_processus).erreur_systeme =
 3817:                                     d_es_erreur_fichier;
 3818:                             return;
 3819:                         }
 3820: 
 3821:                         if (last_valide == d_vrai)
 3822:                         {
 3823:                             sf(s_etat_processus, 31);
 3824:                         }
 3825: 
 3826:                         free(nom_fichier);
 3827:                         return;
 3828:                     }
 3829: 
 3830:                     if (depilement(s_etat_processus, &((*s_etat_processus)
 3831:                             .l_base_pile), &s_objet_evalue) == d_erreur)
 3832:                     {
 3833:                         free(s_variable_y.nom);
 3834:                         free(nom_y);
 3835:                         free(s_variable_x.nom);
 3836:                         free(nom_x);
 3837: 
 3838:                         if (fclose(fichier) != 0)
 3839:                         {
 3840:                             (*s_etat_processus).erreur_systeme =
 3841:                                     d_es_erreur_fichier;
 3842:                             return;
 3843:                         }
 3844: 
 3845:                         if (destruction_fichier(nom_fichier) == d_erreur)
 3846:                         {
 3847:                             (*s_etat_processus).erreur_systeme =
 3848:                                     d_es_erreur_fichier;
 3849:                             return;
 3850:                         }
 3851: 
 3852:                         (*s_etat_processus).erreur_execution =
 3853:                                 d_ex_manque_argument;
 3854: 
 3855:                         if (last_valide == d_vrai)
 3856:                         {
 3857:                             sf(s_etat_processus, 31);
 3858:                         }
 3859: 
 3860:                         free(nom_fichier);
 3861:                         return;
 3862:                     }
 3863: 
 3864:                     if ((*s_objet_evalue).type == INT)
 3865:                     {
 3866:                         borne_maximale_y = (real8) (*((integer8 *)
 3867:                                 (*s_objet_evalue).objet));
 3868:                     }
 3869:                     else if ((*s_objet_evalue).type == REL)
 3870:                     {
 3871:                         borne_maximale_y = (*((real8 *)
 3872:                                 (*s_objet_evalue).objet));
 3873:                     }
 3874:                     else
 3875:                     {
 3876:                         free(s_variable_y.nom);
 3877:                         free(nom_y);
 3878:                         free(s_variable_x.nom);
 3879:                         free(nom_x);
 3880: 
 3881:                         if (fclose(fichier) != 0)
 3882:                         {
 3883:                             (*s_etat_processus).erreur_systeme =
 3884:                                     d_es_erreur_fichier;
 3885:                             return;
 3886:                         }
 3887: 
 3888:                         if (destruction_fichier(nom_fichier) == d_erreur)
 3889:                         {
 3890:                             (*s_etat_processus).erreur_systeme =
 3891:                                     d_es_erreur_fichier;
 3892:                             return;
 3893:                         }
 3894: 
 3895:                         liberation(s_etat_processus, s_objet_evalue);
 3896: 
 3897:                         (*s_etat_processus).erreur_execution =
 3898:                                 d_ex_erreur_type_argument;
 3899: 
 3900:                         if (last_valide == d_vrai)
 3901:                         {
 3902:                             sf(s_etat_processus, 31);
 3903:                         }
 3904: 
 3905:                         free(nom_fichier);
 3906:                         return;
 3907:                     }
 3908: 
 3909:                     liberation(s_etat_processus, s_objet_evalue);
 3910:                 }
 3911:             }
 3912:             else
 3913:             {
 3914:                 if ((s_variable_y.nom =
 3915:                         malloc((strlen((*((struct_nom *) (*(*s_etat_processus)
 3916:                         .depend).objet)).nom) + 1) * sizeof(unsigned char)))
 3917:                         == NULL)
 3918:                 {
 3919:                     if (fclose(fichier) != 0)
 3920:                     {
 3921:                         (*s_etat_processus).erreur_systeme =
 3922:                                 d_es_erreur_fichier;
 3923:                         return;
 3924:                     }
 3925: 
 3926:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3927:                     {
 3928:                         (*s_etat_processus).erreur_systeme =
 3929:                                 d_es_erreur_fichier;
 3930:                         return;
 3931:                     }
 3932: 
 3933:                     (*s_etat_processus).erreur_systeme =
 3934:                             d_es_allocation_memoire;
 3935:                     return;
 3936:                 }
 3937: 
 3938:                 strcpy(s_variable_y.nom, (*((struct_nom *) (*(*s_etat_processus)
 3939:                         .depend).objet)).nom);
 3940: 
 3941:                 if ((nom_y = malloc((strlen(s_variable_y.nom) + 1) *
 3942:                         sizeof(unsigned char))) == NULL)
 3943:                 {
 3944:                     if (fclose(fichier) != 0)
 3945:                     {
 3946:                         (*s_etat_processus).erreur_systeme =
 3947:                                 d_es_erreur_fichier;
 3948:                         return;
 3949:                     }
 3950: 
 3951:                     if (destruction_fichier(nom_fichier) == d_erreur)
 3952:                     {
 3953:                         (*s_etat_processus).erreur_systeme =
 3954:                                 d_es_erreur_fichier;
 3955:                         return;
 3956:                     }
 3957: 
 3958:                     (*s_etat_processus).erreur_systeme =
 3959:                             d_es_allocation_memoire;
 3960:                     return;
 3961:                 }
 3962: 
 3963:                 strcpy(nom_y, s_variable_y.nom);
 3964: 
 3965:                 if ((*s_etat_processus).systeme_axes == 0)
 3966:                 {
 3967:                     borne_minimale_y = (*s_etat_processus).y_min;
 3968:                     borne_maximale_y = (*s_etat_processus).y_max;
 3969:                 }
 3970:                 else
 3971:                 {
 3972:                     borne_minimale_y = (*s_etat_processus).y2_min;
 3973:                     borne_maximale_y = (*s_etat_processus).y2_max;
 3974:                 }
 3975:             }
 3976: 
 3977:             /*
 3978:              * Création d'une variable locale du nom pointé par DEPEND
 3979:              */
 3980: 
 3981:             s_variable_y.niveau = (*s_etat_processus).niveau_courant;
 3982: 
 3983:             if ((s_variable_y.objet = allocation(s_etat_processus, REL))
 3984:                     == NULL)
 3985:             {
 3986:                 if (fclose(fichier) != 0)
 3987:                 {
 3988:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3989:                     return;
 3990:                 }
 3991: 
 3992:                 if (destruction_fichier(nom_fichier) == d_erreur)
 3993:                 {
 3994:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 3995:                     return;
 3996:                 }
 3997: 
 3998:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3999:                 return;
 4000:             }
 4001: 
 4002:             if (creation_variable(s_etat_processus, &s_variable_y, 'V', 'P')
 4003:                     == d_erreur)
 4004:             {
 4005:                 if (fclose(fichier) != 0)
 4006:                 {
 4007:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 4008:                     return;
 4009:                 }
 4010: 
 4011:                 if (destruction_fichier(nom_fichier) == d_erreur)
 4012:                 {
 4013:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 4014:                     return;
 4015:                 }
 4016: 
 4017:                 /*
 4018:                  * L'erreur retournée ne peut être qu'une erreur système
 4019:                  */
 4020: 
 4021:                 free(nom_fichier);
 4022:                 return;
 4023:             }
 4024: 
 4025:             if (borne_maximale_y < borne_minimale_y)
 4026:             {
 4027:                 y = borne_maximale_y;
 4028:                 borne_maximale_y = borne_minimale_y;
 4029:                 borne_minimale_y = y;
 4030:             }
 4031: 
 4032:             if (premiere_iteration == d_vrai)
 4033:             {
 4034:                 dernier_point_valide[0] = borne_minimale_x;
 4035:                 dernier_point_valide[1] = borne_minimale_y;
 4036:                 dernier_point_valide[2] = 0;
 4037: 
 4038:                 premiere_iteration = d_faux;
 4039:             }
 4040: 
 4041:             for(y = borne_minimale_y; y <= borne_maximale_y;
 4042:                     y += (*s_etat_processus).resolution)
 4043:             {
 4044:                 if (recherche_variable(s_etat_processus, nom_x) == d_vrai)
 4045:                 {
 4046:                     // La variable étant créée localement, elle n'est jamais
 4047:                     // ni verrouillée ni partagee.
 4048: 
 4049:                     BUG((*s_etat_processus).s_liste_variables
 4050:                             [(*s_etat_processus).position_variable_courante]
 4051:                             .objet == NULL);
 4052: 
 4053:                     if ((*((*s_etat_processus).s_liste_variables
 4054:                             [(*s_etat_processus).position_variable_courante])
 4055:                             .objet).type != REL)
 4056:                     {
 4057:                         liberation(s_etat_processus,
 4058:                                 ((*s_etat_processus).s_liste_variables
 4059:                                 [(*s_etat_processus)
 4060:                                 .position_variable_courante]).objet);
 4061: 
 4062:                         if ((((*s_etat_processus).s_liste_variables
 4063:                                 [(*s_etat_processus)
 4064:                                 .position_variable_courante]).objet =
 4065:                                 allocation(s_etat_processus, REL)) == NULL)
 4066:                         {
 4067:                             (*s_etat_processus).erreur_systeme =
 4068:                                     d_es_allocation_memoire;
 4069:                             return;
 4070:                         }
 4071:                     }
 4072: 
 4073:                     (*((real8 *) (*((*s_etat_processus).s_liste_variables
 4074:                             [(*s_etat_processus).position_variable_courante])
 4075:                             .objet).objet)) = x;
 4076:                 }
 4077:                 else
 4078:                 {
 4079:                     /*
 4080:                      * La variable créée étant locale, l'utilisateur ne peut
 4081:                      * pas l'effacer. On ne doit donc jamais passer par ici. Si
 4082:                      * c'est néanmoins le cas, une erreur système est générée
 4083:                      * provoquant l'arrêt du programme même dans une
 4084:                      * structure IFERR.
 4085:                      */
 4086: 
 4087:                     if (fclose(fichier) != 0)
 4088:                     {
 4089:                         (*s_etat_processus).erreur_systeme =
 4090:                                 d_es_erreur_fichier;
 4091:                         return;
 4092:                     }
 4093: 
 4094:                     if (destruction_fichier(nom_fichier) == d_erreur)
 4095:                     {
 4096:                         (*s_etat_processus).erreur_systeme =
 4097:                                 d_es_erreur_fichier;
 4098:                         return;
 4099:                     }
 4100: 
 4101:                     if (last_valide == d_vrai)
 4102:                     {
 4103:                         sf(s_etat_processus, 31);
 4104:                     }
 4105: 
 4106:                     free(nom_fichier);
 4107:                     return;
 4108:                 }
 4109: 
 4110:                 if (recherche_variable(s_etat_processus, nom_y) == d_vrai)
 4111:                 {
 4112:                     // La variable étant créée localement, elle n'est jamais
 4113:                     // ni verrouillée ni partagée.
 4114: 
 4115:                     BUG((*s_etat_processus).s_liste_variables
 4116:                             [(*s_etat_processus).position_variable_courante]
 4117:                             .objet == NULL);
 4118: 
 4119:                     if ((*((*s_etat_processus).s_liste_variables
 4120:                             [(*s_etat_processus).position_variable_courante])
 4121:                             .objet).type != REL)
 4122:                     {
 4123:                         liberation(s_etat_processus,
 4124:                                 ((*s_etat_processus).s_liste_variables
 4125:                                 [(*s_etat_processus)
 4126:                                 .position_variable_courante]).objet);
 4127: 
 4128:                         if ((((*s_etat_processus).s_liste_variables
 4129:                                 [(*s_etat_processus)
 4130:                                 .position_variable_courante]).objet =
 4131:                                 allocation(s_etat_processus, REL)) == NULL)
 4132:                         {
 4133:                             (*s_etat_processus).erreur_systeme =
 4134:                                     d_es_allocation_memoire;
 4135:                             return;
 4136:                         }
 4137:                     }
 4138: 
 4139:                     (*((real8 *) (*((*s_etat_processus).s_liste_variables
 4140:                             [(*s_etat_processus).position_variable_courante])
 4141:                             .objet).objet)) = y;
 4142:                 }
 4143:                 else
 4144:                 {
 4145:                     /*
 4146:                      * La variable créée étant locale, l'utilisateur ne peut
 4147:                      * pas l'effacer. On ne doit donc jamais passer par ici. Si
 4148:                      * c'est néanmoins le cas, une erreur système est générée
 4149:                      * provoquant l'arrêt du programme même dans une
 4150:                      * structure IFERR.
 4151:                      */
 4152: 
 4153:                     if (fclose(fichier) != 0)
 4154:                     {
 4155:                         (*s_etat_processus).erreur_systeme =
 4156:                                 d_es_erreur_fichier;
 4157:                         return;
 4158:                     }
 4159: 
 4160:                     if (destruction_fichier(nom_fichier) == d_erreur)
 4161:                     {
 4162:                         (*s_etat_processus).erreur_systeme =
 4163:                                 d_es_erreur_fichier;
 4164:                         return;
 4165:                     }
 4166: 
 4167:                     if (last_valide == d_vrai)
 4168:                     {
 4169:                         sf(s_etat_processus, 31);
 4170:                     }
 4171: 
 4172:                     free(nom_fichier);
 4173:                     return;
 4174:                 }
 4175: 
 4176:                 if (recherche_variable(s_etat_processus, "EQ")
 4177:                         == d_faux)
 4178:                 {
 4179:                     /*
 4180:                      * Aucune variable "EQ" n'existe.
 4181:                      */
 4182: 
 4183:                     (*s_etat_processus).erreur_execution =
 4184:                             d_ex_variable_non_definie;
 4185: 
 4186:                     /*
 4187:                      * Retrait des variables INDEP et DEPND
 4188:                      */
 4189: 
 4190:                     (*s_etat_processus).niveau_courant--;
 4191: 
 4192:                     if (fclose(fichier) != 0)
 4193:                     {
 4194:                         (*s_etat_processus).erreur_systeme =
 4195:                                 d_es_erreur_fichier;
 4196:                         return;
 4197:                     }
 4198: 
 4199:                     if (destruction_fichier(nom_fichier) == d_erreur)
 4200:                     {
 4201:                         (*s_etat_processus).erreur_systeme =
 4202:                                 d_es_erreur_fichier;
 4203:                         return;
 4204:                     }
 4205: 
 4206:                     if (retrait_variable(s_etat_processus, nom_x, 'L')
 4207:                             == d_erreur)
 4208:                     {
 4209:                         if ((*s_etat_processus).erreur_systeme != d_es)
 4210:                         {
 4211:                             if ((*s_etat_processus).erreur_systeme ==
 4212:                                     d_es_variable_introuvable)
 4213:                             {
 4214:                                 (*s_etat_processus).erreur_systeme = d_es;
 4215:                             }
 4216:                             else
 4217:                             {
 4218: 
 4219:                             /*
 4220:                              * Erreur système
 4221:                              */
 4222: 
 4223:                                 free(nom_fichier);
 4224:                                 return;
 4225:                             }
 4226:                         }
 4227: 
 4228:                         free(nom_x);
 4229:                         free(nom_y);
 4230:                         free(nom_fichier);
 4231: 
 4232:                         if (last_valide == d_vrai)
 4233:                         {
 4234:                             sf(s_etat_processus, 31);
 4235:                         }
 4236: 
 4237:                         (*s_etat_processus).erreur_execution =
 4238:                                 d_ex_variable_non_definie;
 4239:                         return;
 4240:                     }
 4241: 
 4242:                     if (retrait_variable(s_etat_processus, nom_y, 'L')
 4243:                             == d_erreur)
 4244:                     {
 4245:                         if ((*s_etat_processus).erreur_systeme != d_es)
 4246:                         {
 4247:                             if ((*s_etat_processus).erreur_systeme ==
 4248:                                     d_es_variable_introuvable)
 4249:                             {
 4250:                                 (*s_etat_processus).erreur_systeme = d_es;
 4251:                             }
 4252:                             else
 4253:                             {
 4254: 
 4255:                             /*
 4256:                              * Erreur système
 4257:                              */
 4258: 
 4259:                                 free(nom_fichier);
 4260:                                 return;
 4261:                             }
 4262:                         }
 4263: 
 4264:                         free(nom_x);
 4265:                         free(nom_y);
 4266:                         free(nom_fichier);
 4267: 
 4268:                         if (last_valide == d_vrai)
 4269:                         {
 4270:                             sf(s_etat_processus, 31);
 4271:                         }
 4272: 
 4273:                         (*s_etat_processus).erreur_execution =
 4274:                                 d_ex_variable_non_definie;
 4275:                         return;
 4276:                     }
 4277: 
 4278:                     if (last_valide == d_vrai)
 4279:                     {
 4280:                         sf(s_etat_processus, 31);
 4281:                     }
 4282: 
 4283:                     free(nom_x);
 4284:                     free(nom_y);
 4285:                     free(nom_fichier);
 4286:                     return;
 4287:                 }
 4288: 
 4289:                 /*
 4290:                  * Recherche de la variable globale "EQ"
 4291:                  */
 4292:                 
 4293:                 i = (*s_etat_processus).position_variable_courante;
 4294:                 presence_variable = d_faux;
 4295: 
 4296:                 while(i >= 0)
 4297:                 {
 4298:                     if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
 4299:                             "EQ") == 0) && ((*s_etat_processus)
 4300:                             .s_liste_variables[i].niveau == 1))
 4301:                     {
 4302:                         presence_variable = d_vrai;
 4303:                         break;
 4304:                     }
 4305: 
 4306:                     i--;
 4307:                 }
 4308: 
 4309:                 (*s_etat_processus).position_variable_courante = i;
 4310: 
 4311:                 BUG((*s_etat_processus).s_liste_variables[i].objet == NULL);
 4312: 
 4313:                 if (presence_variable == d_faux)
 4314:                 {
 4315:                     /*
 4316:                      * Retrait des variables INDEP et DEPND
 4317:                      */
 4318: 
 4319:                     (*s_etat_processus).niveau_courant--;
 4320: 
 4321:                     if (fclose(fichier) != 0)
 4322:                     {
 4323:                         (*s_etat_processus).erreur_systeme =
 4324:                                 d_es_erreur_fichier;
 4325:                         return;
 4326:                     }
 4327: 
 4328:                     if (destruction_fichier(nom_fichier) == d_erreur)
 4329:                     {
 4330:                         (*s_etat_processus).erreur_systeme =
 4331:                                 d_es_erreur_fichier;
 4332:                         return;
 4333:                     }
 4334: 
 4335:                     if (retrait_variable(s_etat_processus, nom_x, 'L')
 4336:                             == d_erreur)
 4337:                     {
 4338:                         if ((*s_etat_processus).erreur_systeme != d_es)
 4339:                         {
 4340:                             if ((*s_etat_processus).erreur_systeme ==
 4341:                                     d_es_variable_introuvable)
 4342:                             {
 4343:                                 (*s_etat_processus).erreur_systeme = d_es;
 4344:                             }
 4345:                             else
 4346:                             {
 4347: 
 4348:                             /*
 4349:                              * Erreur système
 4350:                              */
 4351: 
 4352:                                 free(nom_fichier);
 4353:                                 return;
 4354:                             }
 4355:                         }
 4356: 
 4357:                         free(nom_x);
 4358:                         free(nom_y);
 4359:                         free(nom_fichier);
 4360: 
 4361:                         if (last_valide == d_vrai)
 4362:                         {
 4363:                             sf(s_etat_processus, 31);
 4364:                         }
 4365: 
 4366:                         (*s_etat_processus).erreur_execution =
 4367:                                 d_ex_variable_non_definie;
 4368:                         return;
 4369:                     }
 4370: 
 4371:                     if (retrait_variable(s_etat_processus, nom_y, 'L')
 4372:                             == d_erreur)
 4373:                     {
 4374:                         if ((*s_etat_processus).erreur_systeme != d_es)
 4375:                         {
 4376:                             if ((*s_etat_processus).erreur_systeme ==
 4377:                                     d_es_variable_introuvable)
 4378:                             {
 4379:                                 (*s_etat_processus).erreur_systeme = d_es;
 4380:                             }
 4381:                             else
 4382:                             {
 4383: 
 4384:                             /*
 4385:                              * Erreur système
 4386:                              */
 4387: 
 4388:                                 free(nom_fichier);
 4389:                                 return;
 4390:                             }
 4391:                         }
 4392: 
 4393:                         free(nom_x);
 4394:                         free(nom_y);
 4395:                         free(nom_fichier);
 4396: 
 4397:                         if (last_valide == d_vrai)
 4398:                         {
 4399:                             sf(s_etat_processus, 31);
 4400:                         }
 4401: 
 4402:                         (*s_etat_processus).erreur_execution =
 4403:                                 d_ex_variable_non_definie;
 4404:                         return;
 4405:                     }
 4406: 
 4407:                     free(nom_x);
 4408:                     free(nom_y);
 4409:                     free(nom_fichier);
 4410: 
 4411:                     if (last_valide == d_vrai)
 4412:                     {
 4413:                         sf(s_etat_processus, 31);
 4414:                     }
 4415: 
 4416:                     (*s_etat_processus).erreur_execution =
 4417:                             d_ex_variable_non_definie;
 4418:                     return;
 4419:                 }
 4420: 
 4421:                 /*
 4422:                  * Evaluation de la fonction
 4423:                  */
 4424: 
 4425:                 hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle;
 4426:                 l_position_normale = (*s_etat_processus).l_base_pile_systeme;
 4427:                 niveau_courant = (*s_etat_processus).niveau_courant;
 4428: 
 4429:                 (*s_etat_processus).erreur_execution = d_ex;
 4430:                 (*s_etat_processus).exception = d_ep;
 4431: 
 4432:                 if (evaluation(s_etat_processus, (*s_etat_processus)
 4433:                         .s_liste_variables[(*s_etat_processus)
 4434:                         .position_variable_courante].objet, 'N') == d_erreur)
 4435:                 {
 4436:                     if ((*s_etat_processus).erreur_systeme != d_es)
 4437:                     {
 4438:                         /*
 4439:                          * Erreur système
 4440:                          */
 4441: 
 4442:                         free(nom_fichier);
 4443:                         return;
 4444:                     }
 4445:                     else
 4446:                     {
 4447:                         retour_suite_erreur = d_faux;
 4448:                         (*s_etat_processus).niveau_courant = niveau_courant;
 4449: 
 4450:                         /*
 4451:                          * Restauration de la pile initiale
 4452:                          */
 4453: 
 4454:                         while((*s_etat_processus).hauteur_pile_operationnelle >
 4455:                                 (unsigned long) hauteur_pile)
 4456:                         {
 4457:                             if (depilement(s_etat_processus,
 4458:                                     &((*s_etat_processus)
 4459:                                     .l_base_pile), &s_objet) == d_erreur)
 4460:                             {
 4461:                                 (*s_etat_processus).erreur_execution =
 4462:                                         d_ex_manque_argument;
 4463:                                 retour_suite_erreur = d_vrai;
 4464:                                 break;
 4465:                             }
 4466: 
 4467:                             liberation(s_etat_processus, s_objet);
 4468:                         }
 4469: 
 4470:                         /*
 4471:                          * Restauration de la pile système
 4472:                          */
 4473: 
 4474:                         while((*s_etat_processus).l_base_pile_systeme !=
 4475:                                 l_position_normale)
 4476:                         {
 4477:                             depilement_pile_systeme(s_etat_processus);
 4478: 
 4479:                             if ((*s_etat_processus).erreur_systeme != d_es)
 4480:                             {
 4481:                                 /*
 4482:                                  * Une pile vide provoque une erreur système
 4483:                                  */
 4484: 
 4485:                                 free(nom_fichier);
 4486:                                 return;
 4487:                             }
 4488:                         }
 4489: 
 4490:                         if (retour_suite_erreur == d_vrai)
 4491:                         {
 4492:                             /*
 4493:                              * Retrait des variables INDEP, DEPND et retour
 4494:                              */
 4495: 
 4496:                             (*s_etat_processus).niveau_courant--;
 4497: 
 4498:                             if (fclose(fichier) != 0)
 4499:                             {
 4500:                                 (*s_etat_processus).erreur_systeme =
 4501:                                         d_es_erreur_fichier;
 4502:                                 return;
 4503:                             }
 4504: 
 4505:                             if (destruction_fichier(nom_fichier) == d_erreur)
 4506:                             {
 4507:                                 (*s_etat_processus).erreur_systeme =
 4508:                                         d_es_erreur_fichier;
 4509:                                 return;
 4510:                             }
 4511: 
 4512:                             if (retrait_variable(s_etat_processus,
 4513:                                     nom_x, 'L') == d_erreur)
 4514:                             {
 4515:                                 if ((*s_etat_processus).erreur_systeme != d_es)
 4516:                                 {
 4517:                                     if ((*s_etat_processus).erreur_systeme ==
 4518:                                             d_es_variable_introuvable)
 4519:                                     {
 4520:                                         (*s_etat_processus).erreur_systeme =
 4521:                                                 d_es;
 4522:                                     }
 4523:                                     else
 4524:                                     {
 4525: 
 4526:                                     /*
 4527:                                      * Erreur système
 4528:                                      */
 4529: 
 4530:                                         free(nom_fichier);
 4531:                                         return;
 4532:                                     }
 4533:                                 }
 4534: 
 4535:                                 (*s_etat_processus).erreur_execution =
 4536:                                         d_ex_variable_non_definie;
 4537:                             }
 4538: 
 4539:                             if (retrait_variable(s_etat_processus,
 4540:                                     nom_y, 'L') == d_erreur)
 4541:                             {
 4542:                                 if ((*s_etat_processus).erreur_systeme != d_es)
 4543:                                 {
 4544:                                     if ((*s_etat_processus).erreur_systeme ==
 4545:                                             d_es_variable_introuvable)
 4546:                                     {
 4547:                                         (*s_etat_processus).erreur_systeme =
 4548:                                                 d_es;
 4549:                                     }
 4550:                                     else
 4551:                                     {
 4552: 
 4553:                                     /*
 4554:                                      * Erreur système
 4555:                                      */
 4556: 
 4557:                                         free(nom_fichier);
 4558:                                         return;
 4559:                                     }
 4560:                                 }
 4561: 
 4562:                                 (*s_etat_processus).erreur_execution =
 4563:                                         d_ex_variable_non_definie;
 4564:                             }
 4565: 
 4566:                             free(nom_x);
 4567:                             free(nom_y);
 4568:                             free(nom_fichier);
 4569: 
 4570:                             if (last_valide == d_vrai)
 4571:                             {
 4572:                                 sf(s_etat_processus, 31);
 4573:                             }
 4574: 
 4575:                             return;
 4576:                         }
 4577:                     }
 4578: 
 4579:                     (*s_etat_processus).erreur_execution = d_ex;
 4580:                     (*s_etat_processus).exception = d_ep;
 4581: 
 4582:                     if (fprintf(fichier, "%f %f %f\n",
 4583:                             dernier_point_valide[0],
 4584:                             dernier_point_valide[1],
 4585:                             dernier_point_valide[2]) < 0)
 4586:                     {
 4587:                         (*s_etat_processus).erreur_systeme =
 4588:                                 d_es_erreur_fichier;
 4589:                         return;
 4590:                     }
 4591:                 }
 4592:                 else
 4593:                 {
 4594:                     /*
 4595:                      * Donnée valide à écrire dans le fichier
 4596:                      */
 4597: 
 4598:                     if (depilement(s_etat_processus, &((*s_etat_processus)
 4599:                             .l_base_pile), &s_objet) == d_erreur)
 4600:                     {
 4601: 
 4602:                     /*
 4603:                      * Retrait des variables INDEP et DEPND et retour
 4604:                      */
 4605: 
 4606:                         (*s_etat_processus).niveau_courant--;
 4607: 
 4608:                         if (fclose(fichier) != 0)
 4609:                         {
 4610:                             (*s_etat_processus).erreur_systeme =
 4611:                                     d_es_erreur_fichier;
 4612:                             return;
 4613:                         }
 4614: 
 4615:                         if (destruction_fichier(nom_fichier) == d_erreur)
 4616:                         {
 4617:                             (*s_etat_processus).erreur_systeme =
 4618:                                     d_es_erreur_fichier;
 4619:                             return;
 4620:                         }
 4621: 
 4622:                         if (retrait_variable(s_etat_processus, nom_x,
 4623:                                 'L') == d_erreur)
 4624:                         {
 4625:                             if ((*s_etat_processus).erreur_systeme != d_es)
 4626:                             {
 4627:                                 if ((*s_etat_processus).erreur_systeme ==
 4628:                                         d_es_variable_introuvable)
 4629:                                 {
 4630:                                     (*s_etat_processus).erreur_systeme = d_es;
 4631:                                 }
 4632:                                 else
 4633:                                 {
 4634: 
 4635:                                 /*
 4636:                                  * Erreur système
 4637:                                  */
 4638: 
 4639:                                     free(nom_fichier);
 4640:                                     return;
 4641:                                 }
 4642:                             }
 4643: 
 4644:                             free(nom_x);
 4645:                             free(nom_y);
 4646:                             free(nom_fichier);
 4647: 
 4648:                             if (last_valide == d_vrai)
 4649:                             {
 4650:                                 sf(s_etat_processus, 31);
 4651:                             }
 4652: 
 4653:                             (*s_etat_processus).erreur_execution =
 4654:                                     d_ex_variable_non_definie;
 4655:                             return;
 4656:                         }
 4657: 
 4658:                         if (retrait_variable(s_etat_processus, nom_y,
 4659:                                 'L') == d_erreur)
 4660:                         {
 4661:                             if ((*s_etat_processus).erreur_systeme != d_es)
 4662:                             {
 4663:                                 if ((*s_etat_processus).erreur_systeme ==
 4664:                                         d_es_variable_introuvable)
 4665:                                 {
 4666:                                     (*s_etat_processus).erreur_systeme = d_es;
 4667:                                 }
 4668:                                 else
 4669:                                 {
 4670: 
 4671:                                 /*
 4672:                                  * Erreur système
 4673:                                  */
 4674: 
 4675:                                     free(nom_fichier);
 4676:                                     return;
 4677:                                 }
 4678:                             }
 4679: 
 4680:                             free(nom_x);
 4681:                             free(nom_y);
 4682:                             free(nom_fichier);
 4683: 
 4684:                             if (last_valide == d_vrai)
 4685:                             {
 4686:                                 sf(s_etat_processus, 31);
 4687:                             }
 4688: 
 4689:                             (*s_etat_processus).erreur_execution =
 4690:                                     d_ex_variable_non_definie;
 4691:                             return;
 4692:                         }
 4693: 
 4694:                         free(nom_x);
 4695:                         free(nom_y);
 4696:                         free(nom_fichier);
 4697: 
 4698:                         if (last_valide == d_vrai)
 4699:                         {
 4700:                             sf(s_etat_processus, 31);
 4701:                         }
 4702: 
 4703:                         (*s_etat_processus).erreur_execution =
 4704:                                 d_ex_manque_argument;
 4705:                         return;
 4706:                     }
 4707: 
 4708:                     if ((*s_objet).type == INT)
 4709:                     {
 4710:                         dernier_point_valide[0] = x;
 4711:                         dernier_point_valide[1] = y;
 4712:                         dernier_point_valide[2] = (real8) (*((integer8 *)
 4713:                                 (*s_objet).objet));
 4714: 
 4715:                         if (fprintf(fichier, "%f %f %f\n", x, y,
 4716:                                 (double) (*((integer8 *)
 4717:                                 (*s_objet).objet))) < 0)
 4718:                         {
 4719:                             (*s_etat_processus).erreur_systeme =
 4720:                                     d_es_erreur_fichier;
 4721:                             return;
 4722:                         }
 4723:                     }
 4724:                     else if ((*s_objet).type == REL)
 4725:                     {
 4726:                         dernier_point_valide[0] = x;
 4727:                         dernier_point_valide[1] = y;
 4728:                         dernier_point_valide[2] = (*((real8 *)
 4729:                                 (*s_objet).objet));
 4730: 
 4731:                         if (fprintf(fichier, "%f %f %f\n", x, y,
 4732:                                 (*((real8 *) (*s_objet).objet))) < 0)
 4733:                         {
 4734:                             (*s_etat_processus).erreur_systeme =
 4735:                                     d_es_erreur_fichier;
 4736:                             return;
 4737:                         }
 4738:                     }
 4739: 
 4740:                     liberation(s_etat_processus, s_objet);
 4741:                 }
 4742:             }
 4743: 
 4744:             /*
 4745:              * Retrait de la variable locale DEPND
 4746:              */
 4747: 
 4748:             if (retrait_variable(s_etat_processus, nom_y, 'L') == d_erreur)
 4749:             {
 4750:                 if ((*s_etat_processus).erreur_systeme != d_es)
 4751:                 {
 4752:                     if ((*s_etat_processus).erreur_systeme ==
 4753:                             d_es_variable_introuvable)
 4754:                     {
 4755:                         (*s_etat_processus).erreur_systeme = d_es;
 4756:                     }
 4757:                     else
 4758:                     {
 4759:                         /*
 4760:                          * Erreur système
 4761:                          */
 4762: 
 4763:                         free(nom_fichier);
 4764:                         return;
 4765:                     }
 4766:                 }
 4767: 
 4768:                 free(nom_x);
 4769:                 free(nom_y);
 4770:                 free(nom_fichier);
 4771: 
 4772:                 if (last_valide == d_vrai)
 4773:                 {
 4774:                     sf(s_etat_processus, 31);
 4775:                 }
 4776: 
 4777:                 (*s_etat_processus).erreur_execution =
 4778:                         d_ex_variable_non_definie;
 4779:                 return;
 4780:             }
 4781: 
 4782:             free(nom_y);
 4783: 
 4784:             /*
 4785:              * Saut de ligne dans le fichier pour commencer une nouvelle
 4786:              * trace.
 4787:              */
 4788: 
 4789:             if (fprintf(fichier, "\n") < 0)
 4790:             {
 4791:                 (*s_etat_processus).erreur_systeme =
 4792:                         d_es_erreur_fichier;
 4793:                 return;
 4794:             }
 4795:         }
 4796: 
 4797:         /*
 4798:          * Retrait de la variable locale INDEP
 4799:          */
 4800: 
 4801:         (*s_etat_processus).niveau_courant--;
 4802: 
 4803:         if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
 4804:         {
 4805:             if ((*s_etat_processus).erreur_systeme != d_es)
 4806:             {
 4807:                 if ((*s_etat_processus).erreur_systeme ==
 4808:                         d_es_variable_introuvable)
 4809:                 {
 4810:                     (*s_etat_processus).erreur_systeme = d_es;
 4811:                 }
 4812:                 else
 4813:                 {
 4814:                     /*
 4815:                      * Erreur système
 4816:                      */
 4817: 
 4818:                     free(nom_fichier);
 4819:                     return;
 4820:                 }
 4821:             }
 4822: 
 4823:             free(nom_x);
 4824:             free(nom_fichier);
 4825: 
 4826:             if (last_valide == d_vrai)
 4827:             {
 4828:                 sf(s_etat_processus, 31);
 4829:             }
 4830: 
 4831:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 4832:             return;
 4833:         }
 4834: 
 4835:         free(nom_x);
 4836: 
 4837:         if (strcmp((*s_etat_processus).type_trace_eq, "COURBES DE NIVEAU") == 0)
 4838:         {
 4839:             // Conversion du graphe
 4840:             dimensions = 2;
 4841: 
 4842:             if (fclose(fichier) != 0)
 4843:             {
 4844:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 4845:                 return;
 4846:             }
 4847: 
 4848:             if ((entree_standard =  popen("gnuplot", "w")) == NULL)
 4849:             {
 4850:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 4851:                 return;
 4852:             }
 4853: 
 4854:             if (fprintf(entree_standard, "set nosurface\n") < 0)
 4855:             {
 4856:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 4857:                 return;
 4858:             }
 4859: 
 4860:             if (fprintf(entree_standard, "set contour\n") < 0)
 4861:             {
 4862:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 4863:                 return;
 4864:             }
 4865: 
 4866:             if (fprintf(entree_standard, "set cntrparam level ") < 0)
 4867:             {
 4868:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 4869:                 return;
 4870:             }
 4871: 
 4872:             l_element_courant = (struct_liste_chainee *) (*(*s_etat_processus)
 4873:                     .parametres_courbes_de_niveau).objet;
 4874: 
 4875:             if (l_element_courant != NULL)
 4876:             {
 4877:                 if ((*(*l_element_courant).donnee).type == CHN)
 4878:                 {
 4879:                     if (strcmp((unsigned char *) (*(*l_element_courant).donnee)
 4880:                             .objet, "AUTOMATIC") == 0)
 4881:                     {
 4882:                         if (fprintf(entree_standard, "auto") < 0)
 4883:                         {
 4884:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 4885:                             return;
 4886:                         }
 4887:                     }
 4888:                     else if (strcmp((unsigned char *) (*(*l_element_courant)
 4889:                             .donnee).objet, "DISCRETE") == 0)
 4890:                     {
 4891:                         if (fprintf(entree_standard, "discrete") < 0)
 4892:                         {
 4893:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 4894:                             return;
 4895:                         }
 4896:                     }
 4897:                     else
 4898:                     {
 4899:                         if (fprintf(entree_standard, "incremental") < 0)
 4900:                         {
 4901:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 4902:                             return;
 4903:                         }
 4904:                     }
 4905:                 }
 4906: 
 4907:                 l_element_courant = (*l_element_courant).suivant;
 4908: 
 4909:                 if (l_element_courant != NULL)
 4910:                 {
 4911:                     if (fprintf(entree_standard, " ") < 0)
 4912:                     {
 4913:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 4914:                         return;
 4915:                     }
 4916:                 }
 4917: 
 4918:                 while(l_element_courant != NULL)
 4919:                 {
 4920:                     if ((*(*l_element_courant).donnee).type == INT)
 4921:                     {
 4922:                         if (fprintf(entree_standard, "%f", (double)
 4923:                                 (*((integer8 *) (*(*l_element_courant).donnee)
 4924:                                 .objet))) < 0)
 4925:                         {
 4926:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 4927:                             return;
 4928:                         }
 4929:                     }
 4930:                     else
 4931:                     {
 4932:                         if (fprintf(entree_standard, "%f", (double)
 4933:                                 (*((real8 *) (*(*l_element_courant).donnee)
 4934:                                 .objet))) < 0)
 4935:                         {
 4936:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 4937:                             return;
 4938:                         }
 4939:                     }
 4940: 
 4941:                     l_element_courant = (*l_element_courant).suivant;
 4942: 
 4943:                     if (l_element_courant != NULL)
 4944:                     {
 4945:                         if (fprintf(entree_standard, ",") < 0)
 4946:                         {
 4947:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 4948:                             return;
 4949:                         }
 4950:                     }
 4951:                 }
 4952: 
 4953:                 if (fprintf(entree_standard, "\n") < 0)
 4954:                 {
 4955:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 4956:                     return;
 4957:                 }
 4958:             }
 4959: 
 4960:             if (fprintf(entree_standard, "set terminal table\n") < 0)
 4961:             {
 4962:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 4963:                 return;
 4964:             }
 4965: 
 4966:             if ((nom_fichier_converti = creation_nom_fichier(
 4967:                     s_etat_processus, (*s_etat_processus)
 4968:                     .chemin_fichiers_temporaires)) == NULL)
 4969:             {
 4970:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 4971:                 return;
 4972:             }
 4973: 
 4974:             if (fprintf(entree_standard, "set output '%s'\n",
 4975:                     nom_fichier_converti) < 0)
 4976:             {
 4977:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 4978:                 return;
 4979:             }
 4980: 
 4981:             if (fprintf(entree_standard, "splot '%s'\n", nom_fichier) < 0)
 4982:             {
 4983:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 4984:                 return;
 4985:             }
 4986: 
 4987:             if (fprintf(entree_standard, "set output\n") < 0)
 4988:             {
 4989:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 4990:                 return;
 4991:             }
 4992: 
 4993:             if (fprintf(entree_standard, "quit\n") < 0)
 4994:             {
 4995:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 4996:                 return;
 4997:             }
 4998: 
 4999:             if (pclose(entree_standard) != 0)
 5000:             {
 5001:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 5002:                 return;
 5003:             }
 5004: 
 5005:             if (destruction_fichier(nom_fichier) == d_erreur)
 5006:             {
 5007:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 5008:                 return;
 5009:             }
 5010: 
 5011:             if ((fichier = fopen(nom_fichier_converti, "r")) == NULL)
 5012:             {
 5013:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 5014:                 return;
 5015:             }
 5016: 
 5017:             free(nom_fichier);
 5018:             nom_fichier = nom_fichier_converti;
 5019:         }
 5020:         else
 5021:         {
 5022:             dimensions = 3;
 5023:         }
 5024: 
 5025:     }
 5026: 
 5027:     /*
 5028:      * Type de tracé invalide
 5029:      */
 5030: 
 5031:     else
 5032:     {
 5033:         if (last_valide == d_vrai)
 5034:         {
 5035:             sf(s_etat_processus, 31);
 5036:         }
 5037: 
 5038:         (*s_etat_processus).erreur_execution = d_ex_type_trace_invalide;
 5039:         return;
 5040:     }
 5041: 
 5042:     /*
 5043:      * Fermeture du fichier graphique
 5044:      */
 5045: 
 5046:     if (fclose(fichier) != 0)
 5047:     {
 5048:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 5049:         return;
 5050:     }
 5051: 
 5052:     /*
 5053:      * Chaînage du fichier temporaire à la liste des fichiers graphiques
 5054:      */
 5055: 
 5056:     l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
 5057: 
 5058:     if (l_fichier_courant == NULL)
 5059:     {
 5060:         if (((*s_etat_processus).fichiers_graphiques = malloc(
 5061:                 sizeof(struct_fichier_graphique))) == NULL)
 5062:         {
 5063:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 5064:             return;
 5065:         }
 5066: 
 5067:         (*(*s_etat_processus).fichiers_graphiques).suivant = NULL;
 5068:         (*(*s_etat_processus).fichiers_graphiques).nom = nom_fichier;
 5069:         (*(*s_etat_processus).fichiers_graphiques).legende = NULL;
 5070:         (*(*s_etat_processus).fichiers_graphiques).dimensions = dimensions;
 5071:         (*(*s_etat_processus).fichiers_graphiques).presence_axes = d_faux;
 5072:         (*(*s_etat_processus).fichiers_graphiques).systeme_axes =
 5073:                 (*s_etat_processus).systeme_axes;
 5074:         strcpy((*(*s_etat_processus).fichiers_graphiques).type,
 5075:                 (*s_etat_processus).type_trace_eq);
 5076:     }
 5077:     else
 5078:     {
 5079:         while(l_fichier_courant != NULL)
 5080:         {
 5081:             if ((*l_fichier_courant).dimensions != dimensions)
 5082:             {
 5083:                 if (last_valide == d_vrai)
 5084:                 {
 5085:                     sf(s_etat_processus, 31);
 5086:                 }
 5087: 
 5088:                 (*s_etat_processus).erreur_execution =
 5089:                         d_ex_dimensions_differentes;
 5090:                 return;
 5091:             }
 5092: 
 5093:             l_fichier_precedent = l_fichier_courant;
 5094:             l_fichier_courant = (*l_fichier_courant).suivant;
 5095:         }
 5096: 
 5097:         l_fichier_courant = l_fichier_precedent;
 5098: 
 5099:         if (((*l_fichier_courant).suivant = malloc(
 5100:                 sizeof(struct_fichier_graphique))) == NULL)
 5101:         {
 5102:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 5103:             return;
 5104:         }
 5105: 
 5106:         l_fichier_courant = (*l_fichier_courant).suivant;
 5107: 
 5108:         (*l_fichier_courant).suivant = NULL;
 5109:         (*l_fichier_courant).nom = nom_fichier;
 5110:         (*l_fichier_courant).legende = NULL;
 5111:         (*l_fichier_courant).dimensions = dimensions;
 5112:         (*l_fichier_courant).presence_axes = d_faux;
 5113:         (*l_fichier_courant).systeme_axes = (*s_etat_processus).systeme_axes;
 5114:         strcpy((*l_fichier_courant).type, (*s_etat_processus).type_trace_eq);
 5115:     }
 5116: 
 5117:     /*
 5118:      * Affichage du graphique
 5119:      */
 5120: 
 5121:     appel_gnuplot(s_etat_processus, 'N');
 5122:     (*s_etat_processus).erreur_execution = d_ex;
 5123:     (*s_etat_processus).exception = d_ep;
 5124: 
 5125:     if (last_valide == d_vrai)
 5126:     {
 5127:         sf(s_etat_processus, 31);
 5128:     }
 5129: 
 5130:     return;
 5131: }
 5132: 
 5133: 
 5134: /*
 5135: ================================================================================
 5136:   Fonction 'drax'
 5137: ================================================================================
 5138:   Entrées : pointeur sur une structure struct_processus
 5139: --------------------------------------------------------------------------------
 5140:   Sorties :
 5141: --------------------------------------------------------------------------------
 5142:   Effets de bord : néant
 5143: ================================================================================
 5144: */
 5145: 
 5146: void
 5147: instruction_drax(struct_processus *s_etat_processus)
 5148: {
 5149:     struct_fichier_graphique        *l_fichier_courant;
 5150: 
 5151:     (*s_etat_processus).erreur_execution = d_ex;
 5152: 
 5153:     if ((*s_etat_processus).affichage_arguments == 'Y')
 5154:     {
 5155:         printf("\n  DRAX ");
 5156: 
 5157:         if ((*s_etat_processus).langue == 'F')
 5158:         {
 5159:             printf("(trace les axes)\n\n");
 5160:             printf("  Aucun argument\n");
 5161:         }
 5162:         else
 5163:         {
 5164:             printf("(plot axes)\n\n");
 5165:             printf("  No argument\n");
 5166:         }
 5167: 
 5168:         return;
 5169:     }
 5170:     else if ((*s_etat_processus).test_instruction == 'Y')
 5171:     {
 5172:         (*s_etat_processus).nombre_arguments = -1;
 5173:         return;
 5174:     }
 5175: 
 5176:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 5177:     {
 5178:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 5179:         {
 5180:             return;
 5181:         }
 5182:     }
 5183: 
 5184:     if ((*s_etat_processus).fichiers_graphiques != NULL)
 5185:     {
 5186:         l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
 5187: 
 5188:         if (l_fichier_courant != NULL)
 5189:         {
 5190:             while((*l_fichier_courant).suivant != NULL)
 5191:             {
 5192:                 l_fichier_courant = (*l_fichier_courant).suivant;
 5193:             }
 5194: 
 5195:             (*l_fichier_courant).presence_axes = d_vrai;
 5196:         }
 5197:     }
 5198: 
 5199:     if (test_cfsf(s_etat_processus, 52) == d_faux)
 5200:     {
 5201:         if ((*s_etat_processus).fichiers_graphiques != NULL)
 5202:         {
 5203:             appel_gnuplot(s_etat_processus, 'N');
 5204:         }
 5205:     }
 5206: 
 5207:     return;
 5208: }
 5209: 
 5210: 
 5211: /*
 5212: ================================================================================
 5213:   Fonction 'depnd'
 5214: ================================================================================
 5215:   Entrées : pointeur sur une structure struct_processus
 5216: --------------------------------------------------------------------------------
 5217:   Sorties :
 5218: --------------------------------------------------------------------------------
 5219:   Effets de bord : néant
 5220: ================================================================================
 5221: */
 5222: 
 5223: void
 5224: instruction_depnd(struct_processus *s_etat_processus)
 5225: {
 5226:     struct_liste_chainee            *l_element_courant;
 5227: 
 5228:     struct_objet                    *s_objet;
 5229: 
 5230:     (*s_etat_processus).erreur_execution = d_ex;
 5231: 
 5232:     if ((*s_etat_processus).affichage_arguments == 'Y')
 5233:     {
 5234:         printf("\n  DEPND ");
 5235: 
 5236:         if ((*s_etat_processus).langue == 'F')
 5237:         {
 5238:             printf("(indication de la variable dépendante)\n\n");
 5239:         }
 5240:         else
 5241:         {
 5242:             printf("(set dependant variable)\n\n");
 5243:         }
 5244: 
 5245:         printf("    1: %s, %s\n", d_NOM, d_LST);
 5246: 
 5247:         return;
 5248:     }
 5249:     else if ((*s_etat_processus).test_instruction == 'Y')
 5250:     {
 5251:         (*s_etat_processus).nombre_arguments = -1;
 5252:         return;
 5253:     }
 5254: 
 5255:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 5256:     {
 5257:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 5258:         {
 5259:             return;
 5260:         }
 5261:     }
 5262: 
 5263:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 5264:             &s_objet) == d_erreur)
 5265:     {
 5266:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 5267:         return;
 5268:     }
 5269: 
 5270:     if ((*s_objet).type == NOM)
 5271:     {
 5272:         liberation(s_etat_processus, (*s_etat_processus).depend);
 5273:         (*s_etat_processus).depend = s_objet;
 5274:     }
 5275:     else if ((*s_objet).type == LST)
 5276:     {
 5277:         l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
 5278: 
 5279:         if ((*(*l_element_courant).donnee).type != NOM)
 5280:         {
 5281:             liberation(s_etat_processus, s_objet);
 5282: 
 5283:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 5284:             return;
 5285:         }
 5286: 
 5287:         (*((struct_nom *) (*(*l_element_courant).donnee).objet)).symbole =
 5288:                 d_vrai;
 5289: 
 5290:         l_element_courant = (*l_element_courant).suivant;
 5291: 
 5292:         if (!(((*(*l_element_courant).donnee).type == INT) ||
 5293:                 ((*(*l_element_courant).donnee).type == REL) ||
 5294:                 ((*(*l_element_courant).donnee).type == NOM) ||
 5295:                 ((*(*l_element_courant).donnee).type == ALG) ||
 5296:                 ((*(*l_element_courant).donnee).type == RPN)))
 5297:         {
 5298:             liberation(s_etat_processus, s_objet);
 5299: 
 5300:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 5301:             return;
 5302:         }
 5303: 
 5304:         l_element_courant = (*l_element_courant).suivant;
 5305: 
 5306:         if (!(((*(*l_element_courant).donnee).type == INT) ||
 5307:                 ((*(*l_element_courant).donnee).type == REL) ||
 5308:                 ((*(*l_element_courant).donnee).type == NOM) ||
 5309:                 ((*(*l_element_courant).donnee).type == ALG) ||
 5310:                 ((*(*l_element_courant).donnee).type == RPN)))
 5311:         {
 5312:             liberation(s_etat_processus, s_objet);
 5313: 
 5314:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 5315:             return;
 5316:         }
 5317: 
 5318:         l_element_courant = (*l_element_courant).suivant;
 5319: 
 5320:         if (l_element_courant != NULL)
 5321:         {
 5322:             liberation(s_etat_processus, s_objet);
 5323: 
 5324:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 5325:             return;
 5326:         }
 5327: 
 5328:         liberation(s_etat_processus, (*s_etat_processus).depend);
 5329:         (*s_etat_processus).depend = s_objet;
 5330:     }
 5331:     else
 5332:     {
 5333:         liberation(s_etat_processus, s_objet);
 5334: 
 5335:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 5336:         return;
 5337:     }
 5338: 
 5339:     return;
 5340: }
 5341: 
 5342: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>