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

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.32
    4:   Copyright (C) 1989-2020 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction '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:     integer8                    i;
  357:     integer8                    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:         depassement = d_faux;
  414: 
  415:         for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
  416:                 i++)
  417:         {
  418:             if (((integer8 *) (*((struct_vecteur *) (*s_objet_argument)
  419:                     .objet)).tableau)[i] == INT64_MIN)
  420:             {
  421:                 depassement = d_vrai;
  422:                 break;
  423:             }
  424:         }
  425: 
  426:         if (depassement == d_faux)
  427:         {
  428:             if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  429:             {
  430:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  431:                 return;
  432:             }
  433: 
  434:             (*((integer8 *) (*s_objet_resultat).objet)) = abs(((integer8 *)
  435:                     (*((struct_vecteur *) (*s_objet_argument).objet))
  436:                     .tableau)[0]);
  437: 
  438:             for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet))
  439:                     .taille; i++)
  440:             {
  441:                 if (abs(((integer8 *) (*((struct_vecteur *) (*s_objet_argument)
  442:                         .objet)).tableau)[i]) > (*((integer8 *)
  443:                         (*s_objet_resultat).objet)))
  444:                 {
  445:                     (*((integer8 *) (*s_objet_resultat).objet)) =
  446:                             abs(((integer8 *) (*((struct_vecteur *)
  447:                             (*s_objet_argument).objet)).tableau)[i]);
  448:                 }
  449:             }
  450:         }
  451:         else
  452:         {
  453:             if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  454:             {
  455:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  456:                 return;
  457:             }
  458: 
  459:             (*((real8 *) (*s_objet_resultat).objet)) = abs((real8) ((integer8 *)
  460:                     (*((struct_vecteur *) (*s_objet_argument).objet))
  461:                     .tableau)[0]);
  462: 
  463:             for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet))
  464:                     .taille; i++)
  465:             {
  466:                 if (abs((real8) ((integer8 *) (*((struct_vecteur *)
  467:                         (*s_objet_argument).objet)).tableau)[i]) > (*((real8 *)
  468:                         (*s_objet_resultat).objet)))
  469:                 {
  470:                     (*((real8 *) (*s_objet_resultat).objet)) =
  471:                             abs((real8) ((integer8 *) (*((struct_vecteur *)
  472:                             (*s_objet_argument).objet)).tableau)[i]);
  473:                 }
  474:             }
  475:         }
  476:     }
  477:     else if ((*s_objet_argument).type == VRL)
  478:     {
  479:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  480:         {
  481:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  482:             return;
  483:         }
  484: 
  485:         (*((real8 *) (*s_objet_resultat).objet)) = fabs(((real8 *)
  486:                 (*((struct_vecteur *) (*s_objet_argument).objet)).tableau)[0]);
  487: 
  488:         for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
  489:                 i++)
  490:         {
  491:             if (fabs(((real8 *) (*((struct_vecteur *) (*s_objet_argument)
  492:                     .objet)).tableau)[i]) > (*((real8 *)
  493:                     (*s_objet_resultat).objet)))
  494:             {
  495:                 (*((real8 *) (*s_objet_resultat).objet)) =
  496:                         fabs(((real8 *) (*((struct_vecteur *)
  497:                         (*s_objet_argument).objet)).tableau)[i]);
  498:             }
  499:         }
  500:     }
  501:     else if ((*s_objet_argument).type == VCX)
  502:     {
  503:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  504:         {
  505:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  506:             return;
  507:         }
  508: 
  509:         f77absc_(&(((struct_complexe16 *) (*((struct_vecteur *)
  510:                 (*s_objet_argument).objet)).tableau)[0]), (real8 *)
  511:                 (*s_objet_resultat).objet);
  512: 
  513:         for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
  514:                 i++)
  515:         {
  516:             f77absc_(&(((struct_complexe16 *) (*((struct_vecteur *)
  517:                     (*s_objet_argument).objet)).tableau)[i]), &registre);
  518: 
  519:             if (registre > (*((real8 *) (*s_objet_resultat).objet)))
  520:             {
  521:                 (*((real8 *) (*s_objet_resultat).objet)) = registre;
  522:             }
  523:         }
  524:     }
  525: 
  526: /*
  527: --------------------------------------------------------------------------------
  528:   Traitement des matrices
  529: --------------------------------------------------------------------------------
  530: */
  531: 
  532:     else if ((*s_objet_argument).type == MIN)
  533:     {
  534:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  535:         {
  536:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  537:             return;
  538:         }
  539: 
  540:         cumul_entier = 0;
  541:         depassement = d_faux;
  542:         
  543:         for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  544:                 .nombre_colonnes; j++)
  545:         {
  546:             if (((integer8 **) (*((struct_matrice *) (*s_objet_argument).objet))
  547:                     .tableau)[0][j] == INT64_MIN)
  548:             {
  549:                 depassement = d_vrai;
  550:                 break;
  551:             }
  552: 
  553:             entier_courant = abs(((integer8 **)
  554:                     (*((struct_matrice *) (*s_objet_argument).objet))
  555:                     .tableau)[0][j]);
  556: 
  557:             if (depassement_addition(&cumul_entier, &entier_courant, &tampon)
  558:                     == d_erreur)
  559:             {
  560:                 depassement = d_vrai;
  561:                 break;
  562:             }
  563:         }
  564: 
  565:         if (depassement == d_faux)
  566:         {
  567:             (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
  568: 
  569:             for(i = 1; i < (*((struct_matrice *) (*s_objet_argument).objet))
  570:                     .nombre_lignes; i++)
  571:             {
  572:                 cumul_entier = 0;
  573: 
  574:                 for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  575:                         .nombre_colonnes; j++)
  576:                 {
  577:                     if (((integer8 **) (*((struct_matrice *)
  578:                             (*s_objet_argument).objet)).tableau)[i][j]
  579:                             == INT64_MIN)
  580:                     {
  581:                         depassement = d_vrai;
  582:                         break;
  583:                     }
  584: 
  585:                     entier_courant = abs(((integer8 **) (*((struct_matrice *)
  586:                             (*s_objet_argument).objet)).tableau)[i][j]);
  587: 
  588:                     if (depassement_addition(&cumul_entier, &entier_courant,
  589:                             &tampon) == d_erreur)
  590:                     {
  591:                         depassement = d_vrai;
  592:                         break;
  593:                     }
  594: 
  595:                     cumul_entier = tampon;
  596:                 }
  597: 
  598:                 if (depassement == d_vrai)
  599:                 {
  600:                     break;
  601:                 }
  602: 
  603:                 if (cumul_entier > (*((integer8 *) (*s_objet_resultat).objet)))
  604:                 {
  605:                     (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
  606:                 }
  607:             }
  608:         }
  609: 
  610:         if (depassement == d_vrai)
  611:         {
  612:             /*
  613:              * Dépassement : il faut refaire le calcul en real*8...
  614:              */
  615: 
  616:             free((*s_objet_resultat).objet);
  617:             (*s_objet_resultat).type = REL;
  618: 
  619:             if (((*s_objet_resultat).objet = malloc(sizeof(real8))) == NULL)
  620:             {
  621:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  622:                 return;
  623:             }
  624: 
  625:             if ((accumulateur = malloc(((size_t) (*((struct_matrice *)
  626:                     (*s_objet_argument).objet)).nombre_colonnes) *
  627:                     sizeof(real8))) == NULL)
  628:             {
  629:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  630:                 return;
  631:             }
  632: 
  633:             (*((real8 *) (*s_objet_resultat).objet)) = 0;
  634:             
  635:             for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
  636:                     .nombre_lignes; i++)
  637:             {
  638:                 for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  639:                         .nombre_colonnes; j++)
  640:                 {
  641:                     ((real8 *) accumulateur)[j] = fabs((real8) ((integer8 **)
  642:                             (*((struct_matrice *) (*s_objet_argument).objet))
  643:                             .tableau)[i][j]);
  644:                 }
  645: 
  646:                 cumul_reel = sommation_vecteur_reel(accumulateur,
  647:                         &((*((struct_matrice *) (*s_objet_argument).objet))
  648:                         .nombre_colonnes), &erreur_memoire);
  649: 
  650:                 if (erreur_memoire == d_vrai)
  651:                 {
  652:                     (*s_etat_processus).erreur_systeme =
  653:                             d_es_allocation_memoire;
  654:                     return;
  655:                 }
  656: 
  657:                 if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
  658:                 {
  659:                     (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
  660:                 }
  661:             }
  662: 
  663:             free(accumulateur);
  664:         }
  665:     }
  666:     else if ((*s_objet_argument).type == MRL)
  667:     {
  668:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  669:         {
  670:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  671:             return;
  672:         }
  673: 
  674:         if ((accumulateur = malloc(((size_t) (*((struct_matrice *)
  675:                 (*s_objet_argument).objet)).nombre_colonnes) * sizeof(real8)))
  676:                 == NULL)
  677:         {
  678:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  679:             return;
  680:         }
  681: 
  682:         (*((real8 *) (*s_objet_resultat).objet)) = 0;
  683:         
  684:         for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
  685:                 .nombre_lignes; i++)
  686:         {
  687:             for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  688:                     .nombre_colonnes; j++)
  689:             {
  690:                 ((real8 *) accumulateur)[j] = fabs(((real8 **)
  691:                         (*((struct_matrice *) (*s_objet_argument).objet))
  692:                         .tableau)[i][j]);
  693:             }
  694: 
  695:             cumul_reel = sommation_vecteur_reel(accumulateur,
  696:                     &((*((struct_matrice *) (*s_objet_argument).objet))
  697:                     .nombre_colonnes), &erreur_memoire);
  698: 
  699:             if (erreur_memoire == d_vrai)
  700:             {
  701:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  702:                 return;
  703:             }
  704: 
  705:             if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
  706:             {
  707:                 (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
  708:             }
  709:         }
  710: 
  711:         free(accumulateur);
  712:     }
  713:     else if ((*s_objet_argument).type == MCX)
  714:     {
  715:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  716:         {
  717:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  718:             return;
  719:         }
  720: 
  721:         if ((accumulateur = malloc(((size_t) (*((struct_matrice *)
  722:                 (*s_objet_argument).objet)).nombre_colonnes) * sizeof(real8)))
  723:                 == NULL)
  724:         {
  725:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  726:             return;
  727:         }
  728: 
  729:         (*((real8 *) (*s_objet_resultat).objet)) = 0;
  730:         
  731:         for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
  732:                 .nombre_lignes; i++)
  733:         {
  734:             for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
  735:                     .nombre_colonnes; j++)
  736:             {
  737:                 f77absc_(&(((struct_complexe16 **) (*((struct_matrice *)
  738:                         (*s_objet_argument).objet)).tableau)[i][j]),
  739:                         &(((real8 *) accumulateur)[j]));
  740:             }
  741: 
  742:             cumul_reel = sommation_vecteur_reel(accumulateur,
  743:                     &((*((struct_matrice *) (*s_objet_argument).objet))
  744:                     .nombre_colonnes), &erreur_memoire);
  745: 
  746:             if (erreur_memoire == d_vrai)
  747:             {
  748:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  749:                 return;
  750:             }
  751: 
  752:             if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
  753:             {
  754:                 (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
  755:             }
  756:         }
  757: 
  758:         free(accumulateur);
  759:     }
  760: /*
  761: --------------------------------------------------------------------------------
  762:   Traitement impossible du fait du type de l'argument
  763: --------------------------------------------------------------------------------
  764: */
  765: 
  766:     else
  767:     {
  768:         liberation(s_etat_processus, s_objet_argument);
  769: 
  770:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  771:         return;
  772:     }
  773: 
  774:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  775:             s_objet_resultat) == d_erreur)
  776:     {
  777:         return;
  778:     }
  779: 
  780:     liberation(s_etat_processus, s_objet_argument);
  781: 
  782:     return;
  783: }
  784: 
  785: 
  786: /*
  787: ================================================================================
  788:   Fonction 'rceq'
  789: ================================================================================
  790:   Entrées : pointeur sur une structure struct_processus
  791: --------------------------------------------------------------------------------
  792:   Sorties :
  793: --------------------------------------------------------------------------------
  794:   Effets de bord : néant
  795: ================================================================================
  796: */
  797: 
  798: void
  799: instruction_rceq(struct_processus *s_etat_processus)
  800: {
  801:     struct_objet            *s_objet_variable;
  802: 
  803:     (*s_etat_processus).erreur_execution = d_ex;
  804: 
  805:     if ((*s_etat_processus).affichage_arguments == 'Y')
  806:     {
  807:         printf("\n  RCEQ ");
  808: 
  809:         if ((*s_etat_processus).langue == 'F')
  810:         {
  811:             printf("(rappel de la variable EQ)\n\n");
  812:         }
  813:         else
  814:         {
  815:             printf("(recall EQ variable)\n\n");
  816:         }
  817: 
  818:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
  819:                 "       %s, %s, %s, %s, %s,\n"
  820:                 "       %s, %s, %s, %s, %s,\n"
  821:                 "       %s, %s, %s, %s,\n"
  822:                 "       %s, %s, %s\n",
  823:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  824:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
  825:                 d_SQL, d_SLB, d_PRC, d_MTX, d_REC);
  826: 
  827:         return;
  828:     }
  829:     else if ((*s_etat_processus).test_instruction == 'Y')
  830:     {
  831:         (*s_etat_processus).nombre_arguments = -1;
  832:         return;
  833:     }
  834: 
  835:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  836:     {
  837:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  838:         {
  839:             return;
  840:         }
  841:     }
  842: 
  843:     if (recherche_variable_globale(s_etat_processus, "EQ") == d_faux)
  844:     {
  845:         (*s_etat_processus).erreur_systeme = d_es;
  846: 
  847:         if ((*s_etat_processus).erreur_execution == d_ex)
  848:         {
  849:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
  850:         }
  851: 
  852:         return;
  853:     }
  854: 
  855:     if ((s_objet_variable = copie_objet(s_etat_processus,
  856:             (*(*s_etat_processus).pointeur_variable_courante).objet, 'P'))
  857:             == NULL)
  858:     {
  859:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  860:         return;
  861:     }
  862: 
  863:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  864:             s_objet_variable) == d_erreur)
  865:     {
  866:         return;
  867:     }
  868: 
  869:     return;
  870: }
  871: 
  872: 
  873: /*
  874: ================================================================================
  875:   Fonction 'res'
  876: ================================================================================
  877:   Entrées : pointeur sur une structure struct_processus
  878: --------------------------------------------------------------------------------
  879:   Sorties :
  880: --------------------------------------------------------------------------------
  881:   Effets de bord : néant
  882: ================================================================================
  883: */
  884: 
  885: void
  886: instruction_res(struct_processus *s_etat_processus)
  887: {
  888:     struct_objet                *s_objet;
  889: 
  890:     (*s_etat_processus).erreur_execution = d_ex;
  891: 
  892:     if ((*s_etat_processus).affichage_arguments == 'Y')
  893:     {
  894:         printf("\n  RES ");
  895: 
  896:         if ((*s_etat_processus).langue == 'F')
  897:         {
  898:             printf("(résolution)\n\n");
  899:         }
  900:         else
  901:         {
  902:             printf("(resolution)\n\n");
  903:         }
  904: 
  905:         printf("    1: %s, %s\n", d_INT, d_REL);
  906: 
  907:         return;
  908:     }
  909:     else if ((*s_etat_processus).test_instruction == 'Y')
  910:     {
  911:         (*s_etat_processus).nombre_arguments = -1;
  912:         return;
  913:     }
  914: 
  915:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  916:     {
  917:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  918:         {
  919:             return;
  920:         }
  921:     }
  922: 
  923:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  924:             &s_objet) == d_erreur)
  925:     {
  926:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  927:         return;
  928:     }
  929: 
  930:     if ((*s_objet).type == INT)
  931:     {
  932:         if ((*((integer8 *) (*s_objet).objet)) <= 0)
  933:         {
  934:             liberation(s_etat_processus, s_objet);
  935: 
  936:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  937:             return;
  938:         }
  939: 
  940:         (*s_etat_processus).resolution = (real8) (*((integer8 *)
  941:                 (*s_objet).objet));
  942:     }
  943:     else if ((*s_objet).type == REL)
  944:     {
  945:         if ((*((real8 *) (*s_objet).objet)) <= 0)
  946:         {
  947:             liberation(s_etat_processus, s_objet);
  948: 
  949:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  950:             return;
  951:         }
  952: 
  953:         (*s_etat_processus).resolution = (*((real8 *) (*s_objet).objet));
  954:     }
  955:     else
  956:     {
  957:         liberation(s_etat_processus, s_objet);
  958: 
  959:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  960:         return;
  961:     }
  962: 
  963:     liberation(s_etat_processus, s_objet);
  964:     return;
  965: }
  966: 
  967: 
  968: /*
  969: ================================================================================
  970:   Fonction 'recall'
  971: ================================================================================
  972:   Entrées : pointeur sur une structure struct_processus
  973: --------------------------------------------------------------------------------
  974:   Sorties :
  975: --------------------------------------------------------------------------------
  976:   Effets de bord : néant
  977: ================================================================================
  978: */
  979: 
  980: void
  981: instruction_recall(struct_processus *s_etat_processus)
  982: {
  983:     file                    *pipe;
  984:     file                    *fichier;
  985: 
  986:     int                     caractere;
  987:     int                     ios;
  988: 
  989:     logical1                drapeau_fin;
  990:     logical1                indicateur_48;
  991:     logical1                presence_chaine;
  992: 
  993:     long                    i;
  994:     long                    nombre_caracteres_source;
  995: 
  996:     struct_objet            *s_objet;
  997: 
  998:     unsigned char           autorisation_empilement_programme;
  999:     unsigned char           *chaine;
 1000:     unsigned char           *commande;
 1001:     unsigned char           *executable_candidat;
 1002: 
 1003: #   ifndef OS2
 1004:     unsigned char           *instructions = "%s/bin/rpliconv %s "
 1005:                                     "`%s/bin/rplfile "
 1006:                                     "-m %s/share/rplfiles -i %s | "
 1007:                                     "%s/bin/rplawk "
 1008:                                     "'{ print $3; }' | %s/bin/rplawk -F= '{ if "
 1009:                                     "($2 != \"\") printf(\"-f %%s\", $2); }'` "
 1010:                                     "-t `locale charmap` | %s/bin/%s -o %s";
 1011: #   else
 1012:     unsigned char           *instructions = BOURNE_SHELL
 1013:                                     " -c \"%s/bin/rpliconv %s "
 1014:                                     "`%s/bin/rplfile "
 1015:                                     "-m %s/share/rplfiles -i %s | "
 1016:                                     "%s/bin/rplawk "
 1017:                                     "'{ print $3; }' | %s/bin/rplawk -F= '{ if "
 1018:                                     "($2 != \\\"\\\") printf(\\\"-f %%s\\\", "
 1019:                                     "$2); }'` -t `" d_locale
 1020:                                     "` | %s/bin/%s -o %s\"";
 1021: #   endif
 1022: 
 1023:     unsigned char           *nom_fichier_temporaire;
 1024:     unsigned char           *tampon_definitions_chainees;
 1025:     unsigned char           *tampon_instruction_courante;
 1026: 
 1027:     integer8                position_courante;
 1028: 
 1029:     (*s_etat_processus).erreur_execution = d_ex;
 1030: 
 1031:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1032:     {
 1033:         printf("\n  RECALL ");
 1034: 
 1035:         if ((*s_etat_processus).langue == 'F')
 1036:         {
 1037:             printf("(rappel d'une variable stockée sur disque)\n\n");
 1038:         }
 1039:         else
 1040:         {
 1041:             printf("(recall a variable stored on disk)\n\n");
 1042:         }
 1043: 
 1044:         printf("    1: %s\n", d_CHN);
 1045:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
 1046:                 "       %s, %s, %s, %s, %s,\n"
 1047:                 "       %s, %s, %s, %s, %s\n",
 1048:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
 1049:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN);
 1050: 
 1051:         return;
 1052:     }
 1053:     else if ((*s_etat_processus).test_instruction == 'Y')
 1054:     {
 1055:         (*s_etat_processus).nombre_arguments = -1;
 1056:         return;
 1057:     }
 1058: 
 1059:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1060:     {
 1061:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1062:         {
 1063:             return;
 1064:         }
 1065:     }
 1066: 
 1067:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1068:             &s_objet) == d_erreur)
 1069:     {
 1070:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1071:         return;
 1072:     }
 1073: 
 1074:     if ((*s_objet).type == CHN)
 1075:     {
 1076:         if ((fichier = fopen((unsigned char *) (*s_objet).objet, "r")) == NULL)
 1077:         {
 1078:             liberation(s_etat_processus, s_objet);
 1079: 
 1080:             (*s_etat_processus).erreur_execution = d_ex_erreur_fichier;
 1081:             return;
 1082:         }
 1083: 
 1084:         if (fclose(fichier) != 0)
 1085:         {
 1086:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1087:             return;
 1088:         }
 1089: 
 1090:         if ((nom_fichier_temporaire = creation_nom_fichier(s_etat_processus,
 1091:                 (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
 1092:         {
 1093:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1094:             return;
 1095:         }
 1096: 
 1097:         if ((*s_etat_processus).rpl_home == NULL)
 1098:         {
 1099:             if ((commande = malloc((strlen(ds_preprocesseur) +
 1100:                     (2 * strlen((unsigned char *) (*s_objet).objet)) +
 1101:                     (6 * strlen(d_exec_path)) + 
 1102:                     strlen(nom_fichier_temporaire) + strlen(instructions) - 19)
 1103:                     * sizeof(unsigned char))) == NULL)
 1104:             {
 1105:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1106:                 return;
 1107:             }
 1108: 
 1109:             sprintf(commande, instructions, d_exec_path,
 1110:                     (unsigned char *) (*s_objet).objet,
 1111:                     d_exec_path, d_exec_path,
 1112:                     (unsigned char *) (*s_objet).objet,
 1113:                     d_exec_path, d_exec_path,
 1114:                     d_exec_path, ds_preprocesseur, nom_fichier_temporaire);
 1115: 
 1116:             if (alsprintf(s_etat_processus, &executable_candidat,
 1117:                     "%s/bin/rpliconv", d_exec_path) < 0)
 1118:             {
 1119:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1120:                 return;
 1121:             }
 1122: 
 1123:             if (controle_integrite(s_etat_processus, executable_candidat,
 1124:                     "rpliconv") != d_vrai)
 1125:             {
 1126:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1127:                 return;
 1128:             }
 1129: 
 1130:             free(executable_candidat);
 1131: 
 1132:             if (alsprintf(s_etat_processus, &executable_candidat,
 1133:                     "%s/bin/rplfile", d_exec_path) < 0)
 1134:             {
 1135:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1136:                 return;
 1137:             }
 1138: 
 1139:             if (controle_integrite(s_etat_processus, executable_candidat,
 1140:                     "rplfile") != d_vrai)
 1141:             {
 1142:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1143:                 return;
 1144:             }
 1145: 
 1146:             free(executable_candidat);
 1147: 
 1148:             if (alsprintf(s_etat_processus, &executable_candidat,
 1149:                     "%s/bin/rplpp", d_exec_path) < 0)
 1150:             {
 1151:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1152:                 return;
 1153:             }
 1154: 
 1155:             if (controle_integrite(s_etat_processus, executable_candidat,
 1156:                     "rplpp") != d_vrai)
 1157:             {
 1158:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1159:                 return;
 1160:             }
 1161: 
 1162:             free(executable_candidat);
 1163: 
 1164:             if (alsprintf(s_etat_processus, &executable_candidat,
 1165:                     "%s/bin/rplawk", d_exec_path) < 0)
 1166:             {
 1167:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1168:                 return;
 1169:             }
 1170: 
 1171:             if (controle_integrite(s_etat_processus, executable_candidat,
 1172:                     "rplawk") != d_vrai)
 1173:             {
 1174:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1175:                 return;
 1176:             }
 1177: 
 1178:             free(executable_candidat);
 1179:         }
 1180:         else
 1181:         {
 1182:             if ((commande = malloc((strlen(ds_preprocesseur) +
 1183:                     (2 * strlen((unsigned char *) (*s_objet).objet)) +
 1184:                     (6 * strlen((*s_etat_processus).rpl_home)) + 
 1185:                     strlen(nom_fichier_temporaire) + strlen(instructions) - 19)
 1186:                     * sizeof(unsigned char))) == NULL)
 1187:             {
 1188:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1189:                 return;
 1190:             }
 1191: 
 1192:             sprintf(commande, instructions, (*s_etat_processus).rpl_home,
 1193:                     (unsigned char *) (*s_objet).objet,
 1194:                     (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
 1195:                     (unsigned char *) (*s_objet).objet,
 1196:                     (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
 1197:                     (*s_etat_processus).rpl_home, ds_preprocesseur,
 1198:                     nom_fichier_temporaire);
 1199: 
 1200:             if (alsprintf(s_etat_processus, &executable_candidat,
 1201:                     "%s/bin/rpliconv", (*s_etat_processus).rpl_home) < 0)
 1202:             {
 1203:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1204:                 return;
 1205:             }
 1206: 
 1207:             if (controle_integrite(s_etat_processus, executable_candidat,
 1208:                     "rpliconv") != d_vrai)
 1209:             {
 1210:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1211:                 return;
 1212:             }
 1213: 
 1214:             free(executable_candidat);
 1215: 
 1216:             if (alsprintf(s_etat_processus, &executable_candidat,
 1217:                     "%s/bin/rplfile", (*s_etat_processus).rpl_home) < 0)
 1218:             {
 1219:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1220:                 return;
 1221:             }
 1222: 
 1223:             if (controle_integrite(s_etat_processus, executable_candidat,
 1224:                     "rplfile") != d_vrai)
 1225:             {
 1226:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1227:                 return;
 1228:             }
 1229: 
 1230:             free(executable_candidat);
 1231: 
 1232:             if (alsprintf(s_etat_processus, &executable_candidat,
 1233:                     "%s/bin/rplpp", (*s_etat_processus).rpl_home) < 0)
 1234:             {
 1235:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1236:                 return;
 1237:             }
 1238: 
 1239:             if (controle_integrite(s_etat_processus, executable_candidat,
 1240:                     "rplpp") != d_vrai)
 1241:             {
 1242:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1243:                 return;
 1244:             }
 1245: 
 1246:             free(executable_candidat);
 1247: 
 1248:             if (alsprintf(s_etat_processus, &executable_candidat,
 1249:                     "%s/bin/rplawk", d_exec_path) < 0)
 1250:             {
 1251:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1252:                 return;
 1253:             }
 1254: 
 1255:             if (controle_integrite(s_etat_processus, executable_candidat,
 1256:                     "rplawk") != d_vrai)
 1257:             {
 1258:                 (*s_etat_processus).erreur_systeme = d_es_somme_controle;
 1259:                 return;
 1260:             }
 1261: 
 1262:             free(executable_candidat);
 1263:         }
 1264: 
 1265:         if ((pipe = popen(commande, "r")) == NULL)
 1266:         {
 1267:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1268:             return;
 1269:         }
 1270: 
 1271:         if ((ios = pclose(pipe)) != EXIT_SUCCESS)
 1272:         {
 1273:             liberation(s_etat_processus, s_objet);
 1274:             free(commande);
 1275: 
 1276:             (*s_etat_processus).erreur_execution = d_ex_erreur_fichier;
 1277:             return;
 1278:         }
 1279:         else if (ios == -1)
 1280:         {
 1281:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1282:             return;
 1283:         }
 1284: 
 1285:         free(commande);
 1286: 
 1287:         nombre_caracteres_source = 0;
 1288: 
 1289:         if ((pipe = fopen(nom_fichier_temporaire, "r")) == NULL)
 1290:         {
 1291:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1292:             return;
 1293:         }
 1294: 
 1295:         while(getc(pipe) != EOF)
 1296:         {
 1297:             nombre_caracteres_source++;
 1298:         }
 1299: 
 1300:         if (nombre_caracteres_source == 0)
 1301:         {
 1302:             if (fclose(pipe) == -1)
 1303:             {
 1304:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1305:                 return;
 1306:             }
 1307: 
 1308:             liberation(s_etat_processus, s_objet);
 1309: 
 1310:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1311:             {
 1312:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1313:                 return;
 1314:             }
 1315: 
 1316:             free(nom_fichier_temporaire);
 1317: 
 1318:             (*s_etat_processus).erreur_execution = d_ex_fichier_vide;
 1319:             return;
 1320:         }
 1321: 
 1322:         if ((chaine = malloc((((size_t) nombre_caracteres_source) + 1)
 1323:                 * sizeof(unsigned char))) == NULL)
 1324:         {
 1325:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1326:             return;
 1327:         }
 1328: 
 1329:         rewind(pipe);
 1330: 
 1331:         i = 0;
 1332:         drapeau_fin = d_faux;
 1333:         presence_chaine = d_faux;
 1334: 
 1335:         while(drapeau_fin == d_faux)
 1336:         {
 1337:             if ((caractere = getc(pipe)) != EOF)
 1338:             {
 1339:                 if ((caractere == d_code_retour_chariot) ||
 1340:                         (caractere == d_code_tabulation) ||
 1341:                         ((caractere == d_code_espace) &&
 1342:                         (presence_chaine == d_faux)))
 1343:                 {
 1344:                     do
 1345:                     {
 1346:                         caractere = getc(pipe);
 1347:                     } while(((caractere == d_code_retour_chariot) ||
 1348:                             (caractere == d_code_tabulation) ||
 1349:                             ((caractere == d_code_espace) &&
 1350:                             (presence_chaine == d_faux))) &&
 1351:                             (caractere != EOF));
 1352: 
 1353:                     if (caractere != EOF)
 1354:                     {
 1355:                         chaine[i++] = d_code_espace;
 1356:                     }
 1357:                     else
 1358:                     {
 1359:                         drapeau_fin = d_vrai;
 1360:                     }
 1361:                 }
 1362: 
 1363:                 if ((chaine[i] = (unsigned char) caractere) == '\"')
 1364:                 {
 1365:                     if (i > 0)
 1366:                     {
 1367:                         if (chaine[i - 1] != '\\')
 1368:                         {
 1369:                             presence_chaine = (presence_chaine == d_faux)
 1370:                                     ? d_vrai : d_faux;
 1371:                         }
 1372:                     }
 1373: 
 1374:                     i++;
 1375:                 }
 1376:                 else
 1377:                 {
 1378:                     i++;
 1379:                 }
 1380:             }
 1381:             else
 1382:             {
 1383:                 drapeau_fin = d_vrai;
 1384:             }
 1385:         }
 1386: 
 1387:         if ((caractere == EOF) && (i > 0))
 1388:         {
 1389:             i--;
 1390:         }
 1391: 
 1392:         chaine[i] = d_code_fin_chaine;
 1393: 
 1394:         if (fclose(pipe) != 0)
 1395:         {
 1396:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1397:             return;
 1398:         }
 1399: 
 1400:         indicateur_48 = test_cfsf(s_etat_processus, 48);
 1401:         cf(s_etat_processus, 48);
 1402: 
 1403:         tampon_definitions_chainees = (*s_etat_processus).definitions_chainees;
 1404:         tampon_instruction_courante = (*s_etat_processus).instruction_courante;
 1405:         position_courante = (*s_etat_processus).position_courante;
 1406:         autorisation_empilement_programme = (*s_etat_processus)
 1407:                 .autorisation_empilement_programme;
 1408: 
 1409:         (*s_etat_processus).instruction_courante = NULL;
 1410: 
 1411:         if (((*s_etat_processus).definitions_chainees = transliteration(
 1412:                 s_etat_processus, chaine, "UTF-8", d_locale)) == NULL)
 1413:         {
 1414:             if (indicateur_48 == d_vrai)
 1415:             {
 1416:                 sf(s_etat_processus, 48);
 1417:             }
 1418:             else
 1419:             {
 1420:                 cf(s_etat_processus, 48);
 1421:             }
 1422: 
 1423:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1424:             {
 1425:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1426:                 return;
 1427:             }
 1428: 
 1429:             free(nom_fichier_temporaire);
 1430:             free((*s_etat_processus).instruction_courante);
 1431:             free(chaine);
 1432: 
 1433:             (*s_etat_processus).position_courante = position_courante;
 1434:             (*s_etat_processus).instruction_courante =
 1435:                     tampon_instruction_courante;
 1436:             (*s_etat_processus).definitions_chainees =
 1437:                     tampon_definitions_chainees;
 1438:             (*s_etat_processus).autorisation_empilement_programme =
 1439:                     autorisation_empilement_programme;
 1440: 
 1441:             liberation(s_etat_processus, s_objet);
 1442:             return;
 1443:         }
 1444: 
 1445:         (*s_etat_processus).autorisation_empilement_programme = 'Y';
 1446:         (*s_etat_processus).position_courante = 0;
 1447: 
 1448:         if (analyse_syntaxique(s_etat_processus) == d_erreur)
 1449:         {
 1450:             if (indicateur_48 == d_vrai)
 1451:             {
 1452:                 sf(s_etat_processus, 48);
 1453:             }
 1454:             else
 1455:             {
 1456:                 cf(s_etat_processus, 48);
 1457:             }
 1458: 
 1459:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1460:             {
 1461:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1462:                 return;
 1463:             }
 1464: 
 1465:             free(nom_fichier_temporaire);
 1466:             free((*s_etat_processus).instruction_courante);
 1467:             free((*s_etat_processus).definitions_chainees);
 1468:             free(chaine);
 1469: 
 1470:             (*s_etat_processus).position_courante = position_courante;
 1471:             (*s_etat_processus).instruction_courante =
 1472:                     tampon_instruction_courante;
 1473:             (*s_etat_processus).definitions_chainees =
 1474:                     tampon_definitions_chainees;
 1475:             (*s_etat_processus).autorisation_empilement_programme =
 1476:                     autorisation_empilement_programme;
 1477: 
 1478:             liberation(s_etat_processus, s_objet);
 1479:             return;
 1480:         }
 1481: 
 1482:         (*s_etat_processus).position_courante = 0;
 1483: 
 1484:         if (recherche_instruction_suivante(s_etat_processus) !=
 1485:                 d_absence_erreur)
 1486:         {
 1487:             if (indicateur_48 == d_vrai)
 1488:             {
 1489:                 sf(s_etat_processus, 48);
 1490:             }
 1491:             else
 1492:             {
 1493:                 cf(s_etat_processus, 48);
 1494:             }
 1495: 
 1496:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1497:             {
 1498:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1499:                 return;
 1500:             }
 1501: 
 1502:             free(nom_fichier_temporaire);
 1503:             free((*s_etat_processus).instruction_courante);
 1504:             free((*s_etat_processus).definitions_chainees);
 1505:             free(chaine);
 1506: 
 1507:             (*s_etat_processus).position_courante = position_courante;
 1508:             (*s_etat_processus).instruction_courante =
 1509:                     tampon_instruction_courante;
 1510:             (*s_etat_processus).definitions_chainees =
 1511:                     tampon_definitions_chainees;
 1512:             (*s_etat_processus).autorisation_empilement_programme =
 1513:                     autorisation_empilement_programme;
 1514: 
 1515:             liberation(s_etat_processus, s_objet);
 1516:             return;
 1517:         }
 1518: 
 1519:         (*s_etat_processus).type_en_cours = NON;
 1520:         recherche_type(s_etat_processus);
 1521: 
 1522:         while((*s_etat_processus).definitions_chainees
 1523:                 [(*s_etat_processus).position_courante] != d_code_fin_chaine)
 1524:         {
 1525:             if ((*s_etat_processus).definitions_chainees
 1526:                     [(*s_etat_processus).position_courante++] != d_code_espace)
 1527:             {
 1528:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 1529:             }
 1530:         }
 1531: 
 1532:         free((*s_etat_processus).instruction_courante);
 1533:         free((*s_etat_processus).definitions_chainees);
 1534:         free(chaine);
 1535: 
 1536:         (*s_etat_processus).position_courante = position_courante;
 1537:         (*s_etat_processus).instruction_courante =
 1538:                 tampon_instruction_courante;
 1539:         (*s_etat_processus).definitions_chainees =
 1540:                 tampon_definitions_chainees;
 1541:         (*s_etat_processus).autorisation_empilement_programme =
 1542:                 autorisation_empilement_programme;
 1543: 
 1544:         if (indicateur_48 == d_vrai)
 1545:         {
 1546:             sf(s_etat_processus, 48);
 1547:         }
 1548:         else
 1549:         {
 1550:             cf(s_etat_processus, 48);
 1551:         }
 1552: 
 1553:         if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
 1554:         {
 1555:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 1556:             return;
 1557:         }
 1558: 
 1559:         free(nom_fichier_temporaire);
 1560:     }
 1561:     else
 1562:     {
 1563:         liberation(s_etat_processus, s_objet);
 1564: 
 1565:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1566:         return;
 1567:     }
 1568: 
 1569:     liberation(s_etat_processus, s_objet);
 1570:     return;
 1571: }
 1572: 
 1573: 
 1574: /*
 1575: ================================================================================
 1576:   Fonction 'rcws'
 1577: ================================================================================
 1578:   Entrées : pointeur sur une structure struct_processus
 1579: --------------------------------------------------------------------------------
 1580:   Sorties :
 1581: --------------------------------------------------------------------------------
 1582:   Effets de bord : néant
 1583: ================================================================================
 1584: */
 1585: 
 1586: void
 1587: instruction_rcws(struct_processus *s_etat_processus)
 1588: {
 1589:     struct_objet                *s_objet_resultat;
 1590: 
 1591:     integer8                    i;
 1592:     integer8                    j;
 1593:     integer8                    longueur;
 1594: 
 1595:     (*s_etat_processus).erreur_execution = d_ex;
 1596: 
 1597:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1598:     {
 1599:         printf("\n  RCWS ");
 1600: 
 1601:         if ((*s_etat_processus).langue == 'F')
 1602:         {
 1603:             printf("(rappel de la longueur des entiers binaires)\n\n");
 1604:         }
 1605:         else
 1606:         {
 1607:             printf("(recall the length of the binary integers)\n\n");
 1608:         }
 1609: 
 1610:         printf("->  1: %s\n", d_INT);
 1611: 
 1612:         return;
 1613:     }
 1614:     else if ((*s_etat_processus).test_instruction == 'Y')
 1615:     {
 1616:         (*s_etat_processus).nombre_arguments = -1;
 1617:         return;
 1618:     }
 1619: 
 1620:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1621:     {
 1622:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1623:         {
 1624:             return;
 1625:         }
 1626:     }
 1627: 
 1628:     if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1629:     {
 1630:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1631:         return;
 1632:     }
 1633: 
 1634:     longueur = 1;
 1635:     j = 1;
 1636: 
 1637:     for(i = 37; i <= 42; i++)
 1638:     {
 1639:         longueur += (test_cfsf(s_etat_processus, (unsigned char) i)
 1640:                 == d_vrai) ? j : 0;
 1641:         j *= 2;
 1642:     }
 1643: 
 1644:     (*((integer8 *) (*s_objet_resultat).objet)) = longueur;
 1645: 
 1646:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1647:             s_objet_resultat) == d_erreur)
 1648:     {
 1649:         return;
 1650:     }
 1651: 
 1652:     return;
 1653: }
 1654: 
 1655: 
 1656: /*
 1657: ================================================================================
 1658:   Fonction 'rcls'
 1659: ================================================================================
 1660:   Entrées : pointeur sur une structure struct_processus
 1661: --------------------------------------------------------------------------------
 1662:   Sorties :
 1663: --------------------------------------------------------------------------------
 1664:   Effets de bord : néant
 1665: ================================================================================
 1666: */
 1667: 
 1668: void
 1669: instruction_rcls(struct_processus *s_etat_processus)
 1670: {
 1671:     struct_objet            *s_objet_variable;
 1672: 
 1673:     (*s_etat_processus).erreur_execution = d_ex;
 1674: 
 1675:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1676:     {
 1677:         printf("\n  RCLS ");
 1678: 
 1679:         if ((*s_etat_processus).langue == 'F')
 1680:         {
 1681:             printf("(rappel de la variable %s)\n\n", ds_sdat);
 1682:         }
 1683:         else
 1684:         {
 1685:             printf("(recall %s variable)\n\n", ds_sdat);
 1686:         }
 1687: 
 1688:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
 1689:                 "       %s, %s, %s, %s, %s,\n"
 1690:                 "       %s, %s, %s, %s, %s,\n"
 1691:                 "       %s\n",
 1692:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
 1693:                 d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
 1694: 
 1695:         return;
 1696:     }
 1697:     else if ((*s_etat_processus).test_instruction == 'Y')
 1698:     {
 1699:         (*s_etat_processus).nombre_arguments = -1;
 1700:         return;
 1701:     }
 1702: 
 1703:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1704:     {
 1705:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1706:         {
 1707:             return;
 1708:         }
 1709:     }
 1710: 
 1711:     if (recherche_variable_globale(s_etat_processus, ds_sdat) == d_faux)
 1712:     {
 1713:         (*s_etat_processus).erreur_systeme = d_es;
 1714: 
 1715:         if ((*s_etat_processus).erreur_execution == d_ex)
 1716:         {
 1717:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 1718:         }
 1719: 
 1720:         return;
 1721:     }
 1722: 
 1723:     if ((s_objet_variable = copie_objet(s_etat_processus,
 1724:             (*(*s_etat_processus).pointeur_variable_courante).objet, 'O'))
 1725:             == NULL)
 1726:     {
 1727:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1728:         return;
 1729:     }
 1730: 
 1731:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1732:             s_objet_variable) == d_erreur)
 1733:     {
 1734:         return;
 1735:     }
 1736: 
 1737:     return;
 1738: }
 1739: 
 1740: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>