File:  [local] / rpl / src / types.c
Revision 1.97: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:52 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_32, HEAD
Modification du copyright.

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

CVSweb interface <joel.bertrand@systella.fr>