File:  [local] / rpl / src / types.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Jan 26 15:22:44 2010 UTC (14 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.9
    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:   Affectation automatique d'un type à des données
   29: ================================================================================
   30:   Entrées : structure sur l'état du processus
   31: --------------------------------------------------------------------------------
   32:   Sorties : Néant
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: recherche_type(struct_processus *s_etat_processus)
   40: {
   41:     int                         nombre_elements_convertis;
   42: 
   43:     struct_liste_chainee        *l_base_liste_fonctions;
   44:     struct_liste_chainee        *l_base_liste_decomposition;
   45:     struct_liste_chainee        *l_element_courant;
   46:     struct_liste_chainee        *l_element_courant_fonctions;
   47:     struct_liste_chainee        *l_element_precedent;
   48: 
   49:     struct_liste_pile_systeme   *s_sauvegarde_pile;
   50: 
   51:     struct_objet                *s_objet;
   52:     struct_objet                *s_sous_objet;
   53: 
   54:     logical1                    drapeau_chaine;
   55:     logical1                    drapeau_complexe;
   56:     logical1                    drapeau_matrice;
   57:     logical1                    drapeau_reel;
   58:     logical1                    drapeau_valeur_entiere;
   59:     logical1                    drapeau_valeur_reelle;
   60:     logical1                    erreur;
   61:     logical1                    erreur_lecture_binaire;
   62: 
   63:     logical8                    ancienne_valeur_base;
   64:     logical8                    valeur_base;
   65: 
   66:     long                        coherence_liste;
   67: 
   68:     unsigned char               autorisation_evaluation_nom;
   69:     unsigned char               *definitions_chainees_precedentes;
   70:     unsigned char               *fonction_majuscule;
   71:     unsigned char               *instruction_majuscule;
   72:     unsigned char               *ptr;
   73:     unsigned char               *ptr_ecriture;
   74:     unsigned char               *ptr_lecture;
   75:     unsigned char               registre_instruction_valide;
   76:     unsigned char               registre_interruption;
   77:     unsigned char               registre_mode_execution_programme;
   78:     unsigned char               registre_test;
   79:     unsigned char               registre_test_bis;
   80:     unsigned char               *tampon;
   81: 
   82:     unsigned long               i;
   83:     unsigned long               j;
   84:     unsigned long               niveau;
   85:     unsigned long               niveau_maximal;
   86:     unsigned long               nombre_colonnes;
   87:     unsigned long               nombre_egalites;
   88:     unsigned long               nombre_elements;
   89:     unsigned long               nombre_exposants;
   90:     unsigned long               nombre_lignes;
   91:     unsigned long               nombre_lignes_a_supprimer;
   92:     unsigned long               nombre_points;
   93:     unsigned long               nombre_virgules;
   94:     unsigned long               position_courante;
   95:     unsigned long               profondeur_finale;
   96:     unsigned long               profondeur_initiale;
   97:     unsigned long               sauvegarde_niveau_courant;
   98:     unsigned long               sauvegarde_longueur_definitions_chainees;
   99: 
  100:     void                        *element;
  101: 
  102:     s_objet = (struct_objet *) malloc(sizeof(struct_objet));
  103:     element = NULL;
  104:     nombre_egalites = 0;
  105:     i = 0;
  106: 
  107:     if (s_objet == NULL)
  108:     {
  109:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  110:         return;
  111:     }
  112: 
  113:     initialisation_objet(s_objet);
  114:     registre_test = (*s_etat_processus).test_instruction;
  115:     registre_instruction_valide = (*s_etat_processus).instruction_valide;
  116:     registre_interruption = (*s_etat_processus).traitement_interruptible;
  117:     (*s_etat_processus).test_instruction = 'Y';
  118:     (*s_etat_processus).traitement_interruptible = 'N';
  119: 
  120:     analyse(s_etat_processus, NULL);
  121: 
  122:     (*s_etat_processus).test_instruction = registre_test;
  123: 
  124:     if ((*s_etat_processus).instruction_valide == 'Y')
  125:     {
  126:         if ((*s_etat_processus).constante_symbolique == 'N')
  127:         {
  128:             if ((element = malloc(sizeof(struct_fonction))) == NULL)
  129:             {
  130:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  131:                 (*s_etat_processus).traitement_interruptible =
  132:                         registre_interruption;
  133:                 return;
  134:             }
  135: 
  136:             (*((struct_fonction *) element)).nombre_arguments = 0;
  137:             (*((struct_fonction *) element)).prediction_saut = NULL;
  138: 
  139:             if ((*s_etat_processus).instruction_intrinseque == 'Y')
  140:             {
  141:                 /*
  142:                  * Les fonctions intrinsèques ne sont pas sensibles à la casse.
  143:                  */
  144: 
  145:                 if (((*((struct_fonction *) element)).nom_fonction =
  146:                         conversion_majuscule((*s_etat_processus)
  147:                         .instruction_courante)) == NULL)
  148:                 {
  149:                     (*s_etat_processus).erreur_systeme =
  150:                             d_es_allocation_memoire;
  151:                     (*s_etat_processus).traitement_interruptible =
  152:                             registre_interruption;
  153:                     return;
  154:                 }
  155:             }
  156:             else
  157:             {
  158:                 if (((*((struct_fonction *) element)).nom_fonction =
  159:                         malloc((strlen((*s_etat_processus).instruction_courante)
  160:                         + 1) * sizeof(unsigned char))) == NULL)
  161:                 {
  162:                     (*s_etat_processus).erreur_systeme =
  163:                             d_es_allocation_memoire;
  164:                     (*s_etat_processus).traitement_interruptible =
  165:                             registre_interruption;
  166:                     return;
  167:                 }
  168: 
  169:                 strcpy((*((struct_fonction *) element)).nom_fonction,
  170:                         (*s_etat_processus).instruction_courante);
  171:             }
  172: 
  173:             (*((struct_fonction *) element)).fonction =
  174:                     analyse_instruction(s_etat_processus,
  175:                     (*((struct_fonction *) element)).nom_fonction);
  176: 
  177:             (*s_objet).type = FCT;
  178:             (*s_objet).objet = element;
  179: 
  180:             if (empilement(s_etat_processus,
  181:                     &((*s_etat_processus).l_base_pile), s_objet) == d_erreur)
  182:             {
  183:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  184:                 (*s_etat_processus).traitement_interruptible =
  185:                         registre_interruption;
  186:                 return;
  187:             }
  188:         }
  189:         else
  190:         {
  191:             if ((instruction_majuscule = conversion_majuscule(
  192:                     (*s_etat_processus).instruction_courante)) == NULL)
  193:             {
  194:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  195:                 (*s_etat_processus).traitement_interruptible =
  196:                         registre_interruption;
  197:                 return;
  198:             }
  199: 
  200:             if ((*s_etat_processus).constante_symbolique == 'Y')
  201:             {
  202:                 registre_test_bis = (*s_etat_processus).test_instruction;
  203:                 (*s_etat_processus).test_instruction = 'N';
  204:                 analyse(s_etat_processus, NULL);
  205:                 (*s_etat_processus).test_instruction = registre_test_bis;
  206:                 free(s_objet);
  207:             }
  208:             else
  209:             {
  210:                 (*s_objet).type = NOM;
  211: 
  212:                 if (((*s_objet).objet = malloc(sizeof(struct_nom))) == NULL)
  213:                 {
  214:                     (*s_etat_processus).erreur_systeme =
  215:                             d_es_allocation_memoire;
  216:                     (*s_etat_processus).traitement_interruptible =
  217:                             registre_interruption;
  218:                     return;
  219:                 }
  220: 
  221:                 (*((struct_nom *) (*s_objet).objet)).symbole = d_faux;
  222: 
  223:                 if (((*((struct_nom *) (*s_objet).objet)).nom =
  224:                         (unsigned char *) malloc((strlen((*s_etat_processus)
  225:                         .instruction_courante) + 1) * sizeof(unsigned char)))
  226:                         == NULL)
  227:                 {
  228:                     (*s_etat_processus).erreur_systeme =
  229:                             d_es_allocation_memoire;
  230:                     (*s_etat_processus).traitement_interruptible =
  231:                             registre_interruption;
  232:                     return;
  233:                 }
  234: 
  235:                 strcpy((*((struct_nom *) (*s_objet).objet)).nom,
  236:                         (*s_etat_processus).instruction_courante);
  237: 
  238:                 if (empilement(s_etat_processus,
  239:                         &((*s_etat_processus).l_base_pile), s_objet) ==
  240:                         d_erreur)
  241:                 {
  242:                     (*s_etat_processus).erreur_systeme =
  243:                             d_es_allocation_memoire;
  244:                     (*s_etat_processus).traitement_interruptible =
  245:                             registre_interruption;
  246:                     return;
  247:                 }
  248:             }
  249: 
  250:             free(instruction_majuscule);
  251:         }
  252: 
  253:         (*s_etat_processus).instruction_valide = registre_instruction_valide;
  254:         (*s_etat_processus).traitement_interruptible = registre_interruption;
  255:         return;
  256:     }
  257: 
  258:     (*s_etat_processus).instruction_valide = registre_instruction_valide;
  259: 
  260:     switch(*((*s_etat_processus).instruction_courante))
  261:     {
  262: 
  263: /*
  264: --------------------------------------------------------------------------------
  265:   Complexe
  266: --------------------------------------------------------------------------------
  267: */
  268: 
  269:         case '(' :
  270:         {
  271:             (*s_objet).type = CPL;
  272: 
  273:             element = (void *) ((struct_complexe16 *) malloc(
  274:                     sizeof(struct_complexe16)));
  275: 
  276:             if (element == NULL)
  277:             {
  278:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  279:                 (*s_etat_processus).traitement_interruptible =
  280:                         registre_interruption;
  281:                 return;
  282:             }
  283: 
  284:             conversion_format(s_etat_processus,
  285:                     (*s_etat_processus).instruction_courante);
  286: 
  287:             sauvegarde_longueur_definitions_chainees =
  288:                     (*s_etat_processus).longueur_definitions_chainees;
  289: 
  290:             tampon = (unsigned char *) malloc(
  291:                     (((*s_etat_processus).longueur_definitions_chainees
  292:                     = strlen((*s_etat_processus).instruction_courante)
  293:                     + 4) + 1) * sizeof(unsigned char));
  294: 
  295:             if (tampon == NULL)
  296:             {
  297:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  298:                 (*s_etat_processus).traitement_interruptible =
  299:                         registre_interruption;
  300:                 return;
  301:             }
  302: 
  303:             strcpy(tampon, "<< ");
  304:             ptr_ecriture = tampon + 3;
  305:             ptr_lecture = (*s_etat_processus).instruction_courante + 1;
  306: 
  307:             nombre_virgules = 0;
  308: 
  309:             while((*ptr_lecture) != d_code_fin_chaine)
  310:             {
  311:                 if ((*ptr_lecture) == ',')
  312:                 {
  313:                     (*ptr_lecture) = ' ';
  314:                     nombre_virgules++;
  315:                 }
  316: 
  317:                 *ptr_ecriture++ = *ptr_lecture++;
  318:             }
  319: 
  320:             (*(--ptr_ecriture)) = d_code_fin_chaine;
  321:             strcat(ptr_ecriture, " >>");
  322: 
  323:             position_courante = (*s_etat_processus).position_courante;
  324:             (*s_etat_processus).position_courante = 0;
  325: 
  326:             profondeur_initiale = (*s_etat_processus)
  327:                     .hauteur_pile_operationnelle;
  328: 
  329: /*
  330: -- On met le tout dans la pile opérationnelle ----------------------------------
  331: */
  332: 
  333:             (*s_etat_processus).niveau_recursivite++;
  334:             definitions_chainees_precedentes = (*s_etat_processus)
  335:                     .definitions_chainees;
  336:             (*s_etat_processus).definitions_chainees = tampon;
  337: 
  338:             s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
  339:             sauvegarde_niveau_courant = (*s_etat_processus).niveau_courant;
  340: 
  341:             (*s_etat_processus).l_base_pile_systeme = NULL;
  342:             empilement_pile_systeme(s_etat_processus);
  343: 
  344:             if ((*s_etat_processus).erreur_systeme != d_es)
  345:             {
  346:                 (*s_etat_processus).traitement_interruptible =
  347:                         registre_interruption;
  348:                 return;
  349:             }
  350: 
  351:             (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
  352:             (*s_etat_processus).niveau_courant = 0;
  353:             (*s_etat_processus).autorisation_empilement_programme = 'N';
  354:             registre_mode_execution_programme =
  355:                     (*s_etat_processus).mode_execution_programme;
  356:             (*s_etat_processus).mode_execution_programme = 'Y';
  357: 
  358:             tampon = (*s_etat_processus).instruction_courante;
  359: 
  360:             if ((*s_etat_processus).profilage == d_vrai)
  361:             {
  362:                 profilage(s_etat_processus, "RPL/2 internals");
  363: 
  364:                 if ((*s_etat_processus).erreur_systeme != d_es)
  365:                 {
  366:                     return;
  367:                 }
  368:             }
  369: 
  370:             if (sequenceur(s_etat_processus) == d_erreur)
  371:             {
  372:                 (*s_etat_processus).instruction_courante = tampon;
  373:                 (*s_etat_processus).mode_execution_programme =
  374:                         registre_mode_execution_programme;
  375: 
  376:                 (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
  377:                 (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
  378: 
  379:                 (*s_etat_processus).niveau_recursivite--;
  380: 
  381:                 (*s_etat_processus).position_courante = position_courante;
  382:                 free((*s_etat_processus).definitions_chainees);
  383:                 (*s_etat_processus).definitions_chainees =
  384:                         definitions_chainees_precedentes;
  385:                 (*s_etat_processus).longueur_definitions_chainees =
  386:                         sauvegarde_longueur_definitions_chainees;
  387: 
  388:                 free(element);
  389:                 free(s_objet);
  390: 
  391:                 (*s_etat_processus).traitement_interruptible =
  392:                         registre_interruption;
  393:                 return;
  394:             }
  395: 
  396:             (*s_etat_processus).instruction_courante = tampon;
  397:             (*s_etat_processus).mode_execution_programme =
  398:                     registre_mode_execution_programme;
  399: 
  400:             (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
  401:             (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
  402: 
  403:             (*s_etat_processus).niveau_recursivite--;
  404: 
  405:             (*s_etat_processus).position_courante = position_courante;
  406:             free((*s_etat_processus).definitions_chainees);
  407:             (*s_etat_processus).definitions_chainees =
  408:                     definitions_chainees_precedentes;
  409:             (*s_etat_processus).longueur_definitions_chainees =
  410:                     sauvegarde_longueur_definitions_chainees;
  411: 
  412: /*
  413: -- On relit la pile pour remplir le complexe -----------------------------------
  414: */
  415: 
  416:             profondeur_finale = (*s_etat_processus).hauteur_pile_operationnelle;
  417:             nombre_elements_convertis = profondeur_finale - profondeur_initiale;
  418: 
  419:             if ((nombre_elements_convertis != 2) || (nombre_virgules != 1))
  420:             {
  421:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
  422: 
  423:                 free(s_objet);
  424:                 free(element);
  425: 
  426:                 for(i = 0; i < (unsigned long) nombre_elements_convertis; i++)
  427:                 {
  428:                     if (depilement(s_etat_processus, &((*s_etat_processus)
  429:                             .l_base_pile), &s_sous_objet) == d_erreur)
  430:                     {
  431:                         (*s_etat_processus).traitement_interruptible =
  432:                                 registre_interruption;
  433:                         return;
  434:                     }
  435: 
  436:                     liberation(s_etat_processus, s_sous_objet);
  437:                 }
  438: 
  439:                 (*s_etat_processus).traitement_interruptible =
  440:                         registre_interruption;
  441:                 return;
  442:             }
  443:             else
  444:             {
  445:                 if (depilement(s_etat_processus,
  446:                         &((*s_etat_processus).l_base_pile), &s_sous_objet) ==
  447:                         d_absence_erreur)
  448:                 {
  449:                     if ((*s_sous_objet).type == INT)
  450:                     {
  451:                         (*((struct_complexe16 *) element)).partie_imaginaire =
  452:                                 (*((integer8 *) (*s_sous_objet).objet));
  453:                     }
  454:                     else if ((*s_sous_objet).type == REL)
  455:                     {
  456:                         (*((struct_complexe16 *) element)).partie_imaginaire =
  457:                                 (*((real8 *) (*s_sous_objet).objet));
  458:                     }
  459:                     else
  460:                     {
  461:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
  462: 
  463:                         free(element);
  464:                         free(s_objet);
  465: 
  466:                         liberation(s_etat_processus, s_sous_objet);
  467: 
  468:                         (*s_etat_processus).traitement_interruptible =
  469:                                 registre_interruption;
  470:                         return;
  471:                     }
  472: 
  473:                     liberation(s_etat_processus, s_sous_objet);
  474: 
  475:                     if (depilement(s_etat_processus,
  476:                             &((*s_etat_processus).l_base_pile), &s_sous_objet)
  477:                             == d_absence_erreur)
  478:                     {
  479:                         if ((*s_sous_objet).type == INT)
  480:                         {
  481:                             (*((struct_complexe16 *) element)).partie_reelle =
  482:                                     (*((integer8 *) (*s_sous_objet).objet));
  483:                         }
  484:                         else if ((*s_sous_objet).type == REL)
  485:                         {
  486:                             (*((struct_complexe16 *) element)).partie_reelle =
  487:                                     (*((real8 *) (*s_sous_objet).objet));
  488:                         }
  489:                         else
  490:                         {
  491:                             (*s_etat_processus).erreur_execution = d_ex_syntaxe;
  492: 
  493:                             free(element);
  494:                             free(s_objet);
  495: 
  496:                             liberation(s_etat_processus, s_sous_objet);
  497: 
  498:                             (*s_etat_processus).traitement_interruptible =
  499:                                     registre_interruption;
  500:                             return;
  501:                         }
  502: 
  503:                         liberation(s_etat_processus, s_sous_objet);
  504:                     }
  505:                 }
  506:             }
  507: 
  508:             break;
  509:         }
  510: 
  511: /*
  512: --------------------------------------------------------------------------------
  513:   Binaire
  514: --------------------------------------------------------------------------------
  515: */
  516: 
  517:         case '#' :
  518:         {
  519:             (*s_objet).type = BIN;
  520: 
  521:             element = (void *) ((logical8 *) malloc(
  522:                     sizeof(logical8)));
  523: 
  524:             if (element == NULL)
  525:             {
  526:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  527:                 (*s_etat_processus).traitement_interruptible =
  528:                         registre_interruption;
  529:                 return;
  530:             }
  531: 
  532:             erreur_lecture_binaire = d_faux;
  533: 
  534:             switch((*s_etat_processus).instruction_courante
  535:                     [strlen((*s_etat_processus).instruction_courante) - 1])
  536:             {
  537:                 case 'b' :
  538:                 {
  539:                     i = strlen((*s_etat_processus).instruction_courante) - 2;
  540:                     valeur_base = 1;
  541:                     
  542:                     (*((logical8 *) element)) = 0;
  543: 
  544:                     while(i > 0)
  545:                     {
  546:                         if ((*s_etat_processus).instruction_courante[i] == '1')
  547:                         {
  548:                             (*((logical8 *) element)) += valeur_base;
  549:                         }
  550:                         else if ((*s_etat_processus).instruction_courante[i]
  551:                                 != '0')
  552:                         {
  553:                             if ((*s_etat_processus).instruction_courante[i]
  554:                                     == ' ')
  555:                             {
  556:                                 while(i > 0)
  557:                                 {
  558:                                     if ((*s_etat_processus)
  559:                                             .instruction_courante[i] != ' ')
  560:                                     {
  561:                                         break;
  562:                                     }
  563: 
  564:                                     i--;
  565:                                 }
  566:                             }
  567: 
  568:                             if (i != 0)
  569:                             {
  570:                                 free(element);
  571:                                 free(s_objet);
  572: 
  573:                                 (*s_etat_processus).erreur_execution =
  574:                                         d_ex_syntaxe;
  575:                                 (*s_etat_processus).traitement_interruptible =
  576:                                         registre_interruption;
  577:                                 return;
  578:                             }
  579: 
  580:                             break;
  581:                         }
  582: 
  583:                         ancienne_valeur_base = valeur_base;
  584:                         valeur_base *= 2;
  585: 
  586:                         if  (ancienne_valeur_base > valeur_base)
  587:                         {
  588:                             i--;
  589: 
  590:                             while(i > 0)
  591:                             {
  592:                                 if ((*s_etat_processus).instruction_courante[i]
  593:                                         != ' ')
  594:                                 {
  595:                                     erreur_lecture_binaire = d_vrai;
  596:                                 }
  597: 
  598:                                 i--;
  599:                             }
  600: 
  601:                             break;
  602:                         }
  603: 
  604:                         i--;
  605:                     }
  606: 
  607:                     nombre_elements_convertis = 1;
  608:                     break;
  609:                 }
  610: 
  611:                 case 'o' :
  612:                 {
  613:                     i = strlen((*s_etat_processus).instruction_courante) - 2;
  614:                     valeur_base = 1;
  615:                     
  616:                     (*((logical8 *) element)) = 0;
  617: 
  618:                     while(i > 0)
  619:                     {
  620:                         if ((*s_etat_processus).instruction_courante[i] == '1')
  621:                         {
  622:                             (*((logical8 *) element)) += valeur_base;
  623:                         }
  624:                         else if ((*s_etat_processus).instruction_courante[i]
  625:                                 == '2')
  626:                         {
  627:                             (*((logical8 *) element)) += 2 * valeur_base;
  628:                         }
  629:                         else if ((*s_etat_processus).instruction_courante[i]
  630:                                 == '3')
  631:                         {
  632:                             (*((logical8 *) element)) += 3 * valeur_base;
  633:                         }
  634:                         else if ((*s_etat_processus).instruction_courante[i]
  635:                                 == '4')
  636:                         {
  637:                             (*((logical8 *) element)) += 4 * valeur_base;
  638:                         }
  639:                         else if ((*s_etat_processus).instruction_courante[i]
  640:                                 == '5')
  641:                         {
  642:                             (*((logical8 *) element)) += 5 * valeur_base;
  643:                         }
  644:                         else if ((*s_etat_processus).instruction_courante[i]
  645:                                 == '6')
  646:                         {
  647:                             (*((logical8 *) element)) += 6 * valeur_base;
  648:                         }
  649:                         else if ((*s_etat_processus).instruction_courante[i]
  650:                                 == '7')
  651:                         {
  652:                             (*((logical8 *) element)) += 7 * valeur_base;
  653:                         }
  654:                         else if ((*s_etat_processus).instruction_courante[i]
  655:                                 != '0')
  656:                         {
  657:                             if ((*s_etat_processus).instruction_courante[i]
  658:                                     == ' ')
  659:                             {
  660:                                 while(i > 0)
  661:                                 {
  662:                                     if ((*s_etat_processus)
  663:                                             .instruction_courante[i] != ' ')
  664:                                     {
  665:                                         break;
  666:                                     }
  667: 
  668:                                     i--;
  669:                                 }
  670:                             }
  671: 
  672:                             if (i != 0)
  673:                             {
  674:                                 free(element);
  675:                                 free(s_objet);
  676: 
  677:                                 (*s_etat_processus).erreur_execution =
  678:                                         d_ex_syntaxe;
  679:                                 (*s_etat_processus).traitement_interruptible =
  680:                                         registre_interruption;
  681:                                 return;
  682:                             }
  683: 
  684:                             break;
  685:                         }
  686: 
  687:                         ancienne_valeur_base = valeur_base;
  688:                         valeur_base *= 8;
  689: 
  690:                         if  (ancienne_valeur_base > valeur_base)
  691:                         {
  692:                             i--;
  693: 
  694:                             while(i > 0)
  695:                             {
  696:                                 if ((*s_etat_processus).instruction_courante[i]
  697:                                         != ' ')
  698:                                 {
  699:                                     erreur_lecture_binaire = d_vrai;
  700:                                 }
  701: 
  702:                                 i--;
  703:                             }
  704: 
  705:                             break;
  706:                         }
  707: 
  708:                         i--;
  709:                     }
  710: 
  711:                     nombre_elements_convertis = 1;
  712:                     break;
  713:                 }
  714: 
  715:                 case 'd' :
  716:                 {
  717:                     i = strlen((*s_etat_processus).instruction_courante) - 2;
  718:                     valeur_base = 1;
  719:                     
  720:                     (*((logical8 *) element)) = 0;
  721: 
  722:                     while(i > 0)
  723:                     {
  724:                         if ((*s_etat_processus).instruction_courante[i] == '1')
  725:                         {
  726:                             (*((logical8 *) element)) += valeur_base;
  727:                         }
  728:                         else if ((*s_etat_processus).instruction_courante[i]
  729:                                 == '2')
  730:                         {
  731:                             (*((logical8 *) element)) += 2 * valeur_base;
  732:                         }
  733:                         else if ((*s_etat_processus).instruction_courante[i]
  734:                                 == '3')
  735:                         {
  736:                             (*((logical8 *) element)) += 3 * valeur_base;
  737:                         }
  738:                         else if ((*s_etat_processus).instruction_courante[i]
  739:                                 == '4')
  740:                         {
  741:                             (*((logical8 *) element)) += 4 * valeur_base;
  742:                         }
  743:                         else if ((*s_etat_processus).instruction_courante[i]
  744:                                 == '5')
  745:                         {
  746:                             (*((logical8 *) element)) += 5 * valeur_base;
  747:                         }
  748:                         else if ((*s_etat_processus).instruction_courante[i]
  749:                                 == '6')
  750:                         {
  751:                             (*((logical8 *) element)) += 6 * valeur_base;
  752:                         }
  753:                         else if ((*s_etat_processus).instruction_courante[i]
  754:                                 == '7')
  755:                         {
  756:                             (*((logical8 *) element)) += 7 * valeur_base;
  757:                         }
  758:                         else if ((*s_etat_processus).instruction_courante[i]
  759:                                 == '8')
  760:                         {
  761:                             (*((logical8 *) element)) += 8 * valeur_base;
  762:                         }
  763:                         else if ((*s_etat_processus).instruction_courante[i]
  764:                                 == '9')
  765:                         {
  766:                             (*((logical8 *) element)) += 9 * valeur_base;
  767:                         }
  768:                         else if ((*s_etat_processus).instruction_courante[i]
  769:                                 != '0')
  770:                         {
  771:                             if ((*s_etat_processus).instruction_courante[i]
  772:                                     == ' ')
  773:                             {
  774:                                 while(i > 0)
  775:                                 {
  776:                                     if ((*s_etat_processus)
  777:                                             .instruction_courante[i] != ' ')
  778:                                     {
  779:                                         break;
  780:                                     }
  781: 
  782:                                     i--;
  783:                                 }
  784:                             }
  785: 
  786:                             if (i != 0)
  787:                             {
  788:                                 free(element);
  789:                                 free(s_objet);
  790: 
  791:                                 (*s_etat_processus).erreur_execution =
  792:                                         d_ex_syntaxe;
  793:                                 (*s_etat_processus).traitement_interruptible =
  794:                                         registre_interruption;
  795:                                 return;
  796:                             }
  797: 
  798:                             break;
  799:                         }
  800: 
  801:                         ancienne_valeur_base = valeur_base;
  802:                         valeur_base *= 10;
  803: 
  804:                         if  (ancienne_valeur_base > valeur_base)
  805:                         {
  806:                             i--;
  807: 
  808:                             while(i > 0)
  809:                             {
  810:                                 if ((*s_etat_processus).instruction_courante[i]
  811:                                         != ' ')
  812:                                 {
  813:                                     erreur_lecture_binaire = d_vrai;
  814:                                 }
  815: 
  816:                                 i--;
  817:                             }
  818: 
  819:                             break;
  820:                         }
  821: 
  822:                         i--;
  823:                     }
  824: 
  825:                     nombre_elements_convertis = 1;
  826:                     break;
  827:                 }
  828: 
  829:                 case 'h' :
  830:                 {
  831:                     i = strlen((*s_etat_processus).instruction_courante) - 2;
  832:                     valeur_base = 1;
  833:                     
  834:                     (*((logical8 *) element)) = 0;
  835: 
  836:                     while(i > 0)
  837:                     {
  838:                         if ((*s_etat_processus).instruction_courante[i] == '1')
  839:                         {
  840:                             (*((logical8 *) element)) += valeur_base;
  841:                         }
  842:                         else if ((*s_etat_processus).instruction_courante[i]
  843:                                 == '2')
  844:                         {
  845:                             (*((logical8 *) element)) += 2 * valeur_base;
  846:                         }
  847:                         else if ((*s_etat_processus).instruction_courante[i]
  848:                                 == '3')
  849:                         {
  850:                             (*((logical8 *) element)) += 3 * valeur_base;
  851:                         }
  852:                         else if ((*s_etat_processus).instruction_courante[i]
  853:                                 == '4')
  854:                         {
  855:                             (*((logical8 *) element)) += 4 * valeur_base;
  856:                         }
  857:                         else if ((*s_etat_processus).instruction_courante[i]
  858:                                 == '5')
  859:                         {
  860:                             (*((logical8 *) element)) += 5 * valeur_base;
  861:                         }
  862:                         else if ((*s_etat_processus).instruction_courante[i]
  863:                                 == '6')
  864:                         {
  865:                             (*((logical8 *) element)) += 6 * valeur_base;
  866:                         }
  867:                         else if ((*s_etat_processus).instruction_courante[i]
  868:                                 == '7')
  869:                         {
  870:                             (*((logical8 *) element)) += 7 * valeur_base;
  871:                         }
  872:                         else if ((*s_etat_processus).instruction_courante[i]
  873:                                 == '8')
  874:                         {
  875:                             (*((logical8 *) element)) += 8 * valeur_base;
  876:                         }
  877:                         else if ((*s_etat_processus).instruction_courante[i]
  878:                                 == '9')
  879:                         {
  880:                             (*((logical8 *) element)) += 9 * valeur_base;
  881:                         }
  882:                         else if ((*s_etat_processus).instruction_courante[i]
  883:                                 == 'A')
  884:                         {
  885:                             (*((logical8 *) element)) += 10 * valeur_base;
  886:                         }
  887:                         else if ((*s_etat_processus).instruction_courante[i]
  888:                                 == 'B')
  889:                         {
  890:                             (*((logical8 *) element)) += 11 * valeur_base;
  891:                         }
  892:                         else if ((*s_etat_processus).instruction_courante[i]
  893:                                 == 'C')
  894:                         {
  895:                             (*((logical8 *) element)) += 12 * valeur_base;
  896:                         }
  897:                         else if ((*s_etat_processus).instruction_courante[i]
  898:                                 == 'D')
  899:                         {
  900:                             (*((logical8 *) element)) += 13 * valeur_base;
  901:                         }
  902:                         else if ((*s_etat_processus).instruction_courante[i]
  903:                                 == 'E')
  904:                         {
  905:                             (*((logical8 *) element)) += 14 * valeur_base;
  906:                         }
  907:                         else if ((*s_etat_processus).instruction_courante[i]
  908:                                 == 'F')
  909:                         {
  910:                             (*((logical8 *) element)) += 15 * valeur_base;
  911:                         }
  912:                         else if ((*s_etat_processus).instruction_courante[i]
  913:                                 != '0')
  914:                         {
  915:                             if ((*s_etat_processus).instruction_courante[i]
  916:                                     == ' ')
  917:                             {
  918:                                 while(i > 0)
  919:                                 {
  920:                                     if ((*s_etat_processus)
  921:                                             .instruction_courante[i] != ' ')
  922:                                     {
  923:                                         break;
  924:                                     }
  925: 
  926:                                     i--;
  927:                                 }
  928:                             }
  929: 
  930:                             if (i != 0)
  931:                             {
  932:                                 free(element);
  933:                                 free(s_objet);
  934: 
  935:                                 (*s_etat_processus).erreur_execution =
  936:                                         d_ex_syntaxe;
  937:                                 (*s_etat_processus).traitement_interruptible =
  938:                                         registre_interruption;
  939:                                 return;
  940:                             }
  941: 
  942:                             break;
  943:                         }
  944: 
  945:                         ancienne_valeur_base = valeur_base;
  946:                         valeur_base *= 16;
  947: 
  948:                         if  (ancienne_valeur_base > valeur_base)
  949:                         {
  950:                             i--;
  951: 
  952:                             while(i > 0)
  953:                             {
  954:                                 if ((*s_etat_processus).instruction_courante[i]
  955:                                         != ' ')
  956:                                 {
  957:                                     erreur_lecture_binaire = d_vrai;
  958:                                 }
  959: 
  960:                                 i--;
  961:                             }
  962: 
  963:                             break;
  964:                         }
  965: 
  966:                         i--;
  967:                     }
  968: 
  969:                     nombre_elements_convertis = 1;
  970:                     break;
  971:                 }
  972: 
  973:                 default :
  974:                 {
  975:                     nombre_elements_convertis = 0;
  976:                     break;
  977:                 }
  978:             }
  979: 
  980:             if ((nombre_elements_convertis != 1) ||
  981:                     (erreur_lecture_binaire == d_vrai))
  982:             {
  983:                 free(element);
  984:                 free(s_objet);
  985: 
  986:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
  987:                 (*s_etat_processus).traitement_interruptible =
  988:                         registre_interruption;
  989:                 return;
  990:             }
  991: 
  992:             break;
  993:         }
  994: 
  995: /*
  996: --------------------------------------------------------------------------------
  997:   Matrices ou vecteurs entiers, réels ou complexes
  998: --------------------------------------------------------------------------------
  999: */
 1000: 
 1001:         case '[' :
 1002:         {
 1003:             niveau = 0;
 1004:             niveau_maximal = 0;
 1005: 
 1006:             nombre_colonnes = 0;
 1007:             nombre_lignes = 0;
 1008: 
 1009:             drapeau_complexe = d_faux;
 1010:             drapeau_reel = d_faux;
 1011: 
 1012:             ptr = (*s_etat_processus).instruction_courante;
 1013: 
 1014:             while((*ptr) != d_code_fin_chaine)
 1015:             {
 1016:                 switch(*ptr)
 1017:                 {
 1018:                     case '(' :
 1019:                     case ')' :
 1020:                     {
 1021:                         drapeau_complexe = d_vrai;
 1022:                         drapeau_reel = d_vrai;
 1023:                         break;
 1024:                     }
 1025: 
 1026:                     case '.' :
 1027:                     case 'E' :
 1028:                     case 'e' :
 1029:                     {
 1030:                         drapeau_reel = d_vrai;
 1031:                         break;
 1032:                     }
 1033: 
 1034:                     case '[' :
 1035:                     {
 1036:                         niveau_maximal = (++niveau);
 1037:                         break;
 1038:                     }
 1039: 
 1040:                     case ']' :
 1041:                     {
 1042:                         niveau--;
 1043:                         break;
 1044:                     }
 1045:                 }
 1046: 
 1047:                 ptr++;
 1048:             }
 1049: 
 1050:             if (niveau != 0)
 1051:             {
 1052:                 free(s_objet);
 1053: 
 1054:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 1055:                 (*s_etat_processus).traitement_interruptible =
 1056:                         registre_interruption;
 1057:                 return;
 1058:             }
 1059: 
 1060:             drapeau_matrice = (niveau_maximal == 2) ? d_vrai : d_faux;
 1061: 
 1062:             switch (drapeau_matrice)
 1063:             {
 1064: 
 1065: /*
 1066: --------------------------------------------------------------------------------
 1067:   Vecteur
 1068: --------------------------------------------------------------------------------
 1069: */
 1070: 
 1071:                 case d_faux :
 1072:                 {
 1073: 
 1074: /*
 1075: -- Sauvegarde des paramètres du processus pour analyser le vecteur -------------
 1076: -- Analyse récursive en appelant l'interpréteur sur le vecteur moins -----------
 1077: -- ses délimiteurs -------------------------------------------------------------
 1078: */
 1079: 
 1080:                     sauvegarde_longueur_definitions_chainees =
 1081:                             (*s_etat_processus).longueur_definitions_chainees;
 1082: 
 1083:                     tampon = (unsigned char *) malloc(
 1084:                             (((*s_etat_processus).longueur_definitions_chainees
 1085:                             = strlen((*s_etat_processus).instruction_courante)
 1086:                             + 4) + 1) * sizeof(unsigned char));
 1087: 
 1088:                     if (tampon == NULL)
 1089:                     {
 1090:                         (*s_etat_processus).erreur_systeme =
 1091:                                 d_es_allocation_memoire;
 1092:                         (*s_etat_processus).traitement_interruptible =
 1093:                                 registre_interruption;
 1094:                         return;
 1095:                     }
 1096: 
 1097:                     strcpy(tampon, "<< ");
 1098:                     ptr_ecriture = tampon + 3;
 1099:                     ptr_lecture = (*s_etat_processus).instruction_courante + 1;
 1100: 
 1101:                     while((*ptr_lecture) != d_code_fin_chaine)
 1102:                     {
 1103:                         *ptr_ecriture++ = *ptr_lecture++;
 1104:                     }
 1105: 
 1106:                     (*(--ptr_ecriture)) = d_code_fin_chaine;
 1107:                     strcat(ptr_ecriture, " >>");
 1108: 
 1109:                     position_courante = (*s_etat_processus).position_courante;
 1110:                     (*s_etat_processus).position_courante = 0;
 1111: 
 1112:                     profondeur_initiale = (*s_etat_processus)
 1113:                             .hauteur_pile_operationnelle;
 1114: 
 1115: /*
 1116: -- On met le tout dans la pile opérationnelle ----------------------------------
 1117: */
 1118: 
 1119:                     (*s_etat_processus).niveau_recursivite++;
 1120:                     definitions_chainees_precedentes = (*s_etat_processus)
 1121:                             .definitions_chainees;
 1122:                     (*s_etat_processus).definitions_chainees = tampon;
 1123: 
 1124:                     s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
 1125:                     sauvegarde_niveau_courant = (*s_etat_processus)
 1126:                             .niveau_courant;
 1127: 
 1128:                     (*s_etat_processus).l_base_pile_systeme = NULL;
 1129:                     empilement_pile_systeme(s_etat_processus);
 1130: 
 1131:                     if ((*s_etat_processus).erreur_systeme != d_es)
 1132:                     {
 1133:                         (*s_etat_processus).traitement_interruptible =
 1134:                                 registre_interruption;
 1135:                         return;
 1136:                     }
 1137: 
 1138:                     (*(*s_etat_processus).l_base_pile_systeme)
 1139:                             .retour_definition = 'Y';
 1140:                     (*s_etat_processus).niveau_courant = 0;
 1141:                     (*s_etat_processus).autorisation_empilement_programme = 'N';
 1142:                     registre_mode_execution_programme =
 1143:                             (*s_etat_processus).mode_execution_programme;
 1144:                     (*s_etat_processus).mode_execution_programme = 'Y';
 1145:                     (*s_etat_processus).erreur_scrutation = d_faux;
 1146: 
 1147:                     tampon = (*s_etat_processus).instruction_courante;
 1148:                     nombre_lignes_a_supprimer =
 1149:                             (*s_etat_processus).hauteur_pile_operationnelle;
 1150: 
 1151:                     if ((*s_etat_processus).profilage == d_vrai)
 1152:                     {
 1153:                         profilage(s_etat_processus, "RPL/2 internals");
 1154: 
 1155:                         if ((*s_etat_processus).erreur_systeme != d_es)
 1156:                         {
 1157:                             return;
 1158:                         }
 1159:                     }
 1160: 
 1161:                     if (sequenceur(s_etat_processus) == d_erreur)
 1162:                     {
 1163:                         (*s_etat_processus).mode_execution_programme =
 1164:                                 registre_mode_execution_programme;
 1165:                         nombre_lignes_a_supprimer =
 1166:                                 (*s_etat_processus).hauteur_pile_operationnelle
 1167:                                 - nombre_lignes_a_supprimer;
 1168: 
 1169:                         for(i = 0; i < nombre_lignes_a_supprimer; i++)
 1170:                         {
 1171:                             if (depilement(s_etat_processus,
 1172:                                     &((*s_etat_processus).l_base_pile),
 1173:                                     &s_sous_objet) == d_erreur)
 1174:                             {
 1175:                                 (*s_etat_processus).traitement_interruptible =
 1176:                                         registre_interruption;
 1177:                                 return;
 1178:                             }
 1179: 
 1180:                             liberation(s_etat_processus, s_sous_objet);
 1181:                         }
 1182: 
 1183:                         (*s_etat_processus).instruction_courante = tampon;
 1184: 
 1185:                         (*s_etat_processus).l_base_pile_systeme =
 1186:                                 s_sauvegarde_pile;
 1187:                         (*s_etat_processus).niveau_courant =
 1188:                                 sauvegarde_niveau_courant;
 1189: 
 1190:                         (*s_etat_processus).niveau_recursivite--;
 1191:                         free((*s_etat_processus).definitions_chainees);
 1192: 
 1193:                         (*s_etat_processus).position_courante =
 1194:                                 position_courante;
 1195:                         (*s_etat_processus).definitions_chainees =
 1196:                                 definitions_chainees_precedentes;
 1197:                         (*s_etat_processus).longueur_definitions_chainees =
 1198:                                 sauvegarde_longueur_definitions_chainees;
 1199: 
 1200:                         free(s_objet);
 1201: 
 1202:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 1203:                         (*s_etat_processus).traitement_interruptible =
 1204:                                 registre_interruption;
 1205:                         return;
 1206:                     }
 1207: 
 1208:                     (*s_etat_processus).mode_execution_programme =
 1209:                             registre_mode_execution_programme;
 1210: 
 1211:                     if ((*s_etat_processus).erreur_scrutation == d_vrai)
 1212:                     {
 1213:                         nombre_lignes_a_supprimer =
 1214:                                 (*s_etat_processus).hauteur_pile_operationnelle
 1215:                                 - nombre_lignes_a_supprimer;
 1216: 
 1217:                         for(i = 0; i < nombre_lignes_a_supprimer; i++)
 1218:                         {
 1219:                             if (depilement(s_etat_processus,
 1220:                                     &((*s_etat_processus).l_base_pile),
 1221:                                     &s_sous_objet) == d_erreur)
 1222:                             {
 1223:                                 (*s_etat_processus).traitement_interruptible =
 1224:                                         registre_interruption;
 1225:                                 return;
 1226:                             }
 1227: 
 1228:                             liberation(s_etat_processus, s_sous_objet);
 1229:                         }
 1230: 
 1231:                         (*s_etat_processus).instruction_courante = tampon;
 1232: 
 1233:                         (*s_etat_processus).l_base_pile_systeme =
 1234:                                 s_sauvegarde_pile;
 1235:                         (*s_etat_processus).niveau_courant =
 1236:                                 sauvegarde_niveau_courant;
 1237: 
 1238:                         (*s_etat_processus).niveau_recursivite--;
 1239:                         free((*s_etat_processus).definitions_chainees);
 1240: 
 1241:                         (*s_etat_processus).position_courante =
 1242:                                 position_courante;
 1243:                         (*s_etat_processus).definitions_chainees =
 1244:                                 definitions_chainees_precedentes;
 1245:                         (*s_etat_processus).longueur_definitions_chainees =
 1246:                                 sauvegarde_longueur_definitions_chainees;
 1247: 
 1248:                         free(s_objet);
 1249: 
 1250:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 1251:                         (*s_etat_processus).traitement_interruptible =
 1252:                                 registre_interruption;
 1253:                         return;
 1254:                     }
 1255: 
 1256:                     (*s_etat_processus).instruction_courante = tampon;
 1257: 
 1258:                     (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
 1259:                     (*s_etat_processus).niveau_courant =
 1260:                             sauvegarde_niveau_courant;
 1261: 
 1262:                     (*s_etat_processus).niveau_recursivite--;
 1263: 
 1264:                     (*s_etat_processus).position_courante = position_courante;
 1265:                     free((*s_etat_processus).definitions_chainees);
 1266:                     (*s_etat_processus).definitions_chainees =
 1267:                             definitions_chainees_precedentes;
 1268:                     (*s_etat_processus).longueur_definitions_chainees =
 1269:                             sauvegarde_longueur_definitions_chainees;
 1270: 
 1271: /*
 1272: -- On relit la pile pour remplir le vecteur ------------------------------------
 1273: */
 1274: 
 1275:                     profondeur_finale = (*s_etat_processus)
 1276:                             .hauteur_pile_operationnelle;
 1277:                     nombre_colonnes = profondeur_finale - profondeur_initiale;
 1278: 
 1279:                     element = (void *) ((struct_vecteur *)
 1280:                             malloc(sizeof(struct_vecteur)));
 1281: 
 1282:                     if (element == NULL)
 1283:                     {
 1284:                         (*s_etat_processus).erreur_systeme =
 1285:                                 d_es_allocation_memoire;
 1286:                         (*s_etat_processus).traitement_interruptible =
 1287:                                 registre_interruption;
 1288:                         return;
 1289:                     }
 1290: 
 1291:                     (*((struct_vecteur *) element)).taille = nombre_colonnes;
 1292: 
 1293:                     if (drapeau_complexe == d_vrai)
 1294:                     {
 1295:                         (*((struct_vecteur *) element)).tableau = (void *)
 1296:                                 ((struct_complexe16 *) malloc(nombre_colonnes *
 1297:                                 sizeof(struct_complexe16)));
 1298:                         (*((struct_vecteur *) element)).type = 'C';
 1299:                     }
 1300:                     else if (drapeau_reel == d_vrai)
 1301:                     {
 1302:                         (*((struct_vecteur *) element)).tableau = (void *)
 1303:                                 ((real8 *) malloc(nombre_colonnes *
 1304:                                 sizeof(real8)));
 1305:                         (*((struct_vecteur *) element)).type = 'R';
 1306:                     }
 1307:                     else
 1308:                     {
 1309:                         (*((struct_vecteur *) element)).tableau = (void *)
 1310:                                 ((integer8 *) malloc(nombre_colonnes *
 1311:                                 sizeof(integer8)));
 1312:                         (*((struct_vecteur *) element)).type = 'I';
 1313:                     }
 1314: 
 1315:                     if ((*((struct_vecteur *) element)).tableau == NULL)
 1316:                     {
 1317:                         (*s_etat_processus).erreur_systeme =
 1318:                                 d_es_allocation_memoire;
 1319:                         (*s_etat_processus).traitement_interruptible =
 1320:                                 registre_interruption;
 1321:                         return;
 1322:                     }
 1323: 
 1324:                     erreur = d_absence_erreur;
 1325:                     free(s_objet);
 1326: 
 1327:                     for(i = 0; (i < nombre_colonnes) &&
 1328:                             (erreur == d_absence_erreur); i++)
 1329:                     {
 1330:                         erreur = depilement(s_etat_processus,
 1331:                                 &((*s_etat_processus).l_base_pile), &s_objet);
 1332: 
 1333:                         if (erreur == d_absence_erreur)
 1334:                         {
 1335:                             if (drapeau_complexe == d_vrai)
 1336:                             {
 1337:                                 if ((*s_objet).type == CPL)
 1338:                                 {
 1339:                                     ((struct_complexe16 *) (*((struct_vecteur *)
 1340:                                             element)).tableau)[nombre_colonnes
 1341:                                             - i - 1] = *((struct_complexe16 *)
 1342:                                             ((*s_objet).objet));
 1343:                                 }
 1344:                                 else if ((*s_objet).type == REL)
 1345:                                 {
 1346:                                     ((struct_complexe16 *) (*((struct_vecteur *)
 1347:                                             element)).tableau)[nombre_colonnes
 1348:                                             - i - 1].partie_reelle =
 1349:                                             *((real8 *) ((*s_objet).objet));
 1350:                                     ((struct_complexe16 *) (*((struct_vecteur *)
 1351:                                             element)).tableau)[nombre_colonnes
 1352:                                             - i - 1].partie_imaginaire =
 1353:                                             (real8) 0;
 1354:                                 }
 1355:                                 else if ((*s_objet).type == INT)
 1356:                                 {
 1357:                                     ((struct_complexe16 *) (*((struct_vecteur *)
 1358:                                             element)).tableau)[nombre_colonnes
 1359:                                             - i - 1].partie_reelle = (real8)
 1360:                                             (*((integer8 *) ((*s_objet)
 1361:                                             .objet)));
 1362:                                     ((struct_complexe16 *) (*((struct_vecteur *)
 1363:                                             element)).tableau) [nombre_colonnes
 1364:                                             - i - 1].partie_imaginaire =
 1365:                                             (real8) 0;
 1366:                                 }
 1367:                                 else
 1368:                                 {
 1369:                                     erreur = d_erreur;
 1370:                                 }
 1371:                             }
 1372:                             else if (drapeau_reel == d_vrai)
 1373:                             {
 1374:                                 if ((*s_objet).type == REL)
 1375:                                 {
 1376:                                     ((real8 *) (*((struct_vecteur *)
 1377:                                             element)).tableau)
 1378:                                             [nombre_colonnes - i - 1] =
 1379:                                             *((real8 *) ((*s_objet).objet));
 1380:                                 }
 1381:                                 else if ((*s_objet).type == INT)
 1382:                                 {
 1383:                                     ((real8 *) (*((struct_vecteur *)
 1384:                                             element)).tableau)
 1385:                                             [nombre_colonnes - i - 1] =
 1386:                                             (real8) (*((integer8 *)
 1387:                                             ((*s_objet).objet)));
 1388:                                 }
 1389:                                 else
 1390:                                 {
 1391:                                     erreur = d_erreur;
 1392:                                 }
 1393:                             }
 1394:                             else
 1395:                             {
 1396:                                 if ((*s_objet).type == INT)
 1397:                                 {
 1398:                                     ((integer8 *) (*((struct_vecteur *)
 1399:                                             element)).tableau)
 1400:                                             [nombre_colonnes - i - 1] =
 1401:                                             *((integer8 *) ((*s_objet).objet));
 1402:                                 }
 1403:                                 else
 1404:                                 {
 1405:                                     erreur = d_erreur;
 1406:                                 }
 1407:                             }
 1408: 
 1409:                             liberation(s_etat_processus, s_objet);
 1410: 
 1411:                             if (erreur == d_erreur)
 1412:                             {
 1413:                                 for(i++; i < nombre_colonnes; i++)
 1414:                                 {
 1415:                                     if (depilement(s_etat_processus,
 1416:                                             &((*s_etat_processus).l_base_pile),
 1417:                                             &s_objet) == d_erreur)
 1418:                                     {
 1419:                                         (*s_etat_processus)
 1420:                                                 .traitement_interruptible =
 1421:                                                 registre_interruption;
 1422:                                         return;
 1423:                                     }
 1424: 
 1425:                                     liberation(s_etat_processus, s_objet);
 1426:                                 }
 1427: 
 1428:                                 (*s_etat_processus).erreur_execution =
 1429:                                         d_ex_syntaxe;
 1430: 
 1431:                                 free((*((struct_vecteur *) element)).tableau);
 1432:                                 free(element);
 1433: 
 1434:                                 (*s_etat_processus).traitement_interruptible =
 1435:                                         registre_interruption;
 1436:                                 return;
 1437:                             }
 1438:                         }
 1439:                         else
 1440:                         {
 1441:                             (*s_etat_processus).erreur_systeme = d_es_pile_vide;
 1442:                             (*s_etat_processus).traitement_interruptible =
 1443:                                     registre_interruption;
 1444:                             return;
 1445:                         }
 1446:                     }
 1447: 
 1448:                     s_objet = (struct_objet *) malloc(sizeof(struct_objet));
 1449: 
 1450:                     if (s_objet == NULL)
 1451:                     {
 1452:                         (*s_etat_processus).erreur_systeme =
 1453:                                 d_es_allocation_memoire;
 1454:                         (*s_etat_processus).traitement_interruptible =
 1455:                                 registre_interruption;
 1456:                         return;
 1457:                     }
 1458: 
 1459:                     initialisation_objet(s_objet);
 1460: 
 1461:                     if (drapeau_complexe == d_vrai)
 1462:                     {
 1463:                         (*s_objet).type = VCX;
 1464:                     }
 1465:                     else if (drapeau_reel == d_vrai)
 1466:                     {
 1467:                         (*s_objet).type = VRL;
 1468:                     }
 1469:                     else
 1470:                     {
 1471:                         (*s_objet).type = VIN;
 1472:                     }
 1473: 
 1474:                     break;
 1475:                 }
 1476: 
 1477: /*
 1478: --------------------------------------------------------------------------------
 1479:   Matrice
 1480: --------------------------------------------------------------------------------
 1481: */
 1482: 
 1483:                 case d_vrai :
 1484:                 {
 1485:                     nombre_lignes--;
 1486: 
 1487:                     sauvegarde_longueur_definitions_chainees =
 1488:                             (*s_etat_processus).longueur_definitions_chainees;
 1489: 
 1490:                     tampon = (unsigned char *) malloc(
 1491:                             (((*s_etat_processus).longueur_definitions_chainees
 1492:                             = strlen((*s_etat_processus).instruction_courante)
 1493:                             + 4) + 1) * sizeof(unsigned char));
 1494: 
 1495:                     if (tampon == NULL)
 1496:                     {
 1497:                         (*s_etat_processus).erreur_systeme =
 1498:                                 d_es_allocation_memoire;
 1499:                         (*s_etat_processus).traitement_interruptible =
 1500:                                 registre_interruption;
 1501:                         return;
 1502:                     }
 1503: 
 1504:                     strcpy(tampon, "<< ");
 1505:                     ptr_ecriture = tampon + 3;
 1506:                     ptr_lecture = (*s_etat_processus).instruction_courante + 1;
 1507: 
 1508:                     while((*ptr_lecture) != d_code_fin_chaine)
 1509:                     {
 1510:                         *ptr_ecriture++ = *ptr_lecture++;
 1511:                     }
 1512: 
 1513:                     (*(--ptr_ecriture)) = d_code_fin_chaine;
 1514:                     strcat(ptr_ecriture, " >>");
 1515: 
 1516:                     position_courante = (*s_etat_processus).position_courante;
 1517:                     (*s_etat_processus).position_courante = 0;
 1518: 
 1519:                     profondeur_initiale = (*s_etat_processus)
 1520:                             .hauteur_pile_operationnelle;
 1521: 
 1522: /*
 1523: -- On met les lignes de la matrice dans la pile opérationnelle -----------------
 1524: */
 1525: 
 1526:                     (*s_etat_processus).niveau_recursivite++;
 1527:                     definitions_chainees_precedentes = (*s_etat_processus)
 1528:                             .definitions_chainees;
 1529:                     (*s_etat_processus).definitions_chainees = tampon;
 1530: 
 1531:                     s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
 1532:                     sauvegarde_niveau_courant = (*s_etat_processus)
 1533:                             .niveau_courant;
 1534: 
 1535:                     (*s_etat_processus).l_base_pile_systeme = NULL;
 1536:                     empilement_pile_systeme(s_etat_processus);
 1537: 
 1538:                     if ((*s_etat_processus).erreur_systeme != d_es)
 1539:                     {
 1540:                         (*s_etat_processus).traitement_interruptible =
 1541:                                 registre_interruption;
 1542:                         return;
 1543:                     }
 1544: 
 1545:                     (*(*s_etat_processus).l_base_pile_systeme)
 1546:                             .retour_definition = 'Y';
 1547:                     (*s_etat_processus).niveau_courant = 0;
 1548:                     (*s_etat_processus).autorisation_empilement_programme = 'N';
 1549:                     registre_mode_execution_programme =
 1550:                             (*s_etat_processus).mode_execution_programme;
 1551:                     (*s_etat_processus).mode_execution_programme = 'Y';
 1552:                     (*s_etat_processus).erreur_scrutation = d_faux;
 1553: 
 1554:                     tampon = (*s_etat_processus).instruction_courante;
 1555:                     nombre_lignes_a_supprimer =
 1556:                             (*s_etat_processus).hauteur_pile_operationnelle;
 1557: 
 1558:                     if ((*s_etat_processus).profilage == d_vrai)
 1559:                     {
 1560:                         profilage(s_etat_processus, "RPL/2 internals");
 1561: 
 1562:                         if ((*s_etat_processus).erreur_systeme != d_es)
 1563:                         {
 1564:                             return;
 1565:                         }
 1566:                     }
 1567: 
 1568:                     if (sequenceur(s_etat_processus) == d_erreur)
 1569:                     {
 1570:                         (*s_etat_processus).mode_execution_programme =
 1571:                                 registre_mode_execution_programme;
 1572:                         nombre_lignes_a_supprimer =
 1573:                                 (*s_etat_processus).hauteur_pile_operationnelle
 1574:                                 - nombre_lignes_a_supprimer;
 1575: 
 1576:                         for(i = 0; i < nombre_lignes_a_supprimer; i++)
 1577:                         {
 1578:                             if (depilement(s_etat_processus,
 1579:                                     &((*s_etat_processus).l_base_pile),
 1580:                                     &s_sous_objet) == d_erreur)
 1581:                             {
 1582:                                 (*s_etat_processus).traitement_interruptible =
 1583:                                         registre_interruption;
 1584:                                 return;
 1585:                             }
 1586: 
 1587:                             liberation(s_etat_processus, s_sous_objet);
 1588:                         }
 1589: 
 1590:                         (*s_etat_processus).instruction_courante = tampon;
 1591: 
 1592:                         (*s_etat_processus).l_base_pile_systeme =
 1593:                                 s_sauvegarde_pile;
 1594:                         (*s_etat_processus).niveau_courant =
 1595:                                 sauvegarde_niveau_courant;
 1596: 
 1597:                         free((*s_etat_processus).definitions_chainees);
 1598:                         (*s_etat_processus).niveau_recursivite--;
 1599: 
 1600:                         (*s_etat_processus).definitions_chainees =
 1601:                                 definitions_chainees_precedentes;
 1602:                         (*s_etat_processus).longueur_definitions_chainees =
 1603:                                 sauvegarde_longueur_definitions_chainees;
 1604: 
 1605:                         (*s_etat_processus).position_courante =
 1606:                                 position_courante;
 1607: 
 1608:                         free(s_objet);
 1609: 
 1610:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 1611:                         (*s_etat_processus).traitement_interruptible =
 1612:                                 registre_interruption;
 1613:                         return;
 1614:                     }
 1615: 
 1616:                     (*s_etat_processus).mode_execution_programme =
 1617:                             registre_mode_execution_programme;
 1618: 
 1619:                     if ((*s_etat_processus).erreur_scrutation == d_vrai)
 1620:                     {
 1621:                         nombre_lignes_a_supprimer =
 1622:                                 (*s_etat_processus).hauteur_pile_operationnelle
 1623:                                 - nombre_lignes_a_supprimer;
 1624: 
 1625:                         for(i = 0; i < nombre_lignes_a_supprimer; i++)
 1626:                         {
 1627:                             if (depilement(s_etat_processus,
 1628:                                     &((*s_etat_processus).l_base_pile),
 1629:                                     &s_sous_objet) == d_erreur)
 1630:                             {
 1631:                                 (*s_etat_processus).traitement_interruptible =
 1632:                                         registre_interruption;
 1633:                                 return;
 1634:                             }
 1635: 
 1636:                             liberation(s_etat_processus, s_sous_objet);
 1637:                         }
 1638: 
 1639:                         (*s_etat_processus).instruction_courante = tampon;
 1640: 
 1641:                         (*s_etat_processus).l_base_pile_systeme =
 1642:                                 s_sauvegarde_pile;
 1643:                         (*s_etat_processus).niveau_courant =
 1644:                                 sauvegarde_niveau_courant;
 1645: 
 1646:                         free((*s_etat_processus).definitions_chainees);
 1647:                         (*s_etat_processus).niveau_recursivite--;
 1648: 
 1649:                         (*s_etat_processus).definitions_chainees =
 1650:                                 definitions_chainees_precedentes;
 1651:                         (*s_etat_processus).longueur_definitions_chainees =
 1652:                                 sauvegarde_longueur_definitions_chainees;
 1653: 
 1654:                         (*s_etat_processus).position_courante =
 1655:                                 position_courante;
 1656: 
 1657:                         free(s_objet);
 1658: 
 1659:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 1660:                         (*s_etat_processus).traitement_interruptible =
 1661:                                 registre_interruption;
 1662:                         return;
 1663:                     }
 1664: 
 1665:                     (*s_etat_processus).instruction_courante = tampon;
 1666: 
 1667:                     (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
 1668:                     (*s_etat_processus).niveau_courant =
 1669:                             sauvegarde_niveau_courant;
 1670: 
 1671:                     free((*s_etat_processus).definitions_chainees);
 1672:                     (*s_etat_processus).definitions_chainees =
 1673:                             definitions_chainees_precedentes;
 1674:                     (*s_etat_processus).longueur_definitions_chainees =
 1675:                             sauvegarde_longueur_definitions_chainees;
 1676: 
 1677:                     (*s_etat_processus).niveau_recursivite--;
 1678: 
 1679:                     (*s_etat_processus).position_courante = position_courante;
 1680: 
 1681: /*
 1682: -- On relit la pile qui contient des objets "vecteurs" contenant les -----------
 1683: -- lignes de la matrice --------------------------------------------------------
 1684: */
 1685: 
 1686:                     profondeur_finale = (*s_etat_processus)
 1687:                             .hauteur_pile_operationnelle;
 1688: 
 1689:                     nombre_lignes = profondeur_finale - profondeur_initiale;
 1690: 
 1691:                     element = (void *) ((struct_matrice *) malloc(
 1692:                             sizeof(struct_matrice)));
 1693: 
 1694:                     if (element == NULL)
 1695:                     {
 1696:                         (*s_etat_processus).erreur_systeme =
 1697:                                 d_es_allocation_memoire;
 1698:                         (*s_etat_processus).traitement_interruptible =
 1699:                                 registre_interruption;
 1700:                         return;
 1701:                     }
 1702: 
 1703:                     (*((struct_matrice *) element))
 1704:                             .nombre_lignes = nombre_lignes;
 1705:                     (*((struct_matrice *) element)).nombre_colonnes =
 1706:                             (*((struct_vecteur *) ((*(*(*s_etat_processus)
 1707:                             .l_base_pile).donnee).objet))).taille;
 1708:                     nombre_colonnes = (*((struct_matrice *)
 1709:                             element)).nombre_colonnes;
 1710: 
 1711:                     l_element_courant = (*s_etat_processus).l_base_pile;
 1712: 
 1713:                     drapeau_complexe = d_faux;
 1714:                     drapeau_reel = d_faux;
 1715:                     erreur = d_absence_erreur;
 1716: 
 1717:                     for(i = 0; i < nombre_lignes; i++)
 1718:                     {
 1719:                         if (nombre_colonnes != (*((struct_vecteur *)
 1720:                                 (*(*l_element_courant).donnee).objet)).taille)
 1721:                         {
 1722:                             (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 1723: 
 1724:                             for(j = 0; j < nombre_lignes; j++)
 1725:                             {
 1726:                                 if (depilement(s_etat_processus,
 1727:                                         &((*s_etat_processus).l_base_pile),
 1728:                                         &s_sous_objet) == d_erreur)
 1729:                                 {
 1730:                                     (*s_etat_processus)
 1731:                                             .traitement_interruptible =
 1732:                                             registre_interruption;
 1733:                                     return;
 1734:                                 }
 1735: 
 1736:                                 liberation(s_etat_processus, s_sous_objet);
 1737:                             }
 1738: 
 1739:                             free(element);
 1740:                             free(s_objet);
 1741: 
 1742:                             (*s_etat_processus).traitement_interruptible =
 1743:                                     registre_interruption;
 1744:                             return;
 1745:                         }
 1746: 
 1747:                         if ((*(*l_element_courant)
 1748:                                 .donnee).type == VRL)
 1749:                         {
 1750:                             drapeau_reel = d_vrai;
 1751:                         }
 1752:                         else if ((*(*l_element_courant)
 1753:                                 .donnee).type == VCX)
 1754:                         {
 1755:                             drapeau_complexe = d_vrai;
 1756:                         }
 1757: 
 1758:                         l_element_courant = (*l_element_courant).suivant;
 1759:                     }
 1760: 
 1761:                     free(s_objet);
 1762: 
 1763:                     if ((*s_etat_processus).erreur_execution == d_ex)
 1764:                     {
 1765:                         if (drapeau_complexe == d_vrai)
 1766:                         {
 1767:                             if (((*((struct_matrice *) element)).tableau =
 1768:                                     (void **) ((struct_complexe16 **)
 1769:                                     malloc(nombre_lignes * sizeof(
 1770:                                     struct_complexe16 *)))) == NULL)
 1771:                             {
 1772:                                 (*s_etat_processus).erreur_systeme =
 1773:                                         d_es_allocation_memoire;
 1774:                                 (*s_etat_processus).traitement_interruptible =
 1775:                                         registre_interruption;
 1776:                                 return;
 1777:                             }
 1778: 
 1779:                             (*((struct_matrice *) element)).type = 'C';
 1780: 
 1781:                             for(i = 0; i < nombre_lignes; i++)
 1782:                             {
 1783:                                 if ((((*((struct_matrice *)
 1784:                                         element)).tableau)[i] = (void *)
 1785:                                         ((struct_complexe16 *)
 1786:                                         malloc(nombre_colonnes * sizeof(
 1787:                                         struct_complexe16)))) == NULL)
 1788:                                 {
 1789:                                     (*s_etat_processus).erreur_systeme =
 1790:                                             d_es_allocation_memoire;
 1791:                                     (*s_etat_processus)
 1792:                                             .traitement_interruptible =
 1793:                                             registre_interruption;
 1794:                                     return;
 1795:                                 }
 1796:                             }
 1797:                         }
 1798:                         else if (drapeau_reel == d_vrai)
 1799:                         {
 1800:                             if (((*((struct_matrice *) element)).tableau =
 1801:                                     (void **) ((real8 **)
 1802:                                     malloc(nombre_lignes * sizeof(real8 *))))
 1803:                                     == NULL)
 1804:                             {
 1805:                                 (*s_etat_processus).erreur_systeme =
 1806:                                         d_es_allocation_memoire;
 1807:                                 (*s_etat_processus).traitement_interruptible =
 1808:                                         registre_interruption;
 1809:                                 return;
 1810:                             }
 1811: 
 1812:                             (*((struct_matrice *) element)).type = 'R';
 1813: 
 1814:                             for(i = 0; i < nombre_lignes; i++)
 1815:                             {
 1816:                                 if ((((*((struct_matrice *)element)).tableau)[i]
 1817:                                         = (void *) ((real8 *)
 1818:                                         malloc(nombre_colonnes *
 1819:                                         sizeof(real8)))) == NULL)
 1820:                                 {
 1821:                                     (*s_etat_processus).erreur_systeme =
 1822:                                             d_es_allocation_memoire;
 1823:                                     (*s_etat_processus)
 1824:                                             .traitement_interruptible =
 1825:                                             registre_interruption;
 1826:                                     return;
 1827:                                 }
 1828:                             }
 1829:                         }
 1830:                         else
 1831:                         {
 1832:                             if (((*((struct_matrice *) element)).tableau =
 1833:                                     (void **) ((integer8 **)
 1834:                                     malloc(nombre_lignes *
 1835:                                     sizeof(integer8 *)))) == NULL)
 1836:                             {
 1837:                                 (*s_etat_processus).erreur_systeme =
 1838:                                         d_es_allocation_memoire;
 1839:                                 (*s_etat_processus).traitement_interruptible =
 1840:                                         registre_interruption;
 1841:                                 return;
 1842:                             }
 1843: 
 1844:                             (*((struct_matrice *) element)).type = 'I';
 1845: 
 1846:                             for(i = 0; i < nombre_lignes; i++)
 1847:                             {
 1848:                                 if ((((*((struct_matrice *)
 1849:                                         element)).tableau)[i] = (void *)
 1850:                                         ((integer8 *)
 1851:                                         malloc(nombre_colonnes *
 1852:                                         sizeof(integer8)))) == NULL)
 1853:                                 {
 1854:                                     (*s_etat_processus).erreur_systeme =
 1855:                                             d_es_allocation_memoire;
 1856:                                     (*s_etat_processus)
 1857:                                             .traitement_interruptible =
 1858:                                             registre_interruption;
 1859:                                     return;
 1860:                                 }
 1861:                             }
 1862:                         }
 1863: 
 1864:                         for(i = 0; i < nombre_lignes; i++)
 1865:                         {
 1866:                             if (depilement(s_etat_processus,
 1867:                                     &((*s_etat_processus)
 1868:                                     .l_base_pile), &s_objet) ==
 1869:                                     d_absence_erreur)
 1870:                             {
 1871:                                 if (drapeau_complexe == d_vrai)
 1872:                                 {
 1873:                                     if ((*s_objet).type == VCX)
 1874:                                     {
 1875:                                         for(j = 0; j < nombre_colonnes; j++)
 1876:                                         {
 1877:                                             ((struct_complexe16 **) ((*(
 1878:                                                     (struct_matrice *) element))
 1879:                                                     .tableau))[nombre_lignes - i
 1880:                                                     - 1][j] =
 1881:                                                     ((struct_complexe16 *)
 1882:                                                     (*((struct_vecteur *)
 1883:                                                     (*s_objet).objet))
 1884:                                                     .tableau)[j];
 1885:                                         }
 1886:                                     }
 1887:                                     else if ((*s_objet).type == VRL)
 1888:                                     {
 1889:                                         for(j = 0; j < nombre_colonnes; j++)
 1890:                                         {
 1891:                                             (((struct_complexe16 **) ((*(
 1892:                                                     (struct_matrice *) element))
 1893:                                                     .tableau))[nombre_lignes - i
 1894:                                                     - 1][j]).partie_reelle =
 1895:                                                     ((real8 *) (*(
 1896:                                                     (struct_vecteur *)
 1897:                                                     (*s_objet).objet))
 1898:                                                     .tableau)[j];
 1899:                                             (((struct_complexe16 **) ((*(
 1900:                                                     (struct_matrice *) element))
 1901:                                                     .tableau))[nombre_lignes - i
 1902:                                                     - 1][j]).partie_imaginaire =
 1903:                                                     (real8) 0;
 1904:                                         }
 1905:                                     }
 1906:                                     else if ((*s_objet).type == VIN)
 1907:                                     {
 1908:                                         for(j = 0; j < nombre_colonnes; j++)
 1909:                                         {
 1910:                                             (((struct_complexe16 **) ((*(
 1911:                                                     (struct_matrice *) element))
 1912:                                                     .tableau))[nombre_lignes - i
 1913:                                                     - 1][j]).partie_reelle =
 1914:                                                     (real8) ((integer8 *)
 1915:                                                     (*((struct_vecteur *)
 1916:                                                     (*s_objet).objet)).tableau)
 1917:                                                     [j];
 1918:                                             (((struct_complexe16 **) ((*(
 1919:                                                     (struct_matrice *) element))
 1920:                                                     .tableau))[nombre_lignes - i
 1921:                                                     - 1][j]).partie_imaginaire =
 1922:                                                     (real8) 0;
 1923:                                         }
 1924:                                     }
 1925:                                     else
 1926:                                     {
 1927:                                         erreur = d_erreur;
 1928:                                     }
 1929:                                 }
 1930:                                 else if (drapeau_reel == d_vrai)
 1931:                                 {
 1932:                                     if ((*s_objet).type == VRL)
 1933:                                     {
 1934:                                         for(j = 0; j < nombre_colonnes; j++)
 1935:                                         {
 1936:                                             ((real8 **) ((*((struct_matrice *)
 1937:                                                     element)).tableau))
 1938:                                                     [nombre_lignes - i - 1][j] =
 1939:                                                     ((real8 *) (*(
 1940:                                                     (struct_vecteur *)
 1941:                                                     (*s_objet).objet)).tableau)
 1942:                                                     [j];
 1943:                                         }
 1944:                                     }
 1945:                                     else if ((*s_objet).type == VIN)
 1946:                                     {
 1947:                                         for(j = 0; j < nombre_colonnes; j++)
 1948:                                         {
 1949:                                             ((real8 **) ((*((struct_matrice *)
 1950:                                                     element)).tableau))
 1951:                                                     [nombre_lignes - i - 1][j] =
 1952:                                                     (real8) ((integer8 *)
 1953:                                                     (*((struct_vecteur *)
 1954:                                                     (*s_objet).objet)).tableau)
 1955:                                                     [j];
 1956:                                         }
 1957:                                     }
 1958:                                     else
 1959:                                     {
 1960:                                         erreur = d_erreur;
 1961:                                     }
 1962:                                 }
 1963:                                 else
 1964:                                 {
 1965:                                     if ((*s_objet).type == VIN)
 1966:                                     {
 1967:                                         for(j = 0; j < nombre_colonnes; j++)
 1968:                                         {
 1969:                                             ((integer8 **)
 1970:                                                     ((*((struct_matrice *)
 1971:                                                     element)).tableau))
 1972:                                                     [nombre_lignes - i - 1][j] =
 1973:                                                     ((integer8 *)
 1974:                                                     (*((struct_vecteur *)
 1975:                                                     (*s_objet)
 1976:                                                     .objet)).tableau)[j];
 1977:                                         } 
 1978:                                     }
 1979:                                     else
 1980:                                     {
 1981:                                         erreur = d_erreur;
 1982:                                     }
 1983:                                 }
 1984: 
 1985:                                 liberation(s_etat_processus, s_objet);
 1986: 
 1987:                                 if (erreur == d_erreur)
 1988:                                 {
 1989:                                     for(i++; i < nombre_lignes; i++)
 1990:                                     {
 1991:                                         if (depilement(s_etat_processus,
 1992:                                                 &((*s_etat_processus)
 1993:                                                 .l_base_pile), &s_objet)
 1994:                                                 == d_erreur)
 1995:                                         {
 1996:                                             (*s_etat_processus)
 1997:                                                     .traitement_interruptible =
 1998:                                                     registre_interruption;
 1999:                                             return;
 2000:                                         }
 2001: 
 2002:                                         liberation(s_etat_processus, s_objet);
 2003:                                     }
 2004: 
 2005:                                     (*s_etat_processus).erreur_execution =
 2006:                                             d_ex_syntaxe;
 2007: 
 2008:                                     for(j = 0; j < (*((struct_matrice *)
 2009:                                             element)).nombre_lignes; j++)
 2010:                                     {
 2011:                                         free((*((struct_matrice *) element))
 2012:                                                 .tableau[j]);
 2013:                                     }
 2014: 
 2015:                                     free((*((struct_matrice *) element))
 2016:                                             .tableau);
 2017:                                     free(element);
 2018: 
 2019:                                     (*s_etat_processus)
 2020:                                             .traitement_interruptible =
 2021:                                             registre_interruption;
 2022:                                     return;
 2023:                                 }
 2024:                             }
 2025:                             else
 2026:                             {
 2027:                                 (*s_etat_processus).erreur_systeme =
 2028:                                         d_es_pile_vide;
 2029:                                 (*s_etat_processus).traitement_interruptible =
 2030:                                         registre_interruption;
 2031:                                 return;
 2032:                             }
 2033:                         }
 2034: 
 2035:                         s_objet = (struct_objet *) malloc(sizeof(struct_objet));
 2036: 
 2037:                         if (s_objet == NULL)
 2038:                         {
 2039:                             (*s_etat_processus).erreur_systeme =
 2040:                                     d_es_allocation_memoire;
 2041:                             (*s_etat_processus).traitement_interruptible =
 2042:                                     registre_interruption;
 2043:                             return;
 2044:                         }
 2045: 
 2046:                         initialisation_objet(s_objet);
 2047: 
 2048:                         if (drapeau_complexe == d_vrai)
 2049:                         {
 2050:                             (*s_objet).type = MCX;
 2051:                         }
 2052:                         else if (drapeau_reel == d_vrai)
 2053:                         {
 2054:                             (*s_objet).type = MRL;
 2055:                         }
 2056:                         else
 2057:                         {
 2058:                             (*s_objet).type = MIN;
 2059:                         }
 2060:                     }
 2061:                     else
 2062:                     {
 2063:                         if ((*s_etat_processus).langue == 'F')
 2064:                         {
 2065:                             printf("+++Erreur : Matrice %s invalide [%d]\n",
 2066:                                     (*s_etat_processus).instruction_courante,
 2067:                                     (int) getpid());
 2068:                         }
 2069:                         else
 2070:                         {
 2071:                             printf("+++Error : Invalid %s matrix [%d]\n",
 2072:                                     (*s_etat_processus).instruction_courante,
 2073:                                     (int) getpid());
 2074:                         }
 2075: 
 2076:                         fflush(stdout);
 2077:                     }
 2078: 
 2079:                     break;
 2080:                 }
 2081:             }
 2082: 
 2083:             break;
 2084:         }
 2085: 
 2086: /*
 2087: --------------------------------------------------------------------------------
 2088:   Liste
 2089: --------------------------------------------------------------------------------
 2090: */
 2091: 
 2092:         case '{' :
 2093:         {
 2094:             sauvegarde_longueur_definitions_chainees =
 2095:                     (*s_etat_processus).longueur_definitions_chainees;
 2096: 
 2097:             tampon = (unsigned char *) malloc(
 2098:                     (((*s_etat_processus).longueur_definitions_chainees =
 2099:                     strlen((*s_etat_processus).instruction_courante) + 4) + 1)
 2100:                     * sizeof(unsigned char));
 2101: 
 2102:             if (tampon == NULL)
 2103:             {
 2104:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2105:                 (*s_etat_processus).traitement_interruptible =
 2106:                         registre_interruption;
 2107:                 return;
 2108:             }
 2109: 
 2110:             strcpy(tampon, "<< ");
 2111:             ptr_ecriture = tampon + 3;
 2112:             ptr_lecture = (*s_etat_processus).instruction_courante + 1;
 2113: 
 2114:             while((*ptr_lecture) != d_code_fin_chaine)
 2115:             {
 2116:                 *ptr_ecriture++ = *ptr_lecture++;
 2117:             }
 2118: 
 2119:             (*(--ptr_ecriture)) = d_code_fin_chaine;
 2120:             strcat(ptr_ecriture, " >>");
 2121: 
 2122:             position_courante = (*s_etat_processus).position_courante;
 2123:             (*s_etat_processus).position_courante = 0;
 2124: 
 2125:             profondeur_initiale = (*s_etat_processus)
 2126:                     .hauteur_pile_operationnelle;
 2127: 
 2128: /*
 2129: -- On met le tout dans la pile opérationnelle. ---------------------------------
 2130: */
 2131: 
 2132:             (*s_etat_processus).niveau_recursivite++;
 2133:             definitions_chainees_precedentes = (*s_etat_processus)
 2134:                     .definitions_chainees;
 2135:             (*s_etat_processus).definitions_chainees = tampon;
 2136: 
 2137:             s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
 2138:             sauvegarde_niveau_courant = (*s_etat_processus).niveau_courant;
 2139: 
 2140:             (*s_etat_processus).l_base_pile_systeme = NULL;
 2141:             empilement_pile_systeme(s_etat_processus);
 2142: 
 2143:             if ((*s_etat_processus).erreur_systeme != d_es)
 2144:             {
 2145:                 (*s_etat_processus).traitement_interruptible =
 2146:                         registre_interruption;
 2147:                 return;
 2148:             }
 2149: 
 2150:             (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
 2151:             (*(*s_etat_processus).l_base_pile_systeme)
 2152:                     .origine_routine_evaluation = 'N';
 2153:             (*s_etat_processus).niveau_courant = 0;
 2154:             (*s_etat_processus).autorisation_empilement_programme = 'N';
 2155: 
 2156:             tampon = (*s_etat_processus).instruction_courante;
 2157:             autorisation_evaluation_nom = (*s_etat_processus)
 2158:                     .autorisation_evaluation_nom;
 2159:             (*s_etat_processus).autorisation_evaluation_nom = 'N';
 2160: 
 2161:             registre_test = (*s_etat_processus).test_instruction;
 2162:             (*s_etat_processus).test_instruction = 'Y';
 2163:             registre_mode_execution_programme =
 2164:                     (*s_etat_processus).mode_execution_programme;
 2165:             (*s_etat_processus).mode_execution_programme = 'Y';
 2166:             (*s_etat_processus).erreur_scrutation = d_faux;
 2167: 
 2168:             nombre_lignes_a_supprimer =
 2169:                     (*s_etat_processus).hauteur_pile_operationnelle;
 2170: 
 2171:             /*
 2172:              * Vérification de la cohérence des arguments.
 2173:              * Il doit y avoir autant de '<<' que de '>>' dans
 2174:              * l'expression candidate.
 2175:              */
 2176: 
 2177:             coherence_liste = 0;
 2178:             drapeau_chaine = d_faux;
 2179: 
 2180:             while((*s_etat_processus).definitions_chainees
 2181:                     [(*s_etat_processus).position_courante] !=
 2182:                     d_code_fin_chaine)
 2183:             {
 2184:                 if ((*s_etat_processus).definitions_chainees
 2185:                         [(*s_etat_processus).position_courante] == '"')
 2186:                 {
 2187:                     if (drapeau_chaine == d_faux)
 2188:                     {
 2189:                         drapeau_chaine = d_vrai;
 2190:                     }
 2191:                     else
 2192:                     {
 2193:                         drapeau_chaine = d_faux;
 2194:                     }
 2195:                 }
 2196:                 else if (drapeau_chaine == d_faux)
 2197:                 {
 2198:                     if (((*s_etat_processus).definitions_chainees
 2199:                             [(*s_etat_processus).position_courante] == '<') &&
 2200:                             ((*s_etat_processus).definitions_chainees
 2201:                             [(*s_etat_processus).position_courante + 1] == '<'))
 2202:                     {
 2203:                         coherence_liste++;
 2204:                     }
 2205:                     else if (((*s_etat_processus).definitions_chainees
 2206:                             [(*s_etat_processus).position_courante] == '>') &&
 2207:                             ((*s_etat_processus).definitions_chainees
 2208:                             [(*s_etat_processus).position_courante + 1] == '>'))
 2209:                     {
 2210:                         coherence_liste--;
 2211:                     }
 2212: 
 2213:                 }
 2214: 
 2215:                 (*s_etat_processus).position_courante++;
 2216:             }
 2217: 
 2218:             (*s_etat_processus).position_courante = 0;
 2219: 
 2220:             if ((coherence_liste != 0) || (drapeau_chaine == d_vrai))
 2221:             {
 2222:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 2223: 
 2224:                 nombre_lignes_a_supprimer =
 2225:                         (*s_etat_processus).hauteur_pile_operationnelle
 2226:                         - nombre_lignes_a_supprimer;
 2227: 
 2228:                 for(i = 0; i < nombre_lignes_a_supprimer; i++)
 2229:                 {
 2230:                     if (depilement(s_etat_processus, &((*s_etat_processus)
 2231:                             .l_base_pile), &s_sous_objet) == d_erreur)
 2232:                     {
 2233:                         (*s_etat_processus).traitement_interruptible =
 2234:                                 registre_interruption;
 2235:                         (*s_etat_processus).mode_execution_programme =
 2236:                                 registre_mode_execution_programme;
 2237:                         return;
 2238:                     }
 2239: 
 2240:                     liberation(s_etat_processus, s_sous_objet);
 2241:                 }
 2242: 
 2243:                 (*s_etat_processus).test_instruction = registre_test;
 2244:                 (*s_etat_processus).longueur_definitions_chainees =
 2245:                         sauvegarde_longueur_definitions_chainees;
 2246: 
 2247:                 (*s_etat_processus).instruction_courante = tampon;
 2248:                 (*s_etat_processus).autorisation_evaluation_nom =
 2249:                         autorisation_evaluation_nom;
 2250: 
 2251:                 (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
 2252:                 (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
 2253: 
 2254:                 free((*s_etat_processus).definitions_chainees);
 2255:                 free(s_objet);
 2256: 
 2257:                 (*s_etat_processus).definitions_chainees =
 2258:                         definitions_chainees_precedentes;
 2259: 
 2260:                 (*s_etat_processus).niveau_recursivite--;
 2261: 
 2262:                 (*s_etat_processus).position_courante = position_courante;
 2263: 
 2264:                 (*s_etat_processus).traitement_interruptible =
 2265:                         registre_interruption;
 2266:                 (*s_etat_processus).mode_execution_programme =
 2267:                         registre_mode_execution_programme;
 2268:                 return;
 2269:             }
 2270: 
 2271:             /*
 2272:              * Scrutation de la séquence.
 2273:              */
 2274: 
 2275:             (*s_etat_processus).position_courante = 0;
 2276: 
 2277:             if ((*s_etat_processus).profilage == d_vrai)
 2278:             {
 2279:                 profilage(s_etat_processus, "RPL/2 internals");
 2280: 
 2281:                 if ((*s_etat_processus).erreur_systeme != d_es)
 2282:                 {
 2283:                     return;
 2284:                 }
 2285:             }
 2286: 
 2287:             if (sequenceur(s_etat_processus) == d_erreur)
 2288:             {
 2289:                 (*s_etat_processus).mode_execution_programme =
 2290:                         registre_mode_execution_programme;
 2291:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 2292: 
 2293:                 nombre_lignes_a_supprimer =
 2294:                         (*s_etat_processus).hauteur_pile_operationnelle
 2295:                         - nombre_lignes_a_supprimer;
 2296: 
 2297:                 for(i = 0; i < nombre_lignes_a_supprimer; i++)
 2298:                 {
 2299:                     if (depilement(s_etat_processus, &((*s_etat_processus)
 2300:                             .l_base_pile), &s_sous_objet) == d_erreur)
 2301:                     {
 2302:                         (*s_etat_processus).traitement_interruptible =
 2303:                                 registre_interruption;
 2304:                         return;
 2305:                     }
 2306: 
 2307:                     liberation(s_etat_processus, s_sous_objet);
 2308:                 }
 2309: 
 2310:                 (*s_etat_processus).test_instruction = registre_test;
 2311:                 (*s_etat_processus).longueur_definitions_chainees =
 2312:                         sauvegarde_longueur_definitions_chainees;
 2313: 
 2314:                 (*s_etat_processus).instruction_courante = tampon;
 2315:                 (*s_etat_processus).autorisation_evaluation_nom =
 2316:                         autorisation_evaluation_nom;
 2317: 
 2318:                 (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
 2319:                 (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
 2320: 
 2321:                 free((*s_etat_processus).definitions_chainees);
 2322:                 free(s_objet);
 2323: 
 2324:                 (*s_etat_processus).definitions_chainees =
 2325:                         definitions_chainees_precedentes;
 2326: 
 2327:                 (*s_etat_processus).niveau_recursivite--;
 2328: 
 2329:                 (*s_etat_processus).position_courante = position_courante;
 2330: 
 2331:                 (*s_etat_processus).traitement_interruptible =
 2332:                         registre_interruption;
 2333:                 return;
 2334:             }
 2335: 
 2336:             (*s_etat_processus).mode_execution_programme =
 2337:                     registre_mode_execution_programme;
 2338: 
 2339:             if ((*s_etat_processus).erreur_scrutation == d_vrai)
 2340:             {
 2341:                 nombre_lignes_a_supprimer =
 2342:                         (*s_etat_processus).hauteur_pile_operationnelle
 2343:                         - nombre_lignes_a_supprimer;
 2344: 
 2345:                 for(i = 0; i < nombre_lignes_a_supprimer; i++)
 2346:                 {
 2347:                     if (depilement(s_etat_processus, &((*s_etat_processus)
 2348:                             .l_base_pile), &s_sous_objet) == d_erreur)
 2349:                     {
 2350:                         (*s_etat_processus).traitement_interruptible =
 2351:                                 registre_interruption;
 2352:                         return;
 2353:                     }
 2354: 
 2355:                     liberation(s_etat_processus, s_sous_objet);
 2356:                 }
 2357: 
 2358:                 (*s_etat_processus).test_instruction = registre_test;
 2359:                 (*s_etat_processus).longueur_definitions_chainees =
 2360:                         sauvegarde_longueur_definitions_chainees;
 2361: 
 2362:                 (*s_etat_processus).instruction_courante = tampon;
 2363:                 (*s_etat_processus).autorisation_evaluation_nom =
 2364:                         autorisation_evaluation_nom;
 2365: 
 2366:                 (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
 2367:                 (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
 2368: 
 2369:                 free((*s_etat_processus).definitions_chainees);
 2370:                 free(s_objet);
 2371: 
 2372:                 (*s_etat_processus).definitions_chainees =
 2373:                         definitions_chainees_precedentes;
 2374: 
 2375:                 (*s_etat_processus).niveau_recursivite--;
 2376:                 (*s_etat_processus).position_courante = position_courante;
 2377: 
 2378:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 2379:                 (*s_etat_processus).traitement_interruptible =
 2380:                         registre_interruption;
 2381:                 return;
 2382:             }
 2383: 
 2384:             (*s_etat_processus).test_instruction = registre_test;
 2385:             (*s_etat_processus).longueur_definitions_chainees =
 2386:                     sauvegarde_longueur_definitions_chainees;
 2387: 
 2388:             (*s_etat_processus).instruction_courante = tampon;
 2389:             (*s_etat_processus).autorisation_evaluation_nom =
 2390:                     autorisation_evaluation_nom;
 2391: 
 2392:             (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
 2393:             (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
 2394: 
 2395:             free((*s_etat_processus).definitions_chainees);
 2396:             (*s_etat_processus).definitions_chainees =
 2397:                     definitions_chainees_precedentes;
 2398: 
 2399:             (*s_etat_processus).niveau_recursivite--;
 2400: 
 2401:             (*s_etat_processus).position_courante = position_courante;
 2402: 
 2403: /*
 2404: -- Relecture de la pile opérationnelle -----------------------------------------
 2405: */
 2406: 
 2407:             profondeur_finale = (*s_etat_processus).hauteur_pile_operationnelle;
 2408: 
 2409:             l_element_courant = NULL;
 2410: 
 2411:             free(s_objet);
 2412: 
 2413:             for(i = 0; i < (profondeur_finale - profondeur_initiale); i++)
 2414:             {
 2415:                 if (depilement(s_etat_processus,
 2416:                         &((*s_etat_processus).l_base_pile),
 2417:                         &s_objet) == d_erreur)
 2418:                 {
 2419:                     (*s_etat_processus).traitement_interruptible =
 2420:                             registre_interruption;
 2421:                     return;
 2422:                 }
 2423: 
 2424:                 if (empilement(s_etat_processus, &l_element_courant,
 2425:                         s_objet) == d_erreur)
 2426:                 {
 2427:                     (*s_etat_processus).traitement_interruptible =
 2428:                             registre_interruption;
 2429:                     return;
 2430:                 }
 2431:             }
 2432: 
 2433:             s_objet = (struct_objet *) malloc(sizeof(struct_objet));
 2434: 
 2435:             if (s_objet == NULL)
 2436:             {
 2437:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2438:                 (*s_etat_processus).traitement_interruptible =
 2439:                         registre_interruption;
 2440:                 return;
 2441:             }
 2442: 
 2443:             initialisation_objet(s_objet);
 2444:             (*s_objet).type = LST;
 2445:             element = (void *) l_element_courant;
 2446: 
 2447:             break;
 2448:         }
 2449: 
 2450: /*
 2451: --------------------------------------------------------------------------------
 2452:   Nom ou expression algébrique
 2453: --------------------------------------------------------------------------------
 2454: */
 2455: 
 2456:         case '\'' :
 2457:         {
 2458:             if ((tampon = analyse_algebrique(s_etat_processus,
 2459:                     (*s_etat_processus).instruction_courante,
 2460:                     &l_base_liste_fonctions)) == NULL)
 2461:             {
 2462:                 /*
 2463:                  * L'erreur est de type exécution ou système.
 2464:                  * Dans le doute, on libère *s_objet.
 2465:                  */
 2466: 
 2467:                 while(l_base_liste_fonctions != NULL)
 2468:                 {
 2469:                     l_element_courant_fonctions = l_base_liste_fonctions;
 2470:                     l_base_liste_fonctions = (*l_base_liste_fonctions).suivant;
 2471: 
 2472:                     free((*((struct_fonction *) (*l_element_courant_fonctions)
 2473:                             .donnee)).nom_fonction);
 2474:                     free((struct_fonction *) (*l_element_courant_fonctions)
 2475:                             .donnee);
 2476:                     free(l_element_courant_fonctions);
 2477:                 }
 2478: 
 2479:                 free(s_objet);
 2480: 
 2481:                 (*s_etat_processus).traitement_interruptible =
 2482:                         registre_interruption;
 2483:                 return;
 2484:             }
 2485: 
 2486:             l_base_liste_decomposition = analyse_rpn(s_etat_processus, tampon);
 2487:             l_element_courant = l_base_liste_decomposition;
 2488:             nombre_elements = 0;
 2489: 
 2490:             while(l_element_courant != NULL)
 2491:             {
 2492:                 nombre_elements++;
 2493:                 l_element_courant = (*l_element_courant).suivant;
 2494:             }
 2495: 
 2496:             if (nombre_elements == 3)
 2497:             {
 2498:                 free(tampon);
 2499: 
 2500:                 (*s_objet).type = (*(*(*l_base_liste_decomposition)
 2501:                         .suivant).donnee).type;
 2502:                 element = (void *) (*(*(*l_base_liste_decomposition)
 2503:                         .suivant).donnee).objet;
 2504: 
 2505:                 if ((*s_objet).type == NOM)
 2506:                 {
 2507:                     (*((struct_nom *) (*(*(*l_base_liste_decomposition)
 2508:                             .suivant).donnee).objet)).symbole = d_vrai;
 2509:                 }
 2510:                 else if ((*s_objet).type == FCT)
 2511:                 {
 2512:                     /*
 2513:                      * On essaye de mettre d'utiliser une fonction
 2514:                      * comme un nom... On convertit la fonction en nom
 2515:                      * puis on renvoie une erreur.
 2516:                      */
 2517: 
 2518:                     free(s_objet);
 2519: 
 2520:                     l_element_courant = l_base_liste_decomposition;
 2521: 
 2522:                     while(l_element_courant != NULL)
 2523:                     {
 2524:                         liberation(s_etat_processus,
 2525:                                 (*l_element_courant).donnee);
 2526:                         l_element_precedent = l_element_courant;
 2527:                         l_element_courant = (*l_element_courant).suivant;
 2528:                         free(l_element_precedent);
 2529:                     }
 2530: 
 2531:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 2532:                     (*s_etat_processus).traitement_interruptible =
 2533:                             registre_interruption;
 2534:                     return;
 2535:                 }
 2536: 
 2537:                 l_element_precedent = l_base_liste_decomposition;
 2538:                 l_element_courant = (*l_element_precedent).suivant;
 2539:                 liberation(s_etat_processus, (*l_element_precedent).donnee);
 2540:                 free(l_element_precedent);
 2541:                 l_element_precedent = l_element_courant;
 2542:                 l_element_courant = (*l_element_courant).suivant;
 2543:                 free((*l_element_precedent).donnee);
 2544:                 free(l_element_precedent);
 2545:                 liberation(s_etat_processus, (*l_element_courant).donnee);
 2546:                 free(l_element_courant);
 2547:             }
 2548:             else
 2549:             {
 2550:                 (*s_objet).type = ALG;
 2551: 
 2552:                 if ((*s_etat_processus).debug == d_vrai)
 2553:                     if (((*s_etat_processus).type_debug &
 2554:                             d_debug_variables) != 0)
 2555:                 {
 2556:                     if ((*s_etat_processus).langue == 'F')
 2557:                     {
 2558:                         printf("[%d] Conversion de l'expression en "
 2559:                                 "notation polonaise inversée\n%s\n",
 2560:                                 (int) getpid(), tampon);
 2561:                     }
 2562:                     else
 2563:                     {
 2564:                         printf("[%d] Translation of expression "
 2565:                                 "into reverse polish notation\n%s",
 2566:                                 (int) getpid(), tampon);
 2567:                     }
 2568: 
 2569:                     fflush(stdout);
 2570:                 }
 2571: 
 2572:                 element = (void *) l_base_liste_decomposition;
 2573:                 free(tampon);
 2574: 
 2575:                 if (element == NULL)
 2576:                 {
 2577:                     (*s_etat_processus).erreur_execution =
 2578:                             d_ex_expression_invalide;
 2579:                     (*s_etat_processus).traitement_interruptible =
 2580:                             registre_interruption;
 2581:                     return;
 2582:                 }
 2583: 
 2584:                 l_element_courant = (struct_liste_chainee *) element;
 2585: 
 2586:                 while(l_element_courant != NULL)
 2587:                 {
 2588:                     if ((*(*l_element_courant).donnee).type == FCT)
 2589:                     {
 2590:                         /*
 2591:                          * Si la fonction est intrinsèque au langage,
 2592:                          * elle est convertie en majuscules.
 2593:                          */
 2594: 
 2595:                         tampon = conversion_majuscule((*((struct_fonction *)
 2596:                                 (*(*l_element_courant).donnee).objet))
 2597:                                 .nom_fonction);
 2598: 
 2599:                         free((*((struct_fonction *)
 2600:                                 (*(*l_element_courant).donnee).objet))
 2601:                                 .nom_fonction);
 2602: 
 2603:                         (*((struct_fonction *) (*(*l_element_courant).donnee)
 2604:                                 .objet)).nom_fonction = tampon;
 2605: 
 2606:                         if (strcmp(tampon, "=") == 0)
 2607:                         {
 2608:                             nombre_egalites++;
 2609:                         }
 2610:                     }
 2611: 
 2612:                     l_element_courant = (*l_element_courant).suivant;
 2613:                 }
 2614: 
 2615:                 l_element_courant = (struct_liste_chainee *) element;
 2616: 
 2617:                 while(l_element_courant != NULL)
 2618:                 {
 2619:                     if (((*(*l_element_courant).donnee).type == FCT)
 2620:                             || ((*(*l_element_courant).donnee).type == NOM))
 2621:                     {
 2622:                         if ((*(*l_element_courant).donnee).type == FCT)
 2623:                         {
 2624:                             if (l_base_liste_fonctions != NULL)
 2625:                             {
 2626:                                 l_element_courant_fonctions =
 2627:                                         l_base_liste_fonctions;
 2628: 
 2629:                                 while(l_element_courant_fonctions != NULL)
 2630:                                 {
 2631:                                     if ((fonction_majuscule =
 2632:                                             conversion_majuscule(
 2633:                                             (*((struct_fonction *)
 2634:                                             ((*l_element_courant_fonctions)
 2635:                                             .donnee))).nom_fonction)) == NULL)
 2636:                                     {
 2637:                                         (*s_etat_processus).erreur_systeme =
 2638:                                                 d_es_allocation_memoire;
 2639:                                         (*s_etat_processus)
 2640:                                                 .traitement_interruptible =
 2641:                                                 registre_interruption;
 2642:                                         return;
 2643:                                     }
 2644: 
 2645:                                     if (strcmp(fonction_majuscule,
 2646:                                             (*((struct_fonction *)
 2647:                                             (*(*l_element_courant).donnee)
 2648:                                             .objet)).nom_fonction) == 0)
 2649:                                     {
 2650:                                         free(fonction_majuscule);
 2651:                                         break;
 2652:                                     }
 2653: 
 2654:                                     free(fonction_majuscule);
 2655:                                     l_element_courant_fonctions =
 2656:                                             (*l_element_courant_fonctions)
 2657:                                             .suivant;
 2658:                                 }
 2659: 
 2660:                                 if (l_element_courant_fonctions != NULL)
 2661:                                 {
 2662:                                     (*((struct_fonction *)
 2663:                                             (*(*l_element_courant)
 2664:                                             .donnee).objet)).nombre_arguments =
 2665:                                             (*((struct_fonction *)
 2666:                                             ((*l_element_courant_fonctions)
 2667:                                             .donnee))).nombre_arguments;
 2668:                                 }
 2669:                                 else
 2670:                                 {
 2671:                                     (*((struct_fonction *)
 2672:                                             (*(*l_element_courant).donnee)
 2673:                                             .objet)).nombre_arguments = 0;
 2674:                                 }
 2675:                             }
 2676:                             else
 2677:                             {
 2678:                                 (*((struct_fonction *)
 2679:                                         (*(*l_element_courant).donnee)
 2680:                                         .objet)).nombre_arguments = 0;
 2681:                             }
 2682:                         }
 2683:                         else
 2684:                         {
 2685:                             (*((struct_nom *) (*(*l_element_courant).donnee)
 2686:                                     .objet)).symbole = d_faux;
 2687: 
 2688:                             if (l_base_liste_fonctions != NULL)
 2689:                             {
 2690:                                 l_element_courant_fonctions =
 2691:                                         l_base_liste_fonctions;
 2692: 
 2693:                                 while((strcmp((*((struct_fonction *)
 2694:                                         ((*l_element_courant_fonctions)
 2695:                                         .donnee))).nom_fonction,
 2696:                                         (*((struct_nom *)
 2697:                                         (*(*l_element_courant).donnee).objet))
 2698:                                         .nom) != 0) &&
 2699:                                         ((*l_element_courant_fonctions)
 2700:                                         .suivant != NULL))
 2701:                                 {
 2702:                                     l_element_courant_fonctions =
 2703:                                             (*l_element_courant_fonctions)
 2704:                                             .suivant;
 2705:                                 }
 2706: 
 2707:                                 if (((*l_element_courant_fonctions).suivant !=
 2708:                                         NULL) || (strcmp((*((struct_nom *)
 2709:                                         (*(*l_element_courant).donnee).objet))
 2710:                                         .nom, (*((struct_fonction *)
 2711:                                         ((*l_element_courant_fonctions)
 2712:                                         .donnee))).nom_fonction) == 0))
 2713:                                 {
 2714:                                     tampon = (*((struct_nom *)
 2715:                                             (*(*l_element_courant)
 2716:                                             .donnee).objet)).nom;
 2717: 
 2718:                                     if ((s_sous_objet = (struct_objet *)
 2719:                                             malloc(sizeof(
 2720:                                             struct_objet))) == NULL)
 2721:                                     {
 2722:                                         (*s_etat_processus).erreur_systeme =
 2723:                                                 d_es_allocation_memoire;
 2724:                                         (*s_etat_processus)
 2725:                                                 .traitement_interruptible =
 2726:                                                 registre_interruption;
 2727:                                         return;
 2728:                                     }
 2729: 
 2730:                                     initialisation_objet(s_sous_objet);
 2731:                                     (*s_sous_objet).type = FCT;
 2732:                             
 2733:                                     if (((*s_sous_objet).objet = (void *)
 2734:                                             allocation(s_etat_processus, FCT))
 2735:                                             == NULL)
 2736:                                     {
 2737:                                         (*s_etat_processus).erreur_systeme =
 2738:                                                 d_es_allocation_memoire;
 2739:                                         (*s_etat_processus)
 2740:                                                 .traitement_interruptible =
 2741:                                                 registre_interruption;
 2742:                                         return;
 2743:                                     }
 2744: 
 2745:                                     (*((struct_fonction *) ((*s_sous_objet)
 2746:                                             .objet))).nom_fonction = tampon;
 2747: 
 2748:                                     (*((struct_fonction *) ((*s_sous_objet)
 2749:                                             .objet))).fonction =
 2750:                                             analyse_instruction(
 2751:                                             s_etat_processus, tampon);
 2752: 
 2753:                                     (*((struct_fonction *) ((*s_sous_objet)
 2754:                                             .objet))).nombre_arguments =
 2755:                                             (*((struct_fonction *)
 2756:                                             ((*l_element_courant_fonctions)
 2757:                                             .donnee))).nombre_arguments;
 2758: 
 2759:                                     free((struct_nom *) (*(*l_element_courant)
 2760:                                             .donnee).objet);
 2761:                                     free((*l_element_courant).donnee);
 2762: 
 2763:                                     (*l_element_courant).donnee = s_sous_objet;
 2764:                                 }
 2765:                             }
 2766:                         }       
 2767:                     }
 2768: 
 2769:                     l_element_courant = (*l_element_courant).suivant;
 2770:                 }
 2771:             }
 2772: 
 2773:             while(l_base_liste_fonctions != NULL)
 2774:             {
 2775:                 l_element_courant_fonctions = l_base_liste_fonctions;
 2776:                 l_base_liste_fonctions = (*l_base_liste_fonctions).suivant;
 2777: 
 2778:                 free((*((struct_fonction *) (*l_element_courant_fonctions)
 2779:                         .donnee)).nom_fonction);
 2780:                 free((struct_fonction *) (*l_element_courant_fonctions).donnee);
 2781:                 free(l_element_courant_fonctions);
 2782:             }
 2783: 
 2784:             break;
 2785:         }
 2786: 
 2787: /*
 2788: --------------------------------------------------------------------------------
 2789:   Chaîne de caractères
 2790: --------------------------------------------------------------------------------
 2791: */
 2792: 
 2793:         case '"' :
 2794:         {
 2795:             (*s_objet).type = CHN;
 2796: 
 2797:             element = (void *) ((unsigned char *) malloc(
 2798:                     (strlen((*s_etat_processus).instruction_courante) - 1)
 2799:                     * sizeof(unsigned char)));
 2800: 
 2801:             if (element == NULL)
 2802:             {
 2803:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2804:                 (*s_etat_processus).traitement_interruptible =
 2805:                         registre_interruption;
 2806:                 return;
 2807:             }
 2808: 
 2809:             ptr_lecture = (*s_etat_processus).instruction_courante + 1;
 2810:             ptr_ecriture = (unsigned char *) element;
 2811: 
 2812:             while((*ptr_lecture) != d_code_fin_chaine)
 2813:             {
 2814:                 if ((*ptr_lecture) == '\\')
 2815:                 {
 2816:                     if ((*(ptr_lecture + 1)) == '"')
 2817:                     {
 2818:                         if ((*(ptr_lecture + 2)) != d_code_fin_chaine)
 2819:                         {
 2820:                             ptr_lecture++;
 2821:                         }
 2822:                     }
 2823:                     else if ((*(ptr_lecture + 1)) == 'b')
 2824:                     {
 2825:                         if ((*(ptr_lecture + 2)) != d_code_fin_chaine)
 2826:                         {
 2827:                             ptr_lecture++;
 2828:                             (*ptr_lecture) = '\b';
 2829:                         }
 2830:                     }
 2831:                     else if ((*(ptr_lecture + 1)) == 'n')
 2832:                     {
 2833:                         if ((*(ptr_lecture + 2)) != d_code_fin_chaine)
 2834:                         {
 2835:                             ptr_lecture++;
 2836:                             (*ptr_lecture) = '\n';
 2837:                         }
 2838:                     }
 2839:                     else if ((*(ptr_lecture + 1)) == 't')
 2840:                     {
 2841:                         if ((*(ptr_lecture + 2)) != d_code_fin_chaine)
 2842:                         {
 2843:                             ptr_lecture++;
 2844:                             (*ptr_lecture) = '\t';
 2845:                         }
 2846:                     }
 2847:                     else if ((*(ptr_lecture + 1)) == '\\')
 2848:                     {
 2849:                         if ((*(ptr_lecture + 2)) != d_code_fin_chaine)
 2850:                         {
 2851:                             ptr_lecture++;
 2852:                         }
 2853:                     }
 2854:                 }
 2855: 
 2856:                 *ptr_ecriture++ = *ptr_lecture++;
 2857:             }
 2858: 
 2859:             (*(--ptr_ecriture)) = d_code_fin_chaine;
 2860: 
 2861:             if ((element = realloc(element, (strlen((unsigned char *)
 2862:                     element) + 1) * sizeof(unsigned char))) == NULL)
 2863:             {
 2864:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2865:                 (*s_etat_processus).traitement_interruptible =
 2866:                         registre_interruption;
 2867:                 return;
 2868:             }
 2869: 
 2870:             break;
 2871:         }
 2872: 
 2873: /*
 2874: --------------------------------------------------------------------------------
 2875:   Définition ou tableau
 2876: --------------------------------------------------------------------------------
 2877: */
 2878: 
 2879:         case '<' :
 2880:         {
 2881:             if ((*s_etat_processus).instruction_courante[1] == '[')
 2882:             {
 2883:                 // Tableau
 2884: 
 2885:                 sauvegarde_longueur_definitions_chainees =
 2886:                         (*s_etat_processus).longueur_definitions_chainees;
 2887: 
 2888:                 tampon = (unsigned char *) malloc(
 2889:                         (((*s_etat_processus).longueur_definitions_chainees
 2890:                         = strlen((*s_etat_processus).instruction_courante)
 2891:                         + 2) + 1) * sizeof(unsigned char));
 2892: 
 2893:                 if (tampon == NULL)
 2894:                 {
 2895:                     (*s_etat_processus).erreur_systeme =
 2896:                             d_es_allocation_memoire;
 2897:                     (*s_etat_processus).traitement_interruptible =
 2898:                             registre_interruption;
 2899:                     return;
 2900:                 }
 2901: 
 2902:                 strcpy(tampon, "<< ");
 2903:                 ptr_ecriture = tampon + 3;
 2904:                 ptr_lecture = (*s_etat_processus).instruction_courante + 2;
 2905: 
 2906:                 while((*ptr_lecture) != d_code_fin_chaine)
 2907:                 {
 2908:                     *ptr_ecriture++ = *ptr_lecture++;
 2909:                 }
 2910: 
 2911:                 ptr_ecriture -= 2;
 2912:                 (*ptr_ecriture) = d_code_fin_chaine;
 2913:                 strcat(ptr_ecriture, " >>");
 2914: 
 2915:                 position_courante = (*s_etat_processus).position_courante;
 2916:                 (*s_etat_processus).position_courante = 0;
 2917: 
 2918:                 profondeur_initiale = (*s_etat_processus)
 2919:                         .hauteur_pile_operationnelle;
 2920: 
 2921: /*
 2922: -- On met les éléments du tableau dans la pile opérationnelle ------------------
 2923: */
 2924: 
 2925:                 (*s_etat_processus).niveau_recursivite++;
 2926:                 definitions_chainees_precedentes = (*s_etat_processus)
 2927:                         .definitions_chainees;
 2928:                 (*s_etat_processus).definitions_chainees = tampon;
 2929: 
 2930:                 s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
 2931:                 sauvegarde_niveau_courant = (*s_etat_processus).niveau_courant;
 2932: 
 2933:                 (*s_etat_processus).l_base_pile_systeme = NULL;
 2934:                 empilement_pile_systeme(s_etat_processus);
 2935: 
 2936:                 if ((*s_etat_processus).erreur_systeme != d_es)
 2937:                 {
 2938:                     (*s_etat_processus).traitement_interruptible =
 2939:                             registre_interruption;
 2940:                     return;
 2941:                 }
 2942: 
 2943:                 (*(*s_etat_processus).l_base_pile_systeme)
 2944:                         .retour_definition = 'Y';
 2945:                 (*s_etat_processus).niveau_courant = 0;
 2946:                 (*s_etat_processus).autorisation_empilement_programme = 'N';
 2947:                 registre_mode_execution_programme =
 2948:                         (*s_etat_processus).mode_execution_programme;
 2949:                 (*s_etat_processus).mode_execution_programme = 'Y';
 2950:                 (*s_etat_processus).erreur_scrutation = d_faux;
 2951: 
 2952:                 tampon = (*s_etat_processus).instruction_courante;
 2953:                 nombre_lignes_a_supprimer =
 2954:                         (*s_etat_processus).hauteur_pile_operationnelle;
 2955: 
 2956:                 if ((*s_etat_processus).profilage == d_vrai)
 2957:                 {
 2958:                     profilage(s_etat_processus, "RPL/2 internals");
 2959: 
 2960:                     if ((*s_etat_processus).erreur_systeme != d_es)
 2961:                     {
 2962:                         return;
 2963:                     }
 2964:                 }
 2965: 
 2966:                 if (sequenceur(s_etat_processus) == d_erreur)
 2967:                 {
 2968:                     (*s_etat_processus).mode_execution_programme =
 2969:                             registre_mode_execution_programme;
 2970:                     nombre_lignes_a_supprimer =
 2971:                             (*s_etat_processus).hauteur_pile_operationnelle
 2972:                             - nombre_lignes_a_supprimer;
 2973: 
 2974:                     for(i = 0; i < nombre_lignes_a_supprimer; i++)
 2975:                     {
 2976:                         if (depilement(s_etat_processus,
 2977:                                 &((*s_etat_processus).l_base_pile),
 2978:                                 &s_sous_objet) == d_erreur)
 2979:                         {
 2980:                             (*s_etat_processus).traitement_interruptible =
 2981:                                     registre_interruption;
 2982:                             return;
 2983:                         }
 2984: 
 2985:                         liberation(s_etat_processus, s_sous_objet);
 2986:                     }
 2987: 
 2988:                     (*s_etat_processus).instruction_courante = tampon;
 2989: 
 2990:                     (*s_etat_processus).l_base_pile_systeme =
 2991:                             s_sauvegarde_pile;
 2992:                     (*s_etat_processus).niveau_courant =
 2993:                             sauvegarde_niveau_courant;
 2994: 
 2995:                     free((*s_etat_processus).definitions_chainees);
 2996:                     (*s_etat_processus).niveau_recursivite--;
 2997: 
 2998:                     (*s_etat_processus).definitions_chainees =
 2999:                             definitions_chainees_precedentes;
 3000:                     (*s_etat_processus).longueur_definitions_chainees =
 3001:                             sauvegarde_longueur_definitions_chainees;
 3002: 
 3003:                     (*s_etat_processus).position_courante =
 3004:                             position_courante;
 3005: 
 3006:                     free(s_objet);
 3007: 
 3008:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 3009:                     (*s_etat_processus).traitement_interruptible =
 3010:                             registre_interruption;
 3011:                     return;
 3012:                 }
 3013: 
 3014:                 (*s_etat_processus).mode_execution_programme =
 3015:                         registre_mode_execution_programme;
 3016: 
 3017:                 if ((*s_etat_processus).erreur_scrutation == d_vrai)
 3018:                 {
 3019:                     nombre_lignes_a_supprimer =
 3020:                             (*s_etat_processus).hauteur_pile_operationnelle
 3021:                             - nombre_lignes_a_supprimer;
 3022: 
 3023:                     for(i = 0; i < nombre_lignes_a_supprimer; i++)
 3024:                     {
 3025:                         if (depilement(s_etat_processus,
 3026:                                 &((*s_etat_processus).l_base_pile),
 3027:                                 &s_sous_objet) == d_erreur)
 3028:                         {
 3029:                             (*s_etat_processus).traitement_interruptible =
 3030:                                     registre_interruption;
 3031:                             return;
 3032:                         }
 3033: 
 3034:                         liberation(s_etat_processus, s_sous_objet);
 3035:                     }
 3036: 
 3037:                     (*s_etat_processus).instruction_courante = tampon;
 3038: 
 3039:                     (*s_etat_processus).l_base_pile_systeme =
 3040:                             s_sauvegarde_pile;
 3041:                     (*s_etat_processus).niveau_courant =
 3042:                             sauvegarde_niveau_courant;
 3043: 
 3044:                     free((*s_etat_processus).definitions_chainees);
 3045:                     (*s_etat_processus).niveau_recursivite--;
 3046: 
 3047:                     (*s_etat_processus).definitions_chainees =
 3048:                             definitions_chainees_precedentes;
 3049:                     (*s_etat_processus).longueur_definitions_chainees =
 3050:                             sauvegarde_longueur_definitions_chainees;
 3051: 
 3052:                     (*s_etat_processus).position_courante =
 3053:                             position_courante;
 3054: 
 3055:                     free(s_objet);
 3056: 
 3057:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 3058:                     (*s_etat_processus).traitement_interruptible =
 3059:                             registre_interruption;
 3060:                     return;
 3061:                 }
 3062: 
 3063:                 (*s_etat_processus).instruction_courante = tampon;
 3064: 
 3065:                 (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
 3066:                 (*s_etat_processus).niveau_courant =
 3067:                         sauvegarde_niveau_courant;
 3068: 
 3069:                 free((*s_etat_processus).definitions_chainees);
 3070:                 (*s_etat_processus).definitions_chainees =
 3071:                         definitions_chainees_precedentes;
 3072:                 (*s_etat_processus).longueur_definitions_chainees =
 3073:                         sauvegarde_longueur_definitions_chainees;
 3074: 
 3075:                 (*s_etat_processus).niveau_recursivite--;
 3076: 
 3077:                 (*s_etat_processus).position_courante = position_courante;
 3078: 
 3079: /*
 3080: -- On relit la pile qui contient des sous-objets contenant les -----------------
 3081: -- éléments du tableau ---------------------------------------------------------
 3082: */
 3083: 
 3084:                 profondeur_finale = (*s_etat_processus)
 3085:                         .hauteur_pile_operationnelle;
 3086: 
 3087:                 nombre_lignes = profondeur_finale - profondeur_initiale;
 3088: 
 3089:                 element = (void *) ((struct_tableau *) malloc(
 3090:                         sizeof(struct_tableau)));
 3091: 
 3092:                 if (element == NULL)
 3093:                 {
 3094:                     (*s_etat_processus).erreur_systeme =
 3095:                             d_es_allocation_memoire;
 3096:                     (*s_etat_processus).traitement_interruptible =
 3097:                             registre_interruption;
 3098:                     return;
 3099:                 }
 3100: 
 3101:                 (*((struct_tableau *) element)).nombre_elements = nombre_lignes;
 3102: 
 3103:                 if (((*((struct_tableau *) element)).elements =
 3104:                         malloc(nombre_lignes * sizeof(struct_objet *))) == NULL)
 3105:                 {
 3106:                     (*s_etat_processus).erreur_systeme =
 3107:                             d_es_allocation_memoire;
 3108:                     (*s_etat_processus).traitement_interruptible =
 3109:                             registre_interruption;
 3110:                     return;
 3111:                 }
 3112: 
 3113:                 for(i = 1; i <= nombre_lignes; i++)
 3114:                 {
 3115:                     if (depilement(s_etat_processus,
 3116:                             &((*s_etat_processus).l_base_pile),
 3117:                             &s_sous_objet) == d_erreur)
 3118:                     {
 3119:                         (*s_etat_processus).traitement_interruptible =
 3120:                                 registre_interruption;
 3121:                         return;
 3122:                     }
 3123: 
 3124:                     (*((struct_tableau *) element)).elements[nombre_lignes - i]
 3125:                             = s_sous_objet;
 3126:                 }
 3127: 
 3128:                 (*s_objet).type = TBL;
 3129: 
 3130:                 (*s_etat_processus).traitement_interruptible =
 3131:                         registre_interruption;
 3132:             }
 3133:             else
 3134:             {
 3135:                 // Définition
 3136: 
 3137:                 if (strlen((*s_etat_processus).instruction_courante) < 5)
 3138:                 {
 3139:                     free(s_objet);
 3140: 
 3141:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 3142:                     (*s_etat_processus).traitement_interruptible =
 3143:                             registre_interruption;
 3144:                     return;
 3145:                 }
 3146: 
 3147:                 if ((strncmp((*s_etat_processus).instruction_courante, "<< ", 3)
 3148:                         != 0) && (strcmp((*s_etat_processus)
 3149:                         .instruction_courante, "<<") != 0))
 3150:                 {
 3151:                     free(s_objet);
 3152: 
 3153:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 3154:                     (*s_etat_processus).traitement_interruptible =
 3155:                             registre_interruption;
 3156:                     return;
 3157:                 }
 3158: 
 3159:                 (*s_objet).type = RPN;
 3160: 
 3161:                 element = (void *) analyse_rpn(s_etat_processus,
 3162:                         (*s_etat_processus).instruction_courante);
 3163: 
 3164:                 if (element == NULL)
 3165:                 {
 3166:                     if ((*s_etat_processus).erreur_systeme != d_es)
 3167:                     {
 3168:                         (*s_etat_processus).erreur_systeme =
 3169:                                 d_es_allocation_memoire;
 3170:                     }
 3171: 
 3172:                     (*s_etat_processus).traitement_interruptible =
 3173:                             registre_interruption;
 3174:                     return;
 3175:                 }
 3176: 
 3177:                 l_element_courant = (struct_liste_chainee *) element;
 3178: 
 3179:                 while(l_element_courant != NULL)
 3180:                 {
 3181:                     if ((*(*l_element_courant).donnee).type == FCT)
 3182:                     {
 3183:                         if (strcmp((*((struct_fonction *) (*(*l_element_courant)
 3184:                                 .donnee).objet)).nom_fonction, "=") == 0)
 3185:                         {
 3186:                             nombre_egalites++;
 3187:                         }
 3188:                     }
 3189: 
 3190:                     l_element_courant = (*l_element_courant).suivant;
 3191:                 }
 3192:             }
 3193: 
 3194:             break;
 3195:         }
 3196: 
 3197: /*
 3198: --------------------------------------------------------------------------------
 3199:   Adresse
 3200: --------------------------------------------------------------------------------
 3201: */
 3202: 
 3203:         case '@' :
 3204:         {
 3205:             if ((*s_etat_processus).recherche_types_speciaux == 'Y')
 3206:             {
 3207:                 if (strlen((*s_etat_processus).instruction_courante) > 2)
 3208:                 {
 3209:                     tampon = (*s_etat_processus).instruction_courante;
 3210: 
 3211:                     if (((*s_etat_processus).instruction_courante =
 3212:                             malloc((strlen(tampon) + 2) *
 3213:                             sizeof(unsigned char))) == NULL)
 3214:                     {
 3215:                         (*s_etat_processus).erreur_systeme =
 3216:                                 d_es_allocation_memoire;
 3217:                         (*s_etat_processus).traitement_interruptible =
 3218:                                 registre_interruption;
 3219:                         return;
 3220:                     }
 3221: 
 3222:                     strcpy((*s_etat_processus).instruction_courante, tampon);
 3223:                     (*s_etat_processus).instruction_courante[0] = '#';
 3224:                     (*s_etat_processus).instruction_courante
 3225:                             [strlen((*s_etat_processus).instruction_courante)
 3226:                             + 1] = d_code_fin_chaine;
 3227:                     (*s_etat_processus).instruction_courante
 3228:                             [strlen((*s_etat_processus).instruction_courante)]
 3229:                             = 'h';
 3230: 
 3231:                     recherche_type(s_etat_processus);
 3232: 
 3233:                     free((*s_etat_processus).instruction_courante);
 3234:                     (*s_etat_processus).instruction_courante = tampon;
 3235: 
 3236:                     if (((*s_etat_processus).erreur_systeme == d_es) &&
 3237:                             ((*s_etat_processus).erreur_execution == d_ex))
 3238:                     {
 3239:                         if (depilement(s_etat_processus,
 3240:                                 &((*s_etat_processus).l_base_pile),
 3241:                                 &s_sous_objet) == d_absence_erreur)
 3242:                         {
 3243:                             if ((*s_sous_objet).type == BIN)
 3244:                             {
 3245:                                 (*s_objet).type = ADR;
 3246: 
 3247:                                 if ((element =
 3248:                                         malloc(sizeof(unsigned long))) == NULL)
 3249:                                 {
 3250:                                     (*s_etat_processus).erreur_systeme =
 3251:                                             d_es_allocation_memoire;
 3252:                                     (*s_etat_processus)
 3253:                                             .traitement_interruptible =
 3254:                                             registre_interruption;
 3255:                                     return;
 3256:                                 }
 3257: 
 3258:                                 (*((unsigned long *) element)) = (*((logical8 *)
 3259:                                         (*s_sous_objet).objet));
 3260:                             }
 3261:                             else
 3262:                             {
 3263:                                 (*s_etat_processus).erreur_execution =
 3264:                                         d_ex_syntaxe;
 3265:                             }
 3266: 
 3267:                             liberation(s_etat_processus, s_sous_objet);
 3268:                         }
 3269:                         else
 3270:                         {
 3271:                             (*s_etat_processus).traitement_interruptible =
 3272:                                     registre_interruption;
 3273:                             return;
 3274:                         }
 3275:                     }
 3276:                 }
 3277:                 else
 3278:                 {
 3279:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 3280:                 }
 3281: 
 3282:                 break;
 3283:             }
 3284:         }
 3285: 
 3286: /*
 3287: --------------------------------------------------------------------------------
 3288:   Entier ou réel
 3289: --------------------------------------------------------------------------------
 3290: */
 3291: 
 3292:         default :
 3293:         {
 3294:             if (((*((*s_etat_processus).instruction_courante)) == '-') ||
 3295:                     ((*((*s_etat_processus).instruction_courante)) == '+') ||
 3296:                     (((*((*s_etat_processus).instruction_courante)) >= '0') &&
 3297:                     ((*((*s_etat_processus).instruction_courante))
 3298:                     <= '9')) || ((*((*s_etat_processus).instruction_courante))
 3299:                     == '.'))
 3300:             {
 3301:                 drapeau_valeur_entiere = ((*((*s_etat_processus)
 3302:                         .instruction_courante)) != '.') ? d_vrai : d_faux;
 3303:                 drapeau_valeur_reelle = d_vrai;
 3304: 
 3305:                 nombre_points = 0;
 3306:                 nombre_exposants = 0;
 3307: 
 3308:                 conversion_format(s_etat_processus,
 3309:                         (*s_etat_processus).instruction_courante);
 3310: 
 3311:                 ptr = (*s_etat_processus).instruction_courante;
 3312: 
 3313:                 while((*ptr) != d_code_fin_chaine)
 3314:                 {
 3315:                     switch(*ptr)
 3316:                     {
 3317:                         case '0' :
 3318:                         case '1' :
 3319:                         case '2' :
 3320:                         case '3' :
 3321:                         case '4' :
 3322:                         case '5' :
 3323:                         case '6' :
 3324:                         case '7' :
 3325:                         case '8' :
 3326:                         case '9' :
 3327:                         {
 3328:                             break;
 3329:                         }
 3330: 
 3331:                         // Ne peut survenir qu'après un 'E', un 'e' ou au
 3332:                         // début de la chaîne.
 3333:                         case '+' :
 3334:                         case '-' :
 3335:                         {
 3336:                             if (ptr > (*s_etat_processus).instruction_courante)
 3337:                             {
 3338:                                 if (((*(ptr - 1)) != 'e') &&
 3339:                                         ((*(ptr - 1)) != 'E'))
 3340:                                 {
 3341:                                     drapeau_valeur_entiere = d_faux;
 3342:                                     drapeau_valeur_reelle = d_faux;
 3343:                                 }
 3344:                             }
 3345: 
 3346:                             break;
 3347:                         }
 3348: 
 3349:                         // Ne peut que commencer une chaîne, suivre un
 3350:                         // chiffre ou un signe. Ne peut constituer un
 3351:                         // nombre seul.
 3352:                         case '.' :
 3353:                         {
 3354:                             nombre_points++;
 3355: 
 3356:                             if (ptr > (*s_etat_processus).instruction_courante)
 3357:                             {
 3358:                                 switch(*(ptr - 1))
 3359:                                 {
 3360:                                     case '+' :
 3361:                                     case '-' :
 3362:                                     case '0' :
 3363:                                     case '1' :
 3364:                                     case '2' :
 3365:                                     case '3' :
 3366:                                     case '4' :
 3367:                                     case '5' :
 3368:                                     case '6' :
 3369:                                     case '7' :
 3370:                                     case '8' :
 3371:                                     case '9' :
 3372:                                     {
 3373:                                         drapeau_valeur_entiere = d_faux;
 3374:                                         break;
 3375:                                     }
 3376: 
 3377:                                     default :
 3378:                                     {
 3379:                                         drapeau_valeur_entiere = d_faux;
 3380:                                         drapeau_valeur_reelle = d_faux;
 3381:                                         break;
 3382:                                     }
 3383:                                 }
 3384:                             }
 3385:                             else
 3386:                             {
 3387:                                 if ((*(ptr + 1)) == d_code_fin_chaine)
 3388:                                 {
 3389:                                     drapeau_valeur_entiere = d_faux;
 3390:                                     drapeau_valeur_reelle = d_faux;
 3391:                                 }
 3392:                             }
 3393: 
 3394:                             break;
 3395:                         }
 3396: 
 3397:                         // Ne peut suivre qu'un chiffre ou un point
 3398:                         case 'e' :
 3399:                         case 'E' :
 3400:                         {
 3401:                             nombre_exposants++;
 3402: 
 3403:                             if (ptr > (*s_etat_processus).instruction_courante)
 3404:                             {
 3405:                                 switch(*(ptr - 1))
 3406:                                 {
 3407:                                     case '0' :
 3408:                                     case '1' :
 3409:                                     case '2' :
 3410:                                     case '3' :
 3411:                                     case '4' :
 3412:                                     case '5' :
 3413:                                     case '6' :
 3414:                                     case '7' :
 3415:                                     case '8' :
 3416:                                     case '9' :
 3417:                                     {
 3418:                                         drapeau_valeur_entiere = d_faux;
 3419:                                         break;
 3420:                                     }
 3421: 
 3422:                                     // Le point doit suivre un chiffre
 3423:                                     case '.' :
 3424:                                     {
 3425:                                         if ((ptr - 1) > (*s_etat_processus)
 3426:                                                 .instruction_courante)
 3427:                                         {
 3428:                                             switch(*(ptr - 2))
 3429:                                             {
 3430:                                                 case '0' :
 3431:                                                 case '1' :
 3432:                                                 case '2' :
 3433:                                                 case '3' :
 3434:                                                 case '4' :
 3435:                                                 case '5' :
 3436:                                                 case '6' :
 3437:                                                 case '7' :
 3438:                                                 case '8' :
 3439:                                                 case '9' :
 3440:                                                 {
 3441:                                                     drapeau_valeur_entiere =
 3442:                                                             d_faux;
 3443:                                                     break;
 3444:                                                 }
 3445: 
 3446:                                                 default :
 3447:                                                 {
 3448:                                                     drapeau_valeur_entiere =
 3449:                                                             d_faux;
 3450:                                                     drapeau_valeur_reelle =
 3451:                                                             d_faux;
 3452:                                                     break;
 3453:                                                 }
 3454:                                             }
 3455:                                         }
 3456:                                         else
 3457:                                         {
 3458:                                             drapeau_valeur_entiere = d_faux;
 3459:                                             drapeau_valeur_reelle = d_faux;
 3460:                                         }
 3461: 
 3462:                                         break;
 3463:                                     }
 3464: 
 3465:                                     default :
 3466:                                     {
 3467:                                         drapeau_valeur_entiere = d_faux;
 3468:                                         drapeau_valeur_reelle = d_faux;
 3469:                                         break;
 3470:                                     }
 3471:                                 }
 3472:                             }
 3473:                             else
 3474:                             {
 3475:                                 drapeau_valeur_entiere = d_faux;
 3476:                                 drapeau_valeur_reelle = d_faux;
 3477:                             }
 3478: 
 3479:                             break;
 3480:                         }
 3481: 
 3482:                         default :
 3483:                         {
 3484:                             drapeau_valeur_entiere = d_faux;
 3485:                             drapeau_valeur_reelle = d_faux;
 3486:                             break;
 3487:                         }
 3488:                     }
 3489: 
 3490:                     ptr++;
 3491:                 }
 3492: 
 3493:                 if ((nombre_points > 1) || (nombre_exposants > 1))
 3494:                 {
 3495:                     drapeau_valeur_reelle = d_faux;
 3496:                     drapeau_valeur_entiere = d_faux;
 3497:                 }
 3498:             }
 3499:             else
 3500:             {
 3501:                 drapeau_valeur_entiere = d_faux;
 3502:                 drapeau_valeur_reelle = d_faux;
 3503:             }
 3504: 
 3505:             if ((drapeau_valeur_reelle == d_faux) &&
 3506:                     (drapeau_valeur_entiere == d_faux))
 3507:             {
 3508:                 (*s_objet).type = NOM;
 3509: 
 3510:                 element = malloc(sizeof(struct_nom));
 3511: 
 3512:                 if (element == NULL)
 3513:                 {
 3514:                     (*s_etat_processus).erreur_systeme =
 3515:                             d_es_allocation_memoire;
 3516:                     (*s_etat_processus).traitement_interruptible =
 3517:                             registre_interruption;
 3518:                     return;
 3519:                 }
 3520: 
 3521:                 (*((struct_nom *) element)).symbole = d_faux;
 3522:                 (*((struct_nom *) element)).nom = ((unsigned char *) malloc(
 3523:                         (strlen((*s_etat_processus)
 3524:                         .instruction_courante) + 1) * sizeof(unsigned char)));
 3525: 
 3526:                 if ((*((struct_nom *) element)).nom == NULL)
 3527:                 {
 3528:                     (*s_etat_processus).erreur_systeme =
 3529:                             d_es_allocation_memoire;
 3530:                     (*s_etat_processus).traitement_interruptible =
 3531:                             registre_interruption;
 3532:                     return;
 3533:                 }
 3534: 
 3535:                 strcpy((*((struct_nom *) element)).nom, (*s_etat_processus)
 3536:                         .instruction_courante);
 3537:             }
 3538:             else
 3539:             {
 3540:                 if (drapeau_valeur_entiere == d_faux)
 3541:                 {
 3542:                     (*s_objet).type = REL;
 3543: 
 3544:                     element = (void *) ((real8 *) malloc(
 3545:                             sizeof(real8)));
 3546: 
 3547:                     if (element == NULL)
 3548:                     {
 3549:                         (*s_etat_processus).erreur_systeme =
 3550:                                 d_es_allocation_memoire;
 3551:                         (*s_etat_processus).traitement_interruptible =
 3552:                                 registre_interruption;
 3553:                         return;
 3554:                     }
 3555: 
 3556:                     nombre_elements_convertis = sscanf(
 3557:                             (*s_etat_processus).instruction_courante, "%lg",
 3558:                             (real8 *) element);
 3559: 
 3560:                     if (nombre_elements_convertis != 1)
 3561:                     {
 3562:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 3563:                     }
 3564:                 }
 3565:                 else
 3566:                 {
 3567:                     (*s_objet).type = INT;
 3568: 
 3569:                     element = (void *) ((integer8 *) malloc(
 3570:                             sizeof(integer8)));
 3571: 
 3572:                     if (element == NULL)
 3573:                     {
 3574:                         (*s_etat_processus).erreur_systeme =
 3575:                                 d_es_allocation_memoire;
 3576:                         (*s_etat_processus).traitement_interruptible =
 3577:                                 registre_interruption;
 3578:                         return;
 3579:                     }
 3580: 
 3581:                     nombre_elements_convertis = sscanf(
 3582:                             (*s_etat_processus).instruction_courante, "%lld",
 3583:                             (integer8 *) element);
 3584: 
 3585:                     if (nombre_elements_convertis != 1)
 3586:                     {
 3587:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 3588:                     }
 3589:                 }
 3590:             }
 3591: 
 3592:             break;
 3593:         }
 3594:     }
 3595: 
 3596:     (*s_objet).objet = element;
 3597: 
 3598:     if (nombre_egalites > 1)
 3599:     {
 3600:         liberation(s_etat_processus, s_objet);
 3601: 
 3602:         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 3603:         (*s_etat_processus).traitement_interruptible = registre_interruption;
 3604:         return;
 3605:     }
 3606: 
 3607:     if (empilement(s_etat_processus,
 3608:             &((*s_etat_processus).l_base_pile), s_objet) == d_erreur)
 3609:     {
 3610:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3611:         (*s_etat_processus).traitement_interruptible = registre_interruption;
 3612:         return;
 3613:     }
 3614: 
 3615:     (*s_etat_processus).traitement_interruptible = registre_interruption;
 3616:     return;
 3617: }
 3618: 
 3619: 
 3620: /*
 3621: ================================================================================
 3622:   Conversion de la virgule
 3623: ================================================================================
 3624:   Entrées : structure sur l'état du processus
 3625: --------------------------------------------------------------------------------
 3626:   Sorties : néant
 3627: --------------------------------------------------------------------------------
 3628:   Effets de bord : néant
 3629: ================================================================================
 3630: */
 3631: 
 3632: void
 3633: conversion_format(struct_processus *s_etat_processus, unsigned char *chaine)
 3634: {
 3635:     unsigned char                   *ptr;
 3636: 
 3637: /*
 3638: --------------------------------------------------------------------------------
 3639:   Transcription du point en virgule et réciproquement selon l'indicateur 48
 3640: --------------------------------------------------------------------------------
 3641: */
 3642: 
 3643:     if (test_cfsf(s_etat_processus, 48) == d_vrai)
 3644:     {
 3645:         ptr = chaine;
 3646: 
 3647:         while((*ptr) != d_code_fin_chaine)
 3648:         {
 3649:             if ((*ptr) == '.')
 3650:             {
 3651:                 (*ptr) = ',';
 3652:             }
 3653:             else if ((*ptr) == ',')
 3654:             {
 3655:                 (*ptr) = '.';
 3656:             }
 3657: 
 3658:             ptr++;
 3659:         }
 3660:     }
 3661: 
 3662:     return;
 3663: }
 3664: 
 3665: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>