File:  [local] / rpl / src / instructions_r3.c
Revision 1.21: download - view: text, annotated - select for diffs - revision graph
Thu Sep 23 15:27:39 2010 UTC (13 years, 7 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route pour la 4.0.20.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.20
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'rsd'
   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_rsd(struct_processus *s_etat_processus)
   40: {
   41:     struct_liste_chainee                    *l_element_courant;
   42:     struct_liste_chainee                    *registre_pile_last;
   43: 
   44:     (*s_etat_processus).erreur_execution = d_ex;
   45: 
   46:     if ((*s_etat_processus).affichage_arguments == 'Y')
   47:     {
   48:         printf("\n  RSD ");
   49: 
   50:         if ((*s_etat_processus).langue == 'F')
   51:         {
   52:             printf("(calcul d'un tableau résiduel)\n\n");
   53:         }
   54:         else
   55:         {
   56:             printf("(compute a resudial array)\n\n");
   57:         }
   58: 
   59:         printf("    3: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
   60:         printf("    2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
   61:         printf("    1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
   62:         printf("->  1: %s, %s ,%s\n\n", d_VIN, d_VRL, d_VCX);
   63: 
   64:         printf("    3: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
   65:         printf("    2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
   66:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
   67:         printf("->  1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
   68: 
   69:         return;
   70:     }
   71:     else if ((*s_etat_processus).test_instruction == 'Y')
   72:     {
   73:         (*s_etat_processus).nombre_arguments = -1;
   74:         return;
   75:     }
   76: 
   77:     /*
   78:      * Test du type et du nombre des arguments
   79:      */
   80: 
   81:     if ((*s_etat_processus).hauteur_pile_operationnelle < 3)
   82:     {
   83:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
   84:         return;
   85:     }
   86: 
   87:     l_element_courant = (*s_etat_processus).l_base_pile;
   88: 
   89:     if (((*(*l_element_courant).donnee).type != VIN) &&
   90:             ((*(*l_element_courant).donnee).type != VRL) &&
   91:             ((*(*l_element_courant).donnee).type != VCX) &&
   92:             ((*(*l_element_courant).donnee).type != MIN) &&
   93:             ((*(*l_element_courant).donnee).type != MRL) &&
   94:             ((*(*l_element_courant).donnee).type != MCX))
   95:     {
   96:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
   97:         return;
   98:     }
   99: 
  100:     l_element_courant = (*l_element_courant).suivant;
  101: 
  102:     if (((*(*l_element_courant).donnee).type != MIN) &&
  103:             ((*(*l_element_courant).donnee).type != MRL) &&
  104:             ((*(*l_element_courant).donnee).type != MCX))
  105:     {
  106:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  107:         return;
  108:     }
  109: 
  110:     l_element_courant = (*l_element_courant).suivant;
  111: 
  112:     if (((*(*l_element_courant).donnee).type != VIN) &&
  113:             ((*(*l_element_courant).donnee).type != VRL) &&
  114:             ((*(*l_element_courant).donnee).type != VCX) &&
  115:             ((*(*l_element_courant).donnee).type != MIN) &&
  116:             ((*(*l_element_courant).donnee).type != MRL) &&
  117:             ((*(*l_element_courant).donnee).type != MCX))
  118:     {
  119:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  120:         return;
  121:     }
  122: 
  123:     /*
  124:      * Sauvegarde de la pile LAST courante
  125:      */
  126: 
  127:     registre_pile_last = NULL;
  128: 
  129:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  130:     {
  131:         if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
  132:         {
  133:             return;
  134:         }
  135: 
  136:         registre_pile_last = (*s_etat_processus).l_base_pile_last;
  137:         (*s_etat_processus).l_base_pile_last = NULL;
  138:     }
  139: 
  140:     instruction_multiplication(s_etat_processus);
  141: 
  142:     if (((*s_etat_processus).erreur_systeme != d_es) ||
  143:             ((*s_etat_processus).erreur_execution != d_ex) ||
  144:             ((*s_etat_processus).exception != d_ep))
  145:     {
  146:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
  147:         {
  148:             if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  149:             {
  150:                 return;
  151:             }
  152:         }
  153: 
  154:         (*s_etat_processus).l_base_pile_last = registre_pile_last;
  155: 
  156:         return;
  157:     }
  158: 
  159:     instruction_moins(s_etat_processus);
  160: 
  161:     /*
  162:      * Restauration de la pile LAST
  163:      */
  164: 
  165:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  166:     {
  167:         /*
  168:          * Astuce pour libérer l'ancienne pile last...
  169:          */
  170: 
  171:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  172:         {
  173:             return;
  174:         }
  175: 
  176:         (*s_etat_processus).l_base_pile_last = registre_pile_last;
  177:     }
  178: 
  179:     return;
  180: }
  181: 
  182: 
  183: /*
  184: ================================================================================
  185:   Fonction 'regv'
  186: ================================================================================
  187:   Entrées : pointeur sur une structure struct_processus
  188: --------------------------------------------------------------------------------
  189:   Sorties :
  190: --------------------------------------------------------------------------------
  191:   Effets de bord : néant
  192: ================================================================================
  193: */
  194: 
  195: void
  196: instruction_regv(struct_processus *s_etat_processus)
  197: {
  198:     struct_objet                *s_objet_argument;
  199:     struct_objet                *s_objet_resultat_1;
  200:     struct_objet                *s_objet_resultat_2;
  201: 
  202:     (*s_etat_processus).erreur_execution = d_ex;
  203: 
  204:     if ((*s_etat_processus).affichage_arguments == 'Y')
  205:     {
  206:         printf("\n  REGV ");
  207:         
  208:         if ((*s_etat_processus).langue == 'F')
  209:         {
  210:             printf("(valeurs et vecteurs propres droits)\n\n");
  211:         }
  212:         else
  213:         {
  214:             printf("(eigenvalues and right eigenvectors)\n\n");
  215:         }
  216: 
  217:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  218:         printf("->  2: %s\n", d_MCX);
  219:         printf("    1: %s\n", d_VCX);
  220: 
  221:         return;
  222:     }
  223:     else if ((*s_etat_processus).test_instruction == 'Y')
  224:     {
  225:         (*s_etat_processus).nombre_arguments = -1;
  226:         return;
  227:     }
  228: 
  229:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  230:     {
  231:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  232:         {
  233:             return;
  234:         }
  235:     }
  236: 
  237:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  238:             &s_objet_argument) == d_erreur)
  239:     {
  240:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  241:         return;
  242:     }
  243: 
  244: /*
  245: --------------------------------------------------------------------------------
  246:   L'argument est une matrice carrée
  247: --------------------------------------------------------------------------------
  248: */
  249: 
  250:     if (((*s_objet_argument).type == MIN) ||
  251:             ((*s_objet_argument).type == MRL) ||
  252:             ((*s_objet_argument).type == MCX))
  253:     {
  254:         if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes !=
  255:                 (*((struct_matrice *) (*s_objet_argument).objet))
  256:                 .nombre_colonnes)
  257:         {
  258:             liberation(s_etat_processus, s_objet_argument);
  259: 
  260:             (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
  261:             return;
  262:         }
  263: 
  264:         if ((s_objet_resultat_1 = allocation(s_etat_processus, VCX)) == NULL)
  265:         {
  266:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  267:             return;
  268:         }
  269: 
  270:         if ((s_objet_resultat_2 = allocation(s_etat_processus, MCX)) == NULL)
  271:         {
  272:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  273:             return;
  274:         }
  275: 
  276:         valeurs_propres(s_etat_processus,
  277:                 (struct_matrice *) (*s_objet_argument).objet,
  278:                 (struct_vecteur *) (*s_objet_resultat_1).objet,
  279:                 NULL, (struct_matrice *) (*s_objet_resultat_2).objet);
  280: 
  281:         if ((*s_etat_processus).erreur_systeme != d_es)
  282:         {
  283:             return;
  284:         }
  285: 
  286:         if (((*s_etat_processus).exception != d_ep) ||
  287:                 ((*s_etat_processus).erreur_execution != d_ex))
  288:         {
  289:             liberation(s_etat_processus, s_objet_argument);
  290:             liberation(s_etat_processus, s_objet_resultat_1);
  291:             liberation(s_etat_processus, s_objet_resultat_2);
  292:             return;
  293:         }
  294:     }
  295: 
  296: /*
  297: --------------------------------------------------------------------------------
  298:   Type incompatible
  299: --------------------------------------------------------------------------------
  300: */
  301: 
  302:     else
  303:     {
  304:         liberation(s_etat_processus, s_objet_argument);
  305: 
  306:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  307:         return;
  308:     }
  309: 
  310:     liberation(s_etat_processus, s_objet_argument);
  311: 
  312:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  313:             s_objet_resultat_2) == d_erreur)
  314:     {
  315:         return;
  316:     }
  317: 
  318:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  319:             s_objet_resultat_1) == d_erreur)
  320:     {
  321:         return;
  322:     }
  323: 
  324:     return;
  325: }
  326: 
  327: 
  328: /*
  329: ================================================================================
  330:   Fonction 'rnrm'
  331: ================================================================================
  332:   Entrées : pointeur sur une structure struct_processus
  333: --------------------------------------------------------------------------------
  334:   Sorties :
  335: --------------------------------------------------------------------------------
  336:   Effets de bord : néant
  337: ================================================================================
  338: */
  339: 
  340: void
  341: instruction_rnrm(struct_processus *s_etat_processus)
  342: {
  343:     logical1                    depassement;
  344:     logical1                    erreur_memoire;
  345: 
  346:     real8                       cumul_reel;
  347:     real8                       registre;
  348: 
  349:     integer8                    cumul_entier;
  350:     integer8                    entier_courant;
  351:     integer8                    tampon;
  352: 
  353:     struct_objet                *s_objet_argument;
  354:     struct_objet                *s_objet_resultat;
  355: 
  356:     unsigned long               i;
  357:     unsigned long               j;
  358: 
  359:     void                        *accumulateur;
  360: 
  361:     (*s_etat_processus).erreur_execution = d_ex;
  362: 
  363:     if ((*s_etat_processus).affichage_arguments == 'Y')
  364:     {
  365:         printf("\n  RNRM ");
  366: 
  367:         if ((*s_etat_processus).langue == 'F')
  368:         {
  369:             printf("(norme de ligne)\n\n");
  370:         }
  371:         else
  372:         {
  373:             printf("(row norm)\n\n");
  374:         }
  375: 
  376:         printf("    1: %s, %s\n", d_VIN, d_MIN);
  377:         printf("->  1: %s, %s\n\n", d_INT, d_REL);
  378: 
  379:         printf("    1: %s, %s, %s, %s\n", d_VRL, d_VCX, d_MRL, d_MCX);
  380:         printf("->  1: %s\n", d_REL);
  381: 
  382:         return;
  383:     }
  384:     else if ((*s_etat_processus).test_instruction == 'Y')
  385:     {
  386:         (*s_etat_processus).nombre_arguments = -1;
  387:         return;
  388:     }
  389: 
  390:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  391:     {
  392:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  393:         {
  394:             return;
  395:         }
  396:     }
  397: 
  398:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  399:             &s_objet_argument) == d_erreur)
  400:     {
  401:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  402:         return;
  403:     }
  404: 
  405: /*
  406: --------------------------------------------------------------------------------
  407:   Traitement des vecteurs
  408: --------------------------------------------------------------------------------
  409: */
  410: 
  411:     if ((*s_objet_argument).type == VIN)
  412:     {
  413:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  414:         {
  415:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  416:             return;
  417:         }
  418: 
  419:         (*((integer8 *) (*s_objet_resultat).objet)) = abs(((integer8 *)
  420:                 (*((struct_vecteur *) (*s_objet_argument).objet)).tableau)[0]);
  421: 
  422:         for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
  423:                 i++)
  424:         {
  425:             if (abs(((integer8 *) (*((struct_vecteur *) (*s_objet_argument)
  426:                     .objet)).tableau)[i]) > (*((integer8 *)
  427:                     (*s_objet_resultat).objet)))
  428:             {
  429:                 (*((integer8 *) (*s_objet_resultat).objet)) =
  430:                         abs(((integer8 *) (*((struct_vecteur *)
  431:                         (*s_objet_argument).objet)).tableau)[i]);
  432:             }
  433:         }
  434:     }
  435:     else if ((*s_objet_argument).type == VRL)
  436:     {
  437:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  438:         {
  439:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  440:             return;
  441:         }
  442: 
  443:         (*((real8 *) (*s_objet_resultat).objet)) = fabs(((real8 *)
  444:                 (*((struct_vecteur *) (*s_objet_argument).objet)).tableau)[0]);
  445: 
  446:         for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
  447:                 i++)
  448:         {
  449:             if (fabs(((real8 *) (*((struct_vecteur *) (*s_objet_argument)
  450:                     .objet)).tableau)[i]) > (*((real8 *)
  451:                     (*s_objet_resultat).objet)))
  452:             {
  453:                 (*((real8 *) (*s_objet_resultat).objet)) =
  454:                         fabs(((real8 *) (*((struct_vecteur *)
  455:                         (*s_objet_argument).objet)).tableau)[i]);
  456:             }
  457:         }
  458:     }
  459:     else if ((*s_objet_argument).type == VCX)
  460:     {
  461:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  462:         {
  463:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  464:             return;
  465:         }
  466: 
  467:         f77absc_(&(((struct_complexe16 *) (*((struct_vecteur *)
  468:                 (*s_objet_argument).objet)).tableau)[0]), (real8 *)
  469:                 (*s_objet_resultat).objet);
  470: 
  471:         for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
  472:                 i++)
  473:         {
  474:             f77absc_(&(((struct_complexe16 *) (*((struct_vecteur *)
  475:                     (*s_objet_argument).objet)).tableau)[i]), &registre);
  476: 
  477:             if (registre > (*((real8 *) (*s_objet_resultat).objet)))
  478:             {
  479:                 (*((real8 *) (*s_objet_resultat).objet)) = registre;
  480:             }
  481:         }
  482:     }
  483: 
  484: /*
  485: --------------------------------------------------------------------------------
  486:   Traitement des matrices
  487: --------------------------------------------------------------------------------
  488: */
  489: 
  490:     else if ((*s_objet_argument).type == MIN)
  491:     {
  492:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  493:         {
  494:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  495:             return;
  496:         }
  497: 
  498:         cumul_entier = 0;
  499:         depassement = d_faux;
  500:         
  501:         for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  502:                 .nombre_colonnes; j++)
  503:         {
  504:             entier_courant = abs(((integer8 **)
  505:                     (*((struct_matrice *) (*s_objet_argument).objet))
  506:                     .tableau)[0][j]);
  507: 
  508:             if (depassement_addition(&cumul_entier, &entier_courant, &tampon)
  509:                     == d_erreur)
  510:             {
  511:                 depassement = d_vrai;
  512:                 break;
  513:             }
  514:         }
  515: 
  516:         if (depassement == d_faux)
  517:         {
  518:             (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
  519: 
  520:             for(i = 1; i < (*((struct_matrice *) (*s_objet_argument).objet))
  521:                     .nombre_lignes; i++)
  522:             {
  523:                 cumul_entier = 0;
  524: 
  525:                 for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  526:                         .nombre_colonnes; j++)
  527:                 {
  528:                     entier_courant = abs(((integer8 **) (*((struct_matrice *)
  529:                             (*s_objet_argument).objet)).tableau)[i][j]);
  530: 
  531:                     if (depassement_addition(&cumul_entier, &entier_courant,
  532:                             &tampon) == d_erreur)
  533:                     {
  534:                         depassement = d_vrai;
  535:                         break;
  536:                     }
  537: 
  538:                     cumul_entier = tampon;
  539:                 }
  540: 
  541:                 if (depassement == d_vrai)
  542:                 {
  543:                     break;
  544:                 }
  545: 
  546:                 if (cumul_entier > (*((integer8 *) (*s_objet_resultat).objet)))
  547:                 {
  548:                     (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
  549:                 }
  550:             }
  551:         }
  552: 
  553:         if (depassement == d_vrai)
  554:         {
  555:             /*
  556:              * Dépassement : il faut refaire le calcul en real*8...
  557:              */
  558: 
  559:             free((*s_objet_resultat).objet);
  560:             (*s_objet_resultat).type = REL;
  561: 
  562:             if (((*s_objet_resultat).objet = malloc(sizeof(real8))) == NULL)
  563:             {
  564:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  565:                 return;
  566:             }
  567: 
  568:             if ((accumulateur = malloc((*((struct_matrice *)
  569:                     (*s_objet_argument).objet)).nombre_colonnes *
  570:                     sizeof(real8))) == NULL)
  571:             {
  572:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  573:                 return;
  574:             }
  575: 
  576:             (*((real8 *) (*s_objet_resultat).objet)) = 0;
  577:             
  578:             for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
  579:                     .nombre_lignes; i++)
  580:             {
  581:                 for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  582:                         .nombre_colonnes; j++)
  583:                 {
  584:                     ((real8 *) accumulateur)[j] = fabs((real8) ((integer8 **)
  585:                             (*((struct_matrice *) (*s_objet_argument).objet))
  586:                             .tableau)[i][j]);
  587:                 }
  588: 
  589:                 cumul_reel = sommation_vecteur_reel(accumulateur,
  590:                         &((*((struct_matrice *) (*s_objet_argument).objet))
  591:                         .nombre_colonnes), &erreur_memoire);
  592: 
  593:                 if (erreur_memoire == d_vrai)
  594:                 {
  595:                     (*s_etat_processus).erreur_systeme =
  596:                             d_es_allocation_memoire;
  597:                     return;
  598:                 }
  599: 
  600:                 if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
  601:                 {
  602:                     (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
  603:                 }
  604:             }
  605: 
  606:             free(accumulateur);
  607:         }
  608:     }
  609:     else if ((*s_objet_argument).type == MRL)
  610:     {
  611:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  612:         {
  613:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  614:             return;
  615:         }
  616: 
  617:         if ((accumulateur = malloc((*((struct_matrice *)
  618:                 (*s_objet_argument).objet)).nombre_colonnes * sizeof(real8)))
  619:                 == NULL)
  620:         {
  621:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  622:             return;
  623:         }
  624: 
  625:         (*((real8 *) (*s_objet_resultat).objet)) = 0;
  626:         
  627:         for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
  628:                 .nombre_lignes; i++)
  629:         {
  630:             for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  631:                     .nombre_colonnes; j++)
  632:             {
  633:                 ((real8 *) accumulateur)[j] = fabs(((real8 **)
  634:                         (*((struct_matrice *) (*s_objet_argument).objet))
  635:                         .tableau)[i][j]);
  636:             }
  637: 
  638:             cumul_reel = sommation_vecteur_reel(accumulateur,
  639:                     &((*((struct_matrice *) (*s_objet_argument).objet))
  640:                     .nombre_colonnes), &erreur_memoire);
  641: 
  642:             if (erreur_memoire == d_vrai)
  643:             {
  644:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  645:                 return;
  646:             }
  647: 
  648:             if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
  649:             {
  650:                 (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
  651:             }
  652:         }
  653: 
  654:         free(accumulateur);
  655:     }
  656:     else if ((*s_objet_argument).type == MCX)
  657:     {
  658:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  659:         {
  660:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  661:             return;
  662:         }
  663: 
  664:         if ((accumulateur = malloc((*((struct_matrice *)
  665:                 (*s_objet_argument).objet)).nombre_colonnes * sizeof(real8)))
  666:                 == NULL)
  667:         {
  668:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  669:             return;
  670:         }
  671: 
  672:         (*((real8 *) (*s_objet_resultat).objet)) = 0;
  673:         
  674:         for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
  675:                 .nombre_lignes; i++)
  676:         {
  677:             for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  678:                     .nombre_colonnes; j++)
  679:             {
  680:                 f77absc_(&(((struct_complexe16 **) (*((struct_matrice *)
  681:                         (*s_objet_argument).objet)).tableau)[i][j]),
  682:                         &(((real8 *) accumulateur)[j]));
  683:             }
  684: 
  685:             cumul_reel = sommation_vecteur_reel(accumulateur,
  686:                     &((*((struct_matrice *) (*s_objet_argument).objet))
  687:                     .nombre_colonnes), &erreur_memoire);
  688: 
  689:             if (erreur_memoire == d_vrai)
  690:             {
  691:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  692:                 return;
  693:             }
  694: 
  695:             if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
  696:             {
  697:                 (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
  698:             }
  699:         }
  700: 
  701:         free(accumulateur);
  702:     }
  703: /*
  704: --------------------------------------------------------------------------------
  705:   Traitement impossible du fait du type de l'argument
  706: --------------------------------------------------------------------------------
  707: */
  708: 
  709:     else
  710:     {
  711:         liberation(s_etat_processus, s_objet_argument);
  712: 
  713:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  714:         return;
  715:     }
  716: 
  717:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  718:             s_objet_resultat) == d_erreur)
  719:     {
  720:         return;
  721:     }
  722: 
  723:     liberation(s_etat_processus, s_objet_argument);
  724: 
  725:     return;
  726: }
  727: 
  728: 
  729: /*
  730: ================================================================================
  731:   Fonction 'rceq'
  732: ================================================================================
  733:   Entrées : pointeur sur une structure struct_processus
  734: --------------------------------------------------------------------------------
  735:   Sorties :
  736: --------------------------------------------------------------------------------
  737:   Effets de bord : néant
  738: ================================================================================
  739: */
  740: 
  741: void
  742: instruction_rceq(struct_processus *s_etat_processus)
  743: {
  744:     logical1                presence_variable;
  745: 
  746:     long                    i;
  747: 
  748:     struct_objet            *s_objet_variable;
  749: 
  750:     (*s_etat_processus).erreur_execution = d_ex;
  751: 
  752:     if ((*s_etat_processus).affichage_arguments == 'Y')
  753:     {
  754:         printf("\n  RCEQ ");
  755: 
  756:         if ((*s_etat_processus).langue == 'F')
  757:         {
  758:             printf("(rappel de la variable EQ)\n\n");
  759:         }
  760:         else
  761:         {
  762:             printf("(recall EQ variable)\n\n");
  763:         }
  764: 
  765:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
  766:                 "       %s, %s, %s, %s, %s,\n"
  767:                 "       %s, %s, %s, %s, %s,\n"
  768:                 "       %s, %s, %s, %s,\n"
  769:                 "       %s, %s\n",
  770:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  771:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
  772:                 d_SQL, d_SLB, d_PRC, d_MTX);
  773: 
  774:         return;
  775:     }
  776:     else if ((*s_etat_processus).test_instruction == 'Y')
  777:     {
  778:         (*s_etat_processus).nombre_arguments = -1;
  779:         return;
  780:     }
  781: 
  782:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  783:     {
  784:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  785:         {
  786:             return;
  787:         }
  788:     }
  789: 
  790:     if (recherche_variable(s_etat_processus, "EQ") == d_vrai)
  791:     {
  792:         i = (*s_etat_processus).position_variable_courante;
  793:         presence_variable = d_faux;
  794: 
  795:         while(i >= 0)
  796:         {
  797:             if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, "EQ")
  798:                     == 0) && ((*s_etat_processus).s_liste_variables[i]
  799:                     .niveau == 1))
  800:             {
  801:                 presence_variable = d_vrai;
  802:                 break;
  803:             }
  804: 
  805:             i--;
  806:         }
  807: 
  808:         (*s_etat_processus).position_variable_courante = i;
  809: 
  810:         if (presence_variable == d_faux)
  811:         {
  812:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
  813:             return;
  814:         }
  815: 
  816:         if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
  817:         {
  818:             (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
  819:             return;
  820:         }
  821:     }
  822:     else
  823:     {
  824:         (*s_etat_processus).erreur_systeme = d_es;
  825:         (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
  826:         return;
  827:     }
  828: 
  829:     if ((s_objet_variable = copie_objet(s_etat_processus,
  830:             ((*s_etat_processus).s_liste_variables)
  831:             [(*s_etat_processus).position_variable_courante].objet, 'P'))
  832:             == NULL)
  833:     {
  834:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  835:         return;
  836:     }
  837: 
  838:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  839:             s_objet_variable) == d_erreur)
  840:     {
  841:         return;
  842:     }
  843: 
  844:     return;
  845: }
  846: 
  847: 
  848: /*
  849: ================================================================================
  850:   Fonction 'res'
  851: ================================================================================
  852:   Entrées : pointeur sur une structure struct_processus
  853: --------------------------------------------------------------------------------
  854:   Sorties :
  855: --------------------------------------------------------------------------------
  856:   Effets de bord : néant
  857: ================================================================================
  858: */
  859: 
  860: void
  861: instruction_res(struct_processus *s_etat_processus)
  862: {
  863:     struct_objet                *s_objet;
  864: 
  865:     (*s_etat_processus).erreur_execution = d_ex;
  866: 
  867:     if ((*s_etat_processus).affichage_arguments == 'Y')
  868:     {
  869:         printf("\n  RES ");
  870: 
  871:         if ((*s_etat_processus).langue == 'F')
  872:         {
  873:             printf("(résolution)\n\n");
  874:         }
  875:         else
  876:         {
  877:             printf("(resolution)\n\n");
  878:         }
  879: 
  880:         printf("    1: %s, %s\n", d_INT, d_REL);
  881: 
  882:         return;
  883:     }
  884:     else if ((*s_etat_processus).test_instruction == 'Y')
  885:     {
  886:         (*s_etat_processus).nombre_arguments = -1;
  887:         return;
  888:     }
  889: 
  890:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  891:     {
  892:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  893:         {
  894:             return;
  895:         }
  896:     }
  897: 
  898:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  899:             &s_objet) == d_erreur)
  900:     {
  901:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  902:         return;
  903:     }
  904: 
  905:     if ((*s_objet).type == INT)
  906:     {
  907:         if ((*((integer8 *) (*s_objet).objet)) <= 0)
  908:         {
  909:             liberation(s_etat_processus, s_objet);
  910: 
  911:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  912:             return;
  913:         }
  914: 
  915:         (*s_etat_processus).resolution = (real8) (*((integer8 *)
  916:                 (*s_objet).objet));
  917:     }
  918:     else if ((*s_objet).type == REL)
  919:     {
  920:         if ((*((real8 *) (*s_objet).objet)) <= 0)
  921:         {
  922:             liberation(s_etat_processus, s_objet);
  923: 
  924:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  925:             return;
  926:         }
  927: 
  928:         (*s_etat_processus).resolution = (*((real8 *) (*s_objet).objet));
  929:     }
  930:     else
  931:     {
  932:         liberation(s_etat_processus, s_objet);
  933: 
  934:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  935:         return;
  936:     }
  937: 
  938:     liberation(s_etat_processus, s_objet);
  939:     return;
  940: }
  941: 
  942: 
  943: /*
  944: ================================================================================
  945:   Fonction 'recall'
  946: ================================================================================
  947:   Entrées : pointeur sur une structure struct_processus
  948: --------------------------------------------------------------------------------
  949:   Sorties :
  950: --------------------------------------------------------------------------------
  951:   Effets de bord : néant
  952: ================================================================================
  953: */
  954: 
  955: void
  956: instruction_recall(struct_processus *s_etat_processus)
  957: {
  958:     file                    *pipe;
  959:     file                    *fichier;
  960: 
  961:     int                     caractere;
  962:     int                     ios;
  963: 
  964:     logical1                drapeau_fin;
  965:     logical1                indicateur_48;
  966:     logical1                presence_chaine;
  967: 
  968:     long                    i;
  969:     long                    nombre_caracteres_source;
  970: 
  971:     struct_objet            *s_objet;
  972: 
  973:     unsigned char           autorisation_empilement_programme;
  974:     unsigned char           *chaine;
  975:     unsigned char           *commande;
  976:     unsigned char           *executable_candidat;
  977: 
  978: #   ifndef OS2
  979:     unsigned char           *instructions = "%s/bin/rpliconv %s "
  980:                                     "`%s/bin/rplfile "
  981:                                     "-m %s/share/rplfiles -i %s | "
  982:                                     "%s/bin/rplawk "
  983:                                     "'{ print $3; }' | %s/bin/rplawk -F= '{ if "
  984:                                     "($2 != \"\") printf(\"-f %%s\", $2); }'` "
  985:                                     "-t `locale charmap` | %s/bin/%s -o %s";
  986: #   else
  987:     unsigned char           *instructions = BOURNE_SHELL
  988:                                     " -c \"%s/bin/rpliconv %s "
  989:                                     "`%s/bin/rplfile "
  990:                                     "-m %s/share/rplfiles -i %s | "
  991:                                     "%s/bin/rplawk "
  992:                                     "'{ print $3; }' | %s/bin/rplawk -F= '{ if "
  993:                                     "($2 != \\\"\\\") printf(\\\"-f %%s\\\", "
  994:                                     "$2); }'` -t `" d_locale
  995:                                     "` | %s/bin/%s -o %s\"";
  996: #   endif
  997: 
  998:     unsigned char           *nom_fichier_temporaire;
  999:     unsigned char           *tampon_definitions_chainees;
 1000:     unsigned char           *tampon_instruction_courante;
 1001: 
 1002:     unsigned long           position_courante;
 1003: 
 1004:     (*s_etat_processus).erreur_execution = d_ex;
 1005: 
 1006:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1007:     {
 1008:         printf("\n  RECALL ");
 1009: 
 1010:         if ((*s_etat_processus).langue == 'F')
 1011:         {
 1012:             printf("(rappel d'une variable stockée sur disque)\n\n");
 1013:         }
 1014:         else
 1015:         {
 1016:             printf("(recall a variable stored on disk)\n\n");
 1017:         }
 1018: 
 1019:         printf("    1: %s\n", d_CHN);
 1020:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
 1021:                 "       %s, %s, %s, %s, %s,\n"
 1022:                 "       %s, %s, %s, %s, %s\n",
 1023:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
 1024:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN);
 1025: 
 1026:         return;
 1027:     }
 1028:     else if ((*s_etat_processus).test_instruction == 'Y')
 1029:     {
 1030:         (*s_etat_processus).nombre_arguments = -1;
 1031:         return;
 1032:     }
 1033: 
 1034:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1035:     {
 1036:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1037:         {
 1038:             return;
 1039:         }
 1040:     }
 1041: 
 1042:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1043:             &s_objet) == d_erreur)
 1044:     {
 1045:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1046:         return;
 1047:     }
 1048: 
 1049:     if ((*s_objet).type == CHN)
 1050:     {
 1051:         if ((fichier = fopen((unsigned char *) (*s_objet).objet, "r")) == NULL)
 1052:         {
 1053:             liberation(s_etat_processus, s_objet);
 1054: 
 1055:             (*s_etat_processus).erreur_execution = d_ex_erreur_fichier;
 1056:             return;
 1057:         }
 1058: 
 1059:         if (fclose(fichier) != 0)
 1060:         {
 1061:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1062:             return;
 1063:         }
 1064: 
 1065:         if ((nom_fichier_temporaire = creation_nom_fichier(s_etat_processus,
 1066:                 (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
 1067:         {
 1068:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1069:             return;
 1070:         }
 1071: 
 1072:         if ((*s_etat_processus).rpl_home == NULL)
 1073:         {
 1074:             if ((commande = malloc((strlen(ds_preprocesseur) +
 1075:                     (2 * strlen((unsigned char *) (*s_objet).objet)) +
 1076:                     (6 * strlen(d_exec_path)) + 
 1077:                     strlen(nom_fichier_temporaire) + strlen(instructions) - 19)
 1078:                     * sizeof(unsigned char))) == NULL)
 1079:             {
 1080:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1081:                 return;
 1082:             }
 1083: 
 1084:             sprintf(commande, instructions, d_exec_path,
 1085:                     (unsigned char *) (*s_objet).objet,
 1086:                     d_exec_path, d_exec_path,
 1087:                     (unsigned char *) (*s_objet).objet,
 1088:                     d_exec_path, d_exec_path,
 1089:                     d_exec_path, ds_preprocesseur, nom_fichier_temporaire);
 1090: 
 1091:             if (alsprintf(&executable_candidat, "%s/bin/rpliconv",
 1092:                     d_exec_path) < 0)
 1093:             {
 1094:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1095:                 return;
 1096:             }
 1097: 
 1098:             if (controle(s_etat_processus, executable_candidat, "md5",
 1099:                     rpliconv_md5) != d_vrai)
 1100:             {
 1101:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1102:                 return;
 1103:             }
 1104: 
 1105:             if (controle(s_etat_processus, executable_candidat, "sha1",
 1106:                     rpliconv_sha1) != d_vrai)
 1107:             {
 1108:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1109:                 return;
 1110:             }
 1111: 
 1112:             free(executable_candidat);
 1113: 
 1114:             if (alsprintf(&executable_candidat, "%s/bin/rplfile",
 1115:                     d_exec_path) < 0)
 1116:             {
 1117:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1118:                 return;
 1119:             }
 1120: 
 1121:             if (controle(s_etat_processus, executable_candidat, "md5",
 1122:                     rplfile_md5) != d_vrai)
 1123:             {
 1124:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1125:                 return;
 1126:             }
 1127: 
 1128:             if (controle(s_etat_processus, executable_candidat, "sha1",
 1129:                     rplfile_sha1) != d_vrai)
 1130:             {
 1131:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1132:                 return;
 1133:             }
 1134: 
 1135:             free(executable_candidat);
 1136: 
 1137:             if (alsprintf(&executable_candidat, "%s/bin/rplpp",
 1138:                     d_exec_path) < 0)
 1139:             {
 1140:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1141:                 return;
 1142:             }
 1143: 
 1144:             if (controle(s_etat_processus, executable_candidat, "md5",
 1145:                     rplpp_md5) != d_vrai)
 1146:             {
 1147:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1148:                 return;
 1149:             }
 1150: 
 1151:             if (controle(s_etat_processus, executable_candidat, "sha1",
 1152:                     rplpp_sha1) != d_vrai)
 1153:             {
 1154:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1155:                 return;
 1156:             }
 1157: 
 1158:             free(executable_candidat);
 1159: 
 1160:             if (alsprintf(&executable_candidat, "%s/bin/rplawk",
 1161:                     d_exec_path) < 0)
 1162:             {
 1163:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1164:                 return;
 1165:             }
 1166: 
 1167:             if (controle(s_etat_processus, executable_candidat, "md5",
 1168:                     rplawk_md5) != d_vrai)
 1169:             {
 1170:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1171:                 return;
 1172:             }
 1173: 
 1174:             if (controle(s_etat_processus, executable_candidat, "sha1",
 1175:                     rplawk_sha1) != d_vrai)
 1176:             {
 1177:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1178:                 return;
 1179:             }
 1180: 
 1181:             free(executable_candidat);
 1182:         }
 1183:         else
 1184:         {
 1185:             if ((commande = malloc((strlen(ds_preprocesseur) +
 1186:                     (2 * strlen((unsigned char *) (*s_objet).objet)) +
 1187:                     (6 * strlen((*s_etat_processus).rpl_home)) + 
 1188:                     strlen(nom_fichier_temporaire) + strlen(instructions) - 19)
 1189:                     * sizeof(unsigned char))) == NULL)
 1190:             {
 1191:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1192:                 return;
 1193:             }
 1194: 
 1195:             sprintf(commande, instructions, (*s_etat_processus).rpl_home,
 1196:                     (unsigned char *) (*s_objet).objet,
 1197:                     (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
 1198:                     (unsigned char *) (*s_objet).objet,
 1199:                     (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
 1200:                     (*s_etat_processus).rpl_home, ds_preprocesseur,
 1201:                     nom_fichier_temporaire);
 1202: 
 1203:             if (alsprintf(&executable_candidat, "%s/bin/rpliconv",
 1204:                     (*s_etat_processus).rpl_home) < 0)
 1205:             {
 1206:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1207:                 return;
 1208:             }
 1209: 
 1210:             if (controle(s_etat_processus, executable_candidat, "md5",
 1211:                     rpliconv_md5) != d_vrai)
 1212:             {
 1213:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1214:                 return;
 1215:             }
 1216: 
 1217:             if (controle(s_etat_processus, executable_candidat, "sha1",
 1218:                     rpliconv_sha1) != d_vrai)
 1219:             {
 1220:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1221:                 return;
 1222:             }
 1223: 
 1224:             free(executable_candidat);
 1225: 
 1226:             if (alsprintf(&executable_candidat, "%s/bin/rplfile",
 1227:                     (*s_etat_processus).rpl_home) < 0)
 1228:             {
 1229:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1230:                 return;
 1231:             }
 1232: 
 1233:             if (controle(s_etat_processus, executable_candidat, "md5",
 1234:                     rplfile_md5) != d_vrai)
 1235:             {
 1236:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1237:                 return;
 1238:             }
 1239: 
 1240:             if (controle(s_etat_processus, executable_candidat, "sha1",
 1241:                     rplfile_sha1) != d_vrai)
 1242:             {
 1243:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1244:                 return;
 1245:             }
 1246: 
 1247:             free(executable_candidat);
 1248: 
 1249:             if (alsprintf(&executable_candidat, "%s/bin/rplpp",
 1250:                     (*s_etat_processus).rpl_home) < 0)
 1251:             {
 1252:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1253:                 return;
 1254:             }
 1255: 
 1256:             if (controle(s_etat_processus, executable_candidat, "md5",
 1257:                     rplpp_md5) != d_vrai)
 1258:             {
 1259:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1260:                 return;
 1261:             }
 1262: 
 1263:             if (controle(s_etat_processus, executable_candidat, "sha1",
 1264:                     rplpp_sha1) != d_vrai)
 1265:             {
 1266:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1267:                 return;
 1268:             }
 1269: 
 1270:             free(executable_candidat);
 1271: 
 1272:             if (alsprintf(&executable_candidat, "%s/bin/rplawk",
 1273:                     d_exec_path) < 0)
 1274:             {
 1275:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1276:                 return;
 1277:             }
 1278: 
 1279:             if (controle(s_etat_processus, executable_candidat, "md5",
 1280:                     rplawk_md5) != d_vrai)
 1281:             {
 1282:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1283:                 return;
 1284:             }
 1285: 
 1286:             if (controle(s_etat_processus, executable_candidat, "sha1",
 1287:                     rplawk_sha1) != d_vrai)
 1288:             {
 1289:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1290:                 return;
 1291:             }
 1292: 
 1293:             free(executable_candidat);
 1294:         }
 1295: 
 1296:         if ((pipe = popen(commande, "r")) == NULL)
 1297:         {
 1298:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1299:             return;
 1300:         }
 1301: 
 1302:         if ((ios = pclose(pipe)) != EXIT_SUCCESS)
 1303:         {
 1304:             liberation(s_etat_processus, s_objet);
 1305:             free(commande);
 1306: 
 1307:             (*s_etat_processus).erreur_execution = d_ex_erreur_fichier;
 1308:             return;
 1309:         }
 1310:         else if (ios == -1)
 1311:         {
 1312:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1313:             return;
 1314:         }
 1315: 
 1316:         free(commande);
 1317: 
 1318:         nombre_caracteres_source = 0;
 1319: 
 1320:         if ((pipe = fopen(nom_fichier_temporaire, "r")) == NULL)
 1321:         {
 1322:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1323:             return;
 1324:         }
 1325: 
 1326:         while(getc(pipe) != EOF)
 1327:         {
 1328:             nombre_caracteres_source++;
 1329:         }
 1330: 
 1331:         if (nombre_caracteres_source == 0)
 1332:         {
 1333:             if (fclose(pipe) == -1)
 1334:             {
 1335:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1336:                 return;
 1337:             }
 1338: 
 1339:             liberation(s_etat_processus, s_objet);
 1340: 
 1341:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1342:             {
 1343:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1344:                 return;
 1345:             }
 1346: 
 1347:             free(nom_fichier_temporaire);
 1348: 
 1349:             (*s_etat_processus).erreur_execution = d_ex_fichier_vide;
 1350:             return;
 1351:         }
 1352: 
 1353:         if ((chaine = malloc((nombre_caracteres_source + 1)
 1354:                 * sizeof(unsigned char))) == NULL)
 1355:         {
 1356:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1357:             return;
 1358:         }
 1359: 
 1360:         rewind(pipe);
 1361: 
 1362:         i = 0;
 1363:         drapeau_fin = d_faux;
 1364:         presence_chaine = d_faux;
 1365: 
 1366:         while(drapeau_fin == d_faux)
 1367:         {
 1368:             if ((caractere = getc(pipe)) != EOF)
 1369:             {
 1370:                 if ((caractere == d_code_retour_chariot) ||
 1371:                         (caractere == d_code_tabulation) ||
 1372:                         ((caractere == d_code_espace) &&
 1373:                         (presence_chaine == d_faux)))
 1374:                 {
 1375:                     do
 1376:                     {
 1377:                         caractere = getc(pipe);
 1378:                     } while(((caractere == d_code_retour_chariot) ||
 1379:                             (caractere == d_code_tabulation) ||
 1380:                             ((caractere == d_code_espace) &&
 1381:                             (presence_chaine == d_faux))) &&
 1382:                             (caractere != EOF));
 1383: 
 1384:                     if (caractere != EOF)
 1385:                     {
 1386:                         chaine[i++] = d_code_espace;
 1387:                     }
 1388:                     else
 1389:                     {
 1390:                         drapeau_fin = d_vrai;
 1391:                     }
 1392:                 }
 1393: 
 1394:                 if ((chaine[i] = caractere) == '\"')
 1395:                 {
 1396:                     if (i > 0)
 1397:                     {
 1398:                         if (chaine[i - 1] != '\\')
 1399:                         {
 1400:                             presence_chaine = (presence_chaine == d_faux)
 1401:                                     ? d_vrai : d_faux;
 1402:                         }
 1403:                     }
 1404: 
 1405:                     i++;
 1406:                 }
 1407:                 else
 1408:                 {
 1409:                     i++;
 1410:                 }
 1411:             }
 1412:             else
 1413:             {
 1414:                 drapeau_fin = d_vrai;
 1415:             }
 1416:         }
 1417: 
 1418:         if ((caractere == EOF) && (i > 0))
 1419:         {
 1420:             i--;
 1421:         }
 1422: 
 1423:         chaine[i] = d_code_fin_chaine;
 1424: 
 1425:         if (fclose(pipe) != 0)
 1426:         {
 1427:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1428:             return;
 1429:         }
 1430: 
 1431:         indicateur_48 = test_cfsf(s_etat_processus, 48);
 1432:         cf(s_etat_processus, 48);
 1433: 
 1434:         tampon_definitions_chainees = (*s_etat_processus).definitions_chainees;
 1435:         tampon_instruction_courante = (*s_etat_processus).instruction_courante;
 1436:         position_courante = (*s_etat_processus).position_courante;
 1437:         autorisation_empilement_programme = (*s_etat_processus)
 1438:                 .autorisation_empilement_programme;
 1439: 
 1440:         (*s_etat_processus).instruction_courante = NULL;
 1441: 
 1442:         if (((*s_etat_processus).definitions_chainees = transliteration(
 1443:                 s_etat_processus, chaine, "UTF-8", d_locale)) == NULL)
 1444:         {
 1445:             if (indicateur_48 == d_vrai)
 1446:             {
 1447:                 sf(s_etat_processus, 48);
 1448:             }
 1449:             else
 1450:             {
 1451:                 cf(s_etat_processus, 48);
 1452:             }
 1453: 
 1454:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1455:             {
 1456:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1457:                 return;
 1458:             }
 1459: 
 1460:             free(nom_fichier_temporaire);
 1461:             free((*s_etat_processus).instruction_courante);
 1462:             free(chaine);
 1463: 
 1464:             (*s_etat_processus).position_courante = position_courante;
 1465:             (*s_etat_processus).instruction_courante =
 1466:                     tampon_instruction_courante;
 1467:             (*s_etat_processus).definitions_chainees =
 1468:                     tampon_definitions_chainees;
 1469:             (*s_etat_processus).autorisation_empilement_programme =
 1470:                     autorisation_empilement_programme;
 1471: 
 1472:             liberation(s_etat_processus, s_objet);
 1473:             return;
 1474:         }
 1475: 
 1476:         (*s_etat_processus).autorisation_empilement_programme = 'Y';
 1477:         (*s_etat_processus).position_courante = 0;
 1478: 
 1479:         if (analyse_syntaxique(s_etat_processus) == d_erreur)
 1480:         {
 1481:             if (indicateur_48 == d_vrai)
 1482:             {
 1483:                 sf(s_etat_processus, 48);
 1484:             }
 1485:             else
 1486:             {
 1487:                 cf(s_etat_processus, 48);
 1488:             }
 1489: 
 1490:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1491:             {
 1492:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1493:                 return;
 1494:             }
 1495: 
 1496:             free(nom_fichier_temporaire);
 1497:             free((*s_etat_processus).instruction_courante);
 1498:             free((*s_etat_processus).definitions_chainees);
 1499:             free(chaine);
 1500: 
 1501:             (*s_etat_processus).position_courante = position_courante;
 1502:             (*s_etat_processus).instruction_courante =
 1503:                     tampon_instruction_courante;
 1504:             (*s_etat_processus).definitions_chainees =
 1505:                     tampon_definitions_chainees;
 1506:             (*s_etat_processus).autorisation_empilement_programme =
 1507:                     autorisation_empilement_programme;
 1508: 
 1509:             liberation(s_etat_processus, s_objet);
 1510:             return;
 1511:         }
 1512: 
 1513:         (*s_etat_processus).position_courante = 0;
 1514: 
 1515:         if (recherche_instruction_suivante(s_etat_processus) !=
 1516:                 d_absence_erreur)
 1517:         {
 1518:             if (indicateur_48 == d_vrai)
 1519:             {
 1520:                 sf(s_etat_processus, 48);
 1521:             }
 1522:             else
 1523:             {
 1524:                 cf(s_etat_processus, 48);
 1525:             }
 1526: 
 1527:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1528:             {
 1529:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1530:                 return;
 1531:             }
 1532: 
 1533:             free(nom_fichier_temporaire);
 1534:             free((*s_etat_processus).instruction_courante);
 1535:             free((*s_etat_processus).definitions_chainees);
 1536:             free(chaine);
 1537: 
 1538:             (*s_etat_processus).position_courante = position_courante;
 1539:             (*s_etat_processus).instruction_courante =
 1540:                     tampon_instruction_courante;
 1541:             (*s_etat_processus).definitions_chainees =
 1542:                     tampon_definitions_chainees;
 1543:             (*s_etat_processus).autorisation_empilement_programme =
 1544:                     autorisation_empilement_programme;
 1545: 
 1546:             liberation(s_etat_processus, s_objet);
 1547:             return;
 1548:         }
 1549: 
 1550:         recherche_type(s_etat_processus);
 1551: 
 1552:         while((*s_etat_processus).definitions_chainees
 1553:                 [(*s_etat_processus).position_courante] != d_code_fin_chaine)
 1554:         {
 1555:             if ((*s_etat_processus).definitions_chainees
 1556:                     [(*s_etat_processus).position_courante++] != d_code_espace)
 1557:             {
 1558:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 1559:             }
 1560:         }
 1561: 
 1562:         free((*s_etat_processus).instruction_courante);
 1563:         free((*s_etat_processus).definitions_chainees);
 1564:         free(chaine);
 1565: 
 1566:         (*s_etat_processus).position_courante = position_courante;
 1567:         (*s_etat_processus).instruction_courante =
 1568:                 tampon_instruction_courante;
 1569:         (*s_etat_processus).definitions_chainees =
 1570:                 tampon_definitions_chainees;
 1571:         (*s_etat_processus).autorisation_empilement_programme =
 1572:                 autorisation_empilement_programme;
 1573: 
 1574:         if (indicateur_48 == d_vrai)
 1575:         {
 1576:             sf(s_etat_processus, 48);
 1577:         }
 1578:         else
 1579:         {
 1580:             cf(s_etat_processus, 48);
 1581:         }
 1582: 
 1583:         if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1584:         {
 1585:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1586:             return;
 1587:         }
 1588: 
 1589:         free(nom_fichier_temporaire);
 1590:     }
 1591:     else
 1592:     {
 1593:         liberation(s_etat_processus, s_objet);
 1594: 
 1595:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1596:         return;
 1597:     }
 1598: 
 1599:     liberation(s_etat_processus, s_objet);
 1600:     return;
 1601: }
 1602: 
 1603: 
 1604: /*
 1605: ================================================================================
 1606:   Fonction 'rcws'
 1607: ================================================================================
 1608:   Entrées : pointeur sur une structure struct_processus
 1609: --------------------------------------------------------------------------------
 1610:   Sorties :
 1611: --------------------------------------------------------------------------------
 1612:   Effets de bord : néant
 1613: ================================================================================
 1614: */
 1615: 
 1616: void
 1617: instruction_rcws(struct_processus *s_etat_processus)
 1618: {
 1619:     struct_objet                *s_objet_resultat;
 1620: 
 1621:     unsigned long               i;
 1622:     unsigned long               j;
 1623:     unsigned long               longueur;
 1624: 
 1625:     (*s_etat_processus).erreur_execution = d_ex;
 1626: 
 1627:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1628:     {
 1629:         printf("\n  RCWS ");
 1630: 
 1631:         if ((*s_etat_processus).langue == 'F')
 1632:         {
 1633:             printf("(rappel de la longueur des entiers binaires)\n\n");
 1634:         }
 1635:         else
 1636:         {
 1637:             printf("(recall the length of the binary integers)\n\n");
 1638:         }
 1639: 
 1640:         printf("->  1: %s\n", d_INT);
 1641: 
 1642:         return;
 1643:     }
 1644:     else if ((*s_etat_processus).test_instruction == 'Y')
 1645:     {
 1646:         (*s_etat_processus).nombre_arguments = -1;
 1647:         return;
 1648:     }
 1649: 
 1650:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1651:     {
 1652:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1653:         {
 1654:             return;
 1655:         }
 1656:     }
 1657: 
 1658:     if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1659:     {
 1660:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1661:         return;
 1662:     }
 1663: 
 1664:     longueur = 1;
 1665:     j = 1;
 1666: 
 1667:     for(i = 37; i <= 42; i++)
 1668:     {
 1669:         longueur += (test_cfsf(s_etat_processus, (unsigned char) i)
 1670:                 == d_vrai) ? j : 0;
 1671:         j *= 2;
 1672:     }
 1673: 
 1674:     (*((integer8 *) (*s_objet_resultat).objet)) = longueur;
 1675: 
 1676:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1677:             s_objet_resultat) == d_erreur)
 1678:     {
 1679:         return;
 1680:     }
 1681: 
 1682:     return;
 1683: }
 1684: 
 1685: 
 1686: /*
 1687: ================================================================================
 1688:   Fonction 'rcls'
 1689: ================================================================================
 1690:   Entrées : pointeur sur une structure struct_processus
 1691: --------------------------------------------------------------------------------
 1692:   Sorties :
 1693: --------------------------------------------------------------------------------
 1694:   Effets de bord : néant
 1695: ================================================================================
 1696: */
 1697: 
 1698: void
 1699: instruction_rcls(struct_processus *s_etat_processus)
 1700: {
 1701:     logical1                presence_variable;
 1702: 
 1703:     long                    i;
 1704: 
 1705:     struct_objet            *s_objet_variable;
 1706: 
 1707:     (*s_etat_processus).erreur_execution = d_ex;
 1708: 
 1709:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1710:     {
 1711:         printf("\n  RCLS ");
 1712: 
 1713:         if ((*s_etat_processus).langue == 'F')
 1714:         {
 1715:             printf("(rappel de la variable %s)\n\n", ds_sdat);
 1716:         }
 1717:         else
 1718:         {
 1719:             printf("(recall %s variable)\n\n", ds_sdat);
 1720:         }
 1721: 
 1722:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
 1723:                 "       %s, %s, %s, %s, %s,\n"
 1724:                 "       %s, %s, %s, %s, %s,\n"
 1725:                 "       %s\n",
 1726:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
 1727:                 d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
 1728: 
 1729:         return;
 1730:     }
 1731:     else if ((*s_etat_processus).test_instruction == 'Y')
 1732:     {
 1733:         (*s_etat_processus).nombre_arguments = -1;
 1734:         return;
 1735:     }
 1736: 
 1737:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1738:     {
 1739:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1740:         {
 1741:             return;
 1742:         }
 1743:     }
 1744: 
 1745:     if (recherche_variable(s_etat_processus, ds_sdat) == d_vrai)
 1746:     {
 1747:         i = (*s_etat_processus).position_variable_courante;
 1748:         presence_variable = d_faux;
 1749: 
 1750:         while(i >= 0)
 1751:         {
 1752:             if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, ds_sdat)
 1753:                     == 0) && ((*s_etat_processus).s_liste_variables[i]
 1754:                     .niveau == 1))
 1755:             {
 1756:                 presence_variable = d_vrai;
 1757:                 break;
 1758:             }
 1759: 
 1760:             i--;
 1761:         }
 1762: 
 1763:         (*s_etat_processus).position_variable_courante = i;
 1764: 
 1765:         if (presence_variable == d_faux)
 1766:         {
 1767:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 1768:             return;
 1769:         }
 1770: 
 1771:         if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
 1772:         {
 1773:             (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
 1774:             return;
 1775:         }
 1776:     }
 1777:     else
 1778:     {
 1779:         (*s_etat_processus).erreur_systeme = d_es;
 1780:         (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 1781:         return;
 1782:     }
 1783: 
 1784:     if ((s_objet_variable = copie_objet(s_etat_processus,
 1785:             ((*s_etat_processus).s_liste_variables)
 1786:             [(*s_etat_processus).position_variable_courante].objet, 'O'))
 1787:             == NULL)
 1788:     {
 1789:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1790:         return;
 1791:     }
 1792: 
 1793:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1794:             s_objet_variable) == d_erreur)
 1795:     {
 1796:         return;
 1797:     }
 1798: 
 1799:     return;
 1800: }
 1801: 
 1802: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>