File:  [local] / rpl / src / types.c
Revision 1.26: download - view: text, annotated - select for diffs - revision graph
Mon Jan 3 12:08:10 2011 UTC (13 years, 4 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_20, HEAD
Changement du copyright.

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

CVSweb interface <joel.bertrand@systella.fr>