File:  [local] / rpl / src / instructions_i2.c
Revision 1.52: download - view: text, annotated - select for diffs - revision graph
Fri Sep 6 10:30:53 2013 UTC (10 years, 7 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_16, HEAD
En route pour la 4.1.16.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.16
    4:   Copyright (C) 1989-2013 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 'idn'
   29: ================================================================================
   30:   Entrées : pointeur sur une struct_processus
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_idn(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  IDN ");
   55: 
   56:         if ((*s_etat_processus).langue == 'F')
   57:         {
   58:             printf("(matrice identité)\n\n");
   59:         }
   60:         else
   61:         {
   62:             printf("(identity matrix)\n\n");
   63:         }
   64: 
   65:         printf("    1: %s, %s, %s, %s\n",
   66:                 d_INT, d_MIN, d_MRL, d_MCX);
   67:         printf("->  1: %s\n\n", d_MIN);
   68: 
   69:         printf("    1: %s\n", d_NOM);
   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:     if ((*s_objet_argument).type == NOM)
   94:     {
   95:         argument_nom = d_vrai;
   96: 
   97:         if (recherche_variable(s_etat_processus, (*((struct_nom *)
   98:                 (*s_objet_argument).objet)).nom) == d_faux)
   99:         {
  100:             (*s_etat_processus).erreur_systeme = d_es;
  101:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
  102: 
  103:             liberation(s_etat_processus, s_objet_argument);
  104: 
  105:             return;
  106:         }
  107: 
  108:         liberation(s_etat_processus, s_objet_argument);
  109: 
  110:         if ((*(*s_etat_processus).pointeur_variable_courante)
  111:                 .variable_verrouillee == d_vrai)
  112:         {
  113:             (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
  114:             return;
  115:         }
  116: 
  117:         s_objet_argument = (*(*s_etat_processus).pointeur_variable_courante)
  118:                 .objet;
  119: 
  120:         if (s_objet_argument == NULL)
  121:         {
  122:             if (recherche_variable_partagee(s_etat_processus,
  123:                     (*(*s_etat_processus).pointeur_variable_courante).nom,
  124:                     (*(*s_etat_processus).pointeur_variable_courante)
  125:                     .variable_partagee, (*(*s_etat_processus)
  126:                     .pointeur_variable_courante).origine) == NULL)
  127:             {
  128:                 (*s_etat_processus).erreur_systeme = d_es;
  129:                 (*s_etat_processus).erreur_execution =
  130:                         d_ex_variable_non_definie;
  131: 
  132:                 return;
  133:             }
  134: 
  135:             s_objet_argument = (*(*s_etat_processus)
  136:                     .pointeur_variable_partagee_courante).objet;
  137:             variable_partagee = d_vrai;
  138:         }
  139:         else
  140:         {
  141:             variable_partagee = d_faux;
  142:         }
  143:     }
  144:     else
  145:     {
  146:         argument_nom = d_faux;
  147:         variable_partagee = d_faux;
  148:     }
  149: 
  150: /*
  151: --------------------------------------------------------------------------------
  152:   L'argument est la dimension de la matrice identité à créer ou une
  153:   matrice carée dont les dimensions seront prises pour créer une matrice
  154:   identité.
  155: --------------------------------------------------------------------------------
  156: */
  157: 
  158:     if (((*s_objet_argument).type == INT) ||
  159:             ((*s_objet_argument).type == MIN) ||
  160:             ((*s_objet_argument).type == MRL) ||
  161:             ((*s_objet_argument).type == MCX))
  162:     {
  163:         if ((s_objet_resultat = allocation(s_etat_processus, MIN))
  164:                 == NULL)
  165:         {
  166:             if (variable_partagee == d_vrai)
  167:             {
  168:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  169:                         .pointeur_variable_partagee_courante).mutex)) != 0)
  170:                 {
  171:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  172:                     return;
  173:                 }
  174:             }
  175: 
  176:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  177:             return;
  178:         }
  179: 
  180:         if ((*s_objet_argument).type == INT)
  181:         {
  182:             (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
  183:                     (*((integer8 *) (*s_objet_argument).objet));
  184:             (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
  185:                     (*((integer8 *) (*s_objet_argument).objet));
  186:         }
  187:         else
  188:         {
  189:             (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
  190:                     (*((struct_matrice *) (*s_objet_argument).objet))
  191:                     .nombre_lignes;
  192:             (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
  193:                     (*((struct_matrice *) (*s_objet_argument).objet))
  194:                     .nombre_colonnes;
  195: 
  196:             if ((*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes
  197:                     != (*((struct_matrice *) (*s_objet_resultat).objet))
  198:                     .nombre_colonnes)
  199:             {
  200:                 if (variable_partagee == d_vrai)
  201:                 {
  202:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  203:                             .pointeur_variable_partagee_courante).mutex)) != 0)
  204:                     {
  205:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  206:                         return;
  207:                     }
  208:                 }
  209: 
  210:                 if (argument_nom == d_faux)
  211:                 {
  212:                     liberation(s_etat_processus, s_objet_argument);
  213:                 }
  214: 
  215:                 free((struct_matrice *) (*s_objet_resultat).objet);
  216:                 free(s_objet_resultat);
  217: 
  218:                 (*s_etat_processus).erreur_execution =
  219:                         d_ex_dimensions_invalides;
  220: 
  221:                 return;
  222:             }
  223:         }
  224: 
  225:         if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
  226:                 malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat)
  227:                 .objet)).nombre_lignes) * sizeof(integer8 *))) == NULL)
  228:         {
  229:             if (variable_partagee == d_vrai)
  230:             {
  231:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  232:                         .pointeur_variable_partagee_courante).mutex)) != 0)
  233:                 {
  234:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  235:                     return;
  236:                 }
  237:             }
  238: 
  239:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  240:             return;
  241:         }
  242: 
  243:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
  244:                 .nombre_lignes; i++)
  245:         {
  246:             if ((((integer8 **) (*((struct_matrice *) (*s_objet_resultat)
  247:                     .objet)).tableau)[i] = malloc(((size_t)
  248:                     (*((struct_matrice *) (*s_objet_resultat).objet))
  249:                     .nombre_colonnes) * sizeof(integer8))) == NULL)
  250:             {
  251:                 if (variable_partagee == d_vrai)
  252:                 {
  253:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  254:                             .pointeur_variable_partagee_courante).mutex)) != 0)
  255:                     {
  256:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  257:                         return;
  258:                     }
  259:                 }
  260: 
  261:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  262:                 return;
  263:             }
  264: 
  265:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
  266:                     .nombre_colonnes; j++)
  267:             {
  268:                 ((integer8 **) (*((struct_matrice *) (*s_objet_resultat)
  269:                         .objet)).tableau)[i][j] = (i == j) ? 1 : 0;
  270:             }
  271:         }
  272:     }
  273: 
  274: /*
  275: --------------------------------------------------------------------------------
  276:   Réalisation de la fonction IDN impossible
  277: --------------------------------------------------------------------------------
  278: */
  279: 
  280:     else
  281:     {
  282:         if (variable_partagee == d_vrai)
  283:         {
  284:             if (pthread_mutex_unlock(&((*(*s_etat_processus)
  285:                     .pointeur_variable_partagee_courante).mutex)) != 0)
  286:             {
  287:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  288:                 return;
  289:             }
  290:         }
  291: 
  292:         liberation(s_etat_processus, s_objet_argument);
  293: 
  294:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  295:         return;
  296:     }
  297: 
  298:     liberation(s_etat_processus, s_objet_argument);
  299: 
  300:     if (argument_nom == d_faux)
  301:     {
  302:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  303:                 s_objet_resultat) == d_erreur)
  304:         {
  305:             return;
  306:         }
  307:     }
  308:     else
  309:     {
  310:         if (variable_partagee == d_vrai)
  311:         {
  312:             (*(*s_etat_processus).pointeur_variable_courante).objet = NULL;
  313:             (*(*s_etat_processus).pointeur_variable_partagee_courante).objet =
  314:                     s_objet_resultat;
  315: 
  316:             if (pthread_mutex_unlock(&((*(*s_etat_processus)
  317:                     .pointeur_variable_partagee_courante).mutex)) != 0)
  318:             {
  319:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  320:                 return;
  321:             }
  322:         }
  323:         else
  324:         {
  325:             (*(*s_etat_processus).pointeur_variable_courante).objet =
  326:                     s_objet_resultat;
  327:         }
  328:     }
  329: 
  330:     return;
  331: }
  332: 
  333: 
  334: /*
  335: ================================================================================
  336:   Fonction 'IFFT'
  337: ================================================================================
  338:   Entrées : structure processus
  339: --------------------------------------------------------------------------------
  340:   Sorties :
  341: --------------------------------------------------------------------------------
  342:   Effets de bord : néant
  343: ================================================================================
  344: */
  345: 
  346: void
  347: instruction_ifft(struct_processus *s_etat_processus)
  348: {
  349:     integer4                    erreur;
  350:     integer4                    inverse;
  351:     integer4                    nombre_colonnes;
  352:     integer4                    nombre_lignes;
  353: 
  354:     struct_complexe16           *matrice_f77;
  355: 
  356:     struct_objet                *s_objet_argument;
  357:     struct_objet                *s_objet_longueur_fft;
  358:     struct_objet                *s_objet_resultat;
  359: 
  360:     logical1                    presence_longueur_fft;
  361: 
  362:     integer8                    i;
  363:     integer8                    j;
  364:     integer8                    k;
  365:     integer8                    longueur_fft;
  366: 
  367:     (*s_etat_processus).erreur_execution = d_ex;
  368: 
  369:     if ((*s_etat_processus).affichage_arguments == 'Y')
  370:     {
  371:         printf("\n  IFFT ");
  372: 
  373:         if ((*s_etat_processus).langue == 'F')
  374:         {
  375:             printf("(transformée de Fourier inverse rapide)\n\n");
  376:         }
  377:         else
  378:         {
  379:             printf("(inverse of fast Fourier transform)\n\n");
  380:         }
  381: 
  382:         printf("    2: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
  383:         printf("    1: %s\n", d_INT);
  384:         printf("->  1: %s\n\n", d_VCX);
  385: 
  386:         printf("    1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
  387:         printf("->  1: %s\n\n", d_VCX);
  388: 
  389:         printf("    2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  390:         printf("    1: %s\n", d_INT);
  391:         printf("->  1: %s\n\n", d_MCX);
  392: 
  393:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  394:         printf("->  1: %s\n", d_MCX);
  395: 
  396:         return;
  397:     }
  398:     else if ((*s_etat_processus).test_instruction == 'Y')
  399:     {
  400:         (*s_etat_processus).nombre_arguments = -1;
  401:         return;
  402:     }
  403:     
  404:     /*
  405:      * Il est possible d'imposer une longueur de FFT au premier niveau
  406:      * de la pile.
  407:      */
  408: 
  409:     if ((*s_etat_processus).l_base_pile == NULL)
  410:     {
  411:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  412:         return;
  413:     }
  414: 
  415:     if ((*(*(*s_etat_processus).l_base_pile).donnee).type == INT)
  416:     {
  417:         presence_longueur_fft = d_vrai;
  418: 
  419:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
  420:         {
  421:             if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  422:             {
  423:                 return;
  424:             }
  425:         }
  426: 
  427:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  428:                 &s_objet_longueur_fft) == d_erreur)
  429:         {
  430:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  431:             return;
  432:         }
  433: 
  434:         longueur_fft = (*((integer8 *) (*s_objet_longueur_fft).objet));
  435: 
  436:         liberation(s_etat_processus, s_objet_longueur_fft);
  437:     }
  438:     else
  439:     {
  440:         presence_longueur_fft = d_faux;
  441:         longueur_fft = 0;
  442: 
  443:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
  444:         {
  445:             if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  446:             {
  447:                 return;
  448:             }
  449:         }
  450:     }
  451: 
  452:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  453:             &s_objet_argument) == d_erreur)
  454:     {
  455:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  456:         return;
  457:     }
  458: 
  459: /*
  460: --------------------------------------------------------------------------------
  461:   Vecteur
  462: --------------------------------------------------------------------------------
  463: */
  464: 
  465:     if (((*s_objet_argument).type == VIN) ||
  466:             ((*s_objet_argument).type == VRL) ||
  467:             ((*s_objet_argument).type == VCX))
  468:     {
  469:         if (presence_longueur_fft == d_faux)
  470:         {
  471:             longueur_fft = (integer8) pow(2, ceil(log((real8)
  472:                     (*((struct_vecteur *)
  473:                     (*s_objet_argument).objet)).taille) / log((real8) 2)));
  474: 
  475:             if ((((real8) longueur_fft) / ((real8) (*((struct_vecteur *)
  476:                     (*s_objet_argument).objet)).taille)) == 2)
  477:             {
  478:                 longueur_fft /= 2;
  479:             }
  480:         }
  481: 
  482:         if ((matrice_f77 = malloc(((size_t) longueur_fft) *
  483:                 sizeof(struct_complexe16))) == NULL)
  484:         {
  485:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  486:             return;
  487:         }
  488: 
  489:         if ((*s_objet_argument).type == VIN)
  490:         {
  491:             for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
  492:                     .taille; i++)
  493:             {
  494:                 matrice_f77[i].partie_reelle = (real8) ((integer8 *)
  495:                         (*((struct_vecteur *) (*s_objet_argument).objet))
  496:                         .tableau)[i];
  497:                 matrice_f77[i].partie_imaginaire = (real8) 0;
  498:             }
  499:         }
  500:         else if ((*s_objet_argument).type == VRL)
  501:         {
  502:             for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
  503:                     .taille; i++)
  504:             {
  505:                 matrice_f77[i].partie_reelle = ((real8 *)
  506:                         (*((struct_vecteur *) (*s_objet_argument).objet))
  507:                         .tableau)[i];
  508:                 matrice_f77[i].partie_imaginaire = (real8) 0;
  509:             }
  510:         }
  511:         else
  512:         {
  513:             for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
  514:                     .taille; i++)
  515:             {
  516:                 matrice_f77[i].partie_reelle = ((struct_complexe16 *)
  517:                         (*((struct_vecteur *) (*s_objet_argument).objet))
  518:                         .tableau)[i].partie_reelle;
  519:                 matrice_f77[i].partie_imaginaire = ((struct_complexe16 *)
  520:                         (*((struct_vecteur *) (*s_objet_argument).objet))
  521:                         .tableau)[i].partie_imaginaire;
  522:             }
  523:         }
  524: 
  525:         for(; i < longueur_fft; i++)
  526:         {
  527:                 matrice_f77[i].partie_reelle = (real8) 0;
  528:                 matrice_f77[i].partie_imaginaire = (real8) 0;
  529:         }
  530: 
  531:         nombre_lignes = 1;
  532:         nombre_colonnes = (integer4) longueur_fft;
  533:         inverse = -1;
  534: 
  535:         dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur);
  536: 
  537:         if (erreur != 0)
  538:         {
  539:             liberation(s_etat_processus, s_objet_argument);
  540:             free(matrice_f77);
  541: 
  542:             (*s_etat_processus).erreur_execution = d_ex_longueur_fft;
  543:             return;
  544:         }
  545: 
  546:         if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL)
  547:         {
  548:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  549:             return;
  550:         }
  551: 
  552:         (*((struct_vecteur *) (*s_objet_resultat).objet)).taille = longueur_fft;
  553:         (*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = matrice_f77;
  554:     }
  555: 
  556: /*
  557: --------------------------------------------------------------------------------
  558:   Matrice
  559: --------------------------------------------------------------------------------
  560: */
  561: 
  562:     else if (((*s_objet_argument).type == MIN) ||
  563:             ((*s_objet_argument).type == MRL) ||
  564:             ((*s_objet_argument).type == MCX))
  565:     {
  566:         if (presence_longueur_fft == d_faux)
  567:         {
  568:             longueur_fft = (integer8) pow(2, ceil(log((real8)
  569:                     (*((struct_matrice *) (*s_objet_argument).objet))
  570:                     .nombre_colonnes) / log((real8) 2)));
  571: 
  572:             if ((((real8) longueur_fft) / ((real8) (*((struct_matrice *)
  573:                     (*s_objet_argument).objet)).nombre_colonnes)) == 2)
  574:             {
  575:                 longueur_fft /= 2;
  576:             }
  577:         }
  578: 
  579:         if ((matrice_f77 = malloc(((size_t) longueur_fft) *
  580:                 ((size_t) (*((struct_matrice *) (*s_objet_argument).objet))
  581:                 .nombre_lignes) * sizeof(struct_complexe16))) == NULL)
  582:         {
  583:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  584:             return;
  585:         }
  586: 
  587:         if ((*s_objet_argument).type == MIN)
  588:         {
  589:             for(k = 0, i = 0; i < (*((struct_matrice *) (*s_objet_argument)
  590:                     .objet)).nombre_colonnes; i++)
  591:             {
  592:                 for(j = 0; j < (*((struct_matrice *) (*s_objet_argument)
  593:                         .objet)).nombre_lignes; j++)
  594:                 {
  595:                     matrice_f77[k].partie_reelle = (real8) ((integer8 **)
  596:                             (*((struct_matrice *) (*s_objet_argument).objet))
  597:                             .tableau)[j][i];
  598:                     matrice_f77[k++].partie_imaginaire = (real8) 0;
  599:                 }
  600:             }
  601: 
  602:             for(; k < longueur_fft * (*((struct_matrice *) (*s_objet_argument)
  603:                     .objet)).nombre_lignes; k++)
  604:             {
  605:                 matrice_f77[k].partie_reelle = (real8) 0;
  606:                 matrice_f77[k].partie_imaginaire = (real8) 0;
  607:             }
  608:         }
  609:         else if ((*s_objet_argument).type == MRL)
  610:         {
  611:             for(k = 0, i = 0; i < (*((struct_matrice *) (*s_objet_argument)
  612:                     .objet)).nombre_colonnes; i++)
  613:             {
  614:                 for(j = 0; j < (*((struct_matrice *) (*s_objet_argument)
  615:                         .objet)).nombre_lignes; j++)
  616:                 {
  617:                     matrice_f77[k].partie_reelle = ((real8 **)
  618:                             (*((struct_matrice *) (*s_objet_argument).objet))
  619:                             .tableau)[j][i];
  620:                     matrice_f77[k++].partie_imaginaire = (real8) 0;
  621:                 }
  622:             }
  623: 
  624:             for(; k < longueur_fft * (*((struct_matrice *) (*s_objet_argument)
  625:                     .objet)).nombre_lignes; k++)
  626:             {
  627:                 matrice_f77[k].partie_reelle = (real8) 0;
  628:                 matrice_f77[k].partie_imaginaire = (real8) 0;
  629:             }
  630:         }
  631:         else
  632:         {
  633:             for(k = 0, i = 0; i < (*((struct_matrice *) (*s_objet_argument)
  634:                     .objet)).nombre_colonnes; i++)
  635:             {
  636:                 for(j = 0; j < (*((struct_matrice *) (*s_objet_argument)
  637:                         .objet)).nombre_lignes; j++)
  638:                 {
  639:                     matrice_f77[k].partie_reelle = ((struct_complexe16 **)
  640:                             (*((struct_matrice *) (*s_objet_argument).objet))
  641:                             .tableau)[j][i].partie_reelle;
  642:                     matrice_f77[k++].partie_imaginaire =
  643:                             ((struct_complexe16 **) (*((struct_matrice *)
  644:                             (*s_objet_argument).objet)).tableau)[j][i]
  645:                             .partie_imaginaire;
  646:                 }
  647:             }
  648: 
  649:             for(; k < longueur_fft * (*((struct_matrice *) (*s_objet_argument)
  650:                     .objet)).nombre_lignes; k++)
  651:             {
  652:                 matrice_f77[k].partie_reelle = (real8) 0;
  653:                 matrice_f77[k].partie_imaginaire = (real8) 0;
  654:             }
  655:         }
  656: 
  657:         nombre_lignes = (integer4) (*((struct_matrice *)
  658:                 (*s_objet_argument).objet)).nombre_lignes;
  659:         nombre_colonnes = (integer4) longueur_fft;
  660:         inverse = -1;
  661: 
  662:         dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur);
  663: 
  664:         if (erreur != 0)
  665:         {
  666:             liberation(s_etat_processus, s_objet_argument);
  667:             free(matrice_f77);
  668: 
  669:             (*s_etat_processus).erreur_execution = d_ex_longueur_fft;
  670:             return;
  671:         }
  672: 
  673:         if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
  674:         {
  675:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  676:             return;
  677:         }
  678: 
  679:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
  680:                 (*((struct_matrice *) (*s_objet_argument).objet))
  681:                 .nombre_lignes;
  682:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
  683:                 longueur_fft;
  684: 
  685:         if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
  686:                 malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat)
  687:                 .objet)).nombre_lignes) * sizeof(struct_complexe16 *))) == NULL)
  688:         {
  689:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  690:             return;
  691:         }
  692: 
  693:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
  694:                 .nombre_lignes; i++)
  695:         {
  696:             if ((((struct_complexe16 **) (*((struct_matrice *)
  697:                     (*s_objet_resultat).objet)).tableau)[i] =
  698:                     malloc(((size_t) (*((struct_matrice *)
  699:                     (*s_objet_resultat).objet)).nombre_colonnes) *
  700:                     sizeof(struct_complexe16))) == NULL)
  701:             {
  702:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  703:                 return;
  704:             }
  705:         }
  706: 
  707:         for(k = 0, i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
  708:                 .nombre_colonnes; i++)
  709:         {
  710:             for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
  711:                     .nombre_lignes; j++)
  712:             {
  713:                 ((struct_complexe16 **) (*((struct_matrice *)
  714:                         (*s_objet_resultat).objet)).tableau)[j][i]
  715:                         .partie_reelle = matrice_f77[k].partie_reelle;
  716:                 ((struct_complexe16 **) (*((struct_matrice *)
  717:                         (*s_objet_resultat).objet)).tableau)[j][i]
  718:                         .partie_imaginaire = matrice_f77[k++].partie_imaginaire;
  719:             }
  720:         }
  721: 
  722:         free(matrice_f77);
  723:     }
  724: 
  725: /*
  726: --------------------------------------------------------------------------------
  727:   Calcul de FFT impossible
  728: --------------------------------------------------------------------------------
  729: */
  730: 
  731:     else
  732:     {
  733:         liberation(s_etat_processus, s_objet_argument);
  734: 
  735:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  736:         return;
  737:     }
  738: 
  739:     liberation(s_etat_processus, s_objet_argument);
  740: 
  741:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  742:             s_objet_resultat) == d_erreur)
  743:     {
  744:         return;
  745:     }
  746: 
  747:     return;
  748: }
  749: 
  750: 
  751: /*
  752: ================================================================================
  753:   Fonction 'input'
  754: ================================================================================
  755:   Entrées :
  756: --------------------------------------------------------------------------------
  757:   Sorties :
  758: --------------------------------------------------------------------------------
  759:   Effets de bord : néant
  760: ================================================================================
  761: */
  762: 
  763: void
  764: instruction_input(struct_processus *s_etat_processus)
  765: {
  766:     struct_objet                *s_objet_resultat;
  767: 
  768:     unsigned char               *ptr_e;
  769:     unsigned char               *ptr_l;
  770:     unsigned char               *tampon;
  771:     unsigned char               *tampon2;
  772: 
  773:     integer8                    i;
  774: 
  775:     (*s_etat_processus).erreur_execution = d_ex;
  776: 
  777:     if ((*s_etat_processus).affichage_arguments == 'Y')
  778:     {
  779:         printf("\n  INPUT ");
  780: 
  781:         if ((*s_etat_processus).langue == 'F')
  782:         {
  783:             printf("(attente d'une entrée)\n\n");
  784:         }
  785:         else
  786:         {
  787:             printf("(input)\n\n");
  788:         }
  789: 
  790:         printf("->  1: %s\n", d_CHN);
  791: 
  792:         return;
  793:     }
  794:     else if ((*s_etat_processus).test_instruction == 'Y')
  795:     {
  796:         (*s_etat_processus).nombre_arguments = -1;
  797:         return;
  798:     }
  799:     
  800:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  801:     {
  802:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  803:         {
  804:             return;
  805:         }
  806:     }
  807: 
  808:     if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
  809:     {
  810:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  811:         return;
  812:     }
  813: 
  814:     flockfile(stdin);
  815:     (*s_objet_resultat).objet = (void *) readline("");
  816:     funlockfile(stdin);
  817: 
  818:     if ((*s_objet_resultat).objet == NULL)
  819:     {
  820:         if (((*s_objet_resultat).objet = malloc(sizeof(unsigned char)))
  821:                 == NULL)
  822:         {
  823:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  824:             return;
  825:         }
  826: 
  827:         (*((unsigned char *) (*s_objet_resultat).objet)) =
  828:                 d_code_fin_chaine;
  829:     }
  830: 
  831:     if ((tampon = transliteration(s_etat_processus,
  832:             (unsigned char *) (*s_objet_resultat).objet,
  833:             (*s_etat_processus).localisation, d_locale)) == NULL)
  834:     {
  835:         return;
  836:     }
  837: 
  838:     free((unsigned char *) (*s_objet_resultat).objet);
  839: 
  840:     ptr_l = tampon;
  841:     i = 0;
  842: 
  843:     while((*ptr_l) != d_code_fin_chaine)
  844:     {
  845:         if ((*ptr_l) == '\"')
  846:         {
  847:             i++;
  848:         }
  849: 
  850:         ptr_l++;
  851:     }
  852: 
  853:     if ((tampon2 = malloc((strlen(tampon) + 1 + ((size_t) i)) *
  854:             sizeof(unsigned char))) == NULL)
  855:     {
  856:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  857:         return;
  858:     }
  859: 
  860:     ptr_l = tampon;
  861:     ptr_e = tampon2;
  862: 
  863:     while((*ptr_l) != d_code_fin_chaine)
  864:     {
  865:         if ((*ptr_l) == '\"')
  866:         {
  867:             (*ptr_e) = '\\';
  868:             ptr_e++;
  869:         }
  870: 
  871:         (*ptr_e) = (*ptr_l);
  872:         ptr_e++;
  873:         ptr_l++;
  874:     }
  875: 
  876:     free(tampon);
  877:     (*s_objet_resultat).objet = tampon2;
  878: 
  879:     add_history((unsigned char *) (*s_objet_resultat).objet);
  880:     stifle_history(ds_longueur_historique);
  881: 
  882:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  883:             s_objet_resultat) == d_erreur)
  884:     {
  885:         return;
  886:     }
  887: 
  888:     return;
  889: }
  890: 
  891: 
  892: /*
  893: ================================================================================
  894:   Fonction 'indep'
  895: ================================================================================
  896:   Entrées : pointeur sur une structure struct_processus
  897: --------------------------------------------------------------------------------
  898:   Sorties :
  899: --------------------------------------------------------------------------------
  900:   Effets de bord : néant
  901: ================================================================================
  902: */
  903: 
  904: void
  905: instruction_indep(struct_processus *s_etat_processus)
  906: {
  907:     struct_liste_chainee            *l_element_courant;
  908: 
  909:     struct_objet                    *s_objet;
  910: 
  911:     (*s_etat_processus).erreur_execution = d_ex;
  912: 
  913:     if ((*s_etat_processus).affichage_arguments == 'Y')
  914:     {
  915:         printf("\n  INDEP ");
  916: 
  917:         if ((*s_etat_processus).langue == 'F')
  918:         {
  919:             printf("(indication de la variable indépendante)\n\n");
  920:         }
  921:         else
  922:         {
  923:             printf("(set independant variable)\n\n");
  924:         }
  925: 
  926:         printf("    1: %s, %s\n", d_NOM, d_LST);
  927: 
  928:         return;
  929:     }
  930:     else if ((*s_etat_processus).test_instruction == 'Y')
  931:     {
  932:         (*s_etat_processus).nombre_arguments = -1;
  933:         return;
  934:     }
  935:     
  936:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  937:     {
  938:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  939:         {
  940:             return;
  941:         }
  942:     }
  943: 
  944:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  945:             &s_objet) == d_erreur)
  946:     {
  947:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  948:         return;
  949:     }
  950: 
  951:     if ((*s_objet).type == NOM)
  952:     {
  953:         liberation(s_etat_processus, (*s_etat_processus).indep);
  954:         (*s_etat_processus).indep = s_objet;
  955:     }
  956:     else if ((*s_objet).type == LST)
  957:     {
  958:         l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
  959: 
  960:         if ((*(*l_element_courant).donnee).type != NOM)
  961:         {
  962:             liberation(s_etat_processus, s_objet);
  963: 
  964:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  965:             return;
  966:         }
  967: 
  968:         (*((struct_nom *) (*(*l_element_courant).donnee).objet)).symbole =
  969:                 d_vrai;
  970: 
  971:         l_element_courant = (*l_element_courant).suivant;
  972: 
  973:         if (!(((*(*l_element_courant).donnee).type == INT) ||
  974:                 ((*(*l_element_courant).donnee).type == REL) ||
  975:                 ((*(*l_element_courant).donnee).type == NOM) ||
  976:                 ((*(*l_element_courant).donnee).type == ALG) ||
  977:                 ((*(*l_element_courant).donnee).type == RPN)))
  978:         {
  979:             liberation(s_etat_processus, s_objet);
  980: 
  981:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  982:             return;
  983:         }
  984: 
  985:         l_element_courant = (*l_element_courant).suivant;
  986: 
  987:         if (!(((*(*l_element_courant).donnee).type == INT) ||
  988:                 ((*(*l_element_courant).donnee).type == REL) ||
  989:                 ((*(*l_element_courant).donnee).type == NOM) ||
  990:                 ((*(*l_element_courant).donnee).type == ALG) ||
  991:                 ((*(*l_element_courant).donnee).type == RPN)))
  992:         {
  993:             liberation(s_etat_processus, s_objet);
  994: 
  995:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  996:             return;
  997:         }
  998: 
  999:         l_element_courant = (*l_element_courant).suivant;
 1000: 
 1001:         if (l_element_courant != NULL)
 1002:         {
 1003:             liberation(s_etat_processus, s_objet);
 1004: 
 1005:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1006:             return;
 1007:         }
 1008: 
 1009:         liberation(s_etat_processus, (*s_etat_processus).indep);
 1010:         (*s_etat_processus).indep = s_objet;
 1011:     }
 1012:     else
 1013:     {
 1014:         liberation(s_etat_processus, s_objet);
 1015: 
 1016:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1017:         return;
 1018:     }
 1019: 
 1020:     return;
 1021: }
 1022: 
 1023: 
 1024: /*
 1025: ================================================================================
 1026:   Fonction 'int'
 1027: ================================================================================
 1028:   Entrées : pointeur sur une struct_processus
 1029: --------------------------------------------------------------------------------
 1030:   Sorties :
 1031: --------------------------------------------------------------------------------
 1032:   Effets de bord : néant
 1033: ================================================================================
 1034: */
 1035: 
 1036: void
 1037: instruction_int(struct_processus *s_etat_processus)
 1038: {
 1039:     logical1                    last_valide;
 1040: 
 1041:     real8                       borne_maximale;
 1042:     real8                       borne_minimale;
 1043:     real8                       precision;
 1044: 
 1045:     struct_liste_chainee        *l_element_courant;
 1046: 
 1047:     struct_objet                *s_objet_argument_1;
 1048:     struct_objet                *s_objet_argument_2;
 1049:     struct_objet                *s_objet_argument_3;
 1050:     struct_objet                *s_objet_evalue;
 1051: 
 1052:     unsigned char               *nom_variable;
 1053: 
 1054:     (*s_etat_processus).erreur_execution = d_ex;
 1055: 
 1056:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1057:     {
 1058:         printf("\n  INT ");
 1059: 
 1060:         if ((*s_etat_processus).langue == 'F')
 1061:         {
 1062:             printf("(intégration)\n\n");
 1063:         }
 1064:         else
 1065:         {
 1066:             printf("(numerical)\n\n");
 1067:         }
 1068: 
 1069:         printf("    3: %s, %s, %s, %s, %s\n", d_INT, d_REL,
 1070:                 d_NOM, d_ALG, d_RPN);
 1071:         printf("    2: %s\n", d_LST);
 1072:         printf("    1: %s, %s\n", d_INT, d_REL);
 1073:         printf("->  2: %s, %s\n", d_INT, d_REL);
 1074:         printf("    1: %s, %s\n\n", d_INT, d_REL);
 1075: 
 1076:         printf("    2: %s, %s, %s, %s\n", d_INT, d_REL, d_NOM, d_ALG);
 1077:         printf("    1: %s\n", d_NOM);
 1078:         printf("->  1: %s, %s, %s, %s\n", d_INT, d_REL, d_NOM, d_ALG);
 1079:         return;
 1080:     }
 1081:     else if ((*s_etat_processus).test_instruction == 'Y')
 1082:     {
 1083:         (*s_etat_processus).nombre_arguments = -1;
 1084:         return;
 1085:     }
 1086: 
 1087:     if ((*s_etat_processus).l_base_pile == NULL)
 1088:     {
 1089:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1090:         return;
 1091:     }
 1092: 
 1093:     if ((*(*(*s_etat_processus).l_base_pile).donnee).type == NOM)
 1094:     {
 1095:         // Intégration symbolique
 1096: 
 1097:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1098:         {
 1099:             if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
 1100:             {
 1101:                 return;
 1102:             }
 1103:         }
 1104: 
 1105:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1106:                 &s_objet_argument_1) == d_erreur)
 1107:         {
 1108:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1109:             return;
 1110:         }
 1111: 
 1112:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1113:                 &s_objet_argument_2) == d_erreur)
 1114:         {
 1115:             liberation(s_etat_processus, s_objet_argument_1);
 1116: 
 1117:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1118:             return;
 1119:         }
 1120: 
 1121:         if (((*s_objet_argument_1).type == NOM) &&
 1122:                 (((*s_objet_argument_2).type == NOM) ||
 1123:                 ((*s_objet_argument_2).type == ALG) ||
 1124:                 ((*s_objet_argument_2).type == REL) ||
 1125:                 ((*s_objet_argument_2).type == INT)))
 1126:         {
 1127:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1128:                     s_objet_argument_2) == d_erreur)
 1129:             {
 1130:                 return;
 1131:             }
 1132: 
 1133:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1134:                     s_objet_argument_1) == d_erreur)
 1135:             {
 1136:                 return;
 1137:             }
 1138: 
 1139:             interface_cas(s_etat_processus, RPLCAS_INTEGRATION);
 1140:         }
 1141:         else
 1142:         {
 1143:             liberation(s_etat_processus, s_objet_argument_1);
 1144:             liberation(s_etat_processus, s_objet_argument_2);
 1145: 
 1146:             (*s_etat_processus).erreur_execution =
 1147:                     d_ex_erreur_type_argument;
 1148:             return;
 1149:         }
 1150:     }
 1151:     else
 1152:     {
 1153:         // Intégration numérique
 1154: 
 1155:         if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
 1156:         {
 1157:             if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
 1158:             {
 1159:                 return;
 1160:             }
 1161:         }
 1162: 
 1163:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1164:                 &s_objet_argument_1) == d_erreur)
 1165:         {
 1166:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1167:             return;
 1168:         }
 1169: 
 1170:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1171:                 &s_objet_argument_2) == d_erreur)
 1172:         {
 1173:             liberation(s_etat_processus, s_objet_argument_1);
 1174: 
 1175:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1176:             return;
 1177:         }
 1178: 
 1179:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1180:                 &s_objet_argument_3) == d_erreur)
 1181:         {
 1182:             liberation(s_etat_processus, s_objet_argument_1);
 1183:             liberation(s_etat_processus, s_objet_argument_2);
 1184: 
 1185:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1186:             return;
 1187:         }
 1188: 
 1189:         if (((*s_objet_argument_3).type != NOM) &&
 1190:                 ((*s_objet_argument_3).type != ALG) &&
 1191:                 ((*s_objet_argument_3).type != RPN) &&
 1192:                 ((*s_objet_argument_3).type != REL) &&
 1193:                 ((*s_objet_argument_3).type != INT))
 1194:         {
 1195:             liberation(s_etat_processus, s_objet_argument_1);
 1196:             liberation(s_etat_processus, s_objet_argument_2);
 1197:             liberation(s_etat_processus, s_objet_argument_3);
 1198: 
 1199:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1200:             return;
 1201:         }
 1202: 
 1203:         if ((*s_objet_argument_1).type == INT)
 1204:         {
 1205:             precision = (real8) (*((integer8 *) (*s_objet_argument_1).objet));
 1206:         }
 1207:         else if ((*s_objet_argument_1).type == REL)
 1208:         {
 1209:             precision = (*((real8 *) (*s_objet_argument_1).objet));
 1210:         }
 1211:         else
 1212:         {
 1213:             liberation(s_etat_processus, s_objet_argument_1);
 1214:             liberation(s_etat_processus, s_objet_argument_2);
 1215:             liberation(s_etat_processus, s_objet_argument_3);
 1216: 
 1217:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1218:             return;
 1219:         }
 1220: 
 1221:         if ((*s_objet_argument_2).type == LST)
 1222:         {
 1223:             l_element_courant = (*s_objet_argument_2).objet;
 1224: 
 1225:             if ((*(*l_element_courant).donnee).type != NOM)
 1226:             {
 1227:                 liberation(s_etat_processus, s_objet_argument_1);
 1228:                 liberation(s_etat_processus, s_objet_argument_2);
 1229:                 liberation(s_etat_processus, s_objet_argument_3);
 1230: 
 1231:                 (*s_etat_processus).erreur_execution =
 1232:                         d_ex_erreur_type_argument;
 1233:                 return;
 1234:             }
 1235: 
 1236:             if ((nom_variable = malloc((strlen((*((struct_nom *)
 1237:                     (*(*l_element_courant).donnee).objet)).nom)
 1238:                     + 1) * sizeof(unsigned char))) == NULL)
 1239:             {
 1240:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1241:                 return;
 1242:             }
 1243: 
 1244:             strcpy(nom_variable, (*((struct_nom *) (*(*l_element_courant)
 1245:                     .donnee).objet)).nom);
 1246: 
 1247:             l_element_courant = (*l_element_courant).suivant;
 1248: 
 1249:             if ((*(*l_element_courant).donnee).type == INT)
 1250:             {
 1251:                 borne_minimale = (real8) (*((integer8 *)
 1252:                         (*(*l_element_courant).donnee).objet));
 1253:             }
 1254:             else if ((*(*l_element_courant).donnee).type == REL)
 1255:             {
 1256:                 borne_minimale = (*((real8 *) (*(*l_element_courant)
 1257:                         .donnee).objet));
 1258:             }
 1259:             else
 1260:             {
 1261:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
 1262:                         'N') == d_erreur)
 1263:                 {
 1264:                     free(nom_variable);
 1265:                     liberation(s_etat_processus, s_objet_argument_1);
 1266:                     liberation(s_etat_processus, s_objet_argument_2);
 1267:                     liberation(s_etat_processus, s_objet_argument_3);
 1268: 
 1269:                     return;
 1270:                 }
 1271: 
 1272:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 1273:                         .l_base_pile), &s_objet_evalue) == d_erreur)
 1274:                 {
 1275:                     free(nom_variable);
 1276:                     liberation(s_etat_processus, s_objet_argument_1);
 1277:                     liberation(s_etat_processus, s_objet_argument_2);
 1278:                     liberation(s_etat_processus, s_objet_argument_3);
 1279: 
 1280:                     (*s_etat_processus).erreur_execution =
 1281:                             d_ex_manque_argument;
 1282:                     return;
 1283:                 }
 1284: 
 1285:                 if ((*s_objet_evalue).type == INT)
 1286:                 {
 1287:                     borne_minimale = (real8) (*((integer8 *)
 1288:                             (*s_objet_evalue).objet));
 1289:                 }
 1290:                 else if ((*s_objet_evalue).type == REL)
 1291:                 {
 1292:                     borne_minimale = (*((real8 *) (*s_objet_evalue).objet));
 1293:                 }
 1294:                 else
 1295:                 {
 1296:                     free(nom_variable);
 1297:                     
 1298:                     liberation(s_etat_processus, s_objet_evalue);
 1299:                     liberation(s_etat_processus, s_objet_argument_1);
 1300:                     liberation(s_etat_processus, s_objet_argument_2);
 1301:                     liberation(s_etat_processus, s_objet_argument_3);
 1302: 
 1303:                     (*s_etat_processus).erreur_execution =
 1304:                             d_ex_erreur_type_argument;
 1305:                     return;
 1306:                 }
 1307: 
 1308:                 liberation(s_etat_processus, s_objet_evalue);
 1309:             }
 1310: 
 1311:             l_element_courant = (*l_element_courant).suivant;
 1312: 
 1313:             if ((*(*l_element_courant).donnee).type == INT)
 1314:             {
 1315:                 borne_maximale = (real8) (*((integer8 *)
 1316:                         (*(*l_element_courant).donnee).objet));
 1317:             }
 1318:             else if ((*(*l_element_courant).donnee).type == REL)
 1319:             {
 1320:                 borne_maximale = (*((real8 *) (*(*l_element_courant)
 1321:                         .donnee).objet));
 1322:             }
 1323:             else
 1324:             {
 1325:                 if (evaluation(s_etat_processus, (*l_element_courant).donnee,
 1326:                         'N') == d_erreur)
 1327:                 {
 1328:                     free(nom_variable);
 1329:                     liberation(s_etat_processus, s_objet_argument_1);
 1330:                     liberation(s_etat_processus, s_objet_argument_2);
 1331:                     liberation(s_etat_processus, s_objet_argument_3);
 1332: 
 1333:                     return;
 1334:                 }
 1335: 
 1336:                 if (depilement(s_etat_processus, &((*s_etat_processus)
 1337:                         .l_base_pile), &s_objet_evalue) == d_erreur)
 1338:                 {
 1339:                     free(nom_variable);
 1340:                     liberation(s_etat_processus, s_objet_argument_1);
 1341:                     liberation(s_etat_processus, s_objet_argument_2);
 1342:                     liberation(s_etat_processus, s_objet_argument_3);
 1343: 
 1344:                     (*s_etat_processus).erreur_execution =
 1345:                             d_ex_manque_argument;
 1346:                     return;
 1347:                 }
 1348: 
 1349:                 if ((*s_objet_evalue).type == INT)
 1350:                 {
 1351:                     borne_maximale = (real8) (*((integer8 *)
 1352:                             (*s_objet_evalue).objet));
 1353:                 }
 1354:                 else if ((*s_objet_evalue).type == REL)
 1355:                 {
 1356:                     borne_maximale = (*((real8 *) (*s_objet_evalue).objet));
 1357:                 }
 1358:                 else
 1359:                 {
 1360:                     free(nom_variable);
 1361: 
 1362:                     liberation(s_etat_processus, s_objet_evalue);
 1363:                     liberation(s_etat_processus, s_objet_argument_1);
 1364:                     liberation(s_etat_processus, s_objet_argument_2);
 1365:                     liberation(s_etat_processus, s_objet_argument_3);
 1366: 
 1367:                     (*s_etat_processus).erreur_execution =
 1368:                             d_ex_erreur_type_argument;
 1369:                     return;
 1370:                 }
 1371: 
 1372:                 liberation(s_etat_processus, s_objet_evalue);
 1373:             }
 1374: 
 1375:             /*
 1376:              * Le résultat est retourné sur la pile par la routine
 1377:              */
 1378: 
 1379:             if (last_valide == d_vrai)
 1380:             {
 1381:                 cf(s_etat_processus, 31);
 1382:             }
 1383: 
 1384:             integrale_romberg(s_etat_processus, s_objet_argument_3,
 1385:                     nom_variable, borne_minimale, borne_maximale, precision);
 1386: 
 1387:             if (last_valide == d_vrai)
 1388:             {
 1389:                 sf(s_etat_processus, 31);
 1390:             }
 1391: 
 1392:             free(nom_variable);
 1393:         }
 1394:         else
 1395:         {
 1396:             liberation(s_etat_processus, s_objet_argument_1);
 1397:             liberation(s_etat_processus, s_objet_argument_2);
 1398:             liberation(s_etat_processus, s_objet_argument_3);
 1399: 
 1400:             (*s_etat_processus).erreur_execution =
 1401:                     d_ex_erreur_type_argument;
 1402:             return;
 1403:         }
 1404: 
 1405:         liberation(s_etat_processus, s_objet_argument_1);
 1406:         liberation(s_etat_processus, s_objet_argument_2);
 1407:         liberation(s_etat_processus, s_objet_argument_3);
 1408:     }
 1409: 
 1410:     return;
 1411: }
 1412: 
 1413: 
 1414: /*
 1415: ================================================================================
 1416:   Fonction 'incr'
 1417: ================================================================================
 1418:   Entrées :
 1419: --------------------------------------------------------------------------------
 1420:   Sorties :
 1421: --------------------------------------------------------------------------------
 1422:   Effets de bord : néant
 1423: ================================================================================
 1424: */
 1425: 
 1426: void
 1427: instruction_incr(struct_processus *s_etat_processus)
 1428: {
 1429:     logical1                    variable_partagee;
 1430: 
 1431:     struct_objet                *s_copie_argument;
 1432:     struct_objet                *s_objet_argument;
 1433: 
 1434:     (*s_etat_processus).erreur_execution = d_ex;
 1435: 
 1436:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1437:     {
 1438:         printf("\n  INCR ");
 1439: 
 1440:         if ((*s_etat_processus).langue == 'F')
 1441:         {
 1442:             printf("(incrémentation)\n\n");
 1443:         }
 1444:         else
 1445:         {
 1446:             printf("(incrementation)\n\n");
 1447:         }
 1448: 
 1449:         printf("    1: %s\n", d_INT);
 1450:         printf("->  1: %s\n\n", d_INT);
 1451: 
 1452:         printf("    1: %s\n", d_NOM);
 1453: 
 1454:         return;
 1455:     }
 1456:     else if ((*s_etat_processus).test_instruction == 'Y')
 1457:     {
 1458:         (*s_etat_processus).nombre_arguments = -1;
 1459:         return;
 1460:     }
 1461:     
 1462:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1463:     {
 1464:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1465:         {
 1466:             return;
 1467:         }
 1468:     }
 1469: 
 1470:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1471:             &s_objet_argument) == d_erreur)
 1472:     {
 1473:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1474:         return;
 1475:     }
 1476: 
 1477:     if ((*s_objet_argument).type == INT)
 1478:     {
 1479:         if ((s_copie_argument = copie_objet(s_etat_processus,
 1480:                 s_objet_argument, 'O')) == NULL)
 1481:         {
 1482:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1483:             return;
 1484:         }
 1485: 
 1486:         liberation(s_etat_processus, s_objet_argument);
 1487:         s_objet_argument = s_copie_argument;
 1488: 
 1489:         (*((integer8 *) (*s_objet_argument).objet))++;
 1490: 
 1491:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1492:                 s_objet_argument) == d_erreur)
 1493:         {
 1494:             return;
 1495:         }
 1496:     }
 1497:     else if ((*s_objet_argument).type == NOM)
 1498:     {
 1499:         if (recherche_variable(s_etat_processus, (*((struct_nom *)
 1500:                 (*s_objet_argument).objet)).nom) == d_faux)
 1501:         {
 1502:             (*s_etat_processus).erreur_systeme = d_es;
 1503:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 1504: 
 1505:             return;
 1506:         }
 1507: 
 1508:         liberation(s_etat_processus, s_objet_argument);
 1509: 
 1510:         if ((*(*s_etat_processus).pointeur_variable_courante)
 1511:                 .variable_verrouillee == d_vrai)
 1512:         {
 1513:             (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
 1514:             return;
 1515:         }
 1516: 
 1517:         if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
 1518:         {
 1519:             if (recherche_variable_partagee(s_etat_processus,
 1520:                     (*(*s_etat_processus).pointeur_variable_courante).nom,
 1521:                     (*(*s_etat_processus).pointeur_variable_courante)
 1522:                     .variable_partagee, (*(*s_etat_processus)
 1523:                     .pointeur_variable_courante).origine) == NULL)
 1524:             {
 1525:                 (*s_etat_processus).erreur_systeme = d_es;
 1526:                 (*s_etat_processus).erreur_execution =
 1527:                         d_ex_variable_non_definie;
 1528: 
 1529:                 return;
 1530:             }
 1531: 
 1532:             s_objet_argument = (*(*s_etat_processus)
 1533:                     .pointeur_variable_partagee_courante).objet;
 1534:             variable_partagee = d_vrai;
 1535:         }
 1536:         else
 1537:         {
 1538:             s_objet_argument = (*(*s_etat_processus).pointeur_variable_courante)
 1539:                     .objet;
 1540:             variable_partagee = d_faux;
 1541:         }
 1542: 
 1543:         if ((s_copie_argument = copie_objet(s_etat_processus,
 1544:                 s_objet_argument, 'O')) == NULL)
 1545:         {
 1546:             if (variable_partagee == d_vrai)
 1547:             {
 1548:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
 1549:                         .pointeur_variable_partagee_courante).mutex)) != 0)
 1550:                 {
 1551:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1552:                     return;
 1553:                 }
 1554:             }
 1555: 
 1556:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1557:             return;
 1558:         }
 1559: 
 1560:         liberation(s_etat_processus, s_objet_argument);
 1561: 
 1562:         if (variable_partagee == d_vrai)
 1563:         {
 1564:             (*(*s_etat_processus).pointeur_variable_courante).objet = NULL;
 1565:             (*(*s_etat_processus).pointeur_variable_partagee_courante).objet =
 1566:                     s_copie_argument;
 1567:         }
 1568:         else
 1569:         {
 1570:             (*(*s_etat_processus).pointeur_variable_courante).objet =
 1571:                     s_copie_argument;
 1572:         }
 1573: 
 1574:         if ((*s_copie_argument).type == INT)
 1575:         {
 1576:             (*((integer8 *) (*s_copie_argument).objet))++;
 1577: 
 1578:             if (variable_partagee == d_vrai)
 1579:             {
 1580:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
 1581:                         .pointeur_variable_partagee_courante).mutex)) != 0)
 1582:                 {
 1583:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1584:                     return;
 1585:                 }
 1586:             }
 1587:         }
 1588:         else
 1589:         {
 1590:             if (variable_partagee == d_vrai)
 1591:             {
 1592:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
 1593:                         .pointeur_variable_partagee_courante).mutex)) != 0)
 1594:                 {
 1595:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1596:                     return;
 1597:                 }
 1598:             }
 1599: 
 1600:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1601:             return;
 1602:         }
 1603:     }
 1604:     else
 1605:     {
 1606:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1607: 
 1608:         liberation(s_etat_processus, s_objet_argument);
 1609:         return;
 1610:     }
 1611: 
 1612:     return;
 1613: }
 1614: 
 1615: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>