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

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.32
    4:   Copyright (C) 1989-2020 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'trn'
   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_trn(struct_processus *s_etat_processus)
   40: {
   41:     struct_objet                        *s_objet_argument;
   42:     struct_objet                        *s_objet_resultat;
   43: 
   44:     logical1                            argument_nom;
   45:     logical1                            variable_partagee;
   46: 
   47:     integer8                            i;
   48:     integer8                            j;
   49: 
   50:     (*s_etat_processus).erreur_execution = d_ex;
   51: 
   52:     if ((*s_etat_processus).affichage_arguments == 'Y')
   53:     {
   54:         printf("\n  TRN ");
   55: 
   56:         if ((*s_etat_processus).langue == 'F')
   57:         {
   58:             printf("(transposition)\n\n");
   59:         }
   60:         else
   61:         {
   62:             printf("(transposition)\n\n");
   63:         }
   64: 
   65:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
   66:         printf("->  1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
   67: 
   68:         printf("    1: %s\n", d_NOM);
   69: 
   70:         return;
   71:     }
   72:     else if ((*s_etat_processus).test_instruction == 'Y')
   73:     {
   74:         (*s_etat_processus).nombre_arguments = -1;
   75:         return;
   76:     }
   77: 
   78:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   79:     {
   80:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   81:         {
   82:             return;
   83:         }
   84:     }
   85: 
   86:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
   87:             &s_objet_argument) == d_erreur)
   88:     {
   89:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
   90:         return;
   91:     }
   92: 
   93:     variable_partagee = d_faux;
   94: 
   95:     if ((*s_objet_argument).type == NOM)
   96:     {
   97:         argument_nom = d_vrai;
   98: 
   99:         if (recherche_variable(s_etat_processus, (*((struct_nom *)
  100:                 (*s_objet_argument).objet)).nom) == d_faux)
  101:         {
  102:             (*s_etat_processus).erreur_systeme = d_es;
  103:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
  104: 
  105:             liberation(s_etat_processus, s_objet_argument);
  106: 
  107:             return;
  108:         }
  109: 
  110:         liberation(s_etat_processus, s_objet_argument);
  111: 
  112:         if ((*(*s_etat_processus).pointeur_variable_courante)
  113:                 .variable_verrouillee == d_vrai)
  114:         {
  115:             (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
  116:             return;
  117:         }
  118: 
  119:         if ((*(*s_etat_processus).pointeur_variable_courante).objet != NULL)
  120:         {
  121:             s_objet_argument = (*(*s_etat_processus).pointeur_variable_courante)
  122:                     .objet;
  123:         }
  124:         else
  125:         {
  126:             if (recherche_variable_partagee(s_etat_processus,
  127:                     (*(*s_etat_processus).pointeur_variable_courante).nom,
  128:                     (*(*s_etat_processus).pointeur_variable_courante)
  129:                     .variable_partagee, (*(*s_etat_processus)
  130:                     .pointeur_variable_courante).origine) == NULL)
  131:             {
  132:                 (*s_etat_processus).erreur_systeme = d_es;
  133:                 (*s_etat_processus).erreur_execution =
  134:                         d_ex_variable_non_definie;
  135: 
  136:                 liberation(s_etat_processus, s_objet_argument);
  137: 
  138:                 return;
  139:             }
  140: 
  141:             variable_partagee = d_vrai;
  142:         }
  143:     }
  144:     else
  145:     {
  146:         argument_nom = d_faux;
  147:     }
  148: 
  149: /*
  150: --------------------------------------------------------------------------------
  151:   Matrice transposée d'une matrice entière
  152: --------------------------------------------------------------------------------
  153:  */
  154: 
  155:     if ((*s_objet_argument).type == MIN)
  156:     {
  157:         if ((s_objet_resultat = allocation(s_etat_processus, MIN)) == NULL)
  158:         {
  159:             if (variable_partagee == d_vrai)
  160:             {
  161:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  162:                         .pointeur_variable_partagee_courante).mutex)) != 0)
  163:                 {
  164:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  165:                     return;
  166:                 }
  167:             }
  168: 
  169:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  170:             return;
  171:         }
  172: 
  173:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
  174:                 (*((struct_matrice *) (*s_objet_argument).objet))
  175:                 .nombre_colonnes;
  176:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
  177:                 (*((struct_matrice *) (*s_objet_argument).objet))
  178:                 .nombre_lignes;
  179: 
  180:         if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
  181:                 malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat)
  182:                 .objet)).nombre_lignes) * sizeof(integer8 *))) == NULL)
  183:         {
  184:             if (variable_partagee == d_vrai)
  185:             {
  186:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  187:                         .pointeur_variable_partagee_courante).mutex)) != 0)
  188:                 {
  189:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  190:                     return;
  191:                 }
  192:             }
  193: 
  194:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  195:             return;
  196:         }
  197: 
  198:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
  199:                 .nombre_lignes; i++)
  200:         {
  201:             if ((((integer8 **) (*((struct_matrice *) (*s_objet_resultat)
  202:                     .objet)).tableau)[i] = malloc(((size_t)
  203:                     (*((struct_matrice *) (*s_objet_resultat).objet))
  204:                     .nombre_colonnes) * sizeof(integer8))) == NULL)
  205:             {
  206:                 if (variable_partagee == d_vrai)
  207:                 {
  208:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  209:                             .pointeur_variable_partagee_courante).mutex)) != 0)
  210:                     {
  211:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  212:                         return;
  213:                     }
  214:                 }
  215: 
  216:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  217:                 return;
  218:             }
  219: 
  220:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
  221:                     .nombre_colonnes; j++)
  222:             {
  223:                 ((integer8 **) (*((struct_matrice *) (*s_objet_resultat)
  224:                         .objet)).tableau)[i][j] =
  225:                         ((integer8 **) (*((struct_matrice *)
  226:                         (*s_objet_argument).objet)).tableau)[j][i];
  227:             }
  228:         }
  229:     }
  230: 
  231: /*
  232: --------------------------------------------------------------------------------
  233:   Matrice tranposée d'une matrice réelle
  234: --------------------------------------------------------------------------------
  235: */
  236: 
  237:     else if ((*s_objet_argument).type == MRL)
  238:     {
  239:         if ((s_objet_resultat = allocation(s_etat_processus, MRL)) == NULL)
  240:         {
  241:             if (variable_partagee == d_vrai)
  242:             {
  243:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  244:                         .pointeur_variable_partagee_courante).mutex)) != 0)
  245:                 {
  246:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  247:                     return;
  248:                 }
  249:             }
  250: 
  251:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  252:             return;
  253:         }
  254: 
  255:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
  256:                 (*((struct_matrice *) (*s_objet_argument).objet))
  257:                 .nombre_colonnes;
  258:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
  259:                 (*((struct_matrice *) (*s_objet_argument).objet))
  260:                 .nombre_lignes;
  261: 
  262:         if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
  263:                 malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat)
  264:                 .objet)).nombre_lignes) * sizeof(real8 *))) == NULL)
  265:         {
  266:             if (variable_partagee == d_vrai)
  267:             {
  268:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  269:                         .pointeur_variable_partagee_courante).mutex)) != 0)
  270:                 {
  271:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  272:                     return;
  273:                 }
  274:             }
  275: 
  276:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  277:             return;
  278:         }
  279: 
  280:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
  281:                 .nombre_lignes; i++)
  282:         {
  283:             if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat)
  284:                     .objet)).tableau)[i] = malloc(((size_t)
  285:                     (*((struct_matrice *) (*s_objet_resultat).objet))
  286:                     .nombre_colonnes) * sizeof(real8))) == NULL)
  287:             {
  288:                 if (variable_partagee == d_vrai)
  289:                 {
  290:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  291:                             .pointeur_variable_partagee_courante).mutex)) != 0)
  292:                     {
  293:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  294:                         return;
  295:                     }
  296:                 }
  297: 
  298:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  299:                 return;
  300:             }
  301: 
  302:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
  303:                     .nombre_colonnes; j++)
  304:             {
  305:                 ((real8 **) (*((struct_matrice *) (*s_objet_resultat)
  306:                         .objet)).tableau)[i][j] =
  307:                         ((real8 **) (*((struct_matrice *)
  308:                         (*s_objet_argument).objet)).tableau)[j][i];
  309:             }
  310:         }
  311:     }
  312: 
  313: /*
  314: --------------------------------------------------------------------------------
  315:   Matrice transposée (et conjuguée) d'une matrice complexe
  316: --------------------------------------------------------------------------------
  317: */
  318: 
  319:     else if ((*s_objet_argument).type == MCX)
  320:     {
  321:         if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
  322:         {
  323:             if (variable_partagee == d_vrai)
  324:             {
  325:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  326:                         .pointeur_variable_partagee_courante).mutex)) != 0)
  327:                 {
  328:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  329:                     return;
  330:                 }
  331:             }
  332: 
  333:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  334:             return;
  335:         }
  336: 
  337:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
  338:                 (*((struct_matrice *) (*s_objet_argument).objet))
  339:                 .nombre_colonnes;
  340:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
  341:                 (*((struct_matrice *) (*s_objet_argument).objet))
  342:                 .nombre_lignes;
  343: 
  344:         if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
  345:                 malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat)
  346:                 .objet)).nombre_lignes) * sizeof(struct_complexe16 *))) == NULL)
  347:         {
  348:             if (variable_partagee == d_vrai)
  349:             {
  350:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  351:                         .pointeur_variable_partagee_courante).mutex)) != 0)
  352:                 {
  353:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  354:                     return;
  355:                 }
  356:             }
  357: 
  358:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  359:             return;
  360:         }
  361: 
  362:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
  363:                 .nombre_lignes; i++)
  364:         {
  365:             if ((((struct_complexe16 **) (*((struct_matrice *)
  366:                     (*s_objet_resultat).objet)).tableau)[i] =
  367:                     malloc(((size_t) (*((struct_matrice *)
  368:                     (*s_objet_resultat).objet)).nombre_colonnes) *
  369:                     sizeof(struct_complexe16))) == NULL)
  370:             {
  371:                 if (variable_partagee == d_vrai)
  372:                 {
  373:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  374:                             .pointeur_variable_partagee_courante).mutex)) != 0)
  375:                     {
  376:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  377:                         return;
  378:                     }
  379:                 }
  380: 
  381:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  382:                 return;
  383:             }
  384: 
  385:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
  386:                     .nombre_colonnes; j++)
  387:             {
  388:                 ((struct_complexe16 **) (*((struct_matrice *)
  389:                         (*s_objet_resultat).objet)).tableau)[i][j]
  390:                         .partie_reelle =
  391:                         ((struct_complexe16 **) (*((struct_matrice *)
  392:                         (*s_objet_argument).objet)).tableau)[j][i]
  393:                         .partie_reelle;
  394:                 ((struct_complexe16 **) (*((struct_matrice *)
  395:                         (*s_objet_resultat).objet)).tableau)[i][j]
  396:                         .partie_imaginaire =
  397:                         -((struct_complexe16 **) (*((struct_matrice *)
  398:                         (*s_objet_argument).objet)).tableau)[j][i]
  399:                         .partie_imaginaire;
  400:             }
  401:         }
  402:     }
  403: 
  404: /*
  405: --------------------------------------------------------------------------------
  406:   Fonction transposée impossible à réaliser
  407: --------------------------------------------------------------------------------
  408: */
  409: 
  410:     else
  411:     {
  412:         if (argument_nom == d_faux)
  413:         {
  414:             liberation(s_etat_processus, s_objet_argument);
  415:         }
  416: 
  417:         if (variable_partagee == d_vrai)
  418:         {
  419:             if (pthread_mutex_unlock(&((*(*s_etat_processus)
  420:                     .pointeur_variable_partagee_courante).mutex)) != 0)
  421:             {
  422:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  423:                 return;
  424:             }
  425:         }
  426: 
  427:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  428:         return;
  429:     }
  430: 
  431:     liberation(s_etat_processus, s_objet_argument);
  432: 
  433:     if (argument_nom == d_faux)
  434:     {
  435:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  436:                 s_objet_resultat) == d_erreur)
  437:         {
  438:             return;
  439:         }
  440:     }
  441:     else
  442:     {
  443:         if (variable_partagee == d_vrai)
  444:         {
  445:             (*(*s_etat_processus).pointeur_variable_partagee_courante).objet =
  446:                     s_objet_resultat;
  447: 
  448:             if (pthread_mutex_unlock(&((*(*s_etat_processus)
  449:                     .pointeur_variable_partagee_courante).mutex)) != 0)
  450:             {
  451:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  452:                 return;
  453:             }
  454:         }
  455:         else
  456:         {
  457:             (*(*s_etat_processus).pointeur_variable_courante).objet =
  458:                     s_objet_resultat;
  459:         }
  460:     }
  461: 
  462:     return;
  463: }
  464: 
  465: 
  466: /*
  467: ================================================================================
  468:   Fonction 'tot'
  469: ================================================================================
  470:   Entrées : pointeur sur une structure struct_processus
  471: --------------------------------------------------------------------------------
  472:   Sorties :
  473: --------------------------------------------------------------------------------
  474:   Effets de bord : néant
  475: ================================================================================
  476: */
  477: 
  478: void
  479: instruction_tot(struct_processus *s_etat_processus)
  480: {
  481:     struct_objet                        *s_objet_statistique;
  482:     struct_objet                        *s_objet_resultat;
  483:     struct_objet                        *s_objet_temporaire;
  484: 
  485:     integer8                            nombre_colonnes;
  486: 
  487:     (*s_etat_processus).erreur_execution = d_ex;
  488: 
  489:     if ((*s_etat_processus).affichage_arguments == 'Y')
  490:     {
  491:         printf("\n  TOT ");
  492: 
  493:         if ((*s_etat_processus).langue == 'F')
  494:         {
  495:             printf("(somme des colonnes statistiques)\n\n");
  496:         }
  497:         else
  498:         {
  499:             printf("(sum of statistical columns)\n\n");
  500:         }
  501: 
  502:         printf("->  1: %s, %s, %s, %s\n", d_INT, d_REL, d_VIN, d_REL);
  503: 
  504:         return;
  505:     }
  506:     else if ((*s_etat_processus).test_instruction == 'Y')
  507:     {
  508:         (*s_etat_processus).nombre_arguments = -1;
  509:         return;
  510:     }
  511: 
  512:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  513:     {
  514:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  515:         {
  516:             return;
  517:         }
  518:     }
  519: 
  520:     /*
  521:      * Recherche d'une variable globale référencée par SIGMA
  522:      */
  523: 
  524:     if (recherche_variable_globale(s_etat_processus, ds_sdat) == d_faux)
  525:     {
  526:         /*
  527:          * Aucune variable SIGMA
  528:          */
  529: 
  530:         (*s_etat_processus).erreur_systeme = d_es;
  531: 
  532:         if ((*s_etat_processus).erreur_execution == d_ex)
  533:         {
  534:             (*s_etat_processus).erreur_execution = d_ex_absence_observations;
  535:         }
  536: 
  537:         return;
  538:     }
  539:     else
  540:     {
  541:         if (((*(*(*s_etat_processus).pointeur_variable_courante).objet)
  542:                 .type != MIN) && ((*(*(*s_etat_processus)
  543:                 .pointeur_variable_courante).objet).type != MRL))
  544:         {
  545:             (*s_etat_processus).erreur_execution =
  546:                     d_ex_matrice_statistique_invalide;
  547:             return;
  548:         }
  549: 
  550:         nombre_colonnes = (*((struct_matrice *) (*(*(*s_etat_processus)
  551:                 .pointeur_variable_courante).objet).objet)).nombre_colonnes;
  552:     }
  553: 
  554:     if (nombre_colonnes == 0)
  555:     {
  556:         (*s_etat_processus).erreur_execution =
  557:                 d_ex_matrice_statistique_invalide;
  558:         return;
  559:     }
  560: 
  561:     s_objet_statistique = (*(*s_etat_processus).pointeur_variable_courante)
  562:             .objet;
  563: 
  564:     if (((*s_objet_statistique).type == MIN) ||
  565:             ((*s_objet_statistique).type == MRL))
  566:     {
  567:         if ((s_objet_resultat = allocation(s_etat_processus, NON)) == NULL)
  568:         {
  569:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  570:             return;
  571:         }
  572: 
  573:         if (((*s_objet_resultat).objet = sommation_statistique(
  574:                 s_etat_processus,
  575:                 (struct_matrice *) (*s_objet_statistique).objet)) == NULL)
  576:         {
  577:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  578:             return;
  579:         }
  580: 
  581:         if (nombre_colonnes == 1)
  582:         {
  583:             if ((*((struct_vecteur *) (*s_objet_resultat).objet)).type == 'I')
  584:             {
  585:                 (*s_objet_resultat).type = VIN;
  586:                 s_objet_temporaire = s_objet_resultat;
  587: 
  588:                 if ((s_objet_resultat = allocation(s_etat_processus, INT))
  589:                         == NULL)
  590:                 {
  591:                     (*s_etat_processus).erreur_systeme =
  592:                             d_es_allocation_memoire;
  593:                     return;
  594:                 }
  595: 
  596:                 (*((integer8 *) (*s_objet_resultat).objet)) =
  597:                         ((integer8 *) (*((struct_vecteur *)
  598:                         (*s_objet_temporaire).objet)).tableau)[0];
  599: 
  600:                 liberation(s_etat_processus, s_objet_temporaire);
  601:             }
  602:             else
  603:             {
  604:                 (*s_objet_resultat).type = VRL;
  605:                 s_objet_temporaire = s_objet_resultat;
  606: 
  607:                 if ((s_objet_resultat = allocation(s_etat_processus, REL))
  608:                         == NULL)
  609:                 {
  610:                     (*s_etat_processus).erreur_systeme =
  611:                             d_es_allocation_memoire;
  612:                     return;
  613:                 }
  614: 
  615:                 (*((real8 *) (*s_objet_resultat).objet)) =
  616:                         ((real8 *) (*((struct_vecteur *)
  617:                         (*s_objet_temporaire).objet)).tableau)[0];
  618: 
  619:                 liberation(s_etat_processus, s_objet_temporaire);
  620:             }
  621:         }
  622:         else
  623:         {
  624:             if ((*((struct_vecteur *) (*s_objet_resultat).objet)).type == 'I')
  625:             {
  626:                 (*s_objet_resultat).type = VIN;
  627:             }
  628:             else
  629:             {
  630:                 (*s_objet_resultat).type = VRL;
  631:             }
  632:         }
  633: 
  634:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  635:                 s_objet_resultat) == d_erreur)
  636:         {
  637:             return;
  638:         }
  639:     }
  640:     else
  641:     {
  642:         (*s_etat_processus).erreur_execution =
  643:                 d_ex_matrice_statistique_invalide;
  644:         return;
  645:     }
  646: 
  647:     return;
  648: }
  649: 
  650: 
  651: /*
  652: ================================================================================
  653:   Fonction 'title'
  654: ================================================================================
  655:   Entrées :
  656: --------------------------------------------------------------------------------
  657:   Sorties :
  658: --------------------------------------------------------------------------------
  659:   Effets de bord : néant
  660: ================================================================================
  661: */
  662: 
  663: void
  664: instruction_title(struct_processus *s_etat_processus)
  665: {
  666:     struct_objet                    *s_objet;
  667: 
  668:     (*s_etat_processus).erreur_execution = d_ex;
  669: 
  670:     if ((*s_etat_processus).affichage_arguments == 'Y')
  671:     {
  672:         printf("\n  TITLE ");
  673: 
  674:         if ((*s_etat_processus).langue == 'F')
  675:         {
  676:             printf("(titre d'un graphique)\n\n");
  677:         }
  678:         else
  679:         {
  680:             printf("(title of graphic)\n\n");
  681:         }
  682: 
  683:         printf("    1: %s\n", d_CHN);
  684: 
  685:         return;
  686:     }
  687:     else if ((*s_etat_processus).test_instruction == 'Y')
  688:     {
  689:         (*s_etat_processus).nombre_arguments = -1;
  690:         return;
  691:     }
  692: 
  693:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  694:     {
  695:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  696:         {
  697:             return;
  698:         }
  699:     }
  700: 
  701:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  702:             &s_objet) == d_erreur)
  703:     {
  704:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  705:         return;
  706:     }
  707: 
  708:     if ((*s_objet).type == CHN)
  709:     {
  710:         free((*s_etat_processus).titre);
  711: 
  712:         if (((*s_etat_processus).titre = malloc((strlen((unsigned char *)
  713:                 (*s_objet).objet) + 1) * sizeof(unsigned char))) == NULL)
  714:         {
  715:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  716:             return;
  717:         }
  718: 
  719:         strcpy((*s_etat_processus).titre, (unsigned char *) (*s_objet).objet);
  720:         liberation(s_etat_processus, s_objet);
  721:     }
  722:     else
  723:     {
  724:         liberation(s_etat_processus, s_objet);
  725: 
  726:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  727:         return;
  728:     }
  729: 
  730:     if (test_cfsf(s_etat_processus, 52) == d_faux)
  731:     {
  732:         if ((*s_etat_processus).fichiers_graphiques != NULL)
  733:         {
  734:             appel_gnuplot(s_etat_processus, 'N');
  735:         }
  736:     }
  737: 
  738:     return;
  739: }
  740: 
  741: 
  742: /*
  743: ================================================================================
  744:   Fonction 'time'
  745: ================================================================================
  746:   Entrées :
  747: --------------------------------------------------------------------------------
  748:   Sorties :
  749: --------------------------------------------------------------------------------
  750:   Effets de bord : néant
  751: ================================================================================
  752: */
  753: 
  754: void
  755: instruction_time(struct_processus *s_etat_processus)
  756: {
  757:     struct rusage           s_usage_processus_fils;
  758:     struct rusage           s_usage_processus_pere;
  759: 
  760:     struct_liste_chainee    *l_element_courant;
  761: 
  762:     struct_objet            *s_objet;
  763: 
  764:     (*s_etat_processus).erreur_execution = d_ex;
  765: 
  766:     if ((*s_etat_processus).affichage_arguments == 'Y')
  767:     {
  768:         printf("\n  TIME ");
  769: 
  770:         if ((*s_etat_processus).langue == 'F')
  771:         {
  772:             printf("(temps CPU)\n\n");
  773:         }
  774:         else
  775:         {
  776:             printf("(CPU time)\n\n");
  777:         }
  778: 
  779:         printf("->  1: %s\n", d_LST);
  780: 
  781:         return;
  782:     }
  783:     else if ((*s_etat_processus).test_instruction == 'Y')
  784:     {
  785:         (*s_etat_processus).nombre_arguments = -1;
  786:         return;
  787:     }
  788: 
  789:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  790:     {
  791:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  792:         {
  793:             return;
  794:         }
  795:     }
  796: 
  797:     /*
  798:      * Lecture des différents temps
  799:      */
  800: 
  801: #   ifndef OS2
  802:     if ((getrusage(RUSAGE_SELF, &s_usage_processus_pere)) != 0)
  803:     {
  804:         (*s_etat_processus).erreur_systeme = d_es_processus;
  805:         return;
  806:     }
  807: 
  808:     if ((getrusage(RUSAGE_CHILDREN, &s_usage_processus_fils)) != 0)
  809:     {
  810:         (*s_etat_processus).erreur_systeme = d_es_processus;
  811:         return;
  812:     }
  813: #   else
  814:     s_usage_processus_pere.ru_utime.tv_sec = 0;
  815:     s_usage_processus_pere.ru_utime.tv_usec = 0;
  816:     s_usage_processus_pere.ru_stime.tv_sec = 0;
  817:     s_usage_processus_pere.ru_stime.tv_usec = 0;
  818:     s_usage_processus_fils.ru_utime.tv_sec = 0;
  819:     s_usage_processus_fils.ru_utime.tv_usec = 0;
  820:     s_usage_processus_fils.ru_stime.tv_sec = 0;
  821:     s_usage_processus_fils.ru_stime.tv_usec = 0;
  822: #   endif
  823: 
  824:     /*
  825:      * Initialisation de la liste
  826:      */
  827: 
  828:     if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
  829:     {
  830:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  831:         return;
  832:     }
  833: 
  834:     /*
  835:      * User time du processus père (séquenceur)
  836:      */
  837: 
  838:     if ((l_element_courant = allocation_maillon(s_etat_processus)) == NULL)
  839:     {
  840:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  841:         return;
  842:     }
  843: 
  844:     (*s_objet).objet = l_element_courant;
  845: 
  846:     if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
  847:             == NULL)
  848:     {
  849:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  850:         return;
  851:     }
  852: 
  853:     (*((real8 *) (*(*l_element_courant).donnee).objet)) =
  854:             ((real8) s_usage_processus_pere.ru_utime.tv_sec) +
  855:             (((real8) s_usage_processus_pere.ru_utime.tv_usec) /
  856:             ((real8) 1E6));
  857: 
  858:     /*
  859:      * System time du processus père
  860:      */
  861: 
  862:     if (((*l_element_courant).suivant =
  863:             allocation_maillon(s_etat_processus)) == NULL)
  864:     {
  865:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  866:         return;
  867:     }
  868: 
  869:     l_element_courant = (*l_element_courant).suivant;
  870: 
  871:     if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
  872:             == NULL)
  873:     {
  874:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  875:         return;
  876:     }
  877: 
  878:     (*((real8 *) (*(*l_element_courant).donnee).objet)) =
  879:             ((real8) s_usage_processus_pere.ru_stime.tv_sec) +
  880:             (((real8) s_usage_processus_pere.ru_stime.tv_usec) /
  881:             ((real8) 1E6));
  882: 
  883:     /*
  884:      * User time des processus fils achevés
  885:      */
  886: 
  887:     if (((*l_element_courant).suivant =
  888:             allocation_maillon(s_etat_processus)) == NULL)
  889:     {
  890:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  891:         return;
  892:     }
  893: 
  894:     l_element_courant = (*l_element_courant).suivant;
  895: 
  896:     if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
  897:             == NULL)
  898:     {
  899:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  900:         return;
  901:     }
  902: 
  903:     (*((real8 *) (*(*l_element_courant).donnee).objet)) =
  904:             ((real8) s_usage_processus_fils.ru_utime.tv_sec) +
  905:             (((real8) s_usage_processus_fils.ru_utime.tv_usec) /
  906:             ((real8) 1E6));
  907: 
  908:     /*
  909:      * System time des processus fils achevés
  910:      */
  911: 
  912:     if (((*l_element_courant).suivant =
  913:             allocation_maillon(s_etat_processus)) == NULL)
  914:     {
  915:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  916:         return;
  917:     }
  918: 
  919:     l_element_courant = (*l_element_courant).suivant;
  920: 
  921:     if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
  922:             == NULL)
  923:     {
  924:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  925:         return;
  926:     }
  927: 
  928:     (*((real8 *) (*(*l_element_courant).donnee).objet)) =
  929:             ((real8) s_usage_processus_fils.ru_stime.tv_sec) +
  930:             (((real8) s_usage_processus_fils.ru_stime.tv_usec) /
  931:             ((real8) 1E6));
  932: 
  933:     /*
  934:      * Fermeture de la liste
  935:      */
  936: 
  937:     (*l_element_courant).suivant = NULL;
  938: 
  939:     /*
  940:      * Empilement du résultat
  941:      */
  942: 
  943:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  944:             s_objet) == d_erreur)
  945:     {
  946:         return;
  947:     }
  948: 
  949:     return;
  950: }
  951: 
  952: 
  953: /*
  954: ================================================================================
  955:   Fonction 'taylr'
  956: ================================================================================
  957:   Entrées :
  958: --------------------------------------------------------------------------------
  959:   Sorties :
  960: --------------------------------------------------------------------------------
  961:   Effets de bord : néant
  962: ================================================================================
  963: */
  964: 
  965: void
  966: instruction_taylr(struct_processus *s_etat_processus)
  967: {
  968:     integer8                    i;
  969: 
  970:     logical1                    last_valide;
  971:     logical1                    zero;
  972: 
  973:     struct_liste_chainee        *l_element_courant;
  974: 
  975:     struct_objet                *s_objet_argument;
  976:     struct_objet                *s_objet_argument_1;
  977:     struct_objet                *s_objet_argument_2;
  978:     struct_objet                *s_objet_argument_3;
  979:     struct_objet                *s_objet_argument_4;
  980:     struct_objet                *s_objet_resultat;
  981:     struct_objet                *s_objet_variable_derivation;
  982: 
  983:     struct_variable             s_variable;
  984: 
  985:     (*s_etat_processus).erreur_execution = d_ex;
  986: 
  987:     if ((*s_etat_processus).affichage_arguments == 'Y')
  988:     {
  989:         printf("\n  TAYLR ");
  990: 
  991:         if ((*s_etat_processus).langue == 'F')
  992:         {
  993:             printf("(série de Taylor)\n\n");
  994:         }
  995:         else
  996:         {
  997:             printf("(Taylor serie)\n\n");
  998:         }
  999: 
 1000:         printf("    4: %s\n", d_ALG);
 1001:         printf("    3: %s\n", d_NOM);
 1002:         printf("    2: %s, %s\n", d_INT, d_REL);
 1003:         printf("    1: %s\n", d_INT);
 1004:         printf("->  1: %s\n\n", d_ALG);
 1005: 
 1006:         return;
 1007:     }
 1008:     else if ((*s_etat_processus).test_instruction == 'Y')
 1009:     {
 1010:         (*s_etat_processus).nombre_arguments = -1;
 1011:         return;
 1012:     }
 1013: 
 1014:     if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
 1015:     {
 1016:         if (empilement_pile_last(s_etat_processus, 4) == d_erreur)
 1017:         {
 1018:             return;
 1019:         }
 1020:     }
 1021: 
 1022:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1023:             &s_objet_argument_1) == d_erreur)
 1024:     {
 1025:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1026:         return;
 1027:     }
 1028: 
 1029:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1030:             &s_objet_argument_2) == d_erreur)
 1031:     {
 1032:         liberation(s_etat_processus, s_objet_argument_1);
 1033: 
 1034:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1035:         return;
 1036:     }
 1037: 
 1038:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1039:             &s_objet_argument_3) == d_erreur)
 1040:     {
 1041:         liberation(s_etat_processus, s_objet_argument_1);
 1042:         liberation(s_etat_processus, s_objet_argument_2);
 1043: 
 1044:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1045:         return;
 1046:     }
 1047: 
 1048:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1049:             &s_objet_argument_4) == d_erreur)
 1050:     {
 1051:         liberation(s_etat_processus, s_objet_argument_1);
 1052:         liberation(s_etat_processus, s_objet_argument_2);
 1053:         liberation(s_etat_processus, s_objet_argument_3);
 1054:         liberation(s_etat_processus, s_objet_argument_4);
 1055: 
 1056:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1057:         return;
 1058:     }
 1059: 
 1060:     if (((*s_objet_argument_4).type == ALG) &&
 1061:             ((*s_objet_argument_3).type == NOM) &&
 1062:             (((*s_objet_argument_2).type == INT) ||
 1063:             ((*s_objet_argument_2).type == REL)) &&
 1064:             ((*s_objet_argument_1).type == INT))
 1065:     {
 1066:         if ((*((integer8 *) (*s_objet_argument_1).objet)) <= 0)
 1067:         {
 1068:             liberation(s_etat_processus, s_objet_argument_1);
 1069:             liberation(s_etat_processus, s_objet_argument_2);
 1070:             liberation(s_etat_processus, s_objet_argument_3);
 1071:             liberation(s_etat_processus, s_objet_argument_4);
 1072: 
 1073:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1074:             return;
 1075:         }
 1076: 
 1077:         if ((*s_objet_argument_2).type == REL)
 1078:         {
 1079:             if ((*((real8 *) (*s_objet_argument_2).objet)) == 0)
 1080:             {
 1081:                 zero = d_vrai;
 1082:             }
 1083:             else
 1084:             {
 1085:                 zero = d_faux;
 1086:             }
 1087:         }
 1088:         else
 1089:         {
 1090:             if ((*((integer8 *) (*s_objet_argument_2).objet)) == 0)
 1091:             {
 1092:                 zero = d_vrai;
 1093:             }
 1094:             else
 1095:             {
 1096:                 zero = d_faux;
 1097:             }
 1098:         }
 1099: 
 1100:         /*
 1101:          * Conversion du drapeau symbole des variables symboliques
 1102:          */
 1103: 
 1104:         l_element_courant = (*s_objet_argument_4).objet;
 1105: 
 1106:         while(l_element_courant != NULL)
 1107:         {
 1108:             if ((*(*l_element_courant).donnee).type == NOM)
 1109:             {
 1110:                 if (strcmp((*((struct_nom *) (*(*l_element_courant).donnee)
 1111:                         .objet)).nom, (*((struct_nom *) (*s_objet_argument_3)
 1112:                         .objet)).nom) == 0)
 1113:                 {
 1114:                     (*((struct_nom *) (*(*l_element_courant).donnee).objet))
 1115:                             .symbole = d_faux;
 1116:                 }
 1117:             }
 1118: 
 1119:             l_element_courant = (*l_element_courant).suivant;
 1120:         }
 1121: 
 1122:         /*
 1123:          * Création de la variable locale et initialisation
 1124:          */
 1125: 
 1126:         (*s_etat_processus).niveau_courant++;
 1127: 
 1128:         if ((s_variable.nom = malloc((strlen((*((struct_nom *)
 1129:                 (*s_objet_argument_3).objet)).nom) + 1) *
 1130:                 sizeof(unsigned char))) == NULL)
 1131:         {
 1132:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1133:             return;
 1134:         }
 1135: 
 1136:         s_variable.niveau = (*s_etat_processus).niveau_courant;
 1137:         strcpy(s_variable.nom, (*((struct_nom *) (*s_objet_argument_3)
 1138:                 .objet)).nom);
 1139: 
 1140:         if ((s_variable.objet = copie_objet(s_etat_processus,
 1141:                 s_objet_argument_2, 'O')) == NULL)
 1142:         {
 1143:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1144:             return;
 1145:         }
 1146: 
 1147:         if (creation_variable(s_etat_processus, &s_variable, 'V', 'P')
 1148:                 == d_erreur)
 1149:         {
 1150:             return;
 1151:         }
 1152: 
 1153:         /*
 1154:          * Création de la série
 1155:          */
 1156: 
 1157:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
 1158:         {
 1159:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1160:             return;
 1161:         }
 1162: 
 1163:         if (((*s_objet_resultat).objet =
 1164:                 allocation_maillon(s_etat_processus)) == NULL)
 1165:         {
 1166:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1167:             return;
 1168:         }
 1169: 
 1170:         l_element_courant = (*s_objet_resultat).objet;
 1171: 
 1172:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1173:                 == NULL)
 1174:         {
 1175:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1176:             return;
 1177:         }
 1178: 
 1179:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1180:                 .nombre_arguments = 0;
 1181:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1182:                 .fonction = instruction_vers_niveau_superieur;
 1183: 
 1184:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1185:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1186:         {
 1187:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1188:             return;
 1189:         }
 1190: 
 1191:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1192:                 .nom_fonction, "<<");
 1193: 
 1194:         if (last_valide == d_vrai)
 1195:         {
 1196:             cf(s_etat_processus, 31);
 1197:         }
 1198: 
 1199:         /*
 1200:          * Calcul de la série de Taylor
 1201:          *
 1202:          * s(x) = \sum_{i=0}{n} (1/i!)*((d^i f(x=a))/d(x^i)*(x-a)^i)
 1203:          */
 1204: 
 1205:         for(i = 0; (i <= (*((integer8 *) (*s_objet_argument_1).objet))) &&
 1206:                 ((*s_etat_processus).var_volatile_requete_arret == 0); i++)
 1207:         {
 1208:             /*
 1209:              * Calcul de ((d^i f(x=a))/d(x^i)*(x-a)^i)/i!
 1210:              */
 1211: 
 1212:             if (i != 0)
 1213:             {
 1214:                 // Calcul de la valeur de la dérivée n-ième
 1215:                 // Expression empilée puis dérivée et sauvegardée dans
 1216:                 // s_argument_4.
 1217: 
 1218:                 if (empilement(s_etat_processus, &((*s_etat_processus)
 1219:                         .l_base_pile), s_objet_argument_4) == d_erreur)
 1220:                 {
 1221:                     if (last_valide == d_vrai)
 1222:                     {
 1223:                         sf(s_etat_processus, 31);
 1224:                     }
 1225: 
 1226:                     return;
 1227:                 }
 1228: 
 1229:                 if ((s_objet_variable_derivation =
 1230:                         copie_objet(s_etat_processus, s_objet_argument_3, 'O'))
 1231:                         == NULL)
 1232:                 {
 1233:                     (*s_etat_processus).erreur_systeme =
 1234:                             d_es_allocation_memoire;
 1235:                     return;
 1236:                 }
 1237: 
 1238:                 if (empilement(s_etat_processus, &((*s_etat_processus)
 1239:                         .l_base_pile), s_objet_variable_derivation) == d_erreur)
 1240:                 {
 1241:                     if (last_valide == d_vrai)
 1242:                     {
 1243:                         sf(s_etat_processus, 31);
 1244:                     }
 1245: 
 1246:                     return;
 1247:                 }
 1248: 
 1249:                 instruction_der(s_etat_processus);
 1250: 
 1251:                 if ((*s_etat_processus).erreur_execution != d_ex)
 1252:                 {
 1253:                     liberation(s_etat_processus, s_objet_argument_1);
 1254:                     liberation(s_etat_processus, s_objet_argument_2);
 1255:                     liberation(s_etat_processus, s_objet_argument_3);
 1256: 
 1257:                     (*l_element_courant).suivant = NULL;
 1258: 
 1259:                     liberation(s_etat_processus, s_objet_resultat);
 1260: 
 1261:                     if (last_valide == d_vrai)
 1262:                     {
 1263:                         sf(s_etat_processus, 31);
 1264:                     }
 1265: 
 1266:                     return;
 1267:                 }
 1268:                 else if ((*s_etat_processus).erreur_systeme != d_es)
 1269:                 {
 1270:                     return;
 1271:                 }
 1272: 
 1273:                 if ((*s_etat_processus).var_volatile_requete_arret != 0)
 1274:                 {
 1275:                     /*
 1276:                      * instruction_der() n'a rien renvoyé dans la pile. On
 1277:                      * injecte une valeur nulle dans s_objet_argument_4.
 1278:                      */
 1279: 
 1280:                     if ((s_objet_argument_4 = allocation(s_etat_processus,
 1281:                             INT)) == NULL)
 1282:                     {
 1283:                         (*s_etat_processus).erreur_systeme =
 1284:                                 d_es_allocation_memoire;
 1285:                         return;
 1286:                     }
 1287:                 }
 1288:                 else if (depilement(s_etat_processus, &((*s_etat_processus)
 1289:                         .l_base_pile), &s_objet_argument_4) == d_erreur)
 1290:                 {
 1291:                     liberation(s_etat_processus, s_objet_argument_1);
 1292:                     liberation(s_etat_processus, s_objet_argument_2);
 1293:                     liberation(s_etat_processus, s_objet_argument_3);
 1294: 
 1295:                     (*l_element_courant).suivant = NULL;
 1296: 
 1297:                     liberation(s_etat_processus, s_objet_resultat);
 1298: 
 1299:                     if (last_valide == d_vrai)
 1300:                     {
 1301:                         sf(s_etat_processus, 31);
 1302:                     }
 1303: 
 1304:                     (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1305:                     return;
 1306:                 }
 1307:             }
 1308: 
 1309:             if (evaluation(s_etat_processus, s_objet_argument_4, 'E')
 1310:                     == d_erreur)
 1311:             {
 1312:                 liberation(s_etat_processus, s_objet_argument_1);
 1313:                 liberation(s_etat_processus, s_objet_argument_2);
 1314:                 liberation(s_etat_processus, s_objet_argument_3);
 1315:                 liberation(s_etat_processus, s_objet_argument_4);
 1316: 
 1317:                 (*l_element_courant).suivant = NULL;
 1318: 
 1319:                 liberation(s_etat_processus, s_objet_resultat);
 1320:     
 1321:                 if (last_valide == d_vrai)
 1322:                 {
 1323:                     sf(s_etat_processus, 31);
 1324:                 }
 1325: 
 1326:                 return;
 1327:             }
 1328: 
 1329:             // Division par i!
 1330: 
 1331:             if (i > 1)
 1332:             {
 1333: 
 1334:                 if ((s_objet_argument = allocation(s_etat_processus, INT))
 1335:                         == NULL)
 1336:                 {
 1337:                     (*s_etat_processus).erreur_systeme =
 1338:                             d_es_allocation_memoire;
 1339:                     return;
 1340:                 }
 1341: 
 1342:                 (*((integer8 *) (*s_objet_argument).objet)) = i;
 1343: 
 1344:                 if (empilement(s_etat_processus, &((*s_etat_processus)
 1345:                         .l_base_pile), s_objet_argument) == d_erreur)
 1346:                 {
 1347:                     liberation(s_etat_processus, s_objet_argument_1);
 1348:                     liberation(s_etat_processus, s_objet_argument_2);
 1349:                     liberation(s_etat_processus, s_objet_argument_3);
 1350:                     liberation(s_etat_processus, s_objet_argument_4);
 1351: 
 1352:                     (*l_element_courant).suivant = NULL;
 1353: 
 1354:                     liberation(s_etat_processus, s_objet_resultat);
 1355:                     liberation(s_etat_processus, s_objet_argument);
 1356:     
 1357:                     if (last_valide == d_vrai)
 1358:                     {
 1359:                         sf(s_etat_processus, 31);
 1360:                     }
 1361: 
 1362:                     return;
 1363:                 }
 1364: 
 1365:                 if (i > 2)
 1366:                 {
 1367:                     instruction_fact(s_etat_processus);
 1368: 
 1369:                     if ((*s_etat_processus).erreur_execution != d_ex)
 1370:                     {
 1371:                         liberation(s_etat_processus, s_objet_argument_1);
 1372:                         liberation(s_etat_processus, s_objet_argument_2);
 1373:                         liberation(s_etat_processus, s_objet_argument_3);
 1374:                         liberation(s_etat_processus, s_objet_argument_4);
 1375: 
 1376:                         (*l_element_courant).suivant = NULL;
 1377: 
 1378:                         liberation(s_etat_processus, s_objet_resultat);
 1379: 
 1380:                         if (last_valide == d_vrai)
 1381:                         {
 1382:                             sf(s_etat_processus, 31);
 1383:                         }
 1384: 
 1385:                         return;
 1386:                     }
 1387:                     else if ((*s_etat_processus).erreur_systeme != d_es)
 1388:                     {
 1389:                         return;
 1390:                     }
 1391:                 }
 1392: 
 1393:                 instruction_division(s_etat_processus);
 1394: 
 1395:                 if ((*s_etat_processus).erreur_execution != d_ex)
 1396:                 {
 1397:                     liberation(s_etat_processus, s_objet_argument_1);
 1398:                     liberation(s_etat_processus, s_objet_argument_2);
 1399:                     liberation(s_etat_processus, s_objet_argument_3);
 1400:                     liberation(s_etat_processus, s_objet_argument_4);
 1401: 
 1402:                     (*l_element_courant).suivant = NULL;
 1403: 
 1404:                     liberation(s_etat_processus, s_objet_resultat);
 1405: 
 1406:                     if (last_valide == d_vrai)
 1407:                     {
 1408:                         sf(s_etat_processus, 31);
 1409:                     }
 1410: 
 1411:                     return;
 1412:                 }
 1413:                 else if ((*s_etat_processus).erreur_systeme != d_es)
 1414:                 {
 1415:                     return;
 1416:                 }
 1417:             }
 1418: 
 1419:             if (((*l_element_courant).suivant =
 1420:                     allocation_maillon(s_etat_processus)) == NULL)
 1421:             {
 1422:                 (*s_etat_processus).erreur_systeme =
 1423:                         d_es_allocation_memoire;
 1424:                 return;
 1425:             }
 1426: 
 1427:             l_element_courant = (*l_element_courant).suivant;
 1428: 
 1429:             if (depilement(s_etat_processus, &((*s_etat_processus)
 1430:                     .l_base_pile), &((*l_element_courant).donnee))
 1431:                     == d_erreur)
 1432:             {
 1433:                 liberation(s_etat_processus, s_objet_argument_1);
 1434:                 liberation(s_etat_processus, s_objet_argument_2);
 1435:                 liberation(s_etat_processus, s_objet_argument_3);
 1436:                 liberation(s_etat_processus, s_objet_argument_4);
 1437: 
 1438:                 (*l_element_courant).donnee = NULL;
 1439:                 (*l_element_courant).suivant = NULL;
 1440: 
 1441:                 liberation(s_etat_processus, s_objet_resultat);
 1442: 
 1443:                 if (last_valide == d_vrai)
 1444:                 {
 1445:                     sf(s_etat_processus, 31);
 1446:                 }
 1447: 
 1448:                 (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1449:                 return;
 1450:             }
 1451: 
 1452:             /*
 1453:              * Multiplication par le terme (x-a)**i
 1454:              */
 1455: 
 1456:             if (i != 0)
 1457:             {
 1458:                 if (((*l_element_courant).suivant =
 1459:                         allocation_maillon(s_etat_processus)) == NULL)
 1460:                 {
 1461:                     (*s_etat_processus).erreur_systeme =
 1462:                             d_es_allocation_memoire;
 1463:                     return;
 1464:                 }
 1465: 
 1466:                 l_element_courant = (*l_element_courant).suivant;
 1467: 
 1468:                 if (((*l_element_courant).donnee =
 1469:                         copie_objet(s_etat_processus, s_objet_argument_3, 'O'))
 1470:                         == NULL)
 1471:                 {
 1472:                     (*s_etat_processus).erreur_systeme =
 1473:                             d_es_allocation_memoire;
 1474:                     return;
 1475:                 }
 1476: 
 1477:                 if (zero == d_faux)
 1478:                 {
 1479:                     if (((*l_element_courant).suivant =
 1480:                             allocation_maillon(s_etat_processus)) == NULL)
 1481:                     {
 1482:                         (*s_etat_processus).erreur_systeme =
 1483:                                 d_es_allocation_memoire;
 1484:                         return;
 1485:                     }
 1486: 
 1487:                     l_element_courant = (*l_element_courant).suivant;
 1488: 
 1489:                     if (((*l_element_courant).donnee =
 1490:                             copie_objet(s_etat_processus, s_objet_argument_2,
 1491:                             'O')) == NULL)
 1492:                     {
 1493:                         (*s_etat_processus).erreur_systeme =
 1494:                                 d_es_allocation_memoire;
 1495:                         return;
 1496:                     }
 1497: 
 1498:                     if (((*l_element_courant).suivant =
 1499:                             allocation_maillon(s_etat_processus)) == NULL)
 1500:                     {
 1501:                         (*s_etat_processus).erreur_systeme =
 1502:                                 d_es_allocation_memoire;
 1503:                         return;
 1504:                     }
 1505: 
 1506:                     l_element_courant = (*l_element_courant).suivant;
 1507: 
 1508:                     if (((*l_element_courant).donnee =
 1509:                                 allocation(s_etat_processus, FCT)) == NULL)
 1510:                     {
 1511:                         (*s_etat_processus).erreur_systeme =
 1512:                                 d_es_allocation_memoire;
 1513:                         return;
 1514:                     }
 1515: 
 1516:                     (*((struct_fonction *) (*(*l_element_courant).donnee)
 1517:                             .objet)).nombre_arguments = 0;
 1518:                     (*((struct_fonction *) (*(*l_element_courant).donnee)
 1519:                             .objet)).fonction = instruction_moins;
 1520: 
 1521:                     if (((*((struct_fonction *) (*(*l_element_courant).donnee)
 1522:                             .objet)).nom_fonction = malloc(2 *
 1523:                             sizeof(unsigned char))) == NULL)
 1524:                     {
 1525:                         (*s_etat_processus).erreur_systeme =
 1526:                                 d_es_allocation_memoire;
 1527:                         return;
 1528:                     }
 1529: 
 1530:                     strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
 1531:                             .objet)).nom_fonction, "-");
 1532:                 }
 1533: 
 1534:                 if (i > 1)
 1535:                 {
 1536:                     if (((*l_element_courant).suivant =
 1537:                             allocation_maillon(s_etat_processus)) == NULL)
 1538:                     {
 1539:                         (*s_etat_processus).erreur_systeme =
 1540:                                 d_es_allocation_memoire;
 1541:                         return;
 1542:                     }
 1543: 
 1544:                     l_element_courant = (*l_element_courant).suivant;
 1545: 
 1546:                     if (((*l_element_courant).donnee =
 1547:                             allocation(s_etat_processus, INT)) == NULL)
 1548:                     {
 1549:                         (*s_etat_processus).erreur_systeme =
 1550:                                 d_es_allocation_memoire;
 1551:                         return;
 1552:                     }
 1553: 
 1554:                     (*((integer8 *) (*(*l_element_courant).donnee).objet)) = i;
 1555: 
 1556:                     if (((*l_element_courant).suivant =
 1557:                             allocation_maillon(s_etat_processus)) == NULL)
 1558:                     {
 1559:                         (*s_etat_processus).erreur_systeme =
 1560:                                 d_es_allocation_memoire;
 1561:                         return;
 1562:                     }
 1563: 
 1564:                     l_element_courant = (*l_element_courant).suivant;
 1565: 
 1566:                     if (((*l_element_courant).donnee =
 1567:                             allocation(s_etat_processus, FCT)) == NULL)
 1568:                     {
 1569:                         (*s_etat_processus).erreur_systeme =
 1570:                                 d_es_allocation_memoire;
 1571:                         return;
 1572:                     }
 1573: 
 1574:                     (*((struct_fonction *) (*(*l_element_courant).donnee)
 1575:                             .objet)).nombre_arguments = 0;
 1576:                     (*((struct_fonction *) (*(*l_element_courant).donnee)
 1577:                             .objet)).fonction = instruction_puissance;
 1578: 
 1579:                     if (((*((struct_fonction *) (*(*l_element_courant).donnee)
 1580:                             .objet)).nom_fonction = malloc(2 *
 1581:                             sizeof(unsigned char))) == NULL)
 1582:                     {
 1583:                         (*s_etat_processus).erreur_systeme =
 1584:                                 d_es_allocation_memoire;
 1585:                         return;
 1586:                     }
 1587: 
 1588:                     strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
 1589:                             .objet)).nom_fonction, "^");
 1590:                 }
 1591: 
 1592:                 if (((*l_element_courant).suivant =
 1593:                         allocation_maillon(s_etat_processus)) == NULL)
 1594:                 {
 1595:                     (*s_etat_processus).erreur_systeme =
 1596:                             d_es_allocation_memoire;
 1597:                     return;
 1598:                 }
 1599: 
 1600:                 l_element_courant = (*l_element_courant).suivant;
 1601: 
 1602:                 if (((*l_element_courant).donnee = allocation(s_etat_processus,
 1603:                         FCT)) == NULL)
 1604:                 {
 1605:                     (*s_etat_processus).erreur_systeme =
 1606:                             d_es_allocation_memoire;
 1607:                     return;
 1608:                 }
 1609: 
 1610:                 (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1611:                         .nombre_arguments = 0;
 1612:                 (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1613:                         .fonction = instruction_multiplication;
 1614: 
 1615:                 if (((*((struct_fonction *) (*(*l_element_courant).donnee)
 1616:                         .objet)).nom_fonction = malloc(2 *
 1617:                         sizeof(unsigned char))) == NULL)
 1618:                 {
 1619:                     (*s_etat_processus).erreur_systeme =
 1620:                             d_es_allocation_memoire;
 1621:                     return;
 1622:                 }
 1623: 
 1624:                 strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
 1625:                         .objet)).nom_fonction, "*");
 1626: 
 1627:                 if (((*l_element_courant).suivant =
 1628:                         allocation_maillon(s_etat_processus)) == NULL)
 1629:                 {
 1630:                     (*s_etat_processus).erreur_systeme =
 1631:                             d_es_allocation_memoire;
 1632:                     return;
 1633:                 }
 1634: 
 1635:                 l_element_courant = (*l_element_courant).suivant;
 1636: 
 1637:                 if (((*l_element_courant).donnee = allocation(s_etat_processus,
 1638:                         FCT)) == NULL)
 1639:                 {
 1640:                     (*s_etat_processus).erreur_systeme =
 1641:                             d_es_allocation_memoire;
 1642:                     return;
 1643:                 }
 1644: 
 1645:                 (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1646:                         .nombre_arguments = 0;
 1647:                 (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1648:                         .fonction = instruction_plus;
 1649: 
 1650:                 if (((*((struct_fonction *) (*(*l_element_courant).donnee)
 1651:                         .objet)).nom_fonction = malloc(2 *
 1652:                         sizeof(unsigned char))) == NULL)
 1653:                 {
 1654:                     (*s_etat_processus).erreur_systeme =
 1655:                             d_es_allocation_memoire;
 1656:                     return;
 1657:                 }
 1658: 
 1659:                 strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
 1660:                         .objet)).nom_fonction, "+");
 1661:             }
 1662:         }
 1663: 
 1664:         /*
 1665:          * Fermeture de l'expression
 1666:          */
 1667: 
 1668:         if (last_valide == d_vrai)
 1669:         {
 1670:             sf(s_etat_processus, 31);
 1671:         }
 1672: 
 1673:         if (((*l_element_courant).suivant =
 1674:                 allocation_maillon(s_etat_processus)) == NULL)
 1675:         {
 1676:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1677:             return;
 1678:         }
 1679: 
 1680:         l_element_courant = (*l_element_courant).suivant;
 1681: 
 1682:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1683:                 == NULL)
 1684:         {
 1685:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1686:             return;
 1687:         }
 1688: 
 1689:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1690:                 .nombre_arguments = 0;
 1691:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1692:                 .fonction = instruction_vers_niveau_inferieur;
 1693: 
 1694:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1695:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1696:         {
 1697:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1698:             return;
 1699:         }
 1700: 
 1701:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1702:                 .nom_fonction, ">>");
 1703: 
 1704:         (*l_element_courant).suivant = NULL;
 1705: 
 1706:         /*
 1707:          * Destruction de la variable locale
 1708:          */
 1709: 
 1710:         (*s_etat_processus).niveau_courant--;
 1711: 
 1712:         if (retrait_variable(s_etat_processus, (*((struct_nom *)
 1713:                 (*s_objet_argument_3).objet)).nom, 'L') == d_erreur)
 1714:         {
 1715:             liberation(s_etat_processus, s_objet_argument_1);
 1716:             liberation(s_etat_processus, s_objet_argument_2);
 1717:             liberation(s_etat_processus, s_objet_argument_3);
 1718:             liberation(s_etat_processus, s_objet_argument_4);
 1719:             liberation(s_etat_processus, s_objet_resultat);
 1720: 
 1721:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 1722:             return;
 1723:         }
 1724:     }
 1725:     else
 1726:     {
 1727:         liberation(s_etat_processus, s_objet_argument_1);
 1728:         liberation(s_etat_processus, s_objet_argument_2);
 1729:         liberation(s_etat_processus, s_objet_argument_3);
 1730:         liberation(s_etat_processus, s_objet_argument_4);
 1731: 
 1732:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1733:         return;
 1734:     }
 1735: 
 1736:     liberation(s_etat_processus, s_objet_argument_1);
 1737:     liberation(s_etat_processus, s_objet_argument_2);
 1738:     liberation(s_etat_processus, s_objet_argument_3);
 1739:     liberation(s_etat_processus, s_objet_argument_4);
 1740: 
 1741:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1742:             s_objet_resultat) == d_erreur)
 1743:     {
 1744:         return;
 1745:     }
 1746: 
 1747:     return;
 1748: }
 1749: 
 1750: 
 1751: /*
 1752: ================================================================================
 1753:   Fonction 'target'
 1754: ================================================================================
 1755:   Entrées :
 1756: --------------------------------------------------------------------------------
 1757:   Sorties :
 1758: --------------------------------------------------------------------------------
 1759:   Effets de bord : néant
 1760: ================================================================================
 1761: */
 1762: 
 1763: void
 1764: instruction_target(struct_processus *s_etat_processus)
 1765: {
 1766:     struct_liste_chainee        *l_element_courant;
 1767: 
 1768:     struct addrinfo             *resolution;
 1769:     struct addrinfo             *resolution_courante;
 1770: 
 1771:     struct_objet                *s_objet_argument_1;
 1772:     struct_objet                *s_objet_argument_2;
 1773: 
 1774:     unsigned long               i;
 1775:     unsigned long               nombre_elements;
 1776: 
 1777:     (*s_etat_processus).erreur_execution = d_ex;
 1778: 
 1779:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1780:     {
 1781:         printf("\n  TARGET ");
 1782: 
 1783:         if ((*s_etat_processus).langue == 'F')
 1784:         {
 1785:             printf("(cible d'une socket non connectée)\n\n");
 1786:         }
 1787:         else
 1788:         {
 1789:             printf("(target of unconnected socket)\n\n");
 1790:         }
 1791: 
 1792:         printf("    2: %s, %s\n", d_CHN, d_LST);
 1793:         printf("    1: %s\n", d_SCK);
 1794:         printf("->  1: %s\n", d_SCK);
 1795: 
 1796:         return;
 1797:     }
 1798:     else if ((*s_etat_processus).test_instruction == 'Y')
 1799:     {
 1800:         (*s_etat_processus).nombre_arguments = -1;
 1801:         return;
 1802:     }
 1803: 
 1804:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1805:     {
 1806:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
 1807:         {
 1808:             return;
 1809:         }
 1810:     }
 1811: 
 1812:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1813:             &s_objet_argument_1) == d_erreur)
 1814:     {
 1815:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1816:         return;
 1817:     }
 1818: 
 1819:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1820:             &s_objet_argument_2) == d_erreur)
 1821:     {
 1822:         liberation(s_etat_processus, s_objet_argument_1);
 1823: 
 1824:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1825:         return;
 1826:     }
 1827: 
 1828:     if ((*s_objet_argument_1).type == SCK)
 1829:     {
 1830: 
 1831:         /*
 1832:          * Vérification du type de socket
 1833:          */
 1834: 
 1835:         if ((strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type,
 1836:                 "STREAM") == 0) || (strcmp((*((struct_socket *)
 1837:                 (*s_objet_argument_1).objet)).type, "SEQUENTIAL DATAGRAM")
 1838:                 == 0))
 1839:         {
 1840:             liberation(s_etat_processus, s_objet_argument_1);
 1841:             liberation(s_etat_processus, s_objet_argument_2);
 1842: 
 1843:             (*s_etat_processus).erreur_execution =
 1844:                     d_ex_erreur_parametre_fichier;
 1845:             return;
 1846:         }
 1847: 
 1848:         if ((*s_objet_argument_2).type == CHN)
 1849:         {
 1850:             /*
 1851:              * La socket ne peut être que du domaine UNIX
 1852:              */
 1853: 
 1854:             if ((*((struct_socket *) (*s_objet_argument_1).objet)).domaine
 1855:                     != PF_UNIX)
 1856:             {
 1857:                 liberation(s_etat_processus, s_objet_argument_1);
 1858:                 liberation(s_etat_processus, s_objet_argument_2);
 1859: 
 1860:                 (*s_etat_processus).erreur_execution =
 1861:                         d_ex_erreur_parametre_fichier;
 1862:                 return;
 1863:             }
 1864: 
 1865:             free((*((struct_socket *) (*s_objet_argument_1).objet))
 1866:                     .adresse_distante);
 1867: 
 1868:             if (((*((struct_socket *) (*s_objet_argument_1).objet))
 1869:                     .adresse_distante = transliteration(s_etat_processus,
 1870:                     (unsigned char *) (*s_objet_argument_2).objet,
 1871:                     d_locale, "UTF-8")) == NULL)
 1872:             {
 1873:                 liberation(s_etat_processus, s_objet_argument_1);
 1874:                 liberation(s_etat_processus, s_objet_argument_2);
 1875: 
 1876:                 return;
 1877:             }
 1878:         }
 1879:         else if ((*s_objet_argument_2).type == LST)
 1880:         {
 1881:             l_element_courant = (struct_liste_chainee *)
 1882:                     (*s_objet_argument_2).objet;
 1883:             nombre_elements = 0;
 1884: 
 1885:             while(l_element_courant != NULL)
 1886:             {
 1887:                 nombre_elements++;
 1888:                 l_element_courant = (*l_element_courant).suivant;
 1889:             }
 1890: 
 1891:             if (nombre_elements != 2)
 1892:             {
 1893:                 liberation(s_etat_processus, s_objet_argument_1);
 1894:                 liberation(s_etat_processus, s_objet_argument_2);
 1895: 
 1896:                 (*s_etat_processus).erreur_execution =
 1897:                         d_ex_erreur_parametre_fichier;
 1898:                 return;
 1899:             }
 1900: 
 1901:             l_element_courant = (struct_liste_chainee *)
 1902:                     (*s_objet_argument_2).objet;
 1903: 
 1904:             if ((*(*l_element_courant).donnee).type == VIN)
 1905:             {
 1906:                 if ((*((struct_vecteur *) (*(*l_element_courant).donnee).objet))
 1907:                         .taille == 4)
 1908:                 {
 1909:                     if ((*((struct_socket *) (*s_objet_argument_1).objet))
 1910:                             .domaine != PF_INET)
 1911:                     {
 1912:                         liberation(s_etat_processus, s_objet_argument_1);
 1913:                         liberation(s_etat_processus, s_objet_argument_2);
 1914: 
 1915:                         (*s_etat_processus).erreur_execution =
 1916:                                 d_ex_erreur_parametre_fichier;
 1917:                         return;
 1918:                     }
 1919: 
 1920:                     free((*((struct_socket *) (*s_objet_argument_1).objet))
 1921:                             .adresse_distante);
 1922: 
 1923:                     if (((*((struct_socket *) (*s_objet_argument_1)
 1924:                             .objet)).adresse_distante = malloc(23 *
 1925:                             sizeof(unsigned char))) == NULL)
 1926:                     {
 1927:                         (*s_etat_processus).erreur_systeme =
 1928:                                 d_es_allocation_memoire;
 1929:                         return;
 1930:                     }
 1931: 
 1932:                     for(i = 0; i < 4; i++)
 1933:                     {
 1934:                         if ((((integer8 *) (*((struct_vecteur *)
 1935:                                 (*(*l_element_courant).donnee).objet)).tableau)
 1936:                                 [i] >= 0) && (((integer8 *)
 1937:                                 (*((struct_vecteur *) (*(*l_element_courant)
 1938:                                 .donnee).objet)).tableau)[i] <= 255))
 1939:                         {
 1940:                         }
 1941:                         else
 1942:                         {
 1943:                             liberation(s_etat_processus, s_objet_argument_1);
 1944:                             liberation(s_etat_processus, s_objet_argument_2);
 1945: 
 1946:                             (*s_etat_processus).erreur_execution =
 1947:                                     d_ex_erreur_parametre_fichier;
 1948:                             return;
 1949:                         }
 1950:                     }
 1951: 
 1952:                     sprintf((*((struct_socket *) (*s_objet_argument_1)
 1953:                             .objet)).adresse_distante, "%d.%d.%d.%d",
 1954:                             (int) ((integer8 *) (*((struct_vecteur *)
 1955:                             (*(*l_element_courant).donnee).objet))
 1956:                             .tableau)[0],
 1957:                             (int) ((integer8 *) (*((struct_vecteur *)
 1958:                             (*(*l_element_courant).donnee).objet))
 1959:                             .tableau)[1],
 1960:                             (int) ((integer8 *) (*((struct_vecteur *)
 1961:                             (*(*l_element_courant).donnee).objet))
 1962:                             .tableau)[2],
 1963:                             (int) ((integer8 *) (*((struct_vecteur *)
 1964:                             (*(*l_element_courant).donnee).objet))
 1965:                             .tableau)[3]);
 1966:                 }
 1967:                 else if ((*((struct_vecteur *) (*(*l_element_courant).donnee)
 1968:                         .objet)).taille == 16)
 1969:                 {
 1970:                     if ((*((struct_socket *) (*s_objet_argument_1).objet))
 1971:                             .domaine != PF_INET6)
 1972:                     {
 1973:                         liberation(s_etat_processus, s_objet_argument_1);
 1974:                         liberation(s_etat_processus, s_objet_argument_2);
 1975: 
 1976:                         (*s_etat_processus).erreur_execution =
 1977:                                 d_ex_erreur_parametre_fichier;
 1978:                         return;
 1979:                     }
 1980: 
 1981:                     free((*((struct_socket *) (*s_objet_argument_1).objet))
 1982:                             .adresse_distante);
 1983: 
 1984:                     if (((*((struct_socket *) (*s_objet_argument_1)
 1985:                             .objet)).adresse_distante = malloc(47 *
 1986:                             sizeof(unsigned char))) == NULL)
 1987:                     {
 1988:                         (*s_etat_processus).erreur_systeme =
 1989:                                 d_es_allocation_memoire;
 1990:                         return;
 1991:                     }
 1992: 
 1993:                     for(i = 0; i < 16; i++)
 1994:                     {
 1995:                         if ((((integer8 *) (*((struct_vecteur *)
 1996:                                 (*(*l_element_courant).donnee).objet)).tableau)
 1997:                                 [i] >= 0) && (((integer8 *)
 1998:                                 (*((struct_vecteur *) (*(*l_element_courant)
 1999:                                 .donnee).objet)).tableau)[i] <= 255))
 2000:                         {
 2001:                         }
 2002:                         else
 2003:                         {
 2004:                             liberation(s_etat_processus, s_objet_argument_1);
 2005:                             liberation(s_etat_processus, s_objet_argument_2);
 2006: 
 2007:                             (*s_etat_processus).erreur_execution =
 2008:                                     d_ex_erreur_parametre_fichier;
 2009:                             return;
 2010:                         }
 2011:                     }
 2012: 
 2013:                     sprintf((*((struct_socket *) (*s_objet_argument_1)
 2014:                             .objet)).adresse_distante,
 2015:                             "%02X%02X:%02X%02X:%02X%02X:%02X%02X:"
 2016:                             "%02X%02X:%02X%02X:%02X%02X:%02X%02X",
 2017:                             (int) ((integer8 *) (*((struct_vecteur *)
 2018:                             (*(*l_element_courant).donnee).objet))
 2019:                             .tableau)[0],
 2020:                             (int) ((integer8 *) (*((struct_vecteur *)
 2021:                             (*(*l_element_courant).donnee).objet))
 2022:                             .tableau)[1],
 2023:                             (int) ((integer8 *) (*((struct_vecteur *)
 2024:                             (*(*l_element_courant).donnee).objet))
 2025:                             .tableau)[2],
 2026:                             (int) ((integer8 *) (*((struct_vecteur *)
 2027:                             (*(*l_element_courant).donnee).objet))
 2028:                             .tableau)[3],
 2029:                             (int) ((integer8 *) (*((struct_vecteur *)
 2030:                             (*(*l_element_courant).donnee).objet))
 2031:                             .tableau)[4],
 2032:                             (int) ((integer8 *) (*((struct_vecteur *)
 2033:                             (*(*l_element_courant).donnee).objet))
 2034:                             .tableau)[5],
 2035:                             (int) ((integer8 *) (*((struct_vecteur *)
 2036:                             (*(*l_element_courant).donnee).objet))
 2037:                             .tableau)[6],
 2038:                             (int) ((integer8 *) (*((struct_vecteur *)
 2039:                             (*(*l_element_courant).donnee).objet))
 2040:                             .tableau)[7],
 2041:                             (int) ((integer8 *) (*((struct_vecteur *)
 2042:                             (*(*l_element_courant).donnee).objet))
 2043:                             .tableau)[8],
 2044:                             (int) ((integer8 *) (*((struct_vecteur *)
 2045:                             (*(*l_element_courant).donnee).objet))
 2046:                             .tableau)[9],
 2047:                             (int) ((integer8 *) (*((struct_vecteur *)
 2048:                             (*(*l_element_courant).donnee).objet))
 2049:                             .tableau)[10],
 2050:                             (int) ((integer8 *) (*((struct_vecteur *)
 2051:                             (*(*l_element_courant).donnee).objet))
 2052:                             .tableau)[11],
 2053:                             (int) ((integer8 *) (*((struct_vecteur *)
 2054:                             (*(*l_element_courant).donnee).objet))
 2055:                             .tableau)[12],
 2056:                             (int) ((integer8 *) (*((struct_vecteur *)
 2057:                             (*(*l_element_courant).donnee).objet))
 2058:                             .tableau)[13],
 2059:                             (int) ((integer8 *) (*((struct_vecteur *)
 2060:                             (*(*l_element_courant).donnee).objet))
 2061:                             .tableau)[14],
 2062:                             (int) ((integer8 *) (*((struct_vecteur *)
 2063:                             (*(*l_element_courant).donnee).objet))
 2064:                             .tableau)[15]);
 2065:                 }
 2066:                 else
 2067:                 {
 2068:                     liberation(s_etat_processus, s_objet_argument_1);
 2069:                     liberation(s_etat_processus, s_objet_argument_2);
 2070: 
 2071:                     (*s_etat_processus).erreur_execution =
 2072:                             d_ex_erreur_parametre_fichier;
 2073:                     return;
 2074:                 }
 2075:             }
 2076:             else if ((*(*l_element_courant).donnee).type == CHN)
 2077:             {
 2078:                 resolution = NULL;
 2079: 
 2080:                 if (getaddrinfo((unsigned char *) (*(*l_element_courant)
 2081:                         .donnee).objet, NULL, NULL, &resolution) != 0)
 2082:                 {
 2083:                     liberation(s_etat_processus, s_objet_argument_1);
 2084:                     liberation(s_etat_processus, s_objet_argument_2);
 2085: 
 2086:                     if (resolution != NULL)
 2087:                     {
 2088:                         freeaddrinfo(resolution);
 2089:                     }
 2090: 
 2091:                     (*s_etat_processus).erreur_execution =
 2092:                             d_ex_erreur_acces_fichier;
 2093:                     return;
 2094:                 }
 2095: 
 2096:                 if ((*((struct_socket *) (*s_objet_argument_1).objet))
 2097:                         .domaine == PF_INET)
 2098:                 { // Résolution du nom en IPv4
 2099:                     resolution_courante = resolution;
 2100: 
 2101:                     while(resolution_courante != NULL)
 2102:                     {
 2103:                         if ((*resolution_courante).ai_family == AF_INET)
 2104:                         {
 2105:                             break;
 2106:                         }
 2107: 
 2108:                         resolution_courante = (*resolution_courante).ai_next;
 2109:                     }
 2110: 
 2111:                     if (resolution_courante == NULL)
 2112:                     {
 2113:                         liberation(s_etat_processus, s_objet_argument_1);
 2114:                         liberation(s_etat_processus, s_objet_argument_2);
 2115: 
 2116:                         freeaddrinfo(resolution);
 2117: 
 2118:                         (*s_etat_processus).erreur_execution =
 2119:                                 d_ex_erreur_acces_fichier;
 2120:                         return;
 2121:                     }
 2122: 
 2123:                     free((*((struct_socket *) (*s_objet_argument_1).objet))
 2124:                             .adresse_distante);
 2125: 
 2126:                     if (((*((struct_socket *) (*s_objet_argument_1)
 2127:                             .objet)).adresse_distante = malloc(23 *
 2128:                             sizeof(unsigned char))) == NULL)
 2129:                     {
 2130:                         (*s_etat_processus).erreur_systeme =
 2131:                                 d_es_allocation_memoire;
 2132:                         return;
 2133:                     }
 2134: 
 2135:                     sprintf((*((struct_socket *) (*s_objet_argument_1).objet))
 2136:                             .adresse_distante, "%d.%d.%d.%d",
 2137:                             (ntohl((*((struct sockaddr_in *)
 2138:                             (*resolution_courante).ai_addr)).sin_addr.s_addr)
 2139:                             >> 24) & 0xFF,
 2140:                             (ntohl((*((struct sockaddr_in *)
 2141:                             (*resolution_courante).ai_addr)).sin_addr.s_addr)
 2142:                             >> 16) & 0xFF,
 2143:                             (ntohl((*((struct sockaddr_in *)
 2144:                             (*resolution_courante).ai_addr)).sin_addr.s_addr)
 2145:                             >> 8) & 0xFF,
 2146:                             ntohl((*((struct sockaddr_in *)
 2147:                             (*resolution_courante).ai_addr)).sin_addr.s_addr)
 2148:                             & 0xFF);
 2149:                 }
 2150:                 else if ((*((struct_socket *) (*s_objet_argument_1).objet))
 2151:                         .domaine == PF_INET6)
 2152:                 { // Résolution du nom en IPv6
 2153: #                   ifdef IPV6
 2154:                     resolution_courante = resolution;
 2155: 
 2156:                     while(resolution_courante != NULL)
 2157:                     {
 2158:                         if ((*resolution_courante).ai_family == AF_INET6)
 2159:                         {
 2160:                             break;
 2161:                         }
 2162: 
 2163:                         resolution_courante = (*resolution_courante).ai_next;
 2164:                     }
 2165: 
 2166:                     if (resolution_courante == NULL)
 2167:                     {
 2168:                         liberation(s_etat_processus, s_objet_argument_1);
 2169:                         liberation(s_etat_processus, s_objet_argument_2);
 2170: 
 2171:                         freeaddrinfo(resolution);
 2172: 
 2173:                         (*s_etat_processus).erreur_execution =
 2174:                                 d_ex_erreur_acces_fichier;
 2175:                         return;
 2176:                     }
 2177: 
 2178:                     if (((*((struct_socket *) (*s_objet_argument_1)
 2179:                             .objet)).adresse_distante = malloc(47 *
 2180:                             sizeof(unsigned char))) == NULL)
 2181:                     {
 2182:                         (*s_etat_processus).erreur_systeme =
 2183:                                 d_es_allocation_memoire;
 2184:                         return;
 2185:                     }
 2186: 
 2187:                     sprintf((*((struct_socket *) (*s_objet_argument_1)
 2188:                             .objet)).adresse_distante,
 2189:                             "%02X%02X:%02X%02X:%02X%02X:%02X%02X:"
 2190:                             "%02X%02X:%02X%02X:%02X%02X:%02X%02X",
 2191:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2192:                             .ai_addr)).sin6_addr.s6_addr[0],
 2193:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2194:                             .ai_addr)).sin6_addr.s6_addr[1],
 2195:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2196:                             .ai_addr)).sin6_addr.s6_addr[2],
 2197:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2198:                             .ai_addr)).sin6_addr.s6_addr[3],
 2199:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2200:                             .ai_addr)).sin6_addr.s6_addr[4],
 2201:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2202:                             .ai_addr)).sin6_addr.s6_addr[5],
 2203:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2204:                             .ai_addr)).sin6_addr.s6_addr[6],
 2205:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2206:                             .ai_addr)).sin6_addr.s6_addr[7],
 2207:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2208:                             .ai_addr)).sin6_addr.s6_addr[8],
 2209:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2210:                             .ai_addr)).sin6_addr.s6_addr[9],
 2211:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2212:                             .ai_addr)).sin6_addr.s6_addr[10],
 2213:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2214:                             .ai_addr)).sin6_addr.s6_addr[11],
 2215:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2216:                             .ai_addr)).sin6_addr.s6_addr[12],
 2217:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2218:                             .ai_addr)).sin6_addr.s6_addr[13],
 2219:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2220:                             .ai_addr)).sin6_addr.s6_addr[14],
 2221:                             (*((struct sockaddr_in6 *) (*resolution_courante)
 2222:                             .ai_addr)).sin6_addr.s6_addr[15]);
 2223: #                   else
 2224:                     if ((*s_etat_processus).langue == 'F')
 2225:                     {
 2226:                         printf("+++Attention : Support du protocole"
 2227:                                 " IPv6 indisponible\n");
 2228:                     }
 2229:                     else
 2230:                     {
 2231:                         printf("+++Warning : IPv6 support "
 2232:                                 "unavailable\n");
 2233:                     }
 2234: #                   endif
 2235:                 }
 2236:                 else
 2237:                 {
 2238:                     liberation(s_etat_processus, s_objet_argument_1);
 2239:                     liberation(s_etat_processus, s_objet_argument_2);
 2240: 
 2241:                     freeaddrinfo(resolution);
 2242: 
 2243:                     (*s_etat_processus).erreur_execution =
 2244:                             d_ex_erreur_parametre_fichier;
 2245:                     return;
 2246:                 }
 2247: 
 2248:                 freeaddrinfo(resolution);
 2249:             }
 2250:             else
 2251:             {
 2252:                 liberation(s_etat_processus, s_objet_argument_1);
 2253:                 liberation(s_etat_processus, s_objet_argument_2);
 2254: 
 2255:                 (*s_etat_processus).erreur_execution =
 2256:                         d_ex_erreur_parametre_fichier;
 2257:                 return;
 2258:             }
 2259: 
 2260:             l_element_courant = (*l_element_courant).suivant;
 2261: 
 2262:             if ((*(*l_element_courant).donnee).type == INT)
 2263:             {
 2264:                 if (((*((integer8 *) (*(*l_element_courant).donnee).objet))
 2265:                         >= 0) && ((*((integer8 *) (*(*l_element_courant)
 2266:                         .donnee).objet)) <= 65535))
 2267:                 {
 2268:                     sprintf((*((struct_socket *) (*s_objet_argument_1)
 2269:                             .objet)).adresse_distante +
 2270:                             strlen((*((struct_socket *) (*s_objet_argument_1)
 2271:                             .objet)).adresse_distante), "(%u)", (unsigned int)
 2272:                             (*((integer8 *) (*(*l_element_courant).donnee)
 2273:                             .objet)));
 2274:                 }
 2275:                 else
 2276:                 {
 2277:                     liberation(s_etat_processus, s_objet_argument_1);
 2278:                     liberation(s_etat_processus, s_objet_argument_2);
 2279: 
 2280:                     (*s_etat_processus).erreur_execution =
 2281:                             d_ex_erreur_parametre_fichier;
 2282:                     return;
 2283:                 }
 2284:             }
 2285:             else
 2286:             {
 2287:                 liberation(s_etat_processus, s_objet_argument_1);
 2288:                 liberation(s_etat_processus, s_objet_argument_2);
 2289: 
 2290:                 (*s_etat_processus).erreur_execution =
 2291:                         d_ex_erreur_parametre_fichier;
 2292:                 return;
 2293:             }
 2294:         }
 2295:         else
 2296:         {
 2297:             liberation(s_etat_processus, s_objet_argument_1);
 2298:             liberation(s_etat_processus, s_objet_argument_2);
 2299: 
 2300:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2301:             return;
 2302:         }
 2303:     }
 2304:     else
 2305:     {
 2306:         liberation(s_etat_processus, s_objet_argument_1);
 2307:         liberation(s_etat_processus, s_objet_argument_2);
 2308: 
 2309:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2310:         return;
 2311:     }
 2312: 
 2313:     liberation(s_etat_processus, s_objet_argument_2);
 2314: 
 2315:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2316:             s_objet_argument_1) == d_erreur)
 2317:     {
 2318:         return;
 2319:     }
 2320: 
 2321:     return;
 2322: }
 2323: 
 2324: 
 2325: /*
 2326: ================================================================================
 2327:   Fonction 'tail'
 2328: ================================================================================
 2329:   Entrées :
 2330: --------------------------------------------------------------------------------
 2331:   Sorties :
 2332: --------------------------------------------------------------------------------
 2333:   Effets de bord : néant
 2334: ================================================================================
 2335: */
 2336: 
 2337: void
 2338: instruction_tail(struct_processus *s_etat_processus)
 2339: {
 2340:     integer8                                longueur;
 2341: 
 2342:     struct_liste_chainee                    *l_element_courant;
 2343: 
 2344:     struct_objet                            *s_objet_argument;
 2345:     struct_objet                            *s_objet_resultat;
 2346: 
 2347:     (*s_etat_processus).erreur_execution = d_ex;
 2348: 
 2349:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2350:     {
 2351:         printf("\n  TAIL ");
 2352: 
 2353:         if ((*s_etat_processus).langue == 'F')
 2354:         {
 2355:             printf("(remplace une liste par tous ses éléments hormis "
 2356:                     "son premier)\n\n");
 2357:         }
 2358:         else
 2359:         {
 2360:             printf("(replace a list by all but its first element)\n\n");
 2361:         }
 2362: 
 2363:         printf("    1: %s\n", d_LST);
 2364:         printf("->  1: %s\n", d_LST);
 2365: 
 2366:         return;
 2367:     }
 2368:     else if ((*s_etat_processus).test_instruction == 'Y')
 2369:     {
 2370:         (*s_etat_processus).nombre_arguments = -1;
 2371:         return;
 2372:     }
 2373: 
 2374:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2375:     {
 2376:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 2377:         {
 2378:             return;
 2379:         }
 2380:     }
 2381: 
 2382:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2383:             &s_objet_argument) == d_erreur)
 2384:     {
 2385:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2386:         return;
 2387:     }
 2388: 
 2389:     if ((*s_objet_argument).type == LST)
 2390:     {
 2391:         l_element_courant = (*s_objet_argument).objet;
 2392:         longueur = 0;
 2393: 
 2394:         while(l_element_courant != NULL)
 2395:         {
 2396:             longueur++;
 2397:             l_element_courant = (*l_element_courant).suivant;
 2398:         }
 2399: 
 2400:         if (longueur == 0)
 2401:         {
 2402:             if ((s_objet_resultat = allocation(s_etat_processus, LST))
 2403:                     == NULL)
 2404:             {
 2405:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2406:                 return;
 2407:             }
 2408: 
 2409:             (*s_objet_resultat).objet = NULL;
 2410:         }
 2411:         else
 2412:         {
 2413:             if ((s_objet_resultat = copie_objet(s_etat_processus,
 2414:                     s_objet_argument, 'N')) == NULL)
 2415:             {
 2416:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2417:                 return;
 2418:             }
 2419: 
 2420:             l_element_courant = (*s_objet_resultat).objet;
 2421: 
 2422:             (*s_objet_resultat).objet = (*((struct_liste_chainee *)
 2423:                     (*s_objet_resultat).objet)).suivant;
 2424: 
 2425:             liberation(s_etat_processus, (*l_element_courant).donnee);
 2426:             free(l_element_courant);
 2427:         }
 2428:     }
 2429:     else
 2430:     {
 2431:         liberation(s_etat_processus, s_objet_argument);
 2432: 
 2433:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2434:         return;
 2435:     }
 2436: 
 2437:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2438:             s_objet_resultat) == d_erreur)
 2439:     {
 2440:         return;
 2441:     }
 2442: 
 2443:     liberation(s_etat_processus, s_objet_argument);
 2444: 
 2445:     return;
 2446: }
 2447: 
 2448: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>