File:  [local] / rpl / src / instructions_r6.c
Revision 1.76: download - view: text, annotated - select for diffs - revision graph
Mon Feb 11 09:45:51 2019 UTC (5 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Suite des patches corrigeant le multithreading.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.31
    4:   Copyright (C) 1989-2019 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'recv'
   29: ================================================================================
   30:   Entrées : pointeur sur une structure struct_processus
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_recv(struct_processus *s_etat_processus)
   40: {
   41:     integer8                    nombre_donnees;
   42: 
   43:     sig_atomic_t                registre_stop;
   44: 
   45:     ssize_t                     longueur_ecriture;
   46: 
   47:     struct_liste_chainee        *l_element_courant;
   48: 
   49:     struct_objet                *s_objet_argument;
   50:     struct_objet                *s_objet_resultat;
   51: 
   52:     struct sigaction            action;
   53:     struct sigaction            registre;
   54: 
   55:     (*s_etat_processus).erreur_execution = d_ex;
   56: 
   57:     if ((*s_etat_processus).affichage_arguments == 'Y')
   58:     {
   59:         printf("\n  RECV ");
   60: 
   61:         if ((*s_etat_processus).langue == 'F')
   62:         {
   63:             printf("(réception de données d'un processus fils)\n\n");
   64:         }
   65:         else
   66:         {
   67:             printf("(data reception from child process)\n\n");
   68:         }
   69: 
   70:         printf("    1: %s\n", d_PRC);
   71:         printf("->  1: %s (0)\n\n", d_INT);
   72: 
   73:         printf("    1: %s\n", d_PRC);
   74:         printf("->  2: %s, %s, %s, %s, %s, %s,\n"
   75:                 "       %s, %s, %s, %s, %s,\n"
   76:                 "       %s, %s, %s, %s\n",
   77:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
   78:                 d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN);
   79:         printf("    1: %s (-1)\n", d_INT);
   80: 
   81:         return;
   82:     }
   83:     else if ((*s_etat_processus).test_instruction == 'Y')
   84:     {
   85:         (*s_etat_processus).nombre_arguments = -1;
   86:         return;
   87:     }
   88: 
   89:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   90:     {
   91:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   92:         {
   93:             return;
   94:         }
   95:     }
   96: 
   97:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
   98:             &s_objet_argument) == d_erreur)
   99:     {
  100:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  101:         return;
  102:     }
  103: 
  104:     if ((*s_objet_argument).type == PRC)
  105:     {
  106:         /*
  107:          * Le champ de la structure nombre_objets_dans_pipe à jour
  108:          * est celui présent dans *s_etat_processus et non celui
  109:          * de la structure présente dans la pile opérationnelle.
  110:          */
  111: 
  112:         if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus))
  113:                 != 0)
  114:         {
  115:             (*s_etat_processus).erreur_systeme_processus_fils =
  116:                     d_es_processus;
  117:             return;
  118:         }
  119: 
  120:         l_element_courant = (struct_liste_chainee *)
  121:                 (*s_etat_processus).l_base_pile_processus;
  122:         nombre_donnees = -1;
  123: 
  124:         while(l_element_courant != NULL)
  125:         {
  126:             if ((*(*((struct_processus_fils *) (*s_objet_argument).objet))
  127:                     .thread).processus_detache == d_vrai)
  128:             {
  129:                 if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  130:                         .donnee).objet)).thread).processus_detache == d_faux)
  131:                 {
  132:                     l_element_courant = (*l_element_courant).suivant;
  133:                     continue;
  134:                 }
  135: 
  136:                 if ((*(*((struct_processus_fils *) (*s_objet_argument).objet))
  137:                         .thread).pid == (*(*((struct_processus_fils *)
  138:                         (*(*l_element_courant).donnee).objet)).thread).pid)
  139:                 {
  140:                     if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  141:                             (*s_objet_argument).objet)).thread).mutex)) != 0)
  142:                     {
  143:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  144:                         return;
  145:                     }
  146: 
  147:                     nombre_donnees = (*(*((struct_processus_fils *)
  148:                             (*(*l_element_courant).donnee).objet)).thread)
  149:                             .nombre_objets_dans_pipe;
  150: 
  151:                     if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  152:                             (*s_objet_argument).objet)).thread).mutex)) != 0)
  153:                     {
  154:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  155:                         return;
  156:                     }
  157: 
  158:                     break;
  159:                 }
  160:             }
  161:             else
  162:             {
  163:                 if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  164:                         .donnee).objet)).thread).processus_detache == d_vrai)
  165:                 {
  166:                     l_element_courant = (*l_element_courant).suivant;
  167:                     continue;
  168:                 }
  169: 
  170:                 if ((pthread_equal((*(*((struct_processus_fils *)
  171:                         (*s_objet_argument).objet)).thread).tid,
  172:                         (*(*((struct_processus_fils *) (*(*l_element_courant)
  173:                         .donnee).objet)).thread).tid) != 0) &&
  174:                         ((*(*((struct_processus_fils *)
  175:                         (*s_objet_argument).objet)).thread).pid ==
  176:                         (*(*((struct_processus_fils *) (*(*l_element_courant)
  177:                         .donnee).objet)).thread).pid))
  178:                 {
  179:                     if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  180:                             (*s_objet_argument).objet)).thread).mutex)) != 0)
  181:                     {
  182:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  183:                         return;
  184:                     }
  185: 
  186:                     nombre_donnees = (*(*((struct_processus_fils *)
  187:                             (*(*l_element_courant).donnee).objet)).thread)
  188:                             .nombre_objets_dans_pipe;
  189: 
  190:                     if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  191:                             (*s_objet_argument).objet)).thread).mutex)) != 0)
  192:                     {
  193:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  194:                         return;
  195:                     }
  196: 
  197:                     break;
  198:                 }
  199:             }
  200: 
  201:             l_element_courant = (*l_element_courant).suivant;
  202:         }
  203: 
  204:         /*
  205:          * 0  : aucune donnée dans le pipe du processus.
  206:          * -1 : processus absent de la pile
  207:          */
  208: 
  209:         if (nombre_donnees == -1)
  210:         {
  211:             if (pthread_mutex_unlock(&((*s_etat_processus)
  212:                     .mutex_pile_processus)) != 0)
  213:             {
  214:                 (*s_etat_processus).erreur_systeme_processus_fils =
  215:                         d_es_processus;
  216:                 return;
  217:             }
  218: 
  219:             (*s_etat_processus).erreur_execution = d_ex_processus;
  220:             return;
  221:         }
  222:         else if (nombre_donnees == 0)
  223:         {
  224:             /*
  225:              * On empile une valeur nulle
  226:              */
  227: 
  228:             if (pthread_mutex_unlock(&((*s_etat_processus)
  229:                     .mutex_pile_processus)) != 0)
  230:             {
  231:                 (*s_etat_processus).erreur_systeme_processus_fils =
  232:                         d_es_processus;
  233:                 return;
  234:             }
  235: 
  236:             if ((s_objet_resultat = allocation(s_etat_processus, INT))
  237:                     == NULL)
  238:             {
  239:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  240:                 return;
  241:             }
  242: 
  243:             (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  244: 
  245:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  246:                     s_objet_resultat) == d_erreur)
  247:             {
  248:                 return;
  249:             }
  250: 
  251:             liberation(s_etat_processus, s_objet_argument);
  252: 
  253:             return;
  254:         }
  255: 
  256:         registre_stop = (*s_etat_processus)
  257:                 .var_volatile_traitement_retarde_stop;
  258:         (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
  259: 
  260:         if ((*s_etat_processus).profilage == d_vrai)
  261:         {
  262:             profilage(s_etat_processus, "Interprocess or interthread "
  263:                     "communications (RECV)");
  264: 
  265:             if ((*s_etat_processus).erreur_systeme != d_es)
  266:             {
  267:                 return;
  268:             }
  269:         }
  270: 
  271: #       ifndef SEMAPHORES_NOMMES
  272:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  273: #       else
  274:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  275: #       endif
  276:         {
  277:             (*s_etat_processus).erreur_systeme = d_es_processus;
  278:             return;
  279:         }
  280: 
  281:         if ((s_objet_resultat = lecture_pipe(s_etat_processus,
  282:                 (*(*((struct_processus_fils *) (*s_objet_argument).objet))
  283:                 .thread).pipe_objets[0])) == NULL)
  284:         {
  285: #           ifndef SEMAPHORES_NOMMES
  286:                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
  287: #           else
  288:                 while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
  289: #           endif
  290:             {
  291:                 if (errno != EINTR)
  292:                 {
  293:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  294:                     return;
  295:                 }
  296:             }
  297: 
  298:             if (registre_stop == 0)
  299:             {
  300:                 if ((*s_etat_processus).var_volatile_traitement_retarde_stop
  301:                         == -1)
  302:                 {
  303:                     (*s_etat_processus).var_volatile_requete_arret = -1;
  304:                 }
  305: 
  306:                 (*s_etat_processus).var_volatile_traitement_retarde_stop
  307:                         = registre_stop;
  308:             }
  309: 
  310:             if ((*s_etat_processus).profilage == d_vrai)
  311:             {
  312:                 profilage(s_etat_processus, NULL);
  313:             }
  314: 
  315:             pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
  316:             return;
  317:         }
  318: 
  319: #       ifndef SEMAPHORES_NOMMES
  320:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
  321: #       else
  322:             while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
  323: #       endif
  324:         {
  325:             if (errno != EINTR)
  326:             {
  327:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  328:                 return;
  329:             }
  330:         }
  331: 
  332:         if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  333:                 (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0)
  334:         {
  335:             (*s_etat_processus).erreur_systeme = d_es_processus;
  336:             return;
  337:         }
  338: 
  339:         (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet))
  340:                 .thread).nombre_objets_dans_pipe--;
  341: 
  342:         if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  343:                 (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0)
  344:         {
  345:             (*s_etat_processus).erreur_systeme = d_es_processus;
  346:             return;
  347:         }
  348: 
  349:         if (pthread_mutex_lock(&mutex_sigaction) != 0)
  350:         {
  351:             (*s_etat_processus).erreur_systeme = d_es_processus;
  352:             return;
  353:         }
  354: 
  355:         action.sa_handler = SIG_IGN;
  356:         action.sa_flags = 0;
  357: 
  358:         if (sigaction(SIGPIPE, &action, &registre) != 0)
  359:         {
  360:             if (registre_stop == 0)
  361:             {
  362:                 if ((*s_etat_processus).var_volatile_traitement_retarde_stop
  363:                         == -1)
  364:                 {
  365:                     (*s_etat_processus).var_volatile_requete_arret = -1;
  366:                 }
  367: 
  368:                 (*s_etat_processus).var_volatile_traitement_retarde_stop
  369:                         = registre_stop;
  370:             }
  371: 
  372:             pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
  373: 
  374:             if ((*s_etat_processus).profilage == d_vrai)
  375:             {
  376:                 profilage(s_etat_processus, NULL);
  377:             }
  378: 
  379:             pthread_mutex_unlock(&mutex_sigaction);
  380:             (*s_etat_processus).erreur_systeme = d_es_signal;
  381:             return;
  382:         }
  383: 
  384: #       ifndef SEMAPHORES_NOMMES
  385:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  386: #       else
  387:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  388: #       endif
  389:         {
  390:             pthread_mutex_unlock(&mutex_sigaction);
  391:             (*s_etat_processus).erreur_systeme = d_es_processus;
  392:             return;
  393:         }
  394: 
  395:         while((longueur_ecriture = write_atomic(s_etat_processus,
  396:                 (*(*((struct_processus_fils *) (*(*l_element_courant)
  397:                 .donnee).objet)).thread).pipe_nombre_injections[1], "+",
  398:                 sizeof(unsigned char))) != sizeof(unsigned char))
  399:         {
  400:             if (longueur_ecriture == -1)
  401:             {
  402:                 // Le processus n'existe plus.
  403:                 break;
  404:             }
  405:         }
  406: 
  407: #       ifndef SEMAPHORES_NOMMES
  408:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
  409: #       else
  410:             while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
  411: #       endif
  412:         {
  413:             if (errno != EINTR)
  414:             {
  415:                 pthread_mutex_unlock(&mutex_sigaction);
  416:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  417:                 return;
  418:             }
  419:         }
  420: 
  421:         if ((*s_etat_processus).profilage == d_vrai)
  422:         {
  423:             profilage(s_etat_processus, NULL);
  424:         }
  425: 
  426:         if (registre_stop == 0)
  427:         {
  428:             if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
  429:             {
  430:                 (*s_etat_processus).var_volatile_requete_arret = -1;
  431:             }
  432: 
  433:             (*s_etat_processus).var_volatile_traitement_retarde_stop
  434:                     = registre_stop;
  435:         }
  436: 
  437:         if (sigaction(SIGPIPE, &registre, NULL) != 0)
  438:         {
  439:             pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
  440: 
  441:             (*s_etat_processus).erreur_systeme = d_es_signal;
  442:             return;
  443:         }
  444: 
  445:         if (pthread_mutex_unlock(&mutex_sigaction) != 0)
  446:         {
  447:             (*s_etat_processus).erreur_systeme = d_es_processus;
  448:             return;
  449:         }
  450: 
  451:         if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus))
  452:                 != 0)
  453:         {
  454:             (*s_etat_processus).erreur_systeme_processus_fils =
  455:                     d_es_processus;
  456:         }
  457:     }
  458:     else
  459:     {
  460:         liberation(s_etat_processus, s_objet_argument);
  461: 
  462:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  463:         return;
  464:     }
  465: 
  466:     liberation(s_etat_processus, s_objet_argument);
  467: 
  468:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  469:             s_objet_resultat) == d_erreur)
  470:     {
  471:         return;
  472:     }
  473: 
  474:     /*
  475:      * On rajoute "-1" dans la pile.
  476:      */
  477: 
  478:     if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  479:     {
  480:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  481:         return;
  482:     }
  483: 
  484:     (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  485: 
  486:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  487:             s_objet_resultat) == d_erreur)
  488:     {
  489:         return;
  490:     }
  491: 
  492:     return;
  493: }
  494: 
  495: 
  496: /*
  497: ================================================================================
  498:   Fonction 'row->'
  499: ================================================================================
  500:   Entrées :
  501: --------------------------------------------------------------------------------
  502:   Sorties :
  503: --------------------------------------------------------------------------------
  504:   Effets de bord : néant
  505: ================================================================================
  506: */
  507: 
  508: void
  509: instruction_row_fleche(struct_processus *s_etat_processus)
  510: {
  511:     struct_objet                *s_objet;
  512:     struct_objet                *s_objet_elementaire;
  513: 
  514:     integer8                    i;
  515:     integer8                    j;
  516: 
  517:     (*s_etat_processus).erreur_execution = d_ex;
  518: 
  519:     if ((*s_etat_processus).affichage_arguments == 'Y')
  520:     {
  521:         printf("\n  ROW-> ");
  522: 
  523:         if ((*s_etat_processus).langue == 'F')
  524:         {
  525:             printf("(extraction des lignes d'une matrice)\n\n");
  526:         }
  527:         else
  528:         {
  529:             printf("(extract matrix rows)\n\n");
  530:         }
  531: 
  532:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  533:         printf("->  n: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  534:         printf("    ...\n");
  535:         printf("    2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  536:         printf("    1: %s\n", d_INT);
  537: 
  538:         return;
  539:     }
  540:     else if ((*s_etat_processus).test_instruction == 'Y')
  541:     {
  542:         (*s_etat_processus).nombre_arguments = -1;
  543:         return;
  544:     }
  545: 
  546:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  547:     {
  548:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  549:         {
  550:             return;
  551:         }
  552:     }
  553: 
  554:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  555:             &s_objet) == d_erreur)
  556:     {
  557:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  558:         return;
  559:     }
  560: 
  561:     if ((*s_objet).type == MIN)
  562:     {
  563:         for(i = 0; i < (*((struct_matrice *)
  564:                 (*s_objet).objet)).nombre_lignes; i++)
  565:         {
  566:             if ((s_objet_elementaire = allocation(s_etat_processus, MIN))
  567:                     == NULL)
  568:             {
  569:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  570:                 return;
  571:             }
  572: 
  573:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  574:                     .nombre_lignes = 1;
  575:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  576:                     .nombre_colonnes = (*((struct_matrice *) (*s_objet).objet))
  577:                     .nombre_colonnes;
  578: 
  579:             if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
  580:                     malloc(sizeof(integer8 *))) == NULL)
  581:             {
  582:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  583:                 return;
  584:             }
  585: 
  586:             if ((((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
  587:                     .objet)).tableau)[0] = malloc(((size_t)
  588:                     (*((struct_matrice *) (*s_objet_elementaire).objet))
  589:                     .nombre_colonnes) * sizeof(integer8))) == NULL)
  590:             {
  591:                 (*s_etat_processus).erreur_systeme =
  592:                         d_es_allocation_memoire;
  593:                 return;
  594:             }
  595: 
  596:             for(j = 0; j < (*((struct_matrice *) (*s_objet_elementaire).objet))
  597:                     .nombre_colonnes; j++)
  598:             {
  599:                 ((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
  600:                         .objet)).tableau)[0][j] =
  601:                         ((integer8 **) (*((struct_matrice *)
  602:                         (*s_objet).objet)).tableau)[i][j];
  603:             }
  604: 
  605:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  606:                     s_objet_elementaire) == d_erreur)
  607:             {
  608:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  609:                 return;
  610:             }
  611:         }
  612:     }
  613:     else if ((*s_objet).type == MRL)
  614:     {
  615:         for(i = 0; i < (*((struct_matrice *)
  616:                 (*s_objet).objet)).nombre_lignes; i++)
  617:         {
  618:             if ((s_objet_elementaire = allocation(s_etat_processus, MRL))
  619:                     == NULL)
  620:             {
  621:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  622:                 return;
  623:             }
  624: 
  625:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  626:                     .nombre_lignes = 1;
  627:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  628:                     .nombre_colonnes = (*((struct_matrice *) (*s_objet).objet))
  629:                     .nombre_colonnes;
  630: 
  631:             if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
  632:                     malloc(sizeof(real8 *))) == NULL)
  633:             {
  634:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  635:                 return;
  636:             }
  637: 
  638:             if ((((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
  639:                     .objet)).tableau)[0] = malloc(((size_t)
  640:                     (*((struct_matrice *) (*s_objet_elementaire).objet))
  641:                     .nombre_colonnes) * sizeof(real8))) == NULL)
  642:             {
  643:                 (*s_etat_processus).erreur_systeme =
  644:                         d_es_allocation_memoire;
  645:                 return;
  646:             }
  647: 
  648:             for(j = 0; j < (*((struct_matrice *) (*s_objet_elementaire).objet))
  649:                     .nombre_colonnes; j++)
  650:             {
  651:                 ((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
  652:                         .objet)).tableau)[0][j] =
  653:                         ((real8 **) (*((struct_matrice *)
  654:                         (*s_objet).objet)).tableau)[i][j];
  655:             }
  656: 
  657:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  658:                     s_objet_elementaire) == d_erreur)
  659:             {
  660:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  661:                 return;
  662:             }
  663:         }
  664:     }
  665:     else if ((*s_objet).type == MCX)
  666:     {
  667:         for(i = 0; i < (*((struct_matrice *)
  668:                 (*s_objet).objet)).nombre_lignes; i++)
  669:         {
  670:             if ((s_objet_elementaire = allocation(s_etat_processus, MCX))
  671:                     == NULL)
  672:             {
  673:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  674:                 return;
  675:             }
  676: 
  677:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  678:                     .nombre_lignes = 1;
  679:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  680:                     .nombre_colonnes = (*((struct_matrice *) (*s_objet).objet))
  681:                     .nombre_colonnes;
  682: 
  683:             if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
  684:                     malloc(sizeof(complex16 *))) == NULL)
  685:             {
  686:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  687:                 return;
  688:             }
  689: 
  690:             if ((((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
  691:                     .objet)).tableau)[0] = malloc(((size_t)
  692:                     (*((struct_matrice *) (*s_objet_elementaire).objet))
  693:                     .nombre_colonnes) * sizeof(complex16))) == NULL)
  694:             {
  695:                 (*s_etat_processus).erreur_systeme =
  696:                         d_es_allocation_memoire;
  697:                 return;
  698:             }
  699: 
  700:             for(j = 0; j < (*((struct_matrice *) (*s_objet_elementaire).objet))
  701:                     .nombre_colonnes; j++)
  702:             {
  703:                 ((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
  704:                         .objet)).tableau)[0][j].partie_reelle =
  705:                         ((complex16 **) (*((struct_matrice *)
  706:                         (*s_objet).objet)).tableau)[i][j].partie_reelle;
  707:                 ((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
  708:                         .objet)).tableau)[0][j].partie_imaginaire =
  709:                         ((complex16 **) (*((struct_matrice *)
  710:                         (*s_objet).objet)).tableau)[i][j].partie_imaginaire;
  711:             }
  712: 
  713:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  714:                     s_objet_elementaire) == d_erreur)
  715:             {
  716:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  717:                 return;
  718:             }
  719:         }
  720:     }
  721:     else
  722:     {
  723:         liberation(s_etat_processus, s_objet);
  724: 
  725:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  726:         return;
  727:     }
  728: 
  729:     if ((s_objet_elementaire = allocation(s_etat_processus, INT)) == NULL)
  730:     {
  731:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  732:         return;
  733:     }
  734: 
  735:     (*((integer8 *) (*s_objet_elementaire).objet)) =
  736:             (*((struct_matrice *) (*s_objet).objet)).nombre_lignes;
  737: 
  738:     liberation(s_etat_processus, s_objet);
  739: 
  740:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  741:             s_objet_elementaire) == d_erreur)
  742:     {
  743:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  744:         return;
  745:     }
  746: 
  747:     return;
  748: }
  749: 
  750: 
  751: /*
  752: ================================================================================
  753:   Fonction 'rdate'
  754: ================================================================================
  755:   Entrées : pointeur sur une structure struct_processus
  756: --------------------------------------------------------------------------------
  757:   Sorties :
  758: --------------------------------------------------------------------------------
  759:   Effets de bord : néant
  760: ================================================================================
  761: */
  762: 
  763: void
  764: instruction_rdate(struct_processus *s_etat_processus)
  765: {
  766:     struct_objet            *s_objet;
  767:     struct_objet            *s_objet_argument;
  768: 
  769:     struct timeval          horodatage;
  770: 
  771:     (*s_etat_processus).erreur_execution = d_ex;
  772: 
  773:     if ((*s_etat_processus).affichage_arguments == 'Y')
  774:     {
  775:         printf("\n  RDATE ");
  776: 
  777:         if ((*s_etat_processus).langue == 'F')
  778:         {
  779:             printf("(information sur la date et l'heure avec offset)\n\n");
  780:         }
  781:         else
  782:         {
  783:             printf("(date and time with offset)\n\n");
  784:         }
  785: 
  786:         printf("    1: %s\n", d_INT);
  787:         printf("->  1: %s\n", d_LST);
  788: 
  789:         return;
  790:     }
  791:     else if ((*s_etat_processus).test_instruction == 'Y')
  792:     {
  793:         (*s_etat_processus).nombre_arguments = 1;
  794:         return;
  795:     }
  796: 
  797:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  798:     {
  799:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  800:         {
  801:             return;
  802:         }
  803:     }
  804: 
  805:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  806:             &s_objet_argument) == d_erreur)
  807:     {
  808:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  809:         return;
  810:     }
  811: 
  812:     if ((*s_objet_argument).type == INT)
  813:     {
  814:         gettimeofday(&horodatage, NULL);
  815:         horodatage.tv_sec += (time_t) (*((integer8 *)
  816:                 (*s_objet_argument).objet));
  817: 
  818:         if (horodatage.tv_sec < 0)
  819:         {
  820:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  821: 
  822:             liberation(s_etat_processus, s_objet_argument);
  823:             return;
  824:         }
  825: 
  826:         if ((s_objet = formateur_date(s_etat_processus, &horodatage)) == NULL)
  827:         {
  828:             liberation(s_etat_processus, s_objet_argument);
  829:             return;
  830:         }
  831: 
  832:         liberation(s_etat_processus, s_objet_argument);
  833:     }
  834:     else
  835:     {
  836:         liberation(s_etat_processus, s_objet_argument);
  837: 
  838:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  839:         return;
  840:     }
  841: 
  842:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  843:             s_objet) == d_erreur)
  844:     {
  845:         return;
  846:     }
  847: 
  848:     return;
  849: }
  850: 
  851: 
  852: /*
  853: ================================================================================
  854:   Fonction 'rclswi'
  855: ================================================================================
  856:   Entrées : pointeur sur une structure struct_processus
  857: --------------------------------------------------------------------------------
  858:   Sorties :
  859: --------------------------------------------------------------------------------
  860:   Effets de bord : néant
  861: ================================================================================
  862: */
  863: 
  864: void
  865: instruction_rclswi(struct_processus *s_etat_processus)
  866: {
  867:     integer8                        interruption;
  868: 
  869:     struct_objet                    *s_objet_argument;
  870:     struct_objet                    *s_objet_resultat;
  871: 
  872:     (*s_etat_processus).erreur_execution = d_ex;
  873: 
  874:     if ((*s_etat_processus).affichage_arguments == 'Y')
  875:     {
  876:         printf("\n  RCLSWI ");
  877: 
  878:         if ((*s_etat_processus).langue == 'F')
  879:         {
  880:             printf("(rappel d'une interruption logicielle)\n\n");
  881:         }
  882:         else
  883:         {
  884:             printf("(recall software interrupt)\n\n");
  885:         }
  886: 
  887:         printf("    1: %s\n", d_INT);
  888:         printf("->  1: %s, %s\n", d_NOM, d_RPN);
  889: 
  890:         return;
  891:     }
  892:     else if ((*s_etat_processus).test_instruction == 'Y')
  893:     {
  894:         (*s_etat_processus).nombre_arguments = -1;
  895:         return;
  896:     }
  897: 
  898:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  899:     {
  900:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  901:         {
  902:             return;
  903:         }
  904:     }
  905: 
  906:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  907:             &s_objet_argument) == d_erreur)
  908:     {
  909:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  910:         return;
  911:     }
  912: 
  913:     if ((*s_objet_argument).type == INT)
  914:     {
  915:         interruption = (*((integer8 *) (*s_objet_argument).objet));
  916: 
  917:         if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
  918:         {
  919:             liberation(s_etat_processus, s_objet_argument);
  920: 
  921:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
  922:             return;
  923:         }
  924: 
  925:         if ((*s_etat_processus).corps_interruptions[interruption - 1] == NULL)
  926:         {
  927:             liberation(s_etat_processus, s_objet_argument);
  928: 
  929:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
  930:             return;
  931:         }
  932: 
  933:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  934:                 (*s_etat_processus).corps_interruptions[interruption - 1], 'P'))
  935:                 == NULL)
  936:         {
  937:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  938:             return;
  939:         }
  940:     }
  941:     else
  942:     {
  943:         liberation(s_etat_processus, s_objet_argument);
  944: 
  945:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  946:         return;
  947:     }
  948: 
  949:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  950:             s_objet_resultat) == d_erreur)
  951:     {
  952:         return;
  953:     }
  954: 
  955:     return;
  956: }
  957: 
  958: 
  959: /*
  960: ================================================================================
  961:   Fonction 'revlist'
  962: ================================================================================
  963:   Entrées : pointeur sur une structure struct_processus
  964: --------------------------------------------------------------------------------
  965:   Sorties :
  966: --------------------------------------------------------------------------------
  967:   Effets de bord : néant
  968: ================================================================================
  969: */
  970: 
  971: void
  972: instruction_revlist(struct_processus *s_etat_processus)
  973: {
  974:     struct_liste_chainee            *l_ancienne_base;
  975:     struct_liste_chainee            *l_nouvelle_base;
  976: 
  977:     struct_objet                    *s_objet_argument;
  978:     struct_objet                    *s_objet_intermediaire;
  979:     struct_objet                    *s_objet_resultat;
  980: 
  981:     (*s_etat_processus).erreur_execution = d_ex;
  982: 
  983:     if ((*s_etat_processus).affichage_arguments == 'Y')
  984:     {
  985:         printf("\n  REVLIST ");
  986: 
  987:         if ((*s_etat_processus).langue == 'F')
  988:         {
  989:             printf("(inverse les éléments d'une liste)\n\n");
  990:         }
  991:         else
  992:         {
  993:             printf("(inverts list elements)\n\n");
  994:         }
  995: 
  996:         printf("    1: %s\n", d_LST);
  997:         printf("->  1: %s\n", d_LST);
  998: 
  999:         return;
 1000:     }
 1001:     else if ((*s_etat_processus).test_instruction == 'Y')
 1002:     {
 1003:         (*s_etat_processus).nombre_arguments = -1;
 1004:         return;
 1005:     }
 1006: 
 1007:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1008:     {
 1009:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1010:         {
 1011:             return;
 1012:         }
 1013:     }
 1014: 
 1015:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1016:             &s_objet_argument) == d_erreur)
 1017:     {
 1018:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1019:         return;
 1020:     }
 1021: 
 1022:     if ((*s_objet_argument).type == LST)
 1023:     {
 1024:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1025:                 s_objet_argument, 'N')) == NULL)
 1026:         {
 1027:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1028:             return;
 1029:         }
 1030: 
 1031:         l_ancienne_base = (*s_objet_resultat).objet;
 1032:         l_nouvelle_base = NULL;
 1033: 
 1034:         while(l_ancienne_base != NULL)
 1035:         {
 1036:             if (depilement(s_etat_processus, &l_ancienne_base,
 1037:                     &s_objet_intermediaire) == d_erreur)
 1038:             {
 1039:                 (*s_etat_processus).erreur_systeme = d_es_pile_vide;
 1040:                 return;
 1041:             }
 1042: 
 1043:             if (empilement(s_etat_processus, &l_nouvelle_base,
 1044:                     s_objet_intermediaire) == d_erreur)
 1045:             {
 1046:                 return;
 1047:             }
 1048:         }
 1049: 
 1050:         (*s_objet_resultat).objet = l_nouvelle_base;
 1051:     }
 1052:     else
 1053:     {
 1054:         liberation(s_etat_processus, s_objet_argument);
 1055: 
 1056:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1057:         return;
 1058:     }
 1059: 
 1060:     liberation(s_etat_processus, s_objet_argument);
 1061: 
 1062:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1063:             s_objet_resultat) == d_erreur)
 1064:     {
 1065:         return;
 1066:     }
 1067: 
 1068:     return;
 1069: }
 1070: 
 1071: 
 1072: /*
 1073: ================================================================================
 1074:   Fonction 'rstop'
 1075: ================================================================================
 1076:   Entrées :
 1077: --------------------------------------------------------------------------------
 1078:   Sorties :
 1079: --------------------------------------------------------------------------------
 1080:   Effets de bord : néant
 1081: ================================================================================
 1082: */
 1083: 
 1084: void
 1085: instruction_rstop(struct_processus *s_etat_processus)
 1086: {
 1087:     (*s_etat_processus).erreur_execution = d_ex;
 1088: 
 1089:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1090:     {
 1091:         printf("\n  RSTOP ");
 1092: 
 1093:         if ((*s_etat_processus).langue == 'F')
 1094:         {
 1095:             printf("(libère le signal stop)\n\n");
 1096:             printf("  Aucun argument\n");
 1097:         }
 1098:         else
 1099:         {
 1100:             printf("(release stop signal)\n\n");
 1101:             printf("  No argument\n");
 1102:         }
 1103: 
 1104:         return;
 1105:     }
 1106:     else if ((*s_etat_processus).test_instruction == 'Y')
 1107:     {
 1108:         (*s_etat_processus).nombre_arguments = -1;
 1109:         return;
 1110:     }
 1111: 
 1112:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1113:     {
 1114:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1115:         {
 1116:             return;
 1117:         }
 1118:     }
 1119: 
 1120:     if ((*s_etat_processus).var_volatile_traitement_retarde_stop == 0)
 1121:     {
 1122:         (*s_etat_processus).erreur_execution = d_ex_stop;
 1123:         return;
 1124:     }
 1125: 
 1126:     if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
 1127:     {
 1128:         (*s_etat_processus).var_volatile_requete_arret = -1;
 1129:     }
 1130: 
 1131:     (*s_etat_processus).var_volatile_traitement_retarde_stop = 0;
 1132: 
 1133:     return;
 1134: }
 1135: 
 1136: 
 1137: /*
 1138: ================================================================================
 1139:   fonction 'rfuse'
 1140: ================================================================================
 1141:   entrées :
 1142: --------------------------------------------------------------------------------
 1143:   sorties :
 1144: --------------------------------------------------------------------------------
 1145:   effets de bord : néant
 1146: ================================================================================
 1147: */
 1148: 
 1149: void
 1150: instruction_rfuse(struct_processus *s_etat_processus)
 1151: {
 1152:     struct_objet                *s_objet_resultat;
 1153: 
 1154:     (*s_etat_processus).erreur_execution = d_ex;
 1155: 
 1156:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1157:     {
 1158:         printf("\n  RFUSE ");
 1159: 
 1160:         if ((*s_etat_processus).langue == 'F')
 1161:         {
 1162:             printf("(valeur courante du fusible)\n\n");
 1163:         }
 1164:         else
 1165:         {
 1166:             printf("(remaining fuse value)\n\n");
 1167:         }
 1168: 
 1169:         printf("->  1: %s\n", d_REL);
 1170:         return;
 1171:     }
 1172:     else if ((*s_etat_processus).test_instruction == 'Y')
 1173:     {
 1174:         (*s_etat_processus).nombre_arguments = -1;
 1175:         return;
 1176:     }
 1177:     
 1178:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1179:     {
 1180:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1181:         {
 1182:             return;
 1183:         }
 1184:     }
 1185: 
 1186:     if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
 1187:     {
 1188:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1189:         return;
 1190:     }
 1191: 
 1192:     (*((real8 *) (*s_objet_resultat).objet)) =
 1193:             (*s_etat_processus).temps_maximal_cpu;
 1194: 
 1195:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1196:             s_objet_resultat) == d_erreur)
 1197:     {
 1198:         return;
 1199:     }
 1200: 
 1201:     return;
 1202: }
 1203: 
 1204: 
 1205: /*
 1206: ================================================================================
 1207:   fonction 'rdgn'
 1208: ================================================================================
 1209:   entrées :
 1210: --------------------------------------------------------------------------------
 1211:   sorties :
 1212: --------------------------------------------------------------------------------
 1213:   effets de bord : néant
 1214: ================================================================================
 1215: */
 1216: 
 1217: void
 1218: instruction_rdgn(struct_processus *s_etat_processus)
 1219: {
 1220:     const gsl_rng_type          **type_courant;
 1221:     const gsl_rng_type          **types;
 1222: 
 1223:     const unsigned char         *message = "UNINITIALIZED RANDOM GENERATOR";
 1224: 
 1225:     long                        dernier;
 1226:     long                        i;
 1227:     long                        j;
 1228:     long                        nombre_types;
 1229:     long                        premier;
 1230: 
 1231:     struct_objet                *s_objet_argument;
 1232:     struct_objet                *s_objet_resultat;
 1233: 
 1234:     unsigned char               *pointeur;
 1235:     unsigned char               *requete;
 1236:     unsigned char               **types_generateurs;
 1237: 
 1238:     (*s_etat_processus).erreur_execution = d_ex;
 1239: 
 1240:     types = gsl_rng_types_setup();
 1241: 
 1242:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1243:     {
 1244:         printf("\n  RDGN ");
 1245: 
 1246:         if ((*s_etat_processus).langue == 'F')
 1247:         {
 1248:             printf("(choix du générateur de nombres aléatoires)\n\n");
 1249:         }
 1250:         else
 1251:         {
 1252:             printf("(random number generator specification)\n\n");
 1253:         }
 1254: 
 1255:         printf("    1: %s\n\n", d_CHN);
 1256: 
 1257:         printf("    1: \"QUERY\"\n");
 1258:         printf("->  1: %s\n\n", d_CHN);
 1259: 
 1260:         if ((*s_etat_processus).langue == 'F')
 1261:         {
 1262:             printf("  Générateurs disponibles :\n\n");
 1263:         }
 1264:         else
 1265:         {
 1266:             printf("  Available generators:\n\n");
 1267:         }
 1268: 
 1269:         for(nombre_types = 0, type_courant = types;
 1270:                 (*type_courant) != NULL; type_courant++, nombre_types++);
 1271: 
 1272:         if ((types_generateurs = malloc(((size_t) nombre_types) *
 1273:                 sizeof(unsigned char *))) == NULL)
 1274:         {
 1275:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1276:             return;
 1277:         }
 1278: 
 1279:         for(i = 0, type_courant = types; (*type_courant) != NULL;
 1280:                 type_courant++, i++)
 1281:         {
 1282:             if ((types_generateurs[i] = malloc((strlen((**type_courant).name)
 1283:                     + 1) * sizeof(unsigned char))) == NULL)
 1284:             {
 1285:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1286:                 return;
 1287:             }
 1288: 
 1289:             strcpy(types_generateurs[i], (**type_courant).name);
 1290:             pointeur = types_generateurs[i];
 1291: 
 1292:             while((*pointeur) != d_code_fin_chaine)
 1293:             {
 1294:                 if ((*pointeur) == '-')
 1295:                 {
 1296:                     (*pointeur) = '_';
 1297:                 }
 1298: 
 1299:                 pointeur++;
 1300:             }
 1301:         }
 1302: 
 1303:         // Tri des types de générateurs (tri shaker)
 1304: 
 1305:         premier = 1;
 1306:         dernier = nombre_types - 2;
 1307: 
 1308:         while((dernier - premier) >= 2)
 1309:         {
 1310:             for(j = 2, i = premier; i <= dernier; i++)
 1311:             {
 1312:                 if (strcmp(types_generateurs[i], types_generateurs[i + 1]) > 0)
 1313:                 {
 1314:                     swap(&(types_generateurs[i]),
 1315:                             &(types_generateurs[i + 1]),
 1316:                             sizeof(unsigned char *));
 1317:                     j = i;
 1318:                 }
 1319:             }
 1320: 
 1321:             dernier = j;
 1322:             i = nombre_types - 2;
 1323: 
 1324:             for(i = dernier; i >= premier; i--)
 1325:             {
 1326:                 if (strcmp(types_generateurs[i - 1], types_generateurs[i]) > 0)
 1327:                 {
 1328:                     swap(&(types_generateurs[i - 1]),
 1329:                             &(types_generateurs[i]),
 1330:                             sizeof(unsigned char *));
 1331:                     j = i;
 1332:                 }
 1333:             }
 1334: 
 1335:             premier = j;
 1336:         }
 1337: 
 1338:         for(i = 0; i < nombre_types; i++)
 1339:         {
 1340:             printf("  - %s\n", types_generateurs[i]);
 1341:             free(types_generateurs[i]);
 1342:         }
 1343: 
 1344:         free(types_generateurs);
 1345:         return;
 1346:     }
 1347:     else if ((*s_etat_processus).test_instruction == 'Y')
 1348:     {
 1349:         (*s_etat_processus).nombre_arguments = -1;
 1350:         return;
 1351:     }
 1352: 
 1353:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1354:     {
 1355:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1356:         {
 1357:             return;
 1358:         }
 1359:     }
 1360: 
 1361:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1362:             &s_objet_argument) == d_erreur)
 1363:     {
 1364:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1365:         return;
 1366:     }
 1367: 
 1368:     if ((*s_objet_argument).type == CHN)
 1369:     {
 1370:         if ((requete = conversion_majuscule(s_etat_processus, (unsigned char *)
 1371:                 (*s_objet_argument).objet)) == NULL)
 1372:         {
 1373:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1374:             return;
 1375:         }
 1376: 
 1377:         if (strcmp(requete, "QUERY") == 0)
 1378:         {
 1379:             /*
 1380:              * Récupération du type du générateur
 1381:              */
 1382: 
 1383:             free(requete);
 1384: 
 1385:             if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
 1386:             {
 1387:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1388:                 return;
 1389:             }
 1390: 
 1391:             if ((*s_etat_processus).type_generateur_aleatoire == NULL)
 1392:             {
 1393:                 if (((*s_objet_resultat).objet = malloc((strlen(message) + 1) *
 1394:                         sizeof(unsigned char))) == NULL)
 1395:                 {
 1396:                     (*s_etat_processus).erreur_systeme =
 1397:                             d_es_allocation_memoire;
 1398:                     return;
 1399:                 }
 1400: 
 1401:                 strcpy((unsigned char *) (*s_objet_resultat).objet, message);
 1402:             }
 1403:             else
 1404:             {
 1405:                 if (((*s_objet_resultat).objet = conversion_majuscule(
 1406:                         s_etat_processus, (unsigned char *) gsl_rng_name(
 1407:                         (*s_etat_processus).generateur_aleatoire))) == NULL)
 1408:                 {
 1409:                     (*s_etat_processus).erreur_systeme =
 1410:                             d_es_allocation_memoire;
 1411:                     return;
 1412:                 }
 1413:             }
 1414: 
 1415:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1416:                     s_objet_resultat) == d_erreur)
 1417:             {
 1418:                 return;
 1419:             }
 1420:         }
 1421:         else
 1422:         {
 1423:             /*
 1424:              * Affectation d'un nouveau type de générateur
 1425:              */
 1426: 
 1427: #           include "generateurs.c"
 1428: 
 1429:             free(requete);
 1430: 
 1431:             if ((*s_etat_processus).generateur_aleatoire != NULL)
 1432:             {
 1433:                 liberation_generateur_aleatoire(s_etat_processus);
 1434:             }
 1435: 
 1436:             initialisation_generateur_aleatoire(s_etat_processus, d_vrai, 0);
 1437:         }
 1438:     }
 1439:     else
 1440:     {
 1441:         liberation(s_etat_processus, s_objet_argument);
 1442: 
 1443:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1444:         return;
 1445:     }
 1446: 
 1447:     liberation(s_etat_processus, s_objet_argument);
 1448: 
 1449:     return;
 1450: }
 1451: 
 1452: 
 1453: /*
 1454: ================================================================================
 1455:   fonction 'rank'
 1456: ================================================================================
 1457:   entrées :
 1458: --------------------------------------------------------------------------------
 1459:   sorties :
 1460: --------------------------------------------------------------------------------
 1461:   effets de bord : néant
 1462: ================================================================================
 1463: */
 1464: 
 1465: void
 1466: instruction_rank(struct_processus *s_etat_processus)
 1467: {
 1468:     struct_objet                    *s_objet_argument;
 1469:     struct_objet                    *s_objet_resultat;
 1470: 
 1471:     (*s_etat_processus).erreur_execution = d_ex;
 1472: 
 1473:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1474:     {
 1475:         printf("\n  RANK ");
 1476: 
 1477:         if ((*s_etat_processus).langue == 'F')
 1478:         {
 1479:             printf("(rang de la matrice)\n\n");
 1480:         }
 1481:         else
 1482:         {
 1483:             printf("(matrix rank)\n\n");
 1484:         }
 1485: 
 1486:         printf("    1: %s, %s, %s\n", d_MIN, d_REL, d_MCX);
 1487:         printf("->  1: %s\n", d_INT);
 1488: 
 1489:         return;
 1490:     }
 1491:     else if ((*s_etat_processus).test_instruction == 'Y')
 1492:     {
 1493:         (*s_etat_processus).nombre_arguments = -1;
 1494:         return;
 1495:     }
 1496: 
 1497:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1498:     {
 1499:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1500:         {
 1501:             return;
 1502:         }
 1503:     }
 1504: 
 1505:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1506:             &s_objet_argument) == d_erreur)
 1507:     {
 1508:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1509:         return;
 1510:     }
 1511: 
 1512:     if (((*s_objet_argument).type == MIN) ||
 1513:             ((*s_objet_argument).type == MRL) ||
 1514:             ((*s_objet_argument).type == MCX))
 1515:     {
 1516:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1517:         {
 1518:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1519:             return;
 1520:         }
 1521: 
 1522:         rang(s_etat_processus, (*s_objet_argument).objet,
 1523:                 (*s_objet_resultat).objet);
 1524: 
 1525:         if ((*s_etat_processus).erreur_systeme != d_es)
 1526:         {
 1527:             return;
 1528:         }
 1529: 
 1530:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1531:                 ((*s_etat_processus).exception != d_ep))
 1532:         {
 1533:             liberation(s_etat_processus, s_objet_argument);
 1534:             liberation(s_etat_processus, s_objet_resultat);
 1535:             return;
 1536:         }
 1537:     }
 1538:     else
 1539:     {
 1540:         liberation(s_etat_processus, s_objet_argument);
 1541: 
 1542:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1543:         return;
 1544:     }
 1545: 
 1546:     liberation(s_etat_processus, s_objet_argument);
 1547: 
 1548:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1549:             s_objet_resultat) == d_erreur)
 1550:     {
 1551:         return;
 1552:     }
 1553: 
 1554:     return;
 1555: }
 1556: 
 1557: 
 1558: /*
 1559: ================================================================================
 1560:   Fonction 'recode'
 1561: ================================================================================
 1562:   Entrées :
 1563: --------------------------------------------------------------------------------
 1564:   Sorties :
 1565: --------------------------------------------------------------------------------
 1566:   Effets de bord : néant
 1567: ================================================================================
 1568: */
 1569: 
 1570: void
 1571: instruction_recode(struct_processus *s_etat_processus)
 1572: {
 1573:     struct_objet                    *s_objet_argument_1;
 1574:     struct_objet                    *s_objet_argument_2;
 1575:     struct_objet                    *s_objet_argument_3;
 1576:     struct_objet                    *s_objet_resultat;
 1577: 
 1578:     unsigned char                   *encodage_destination;
 1579:     unsigned char                   *encodage_source;
 1580:     unsigned char                   *tampon;
 1581: 
 1582:     (*s_etat_processus).erreur_execution = d_ex;
 1583: 
 1584:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1585:     {
 1586:         printf("\n  RECODE ");
 1587: 
 1588:         if ((*s_etat_processus).langue == 'F')
 1589:         {
 1590:             printf("(conversion d'encodage d'une chaîne de caractères)\n\n");
 1591:         }
 1592:         else
 1593:         {
 1594:             printf("(string recodage)\n\n");
 1595:         }
 1596: 
 1597:         printf("    3: %s\n", d_CHN);
 1598:         printf("    2: %s\n", d_CHN);
 1599:         printf("    1: %s\n", d_CHN);
 1600:         printf("->  1: %s\n\n", d_CHN);
 1601: 
 1602:         if ((*s_etat_processus).langue == 'F')
 1603:         {
 1604:             printf("  Utilisation :\n\n");
 1605:         }
 1606:         else
 1607:         {
 1608:             printf("  Usage:\n\n");
 1609:         }
 1610: 
 1611:         printf("    \"string\" \"ISO8859-1\" \"UTF-8\" recode\n");
 1612:         printf("    \"string\" \"ISO8859-1\" \"UTF-8//TRANSLIT\" recode\n");
 1613:         printf("    \"string\" \"ISO8859-1\" \"UTF-8//IGNORE\" recode\n");
 1614:         return;
 1615:     }
 1616:     else if ((*s_etat_processus).test_instruction == 'Y')
 1617:     {
 1618:         (*s_etat_processus).nombre_arguments = -1;
 1619:         return;
 1620:     }
 1621: 
 1622:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1623:     {
 1624:         if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
 1625:         {
 1626:             return;
 1627:         }
 1628:     }
 1629: 
 1630:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1631:             &s_objet_argument_1) == d_erreur)
 1632:     {
 1633:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1634:         return;
 1635:     }
 1636: 
 1637:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1638:             &s_objet_argument_2) == d_erreur)
 1639:     {
 1640:         liberation(s_etat_processus, s_objet_argument_1);
 1641: 
 1642:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1643:         return;
 1644:     }
 1645: 
 1646:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1647:             &s_objet_argument_3) == d_erreur)
 1648:     {
 1649:         liberation(s_etat_processus, s_objet_argument_1);
 1650:         liberation(s_etat_processus, s_objet_argument_2);
 1651: 
 1652:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1653:         return;
 1654:     }
 1655: 
 1656:     if (((*s_objet_argument_1).type == CHN) &&
 1657:             ((*s_objet_argument_2).type == CHN) &&
 1658:             ((*s_objet_argument_3).type == CHN))
 1659:     {
 1660:         if ((encodage_source = conversion_majuscule(s_etat_processus,
 1661:                 (unsigned char *) (*s_objet_argument_2).objet)) == NULL)
 1662:         {
 1663:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1664:             return;
 1665:         }
 1666: 
 1667:         if ((encodage_destination = conversion_majuscule(s_etat_processus,
 1668:                 (unsigned char *) (*s_objet_argument_1).objet)) == NULL)
 1669:         {
 1670:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1671:             return;
 1672:         }
 1673: 
 1674:         tampon = reencodage(s_etat_processus,
 1675:                 (*s_objet_argument_3).objet, encodage_source,
 1676:                 encodage_destination);
 1677: 
 1678:         free(encodage_destination);
 1679:         free(encodage_source);
 1680: 
 1681:         if (tampon == NULL)
 1682:         {
 1683:             liberation(s_etat_processus, s_objet_argument_1);
 1684:             liberation(s_etat_processus, s_objet_argument_2);
 1685:             liberation(s_etat_processus, s_objet_argument_3);
 1686:             return;
 1687:         }
 1688: 
 1689:         if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
 1690:         {
 1691:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1692:             return;
 1693:         }
 1694: 
 1695:         (*s_objet_resultat).objet = tampon;
 1696:     }
 1697:     else
 1698:     {
 1699:         liberation(s_etat_processus, s_objet_argument_1);
 1700:         liberation(s_etat_processus, s_objet_argument_2);
 1701:         liberation(s_etat_processus, s_objet_argument_3);
 1702: 
 1703:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1704:         return;
 1705:     }
 1706: 
 1707:     liberation(s_etat_processus, s_objet_argument_1);
 1708:     liberation(s_etat_processus, s_objet_argument_2);
 1709:     liberation(s_etat_processus, s_objet_argument_3);
 1710: 
 1711:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1712:             s_objet_resultat) == d_erreur)
 1713:     {
 1714:         return;
 1715:     }
 1716: 
 1717:     return;
 1718: }
 1719: 
 1720: 
 1721: /*
 1722: ================================================================================
 1723:   Fonction 'repl'
 1724: ================================================================================
 1725:   Entrées :
 1726: --------------------------------------------------------------------------------
 1727:   Sorties :
 1728: --------------------------------------------------------------------------------
 1729:   Effets de bord : néant
 1730: ================================================================================
 1731: */
 1732: 
 1733: void
 1734: instruction_repl(struct_processus *s_etat_processus)
 1735: {
 1736:     integer8                        difference;
 1737:     integer8                        difference_ecriture;
 1738:     integer8                        difference_lecture;
 1739:     integer8                        nombre_occurrences;
 1740:     integer8                        position;
 1741: 
 1742:     struct_liste_chainee            *l_element_a_supprimer;
 1743:     struct_liste_chainee            *l_element_courant;
 1744:     struct_liste_chainee            *l_element_courant_2;
 1745:     struct_liste_chainee            *l_element_precedent;
 1746:     struct_liste_chainee            *l_element_precedent_2;
 1747: 
 1748:     struct_objet                    *s_objet_argument_1;
 1749:     struct_objet                    *s_objet_argument_2;
 1750:     struct_objet                    *s_objet_argument_3;
 1751:     struct_objet                    *s_objet_intermediaire;
 1752:     struct_objet                    *s_objet_resultat;
 1753: 
 1754:     unsigned char                   *ancien_pointeur_ecriture;
 1755:     unsigned char                   *ancien_pointeur_lecture;
 1756:     unsigned char                   *pointeur_ecriture;
 1757:     unsigned char                   *pointeur_lecture;
 1758: 
 1759:     (*s_etat_processus).erreur_execution = d_ex;
 1760: 
 1761:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1762:     {
 1763:         printf("\n  REPL ");
 1764: 
 1765:         if ((*s_etat_processus).langue == 'F')
 1766:         {
 1767:             printf("(remplacement d'éléments dans une liste ou une chaîne"
 1768:                     ")\n\n");
 1769:         }
 1770:         else
 1771:         {
 1772:             printf("(replace elements in list or string)\n\n");
 1773:         }
 1774: 
 1775:         printf("    3: %s\n", d_LST);
 1776:         printf("    2: %s\n", d_INT);
 1777:         printf("    1: %s\n", d_LST);
 1778:         printf("->  1: %s\n\n", d_LST);
 1779: 
 1780:         printf("    3: %s\n", d_CHN);
 1781:         printf("    2: %s\n", d_CHN);
 1782:         printf("    1: %s\n", d_CHN);
 1783:         printf("->  1: %s\n\n", d_CHN);
 1784:         return;
 1785:     }
 1786:     else if ((*s_etat_processus).test_instruction == 'Y')
 1787:     {
 1788:         (*s_etat_processus).nombre_arguments = -1;
 1789:         return;
 1790:     }
 1791: 
 1792:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1793:     {
 1794:         if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
 1795:         {
 1796:             return;
 1797:         }
 1798:     }
 1799: 
 1800:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1801:             &s_objet_argument_1) == d_erreur)
 1802:     {
 1803:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1804:         return;
 1805:     }
 1806: 
 1807:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1808:             &s_objet_argument_2) == d_erreur)
 1809:     {
 1810:         liberation(s_etat_processus, s_objet_argument_1);
 1811: 
 1812:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1813:         return;
 1814:     }
 1815: 
 1816:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1817:             &s_objet_argument_3) == d_erreur)
 1818:     {
 1819:         liberation(s_etat_processus, s_objet_argument_1);
 1820:         liberation(s_etat_processus, s_objet_argument_2);
 1821: 
 1822:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1823:         return;
 1824:     }
 1825: 
 1826:     if (((*s_objet_argument_1).type == CHN) &&
 1827:             ((*s_objet_argument_2).type == CHN) &&
 1828:             ((*s_objet_argument_3).type == CHN))
 1829:     {
 1830:         if (strcmp((unsigned char *) (*s_objet_argument_2).objet, "") == 0)
 1831:         {
 1832:             liberation(s_etat_processus, s_objet_argument_1);
 1833:             liberation(s_etat_processus, s_objet_argument_2);
 1834:             liberation(s_etat_processus, s_objet_argument_3);
 1835: 
 1836:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1837:             return;
 1838:         }
 1839: 
 1840:         nombre_occurrences = 0;
 1841:         pointeur_lecture = (unsigned char *) (*s_objet_argument_3).objet;
 1842: 
 1843:         for(;;)
 1844:         {
 1845:             pointeur_lecture = strstr(pointeur_lecture, (unsigned char *)
 1846:                     (*s_objet_argument_2).objet);
 1847: 
 1848:             if (pointeur_lecture == NULL)
 1849:             {
 1850:                 break;
 1851:             }
 1852: 
 1853:             pointeur_lecture++;
 1854:             nombre_occurrences++;
 1855:         }
 1856: 
 1857:         // Différence est positive si la nouvelle chaîne est plus longue
 1858:         // que la chaîne originelle.
 1859: 
 1860:         difference = ((integer8) strlen((unsigned char *) (*s_objet_argument_1)
 1861:                 .objet)) - ((integer8) strlen((unsigned char *)
 1862:                 (*s_objet_argument_2).objet));
 1863: 
 1864:         if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
 1865:         {
 1866:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1867:             return;
 1868:         }
 1869: 
 1870:         if (((*s_objet_resultat).objet = malloc((strlen((unsigned char *)
 1871:                 (*s_objet_argument_3).objet) + ((size_t) (nombre_occurrences *
 1872:                 difference)) + 1) * sizeof(unsigned char))) == NULL)
 1873:         {
 1874:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1875:             return;
 1876:         }
 1877: 
 1878:         pointeur_lecture = (unsigned char *) (*s_objet_argument_3).objet;
 1879:         pointeur_ecriture = (unsigned char *) (*s_objet_resultat).objet;
 1880:         difference_lecture = (integer8) strlen((unsigned char *)
 1881:                 (*s_objet_argument_2).objet);
 1882:         difference_ecriture = (integer8) strlen((unsigned char *)
 1883:                 (*s_objet_argument_1).objet);
 1884: 
 1885:         for(;;)
 1886:         {
 1887:             ancien_pointeur_lecture = pointeur_lecture;
 1888:             ancien_pointeur_ecriture = pointeur_ecriture;
 1889: 
 1890:             pointeur_lecture = strstr(ancien_pointeur_lecture,
 1891:                     (unsigned char *) (*s_objet_argument_2).objet);
 1892: 
 1893:             if (pointeur_lecture == NULL)
 1894:             {
 1895:                 strcpy(ancien_pointeur_ecriture, ancien_pointeur_lecture);
 1896:                 break;
 1897:             }
 1898: 
 1899:             strncpy(ancien_pointeur_ecriture, ancien_pointeur_lecture,
 1900:                     (size_t) (pointeur_lecture - ancien_pointeur_lecture));
 1901:             strcpy(ancien_pointeur_ecriture +
 1902:                     (pointeur_lecture - ancien_pointeur_lecture),
 1903:                     (unsigned char *) (*s_objet_argument_1).objet);
 1904: 
 1905:             pointeur_ecriture += difference_ecriture +
 1906:                     (pointeur_lecture - ancien_pointeur_lecture);
 1907:             pointeur_lecture += difference_lecture;
 1908:         }
 1909:     }
 1910:     else if (((*s_objet_argument_1).type == LST) &&
 1911:             ((*s_objet_argument_2).type == INT) &&
 1912:             ((*s_objet_argument_3).type == LST))
 1913:     {
 1914:         if ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0)
 1915:         {
 1916:             liberation(s_etat_processus, s_objet_argument_1);
 1917:             liberation(s_etat_processus, s_objet_argument_2);
 1918:             liberation(s_etat_processus, s_objet_argument_3);
 1919: 
 1920:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
 1921:             return;
 1922:         }
 1923: 
 1924:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1925:                 s_objet_argument_3, 'N')) == NULL)
 1926:         {
 1927:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1928:             return;
 1929:         }
 1930: 
 1931:         l_element_courant =  (*s_objet_resultat).objet;
 1932:         l_element_precedent = NULL;
 1933:         position = 1;
 1934: 
 1935:         while(position < (*((integer8 *) (*s_objet_argument_2).objet)))
 1936:         {
 1937:             if (l_element_courant == NULL)
 1938:             {
 1939:                 liberation(s_etat_processus, s_objet_argument_1);
 1940:                 liberation(s_etat_processus, s_objet_argument_2);
 1941:                 liberation(s_etat_processus, s_objet_argument_3);
 1942:                 liberation(s_etat_processus, s_objet_resultat);
 1943: 
 1944:                 (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
 1945:                 return;
 1946:             }
 1947: 
 1948:             position++;
 1949:             l_element_precedent = l_element_courant;
 1950:             l_element_courant = (*l_element_courant).suivant;
 1951:         }
 1952: 
 1953:         l_element_a_supprimer = l_element_courant;
 1954: 
 1955:         if (l_element_courant == NULL)
 1956:         {
 1957:             liberation(s_etat_processus, s_objet_argument_1);
 1958:             liberation(s_etat_processus, s_objet_argument_2);
 1959:             liberation(s_etat_processus, s_objet_argument_3);
 1960:             liberation(s_etat_processus, s_objet_resultat);
 1961: 
 1962:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
 1963:             return;
 1964:         }
 1965: 
 1966:         if ((s_objet_intermediaire = copie_objet(s_etat_processus,
 1967:                 s_objet_argument_1, 'N')) == NULL)
 1968:         {
 1969:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1970:             return;
 1971:         }
 1972: 
 1973:         if (l_element_precedent == NULL)
 1974:         {
 1975:             (*s_objet_resultat).objet = (*s_objet_intermediaire).objet;
 1976:         }
 1977:         else
 1978:         {
 1979:             (*l_element_precedent).suivant = (*s_objet_intermediaire).objet;
 1980:         }
 1981: 
 1982:         // (*l_element_precedent).suivant contient le premier maillon
 1983:         // de la liste accrochée, l_element_a_supprimer est le premier maillons
 1984:         // à supprimer.
 1985: 
 1986:         l_element_courant = (*s_objet_intermediaire).objet;
 1987:         (*s_objet_intermediaire).objet = l_element_a_supprimer;
 1988: 
 1989:         l_element_courant_2 = l_element_a_supprimer;
 1990:         l_element_precedent_2 = NULL;
 1991: 
 1992:         for(;;)
 1993:         {
 1994:             if (l_element_courant == NULL)
 1995:             {
 1996:                 // La nouvelle liste est plus courte. On raboute les éléments
 1997:                 // restant de l'ancienne liste à la nouvelle.
 1998: 
 1999:                 if (l_element_precedent == NULL)
 2000:                 {
 2001:                     (*s_objet_resultat).objet = l_element_courant_2;
 2002:                 }
 2003:                 else
 2004:                 {
 2005:                     (*l_element_precedent).suivant = l_element_courant_2;
 2006:                 }
 2007: 
 2008:                 if (l_element_precedent_2 == NULL)
 2009:                 {
 2010:                     (*s_objet_intermediaire).objet = NULL;
 2011:                 }
 2012:                 else
 2013:                 {
 2014:                     (*l_element_precedent_2).suivant = NULL;
 2015:                 }
 2016: 
 2017:                 break;
 2018:             }
 2019: 
 2020:             if (l_element_courant_2 == NULL)
 2021:             {
 2022:                 // L'ancienne liste est plus courte.
 2023:                 break;
 2024:             }
 2025: 
 2026:             l_element_precedent = l_element_courant;
 2027:             l_element_precedent_2 = l_element_courant_2;
 2028:             l_element_courant = (*l_element_courant).suivant;
 2029:             l_element_courant_2 = (*l_element_courant_2).suivant;
 2030:         }
 2031: 
 2032:         liberation(s_etat_processus, s_objet_intermediaire);
 2033:     }
 2034:     else
 2035:     {
 2036:         liberation(s_etat_processus, s_objet_argument_1);
 2037:         liberation(s_etat_processus, s_objet_argument_2);
 2038:         liberation(s_etat_processus, s_objet_argument_3);
 2039: 
 2040:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2041:         return;
 2042:     }
 2043: 
 2044:     liberation(s_etat_processus, s_objet_argument_1);
 2045:     liberation(s_etat_processus, s_objet_argument_2);
 2046:     liberation(s_etat_processus, s_objet_argument_3);
 2047: 
 2048:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2049:             s_objet_resultat) == d_erreur)
 2050:     {
 2051:         return;
 2052:     }
 2053: 
 2054:     return;
 2055: }
 2056: 
 2057: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>