File:  [local] / rpl / src / instructions_r6.c
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Wed Apr 21 13:45:49 2010 UTC (14 years ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route pour la 4.0.15 !

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.15
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl.conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   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)) != 0)
  113:         {
  114:             (*s_etat_processus).erreur_systeme_processus_fils =
  115:                     d_es_processus;
  116:             return;
  117:         }
  118: 
  119:         l_element_courant = (struct_liste_chainee *)
  120:                 (*s_etat_processus).l_base_pile_processus;
  121:         nombre_donnees = -1;
  122: 
  123:         while(l_element_courant != NULL)
  124:         {
  125:             if ((*(*((struct_processus_fils *) (*s_objet_argument).objet))
  126:                     .thread).processus_detache == d_vrai)
  127:             {
  128:                 if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  129:                         .donnee).objet)).thread).processus_detache == d_faux)
  130:                 {
  131:                     l_element_courant = (*l_element_courant).suivant;
  132:                     continue;
  133:                 }
  134: 
  135:                 if ((*(*((struct_processus_fils *) (*s_objet_argument).objet))
  136:                         .thread).pid == (*(*((struct_processus_fils *)
  137:                         (*(*l_element_courant).donnee).objet)).thread).pid)
  138:                 {
  139:                     if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  140:                             (*s_objet_argument).objet)).thread).mutex)) != 0)
  141:                     {
  142:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  143:                         return;
  144:                     }
  145: 
  146:                     nombre_donnees = (*(*((struct_processus_fils *)
  147:                             (*(*l_element_courant).donnee).objet)).thread)
  148:                             .nombre_objets_dans_pipe;
  149: 
  150:                     if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  151:                             (*s_objet_argument).objet)).thread).mutex)) != 0)
  152:                     {
  153:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  154:                         return;
  155:                     }
  156: 
  157:                     break;
  158:                 }
  159:             }
  160:             else
  161:             {
  162:                 if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  163:                         .donnee).objet)).thread).processus_detache == d_vrai)
  164:                 {
  165:                     l_element_courant = (*l_element_courant).suivant;
  166:                     continue;
  167:                 }
  168: 
  169:                 if ((pthread_equal((*(*((struct_processus_fils *)
  170:                         (*s_objet_argument).objet)).thread).tid,
  171:                         (*(*((struct_processus_fils *) (*(*l_element_courant)
  172:                         .donnee).objet)).thread).tid) != 0) &&
  173:                         ((*(*((struct_processus_fils *)
  174:                         (*s_objet_argument).objet)).thread).pid ==
  175:                         (*(*((struct_processus_fils *) (*(*l_element_courant)
  176:                         .donnee).objet)).thread).pid))
  177:                 {
  178:                     if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  179:                             (*s_objet_argument).objet)).thread).mutex)) != 0)
  180:                     {
  181:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  182:                         return;
  183:                     }
  184: 
  185:                     nombre_donnees = (*(*((struct_processus_fils *)
  186:                             (*(*l_element_courant).donnee).objet)).thread)
  187:                             .nombre_objets_dans_pipe;
  188: 
  189:                     if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  190:                             (*s_objet_argument).objet)).thread).mutex)) != 0)
  191:                     {
  192:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  193:                         return;
  194:                     }
  195: 
  196:                     break;
  197:                 }
  198:             }
  199: 
  200:             l_element_courant = (*l_element_courant).suivant;
  201:         }
  202: 
  203:         /*
  204:          * 0  : aucune donnée dans le pipe du processus.
  205:          * -1 : processus absent de la pile
  206:          */
  207: 
  208:         if (nombre_donnees == -1)
  209:         {
  210:             if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
  211:             {
  212:                 (*s_etat_processus).erreur_systeme_processus_fils =
  213:                         d_es_processus;
  214:                 return;
  215:             }
  216: 
  217:             (*s_etat_processus).erreur_execution = d_ex_processus;
  218:             return;
  219:         }
  220:         else if (nombre_donnees == 0)
  221:         {
  222:             /*
  223:              * On empile une valeur nulle
  224:              */
  225: 
  226:             if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
  227:             {
  228:                 (*s_etat_processus).erreur_systeme_processus_fils =
  229:                         d_es_processus;
  230:                 return;
  231:             }
  232: 
  233:             if ((s_objet_resultat = allocation(s_etat_processus, INT))
  234:                     == NULL)
  235:             {
  236:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  237:                 return;
  238:             }
  239: 
  240:             (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  241: 
  242:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  243:                     s_objet_resultat) == d_erreur)
  244:             {
  245:                 return;
  246:             }
  247: 
  248:             liberation(s_etat_processus, s_objet_argument);
  249: 
  250:             return;
  251:         }
  252: 
  253:         registre_stop = (*s_etat_processus)
  254:                 .var_volatile_traitement_retarde_stop;
  255:         (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
  256: 
  257:         if ((*s_etat_processus).profilage == d_vrai)
  258:         {
  259:             profilage(s_etat_processus, "Interprocess or interthread "
  260:                     "communications (RECV)");
  261: 
  262:             if ((*s_etat_processus).erreur_systeme != d_es)
  263:             {
  264:                 return;
  265:             }
  266:         }
  267: 
  268: #       ifndef SEMAPHORES_NOMMES
  269:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  270:         {
  271:             (*s_etat_processus).erreur_systeme = d_es_processus;
  272:             return;
  273:         }
  274: #       else
  275:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  276:         {
  277:             (*s_etat_processus).erreur_systeme = d_es_processus;
  278:             return;
  279:         }
  280: #       endif
  281: 
  282:         if ((s_objet_resultat = lecture_pipe(s_etat_processus,
  283:                 (*(*((struct_processus_fils *) (*s_objet_argument).objet))
  284:                 .thread).pipe_objets[0])) == NULL)
  285:         {
  286: #           ifndef SEMAPHORES_NOMMES
  287:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  288: #           else
  289:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  290: #           endif
  291:             {
  292:                 if (errno != EINTR)
  293:                 {
  294:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  295:                     return;
  296:                 }
  297:             }
  298: 
  299:             if (registre_stop == 0)
  300:             {
  301:                 if ((*s_etat_processus).var_volatile_traitement_retarde_stop
  302:                         == -1)
  303:                 {
  304:                     (*s_etat_processus).var_volatile_requete_arret = -1;
  305:                 }
  306: 
  307:                 (*s_etat_processus).var_volatile_traitement_retarde_stop
  308:                         = registre_stop;
  309:             }
  310: 
  311:             if ((*s_etat_processus).profilage == d_vrai)
  312:             {
  313:                 profilage(s_etat_processus, NULL);
  314:             }
  315: 
  316:             pthread_mutex_unlock(&((*s_etat_processus).mutex));
  317:             return;
  318:         }
  319: 
  320: #       ifndef SEMAPHORES_NOMMES
  321:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  322: #       else
  323:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  324: #       endif
  325:         {
  326:             if (errno != EINTR)
  327:             {
  328:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  329:                 return;
  330:             }
  331:         }
  332: 
  333:         if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  334:                 (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0)
  335:         {
  336:             (*s_etat_processus).erreur_systeme = d_es_processus;
  337:             return;
  338:         }
  339: 
  340:         (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet))
  341:                 .thread).nombre_objets_dans_pipe--;
  342: 
  343:         if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  344:                 (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0)
  345:         {
  346:             (*s_etat_processus).erreur_systeme = d_es_processus;
  347:             return;
  348:         }
  349: 
  350:         action.sa_handler = SIG_IGN;
  351:         action.sa_flags = SA_ONSTACK;
  352: 
  353:         if (sigaction(SIGPIPE, &action, &registre) != 0)
  354:         {
  355:             if (registre_stop == 0)
  356:             {
  357:                 if ((*s_etat_processus).var_volatile_traitement_retarde_stop
  358:                         == -1)
  359:                 {
  360:                     (*s_etat_processus).var_volatile_requete_arret = -1;
  361:                 }
  362: 
  363:                 (*s_etat_processus).var_volatile_traitement_retarde_stop
  364:                         = registre_stop;
  365:             }
  366: 
  367:             pthread_mutex_unlock(&((*s_etat_processus).mutex));
  368: 
  369:             if ((*s_etat_processus).profilage == d_vrai)
  370:             {
  371:                 profilage(s_etat_processus, NULL);
  372:             }
  373: 
  374:             (*s_etat_processus).erreur_systeme = d_es_signal;
  375:             return;
  376:         }
  377: 
  378: #       ifndef SEMAPHORES_NOMMES
  379:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  380: #       else
  381:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  382: #       endif
  383:         {
  384:             (*s_etat_processus).erreur_systeme = d_es_processus;
  385:             return;
  386:         }
  387: 
  388:         while((longueur_ecriture = write_atomic(s_etat_processus,
  389:                 (*(*((struct_processus_fils *) (*(*l_element_courant)
  390:                 .donnee).objet)).thread).pipe_nombre_injections[1], "+",
  391:                 sizeof(unsigned char))) != sizeof(unsigned char))
  392:         {
  393:             if (longueur_ecriture == -1)
  394:             {
  395:                 // Le processus n'existe plus.
  396:                 break;
  397:             }
  398:         }
  399: 
  400: #       ifndef SEMAPHORES_NOMMES
  401:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  402: #       else
  403:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  404: #       endif
  405:         {
  406:             if (errno != EINTR)
  407:             {
  408:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  409:                 return;
  410:             }
  411:         }
  412: 
  413:         if ((*s_etat_processus).profilage == d_vrai)
  414:         {
  415:             profilage(s_etat_processus, NULL);
  416:         }
  417: 
  418:         if (registre_stop == 0)
  419:         {
  420:             if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
  421:             {
  422:                 (*s_etat_processus).var_volatile_requete_arret = -1;
  423:             }
  424: 
  425:             (*s_etat_processus).var_volatile_traitement_retarde_stop
  426:                     = registre_stop;
  427:         }
  428: 
  429:         if (sigaction(SIGPIPE, &registre, NULL) != 0)
  430:         {
  431:             pthread_mutex_unlock(&((*s_etat_processus).mutex));
  432: 
  433:             (*s_etat_processus).erreur_systeme = d_es_signal;
  434:             return;
  435:         }
  436: 
  437:         if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 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:     unsigned long               i;
  500:     unsigned long               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((*((struct_matrice *)
  573:                     (*s_objet_elementaire).objet)).nombre_colonnes *
  574:                     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((*((struct_matrice *)
  625:                     (*s_objet_elementaire).objet)).nombre_colonnes *
  626:                     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((*((struct_matrice *)
  677:                     (*s_objet_elementaire).objet)).nombre_colonnes *
  678:                     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 += (*((integer8 *) (*s_objet_argument).objet));
  801: 
  802:         if (horodatage.tv_sec < 0)
  803:         {
  804:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  805: 
  806:             liberation(s_etat_processus, s_objet_argument);
  807:             return;
  808:         }
  809: 
  810:         if ((s_objet = formateur_date(s_etat_processus, &horodatage)) == NULL)
  811:         {
  812:             liberation(s_etat_processus, s_objet_argument);
  813:             return;
  814:         }
  815: 
  816:         liberation(s_etat_processus, s_objet_argument);
  817:     }
  818:     else
  819:     {
  820:         liberation(s_etat_processus, s_objet_argument);
  821: 
  822:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  823:         return;
  824:     }
  825: 
  826:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  827:             s_objet) == d_erreur)
  828:     {
  829:         return;
  830:     }
  831: 
  832:     return;
  833: }
  834: 
  835: 
  836: /*
  837: ================================================================================
  838:   Fonction 'rclswi'
  839: ================================================================================
  840:   Entrées : pointeur sur une structure struct_processus
  841: --------------------------------------------------------------------------------
  842:   Sorties :
  843: --------------------------------------------------------------------------------
  844:   Effets de bord : néant
  845: ================================================================================
  846: */
  847: 
  848: void
  849: instruction_rclswi(struct_processus *s_etat_processus)
  850: {
  851:     integer8                        interruption;
  852: 
  853:     struct_objet                    *s_objet_argument;
  854:     struct_objet                    *s_objet_resultat;
  855: 
  856:     (*s_etat_processus).erreur_execution = d_ex;
  857: 
  858:     if ((*s_etat_processus).affichage_arguments == 'Y')
  859:     {
  860:         printf("\n  RCLSWI ");
  861: 
  862:         if ((*s_etat_processus).langue == 'F')
  863:         {
  864:             printf("(rappel d'une interruption logicielle)\n\n");
  865:         }
  866:         else
  867:         {
  868:             printf("(recall software interrupt)\n\n");
  869:         }
  870: 
  871:         printf("    1: %s\n", d_INT);
  872:         printf("->  1: %s, %s\n", d_NOM, d_RPN);
  873: 
  874:         return;
  875:     }
  876:     else if ((*s_etat_processus).test_instruction == 'Y')
  877:     {
  878:         (*s_etat_processus).nombre_arguments = -1;
  879:         return;
  880:     }
  881: 
  882:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  883:     {
  884:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  885:         {
  886:             return;
  887:         }
  888:     }
  889: 
  890:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  891:             &s_objet_argument) == d_erreur)
  892:     {
  893:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  894:         return;
  895:     }
  896: 
  897:     if ((*s_objet_argument).type == INT)
  898:     {
  899:         interruption = (*((integer8 *) (*s_objet_argument).objet));
  900: 
  901:         if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
  902:         {
  903:             liberation(s_etat_processus, s_objet_argument);
  904: 
  905:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
  906:             return;
  907:         }
  908: 
  909:         if ((*s_etat_processus).corps_interruptions[interruption - 1] == NULL)
  910:         {
  911:             liberation(s_etat_processus, s_objet_argument);
  912: 
  913:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
  914:             return;
  915:         }
  916: 
  917:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  918:                 (*s_etat_processus).corps_interruptions[interruption - 1], 'P'))
  919:                 == NULL)
  920:         {
  921:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  922:             return;
  923:         }
  924:     }
  925:     else
  926:     {
  927:         liberation(s_etat_processus, s_objet_argument);
  928: 
  929:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  930:         return;
  931:     }
  932: 
  933:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  934:             s_objet_resultat) == d_erreur)
  935:     {
  936:         return;
  937:     }
  938: 
  939:     return;
  940: }
  941: 
  942: 
  943: /*
  944: ================================================================================
  945:   Fonction 'revlist'
  946: ================================================================================
  947:   Entrées : pointeur sur une structure struct_processus
  948: --------------------------------------------------------------------------------
  949:   Sorties :
  950: --------------------------------------------------------------------------------
  951:   Effets de bord : néant
  952: ================================================================================
  953: */
  954: 
  955: void
  956: instruction_revlist(struct_processus *s_etat_processus)
  957: {
  958:     struct_liste_chainee            *l_ancienne_base;
  959:     struct_liste_chainee            *l_nouvelle_base;
  960: 
  961:     struct_objet                    *s_objet_argument;
  962:     struct_objet                    *s_objet_intermediaire;
  963:     struct_objet                    *s_objet_resultat;
  964: 
  965:     (*s_etat_processus).erreur_execution = d_ex;
  966: 
  967:     if ((*s_etat_processus).affichage_arguments == 'Y')
  968:     {
  969:         printf("\n  REVLIST ");
  970: 
  971:         if ((*s_etat_processus).langue == 'F')
  972:         {
  973:             printf("(inverse les éléments d'une liste)\n\n");
  974:         }
  975:         else
  976:         {
  977:             printf("(inverts list elements)\n\n");
  978:         }
  979: 
  980:         printf("    1: %s\n", d_LST);
  981:         printf("->  1: %s\n", d_LST);
  982: 
  983:         return;
  984:     }
  985:     else if ((*s_etat_processus).test_instruction == 'Y')
  986:     {
  987:         (*s_etat_processus).nombre_arguments = -1;
  988:         return;
  989:     }
  990: 
  991:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  992:     {
  993:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  994:         {
  995:             return;
  996:         }
  997:     }
  998: 
  999:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1000:             &s_objet_argument) == d_erreur)
 1001:     {
 1002:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1003:         return;
 1004:     }
 1005: 
 1006:     if ((*s_objet_argument).type == LST)
 1007:     {
 1008:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1009:                 s_objet_argument, 'N')) == NULL)
 1010:         {
 1011:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1012:             return;
 1013:         }
 1014: 
 1015:         l_ancienne_base = (*s_objet_resultat).objet;
 1016:         l_nouvelle_base = NULL;
 1017: 
 1018:         while(l_ancienne_base != NULL)
 1019:         {
 1020:             if (depilement(s_etat_processus, &l_ancienne_base,
 1021:                     &s_objet_intermediaire) == d_erreur)
 1022:             {
 1023:                 (*s_etat_processus).erreur_systeme = d_es_pile_vide;
 1024:                 return;
 1025:             }
 1026: 
 1027:             if (empilement(s_etat_processus, &l_nouvelle_base,
 1028:                     s_objet_intermediaire) == d_erreur)
 1029:             {
 1030:                 return;
 1031:             }
 1032:         }
 1033: 
 1034:         (*s_objet_resultat).objet = l_nouvelle_base;
 1035:     }
 1036:     else
 1037:     {
 1038:         liberation(s_etat_processus, s_objet_argument);
 1039: 
 1040:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1041:         return;
 1042:     }
 1043: 
 1044:     liberation(s_etat_processus, s_objet_argument);
 1045: 
 1046:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1047:             s_objet_resultat) == d_erreur)
 1048:     {
 1049:         return;
 1050:     }
 1051: 
 1052:     return;
 1053: }
 1054: 
 1055: 
 1056: /*
 1057: ================================================================================
 1058:   Fonction 'rstop'
 1059: ================================================================================
 1060:   Entrées :
 1061: --------------------------------------------------------------------------------
 1062:   Sorties :
 1063: --------------------------------------------------------------------------------
 1064:   Effets de bord : néant
 1065: ================================================================================
 1066: */
 1067: 
 1068: void
 1069: instruction_rstop(struct_processus *s_etat_processus)
 1070: {
 1071:     (*s_etat_processus).erreur_execution = d_ex;
 1072: 
 1073:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1074:     {
 1075:         printf("\n  RSTOP ");
 1076: 
 1077:         if ((*s_etat_processus).langue == 'F')
 1078:         {
 1079:             printf("(libère le signal stop)\n\n");
 1080:             printf("  Aucun argument\n");
 1081:         }
 1082:         else
 1083:         {
 1084:             printf("(release stop signal)\n\n");
 1085:             printf("  No argument\n");
 1086:         }
 1087: 
 1088:         return;
 1089:     }
 1090:     else if ((*s_etat_processus).test_instruction == 'Y')
 1091:     {
 1092:         (*s_etat_processus).nombre_arguments = -1;
 1093:         return;
 1094:     }
 1095: 
 1096:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1097:     {
 1098:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1099:         {
 1100:             return;
 1101:         }
 1102:     }
 1103: 
 1104:     if ((*s_etat_processus).var_volatile_traitement_retarde_stop == 0)
 1105:     {
 1106:         (*s_etat_processus).erreur_execution = d_ex_stop;
 1107:         return;
 1108:     }
 1109: 
 1110:     if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
 1111:     {
 1112:         (*s_etat_processus).var_volatile_requete_arret = -1;
 1113:     }
 1114: 
 1115:     (*s_etat_processus).var_volatile_traitement_retarde_stop = 0;
 1116: 
 1117:     return;
 1118: }
 1119: 
 1120: 
 1121: /*
 1122: ================================================================================
 1123:   fonction 'rfuse'
 1124: ================================================================================
 1125:   entrées :
 1126: --------------------------------------------------------------------------------
 1127:   sorties :
 1128: --------------------------------------------------------------------------------
 1129:   effets de bord : néant
 1130: ================================================================================
 1131: */
 1132: 
 1133: void
 1134: instruction_rfuse(struct_processus *s_etat_processus)
 1135: {
 1136:     struct_objet                *s_objet_resultat;
 1137: 
 1138:     (*s_etat_processus).erreur_execution = d_ex;
 1139: 
 1140:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1141:     {
 1142:         printf("\n  RFUSE ");
 1143: 
 1144:         if ((*s_etat_processus).langue == 'F')
 1145:         {
 1146:             printf("(valeur courante du fusible)\n\n");
 1147:         }
 1148:         else
 1149:         {
 1150:             printf("(remaining fuse value)\n\n");
 1151:         }
 1152: 
 1153:         printf("->  1: %s\n", d_REL);
 1154:         return;
 1155:     }
 1156:     else if ((*s_etat_processus).test_instruction == 'Y')
 1157:     {
 1158:         (*s_etat_processus).nombre_arguments = -1;
 1159:         return;
 1160:     }
 1161:     
 1162:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1163:     {
 1164:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1165:         {
 1166:             return;
 1167:         }
 1168:     }
 1169: 
 1170:     if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
 1171:     {
 1172:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1173:         return;
 1174:     }
 1175: 
 1176:     (*((real8 *) (*s_objet_resultat).objet)) =
 1177:             (*s_etat_processus).temps_maximal_cpu;
 1178: 
 1179:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1180:             s_objet_resultat) == d_erreur)
 1181:     {
 1182:         return;
 1183:     }
 1184: 
 1185:     return;
 1186: }
 1187: 
 1188: 
 1189: /*
 1190: ================================================================================
 1191:   fonction 'rdgn'
 1192: ================================================================================
 1193:   entrées :
 1194: --------------------------------------------------------------------------------
 1195:   sorties :
 1196: --------------------------------------------------------------------------------
 1197:   effets de bord : néant
 1198: ================================================================================
 1199: */
 1200: 
 1201: void
 1202: instruction_rdgn(struct_processus *s_etat_processus)
 1203: {
 1204:     const gsl_rng_type          **type_courant;
 1205:     const gsl_rng_type          **types;
 1206: 
 1207:     const unsigned char         *message = "UNINITIALIZED RANDOM GENERATOR";
 1208: 
 1209:     long                        dernier;
 1210:     long                        i;
 1211:     long                        j;
 1212:     long                        premier;
 1213: 
 1214:     struct_objet                *s_objet_argument;
 1215:     struct_objet                *s_objet_resultat;
 1216: 
 1217:     unsigned char               *requete;
 1218:     unsigned char               **types_generateurs;
 1219: 
 1220:     unsigned long               nombre_types;
 1221: 
 1222:     (*s_etat_processus).erreur_execution = d_ex;
 1223: 
 1224:     types = gsl_rng_types_setup();
 1225: 
 1226:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1227:     {
 1228:         printf("\n  RDGN ");
 1229: 
 1230:         if ((*s_etat_processus).langue == 'F')
 1231:         {
 1232:             printf("(choix du générateur de nombres aléatoires)\n\n");
 1233:         }
 1234:         else
 1235:         {
 1236:             printf("(random number generator specification)\n\n");
 1237:         }
 1238: 
 1239:         printf("    1: %s\n\n", d_CHN);
 1240: 
 1241:         printf("    1: \"QUERY\"\n");
 1242:         printf("->  1: %s\n\n", d_CHN);
 1243: 
 1244:         if ((*s_etat_processus).langue == 'F')
 1245:         {
 1246:             printf("  Générateurs disponibles :\n\n");
 1247:         }
 1248:         else
 1249:         {
 1250:             printf("  Available generators:\n\n");
 1251:         }
 1252: 
 1253:         for(nombre_types = 0, type_courant = types;
 1254:                 (*type_courant) != NULL; type_courant++, nombre_types++);
 1255: 
 1256:         if ((types_generateurs = malloc(nombre_types * sizeof(unsigned char *)))
 1257:                 == NULL)
 1258:         {
 1259:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1260:             return;
 1261:         }
 1262: 
 1263:         for(i = 0, type_courant = types; (*type_courant) != NULL;
 1264:                 type_courant++, i++)
 1265:         {
 1266:             if ((types_generateurs[i] = malloc((strlen((**type_courant).name)
 1267:                     + 1) * sizeof(unsigned char))) == NULL)
 1268:             {
 1269:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1270:                 return;
 1271:             }
 1272: 
 1273:             strcpy(types_generateurs[i], (**type_courant).name);
 1274:         }
 1275: 
 1276:         // Tri des types de générateurs (tri shaker)
 1277: 
 1278:         premier = 1;
 1279:         dernier = nombre_types - 2;
 1280: 
 1281:         while((dernier - premier) >= 2)
 1282:         {
 1283:             for(j = 2, i = premier; i <= dernier; i++)
 1284:             {
 1285:                 if (strcmp(types_generateurs[i], types_generateurs[i + 1]) > 0)
 1286:                 {
 1287:                     swap(&(types_generateurs[i]),
 1288:                             &(types_generateurs[i + 1]),
 1289:                             sizeof(unsigned char *));
 1290:                     j = i;
 1291:                 }
 1292:             }
 1293: 
 1294:             dernier = j;
 1295:             i = nombre_types - 2;
 1296: 
 1297:             for(i = dernier; i >= premier; i--)
 1298:             {
 1299:                 if (strcmp(types_generateurs[i - 1], types_generateurs[i]) > 0)
 1300:                 {
 1301:                     swap(&(types_generateurs[i - 1]),
 1302:                             &(types_generateurs[i]),
 1303:                             sizeof(unsigned char *));
 1304:                     j = i;
 1305:                 }
 1306:             }
 1307: 
 1308:             premier = j;
 1309:         }
 1310: 
 1311:         for(i = 0; i < (long) nombre_types; i++)
 1312:         {
 1313:             printf("  - %s\n", types_generateurs[i]);
 1314:             free(types_generateurs[i]);
 1315:         }
 1316: 
 1317:         free(types_generateurs);
 1318:         return;
 1319:     }
 1320:     else if ((*s_etat_processus).test_instruction == 'Y')
 1321:     {
 1322:         (*s_etat_processus).nombre_arguments = -1;
 1323:         return;
 1324:     }
 1325: 
 1326:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1327:     {
 1328:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1329:         {
 1330:             return;
 1331:         }
 1332:     }
 1333: 
 1334:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1335:             &s_objet_argument) == d_erreur)
 1336:     {
 1337:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1338:         return;
 1339:     }
 1340: 
 1341:     if ((*s_objet_argument).type == CHN)
 1342:     {
 1343:         if ((requete = conversion_majuscule((unsigned char *)
 1344:                 (*s_objet_argument).objet)) == NULL)
 1345:         {
 1346:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1347:             return;
 1348:         }
 1349: 
 1350:         if (strcmp(requete, "QUERY") == 0)
 1351:         {
 1352:             /*
 1353:              * Récupération du type du générateur
 1354:              */
 1355: 
 1356:             free(requete);
 1357: 
 1358:             if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
 1359:             {
 1360:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1361:                 return;
 1362:             }
 1363: 
 1364:             if ((*s_etat_processus).type_generateur_aleatoire == NULL)
 1365:             {
 1366:                 if (((*s_objet_resultat).objet = malloc((strlen(message) + 1) *
 1367:                         sizeof(unsigned char))) == NULL)
 1368:                 {
 1369:                     (*s_etat_processus).erreur_systeme =
 1370:                             d_es_allocation_memoire;
 1371:                     return;
 1372:                 }
 1373: 
 1374:                 strcpy((unsigned char *) (*s_objet_resultat).objet, message);
 1375:             }
 1376:             else
 1377:             {
 1378:                 if (((*s_objet_resultat).objet = conversion_majuscule(
 1379:                         (unsigned char *) gsl_rng_name(
 1380:                         (*s_etat_processus).generateur_aleatoire))) == NULL)
 1381:                 {
 1382:                     (*s_etat_processus).erreur_systeme =
 1383:                             d_es_allocation_memoire;
 1384:                     return;
 1385:                 }
 1386:             }
 1387: 
 1388:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1389:                     s_objet_resultat) == d_erreur)
 1390:             {
 1391:                 return;
 1392:             }
 1393:         }
 1394:         else
 1395:         {
 1396:             /*
 1397:              * Affectation d'un nouveau type de générateur
 1398:              */
 1399: 
 1400: #           include "generateurs.c"
 1401: 
 1402:             free(requete);
 1403: 
 1404:             if ((*s_etat_processus).generateur_aleatoire != NULL)
 1405:             {
 1406:                 liberation_generateur_aleatoire(s_etat_processus);
 1407:             }
 1408: 
 1409:             initialisation_generateur_aleatoire(s_etat_processus, d_vrai, 0);
 1410:         }
 1411:     }
 1412:     else
 1413:     {
 1414:         liberation(s_etat_processus, s_objet_argument);
 1415: 
 1416:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1417:         return;
 1418:     }
 1419: 
 1420:     liberation(s_etat_processus, s_objet_argument);
 1421: 
 1422:     return;
 1423: }
 1424: 
 1425: 
 1426: /*
 1427: ================================================================================
 1428:   fonction 'rank'
 1429: ================================================================================
 1430:   entrées :
 1431: --------------------------------------------------------------------------------
 1432:   sorties :
 1433: --------------------------------------------------------------------------------
 1434:   effets de bord : néant
 1435: ================================================================================
 1436: */
 1437: 
 1438: void
 1439: instruction_rank(struct_processus *s_etat_processus)
 1440: {
 1441:     struct_objet                    *s_objet_argument;
 1442:     struct_objet                    *s_objet_resultat;
 1443: 
 1444:     (*s_etat_processus).erreur_execution = d_ex;
 1445: 
 1446:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1447:     {
 1448:         printf("\n  RANK ");
 1449: 
 1450:         if ((*s_etat_processus).langue == 'F')
 1451:         {
 1452:             printf("(rang de la matrice)\n\n");
 1453:         }
 1454:         else
 1455:         {
 1456:             printf("(matrix rank)\n\n");
 1457:         }
 1458: 
 1459:         printf("    1: %s, %s, %s\n", d_MIN, d_REL, d_MCX);
 1460:         printf("->  1: %s\n", d_INT);
 1461: 
 1462:         return;
 1463:     }
 1464:     else if ((*s_etat_processus).test_instruction == 'Y')
 1465:     {
 1466:         (*s_etat_processus).nombre_arguments = -1;
 1467:         return;
 1468:     }
 1469: 
 1470:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1471:     {
 1472:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1473:         {
 1474:             return;
 1475:         }
 1476:     }
 1477: 
 1478:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1479:             &s_objet_argument) == d_erreur)
 1480:     {
 1481:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1482:         return;
 1483:     }
 1484: 
 1485:     if (((*s_objet_argument).type == MIN) ||
 1486:             ((*s_objet_argument).type == MRL) ||
 1487:             ((*s_objet_argument).type == MCX))
 1488:     {
 1489:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1490:         {
 1491:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1492:             return;
 1493:         }
 1494: 
 1495:         rang(s_etat_processus, (*s_objet_argument).objet,
 1496:                 (*s_objet_resultat).objet);
 1497: 
 1498:         if ((*s_etat_processus).erreur_systeme != d_es)
 1499:         {
 1500:             return;
 1501:         }
 1502: 
 1503:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1504:                 ((*s_etat_processus).exception != d_ep))
 1505:         {
 1506:             liberation(s_etat_processus, s_objet_argument);
 1507:             liberation(s_etat_processus, s_objet_resultat);
 1508:             return;
 1509:         }
 1510:     }
 1511:     else
 1512:     {
 1513:         liberation(s_etat_processus, s_objet_argument);
 1514: 
 1515:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1516:         return;
 1517:     }
 1518: 
 1519:     liberation(s_etat_processus, s_objet_argument);
 1520: 
 1521:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1522:             s_objet_resultat) == d_erreur)
 1523:     {
 1524:         return;
 1525:     }
 1526: 
 1527:     return;
 1528: }
 1529: 
 1530: 
 1531: /*
 1532: ================================================================================
 1533:   Fonction 'recode'
 1534: ================================================================================
 1535:   Entrées :
 1536: --------------------------------------------------------------------------------
 1537:   Sorties :
 1538: --------------------------------------------------------------------------------
 1539:   Effets de bord : néant
 1540: ================================================================================
 1541: */
 1542: 
 1543: void
 1544: instruction_recode(struct_processus *s_etat_processus)
 1545: {
 1546:     struct_objet                    *s_objet_argument_1;
 1547:     struct_objet                    *s_objet_argument_2;
 1548:     struct_objet                    *s_objet_argument_3;
 1549:     struct_objet                    *s_objet_resultat;
 1550: 
 1551:     unsigned char                   *encodage_destination;
 1552:     unsigned char                   *encodage_source;
 1553:     unsigned char                   *tampon;
 1554: 
 1555:     (*s_etat_processus).erreur_execution = d_ex;
 1556: 
 1557:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1558:     {
 1559:         printf("\n  RECODE ");
 1560: 
 1561:         if ((*s_etat_processus).langue == 'F')
 1562:         {
 1563:             printf("(conversion d'encodage d'une chaîne de caractères)\n\n");
 1564:         }
 1565:         else
 1566:         {
 1567:             printf("(string recodage)\n\n");
 1568:         }
 1569: 
 1570:         printf("    3: %s\n", d_CHN);
 1571:         printf("    2: %s\n", d_CHN);
 1572:         printf("    1: %s\n", d_CHN);
 1573:         printf("->  1: %s\n\n", d_CHN);
 1574: 
 1575:         if ((*s_etat_processus).langue == 'F')
 1576:         {
 1577:             printf("  Utilisation :\n\n");
 1578:         }
 1579:         else
 1580:         {
 1581:             printf("  Usage:\n\n");
 1582:         }
 1583: 
 1584:         printf("    \"string\" \"ISO8859-1\" \"UTF-8\" recode\n");
 1585:         printf("    \"string\" \"ISO8859-1\" \"UTF-8//TRANSLIT\" recode\n");
 1586:         printf("    \"string\" \"ISO8859-1\" \"UTF-8//IGNORE\" recode\n");
 1587:         return;
 1588:     }
 1589:     else if ((*s_etat_processus).test_instruction == 'Y')
 1590:     {
 1591:         (*s_etat_processus).nombre_arguments = -1;
 1592:         return;
 1593:     }
 1594: 
 1595:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1596:     {
 1597:         if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
 1598:         {
 1599:             return;
 1600:         }
 1601:     }
 1602: 
 1603:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1604:             &s_objet_argument_1) == d_erreur)
 1605:     {
 1606:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1607:         return;
 1608:     }
 1609: 
 1610:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1611:             &s_objet_argument_2) == d_erreur)
 1612:     {
 1613:         liberation(s_etat_processus, s_objet_argument_1);
 1614: 
 1615:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1616:         return;
 1617:     }
 1618: 
 1619:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1620:             &s_objet_argument_3) == d_erreur)
 1621:     {
 1622:         liberation(s_etat_processus, s_objet_argument_1);
 1623:         liberation(s_etat_processus, s_objet_argument_2);
 1624: 
 1625:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1626:         return;
 1627:     }
 1628: 
 1629:     if (((*s_objet_argument_1).type == CHN) &&
 1630:             ((*s_objet_argument_2).type == CHN) &&
 1631:             ((*s_objet_argument_3).type == CHN))
 1632:     {
 1633:         if ((encodage_source = conversion_majuscule((unsigned char *)
 1634:                 (*s_objet_argument_2).objet)) == NULL)
 1635:         {
 1636:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1637:             return;
 1638:         }
 1639: 
 1640:         if ((encodage_destination = conversion_majuscule((unsigned char *)
 1641:                 (*s_objet_argument_1).objet)) == NULL)
 1642:         {
 1643:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1644:             return;
 1645:         }
 1646: 
 1647:         tampon = reencodage(s_etat_processus,
 1648:                 (*s_objet_argument_3).objet, encodage_source,
 1649:                 encodage_destination);
 1650: 
 1651:         free(encodage_destination);
 1652:         free(encodage_source);
 1653: 
 1654:         if (tampon == NULL)
 1655:         {
 1656:             liberation(s_etat_processus, s_objet_argument_1);
 1657:             liberation(s_etat_processus, s_objet_argument_2);
 1658:             liberation(s_etat_processus, s_objet_argument_3);
 1659:             return;
 1660:         }
 1661: 
 1662:         if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
 1663:         {
 1664:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1665:             return;
 1666:         }
 1667: 
 1668:         (*s_objet_resultat).objet = tampon;
 1669:     }
 1670:     else
 1671:     {
 1672:         liberation(s_etat_processus, s_objet_argument_1);
 1673:         liberation(s_etat_processus, s_objet_argument_2);
 1674:         liberation(s_etat_processus, s_objet_argument_3);
 1675: 
 1676:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1677:         return;
 1678:     }
 1679: 
 1680:     liberation(s_etat_processus, s_objet_argument_1);
 1681:     liberation(s_etat_processus, s_objet_argument_2);
 1682:     liberation(s_etat_processus, s_objet_argument_3);
 1683: 
 1684:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1685:             s_objet_resultat) == d_erreur)
 1686:     {
 1687:         return;
 1688:     }
 1689: 
 1690:     return;
 1691: }
 1692: 
 1693: 
 1694: /*
 1695: ================================================================================
 1696:   Fonction 'repl'
 1697: ================================================================================
 1698:   Entrées :
 1699: --------------------------------------------------------------------------------
 1700:   Sorties :
 1701: --------------------------------------------------------------------------------
 1702:   Effets de bord : néant
 1703: ================================================================================
 1704: */
 1705: 
 1706: void
 1707: instruction_repl(struct_processus *s_etat_processus)
 1708: {
 1709:     integer8                        position;
 1710: 
 1711:     long                            difference;
 1712:     long                            difference_ecriture;
 1713:     long                            difference_lecture;
 1714:     long                            nombre_occurrences;
 1715: 
 1716:     struct_liste_chainee            *l_element_a_supprimer;
 1717:     struct_liste_chainee            *l_element_courant;
 1718:     struct_liste_chainee            *l_element_courant_2;
 1719:     struct_liste_chainee            *l_element_precedent;
 1720:     struct_liste_chainee            *l_element_precedent_2;
 1721: 
 1722:     struct_objet                    *s_objet_argument_1;
 1723:     struct_objet                    *s_objet_argument_2;
 1724:     struct_objet                    *s_objet_argument_3;
 1725:     struct_objet                    *s_objet_intermediaire;
 1726:     struct_objet                    *s_objet_resultat;
 1727: 
 1728:     unsigned char                   *ancien_pointeur_ecriture;
 1729:     unsigned char                   *ancien_pointeur_lecture;
 1730:     unsigned char                   *pointeur_ecriture;
 1731:     unsigned char                   *pointeur_lecture;
 1732: 
 1733:     (*s_etat_processus).erreur_execution = d_ex;
 1734: 
 1735:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1736:     {
 1737:         printf("\n  REPL ");
 1738: 
 1739:         if ((*s_etat_processus).langue == 'F')
 1740:         {
 1741:             printf("(remplacement d'éléments dans une liste ou une chaîne"
 1742:                     ")\n\n");
 1743:         }
 1744:         else
 1745:         {
 1746:             printf("(replace elements in list or string)\n\n");
 1747:         }
 1748: 
 1749:         printf("    3: %s\n", d_LST);
 1750:         printf("    2: %s\n", d_INT);
 1751:         printf("    1: %s\n", d_LST);
 1752:         printf("->  1: %s\n\n", d_LST);
 1753: 
 1754:         printf("    3: %s\n", d_CHN);
 1755:         printf("    2: %s\n", d_CHN);
 1756:         printf("    1: %s\n", d_CHN);
 1757:         printf("->  1: %s\n\n", d_CHN);
 1758:         return;
 1759:     }
 1760:     else if ((*s_etat_processus).test_instruction == 'Y')
 1761:     {
 1762:         (*s_etat_processus).nombre_arguments = -1;
 1763:         return;
 1764:     }
 1765: 
 1766:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1767:     {
 1768:         if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
 1769:         {
 1770:             return;
 1771:         }
 1772:     }
 1773: 
 1774:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1775:             &s_objet_argument_1) == d_erreur)
 1776:     {
 1777:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1778:         return;
 1779:     }
 1780: 
 1781:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1782:             &s_objet_argument_2) == d_erreur)
 1783:     {
 1784:         liberation(s_etat_processus, s_objet_argument_1);
 1785: 
 1786:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1787:         return;
 1788:     }
 1789: 
 1790:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1791:             &s_objet_argument_3) == d_erreur)
 1792:     {
 1793:         liberation(s_etat_processus, s_objet_argument_1);
 1794:         liberation(s_etat_processus, s_objet_argument_2);
 1795: 
 1796:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1797:         return;
 1798:     }
 1799: 
 1800:     if (((*s_objet_argument_1).type == CHN) &&
 1801:             ((*s_objet_argument_2).type == CHN) &&
 1802:             ((*s_objet_argument_3).type == CHN))
 1803:     {
 1804:         if (strcmp((unsigned char *) (*s_objet_argument_2).objet, "") == 0)
 1805:         {
 1806:             liberation(s_etat_processus, s_objet_argument_1);
 1807:             liberation(s_etat_processus, s_objet_argument_2);
 1808:             liberation(s_etat_processus, s_objet_argument_3);
 1809: 
 1810:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1811:             return;
 1812:         }
 1813: 
 1814:         nombre_occurrences = 0;
 1815:         pointeur_lecture = (unsigned char *) (*s_objet_argument_3).objet;
 1816: 
 1817:         for(;;)
 1818:         {
 1819:             pointeur_lecture = strstr(pointeur_lecture, (unsigned char *)
 1820:                     (*s_objet_argument_2).objet);
 1821: 
 1822:             if (pointeur_lecture == NULL)
 1823:             {
 1824:                 break;
 1825:             }
 1826: 
 1827:             pointeur_lecture++;
 1828:             nombre_occurrences++;
 1829:         }
 1830: 
 1831:         // Différence est positive si la nouvelle chaîne est plus longue
 1832:         // que la chaîne originelle.
 1833: 
 1834:         difference = strlen((unsigned char *) (*s_objet_argument_1).objet)
 1835:                 - strlen((unsigned char *) (*s_objet_argument_2).objet);
 1836: 
 1837:         if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
 1838:         {
 1839:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1840:             return;
 1841:         }
 1842: 
 1843:         if (((*s_objet_resultat).objet = malloc((strlen((unsigned char *)
 1844:                 (*s_objet_argument_3).objet) + (nombre_occurrences *
 1845:                 difference) + 1) * sizeof(unsigned char))) == NULL)
 1846:         {
 1847:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1848:             return;
 1849:         }
 1850: 
 1851:         pointeur_lecture = (unsigned char *) (*s_objet_argument_3).objet;
 1852:         pointeur_ecriture = (unsigned char *) (*s_objet_resultat).objet;
 1853:         difference_lecture = strlen((unsigned char *)
 1854:                 (*s_objet_argument_2).objet);
 1855:         difference_ecriture = strlen((unsigned char *)
 1856:                 (*s_objet_argument_1).objet);
 1857: 
 1858:         for(;;)
 1859:         {
 1860:             ancien_pointeur_lecture = pointeur_lecture;
 1861:             ancien_pointeur_ecriture = pointeur_ecriture;
 1862: 
 1863:             pointeur_lecture = strstr(ancien_pointeur_lecture,
 1864:                     (unsigned char *) (*s_objet_argument_2).objet);
 1865: 
 1866:             if (pointeur_lecture == NULL)
 1867:             {
 1868:                 strcpy(ancien_pointeur_ecriture, ancien_pointeur_lecture);
 1869:                 break;
 1870:             }
 1871: 
 1872:             strncpy(ancien_pointeur_ecriture, ancien_pointeur_lecture,
 1873:                     pointeur_lecture - ancien_pointeur_lecture);
 1874:             strcpy(ancien_pointeur_ecriture +
 1875:                     (pointeur_lecture - ancien_pointeur_lecture),
 1876:                     (unsigned char *) (*s_objet_argument_1).objet);
 1877: 
 1878:             pointeur_ecriture += difference_ecriture +
 1879:                     (pointeur_lecture - ancien_pointeur_lecture);
 1880:             pointeur_lecture += difference_lecture;
 1881:         }
 1882:     }
 1883:     else if (((*s_objet_argument_1).type == LST) &&
 1884:             ((*s_objet_argument_2).type == INT) &&
 1885:             ((*s_objet_argument_3).type == LST))
 1886:     {
 1887:         if ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0)
 1888:         {
 1889:             liberation(s_etat_processus, s_objet_argument_1);
 1890:             liberation(s_etat_processus, s_objet_argument_2);
 1891:             liberation(s_etat_processus, s_objet_argument_3);
 1892: 
 1893:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
 1894:             return;
 1895:         }
 1896: 
 1897:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1898:                 s_objet_argument_3, 'N')) == NULL)
 1899:         {
 1900:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1901:             return;
 1902:         }
 1903: 
 1904:         l_element_courant =  (*s_objet_resultat).objet;
 1905:         l_element_precedent = NULL;
 1906:         position = 1;
 1907: 
 1908:         while(position < (*((integer8 *) (*s_objet_argument_2).objet)))
 1909:         {
 1910:             if (l_element_courant == NULL)
 1911:             {
 1912:                 liberation(s_etat_processus, s_objet_argument_1);
 1913:                 liberation(s_etat_processus, s_objet_argument_2);
 1914:                 liberation(s_etat_processus, s_objet_argument_3);
 1915:                 liberation(s_etat_processus, s_objet_resultat);
 1916: 
 1917:                 (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
 1918:                 return;
 1919:             }
 1920: 
 1921:             position++;
 1922:             l_element_precedent = l_element_courant;
 1923:             l_element_courant = (*l_element_courant).suivant;
 1924:         }
 1925: 
 1926:         l_element_a_supprimer = l_element_courant;
 1927: 
 1928:         if (l_element_courant == NULL)
 1929:         {
 1930:             liberation(s_etat_processus, s_objet_argument_1);
 1931:             liberation(s_etat_processus, s_objet_argument_2);
 1932:             liberation(s_etat_processus, s_objet_argument_3);
 1933:             liberation(s_etat_processus, s_objet_resultat);
 1934: 
 1935:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
 1936:             return;
 1937:         }
 1938: 
 1939:         if ((s_objet_intermediaire = copie_objet(s_etat_processus,
 1940:                 s_objet_argument_1, 'N')) == NULL)
 1941:         {
 1942:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1943:             return;
 1944:         }
 1945: 
 1946:         if (l_element_precedent == NULL)
 1947:         {
 1948:             (*s_objet_resultat).objet = (*s_objet_intermediaire).objet;
 1949:         }
 1950:         else
 1951:         {
 1952:             (*l_element_precedent).suivant = (*s_objet_intermediaire).objet;
 1953:         }
 1954: 
 1955:         // (*l_element_precedent).suivant contient le premier maillon
 1956:         // de la liste accrochée, l_element_a_supprimer est le premier maillons
 1957:         // à supprimer.
 1958: 
 1959:         l_element_courant = (*s_objet_intermediaire).objet;
 1960:         (*s_objet_intermediaire).objet = l_element_a_supprimer;
 1961: 
 1962:         l_element_courant_2 = l_element_a_supprimer;
 1963:         l_element_precedent_2 = NULL;
 1964: 
 1965:         for(;;)
 1966:         {
 1967:             if (l_element_courant == NULL)
 1968:             {
 1969:                 // La nouvelle liste est plus courte. On raboute les éléments
 1970:                 // restant de l'ancienne liste à la nouvelle.
 1971: 
 1972:                 if (l_element_precedent == NULL)
 1973:                 {
 1974:                     (*s_objet_resultat).objet = l_element_courant_2;
 1975:                 }
 1976:                 else
 1977:                 {
 1978:                     (*l_element_precedent).suivant = l_element_courant_2;
 1979:                 }
 1980: 
 1981:                 if (l_element_precedent_2 == NULL)
 1982:                 {
 1983:                     (*s_objet_intermediaire).objet = NULL;
 1984:                 }
 1985:                 else
 1986:                 {
 1987:                     (*l_element_precedent_2).suivant = NULL;
 1988:                 }
 1989: 
 1990:                 break;
 1991:             }
 1992: 
 1993:             if (l_element_courant_2 == NULL)
 1994:             {
 1995:                 // L'ancienne liste est plus courte.
 1996:                 break;
 1997:             }
 1998: 
 1999:             l_element_precedent = l_element_courant;
 2000:             l_element_precedent_2 = l_element_courant_2;
 2001:             l_element_courant = (*l_element_courant).suivant;
 2002:             l_element_courant_2 = (*l_element_courant_2).suivant;
 2003:         }
 2004: 
 2005:         liberation(s_etat_processus, s_objet_intermediaire);
 2006:     }
 2007:     else
 2008:     {
 2009:         liberation(s_etat_processus, s_objet_argument_1);
 2010:         liberation(s_etat_processus, s_objet_argument_2);
 2011:         liberation(s_etat_processus, s_objet_argument_3);
 2012: 
 2013:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2014:         return;
 2015:     }
 2016: 
 2017:     liberation(s_etat_processus, s_objet_argument_1);
 2018:     liberation(s_etat_processus, s_objet_argument_2);
 2019:     liberation(s_etat_processus, s_objet_argument_3);
 2020: 
 2021:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2022:             s_objet_resultat) == d_erreur)
 2023:     {
 2024:         return;
 2025:     }
 2026: 
 2027:     return;
 2028: }
 2029: 
 2030: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>