File:  [local] / rpl / src / instructions_r6.c
Revision 1.65: download - view: text, annotated - select for diffs - revision graph
Thu Nov 26 11:44:39 2015 UTC (8 years, 5 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_24, HEAD
Mise à jour de Lapack (3.6.0) et du numéro de version du RPL/2.

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

CVSweb interface <joel.bertrand@systella.fr>