File:  [local] / rpl / src / instructions_l5.c
Revision 1.69: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:46 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 'lcd->'
   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_lcd_fleche(struct_processus *s_etat_processus)
   40: {
   41:     file                        *descripteur;
   42:     file                        *descripteur_graphique;
   43: 
   44:     int                         caractere;
   45: 
   46:     struct_fichier_graphique    *l_fichier_courant;
   47: 
   48:     struct_liste_chainee        *l_element_courant;
   49: 
   50:     struct_objet                *s_objet_argument;
   51: 
   52:     unsigned long               nombre_elements;
   53: 
   54:     (*s_etat_processus).erreur_execution = d_ex;
   55: 
   56:     if ((*s_etat_processus).affichage_arguments == 'Y')
   57:     {
   58:         printf("\n  LCD-> ");
   59:         
   60:         if ((*s_etat_processus).langue == 'F')
   61:         {
   62:             printf("(sauvegarde d'un fichier graphique)\n\n");
   63:         }
   64:         else
   65:         {
   66:             printf("(graphical file storage)\n\n");
   67:         }
   68: 
   69:         printf("    1: %s, %s\n\n", d_CHN, d_LST);
   70: 
   71:         if ((*s_etat_processus).langue == 'F')
   72:         {
   73:             printf("  Utilisation :\n\n");
   74:         }
   75:         else
   76:         {
   77:             printf("  Usage:\n\n");
   78:         }
   79: 
   80:         printf("    \"filename\" LCD->\n");
   81:         printf("    { \"filename\" \"postscript eps enhanced monochrome "
   82:                 "dashed\" } LCD->\n");
   83: 
   84:         return;
   85:     }
   86:     else if ((*s_etat_processus).test_instruction == 'Y')
   87:     {
   88:         (*s_etat_processus).nombre_arguments = -1;
   89:         return;
   90:     }
   91: 
   92:     nombre_elements = 0;
   93: 
   94:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   95:     {
   96:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   97:         {
   98:             return;
   99:         }
  100:     }
  101: 
  102:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  103:             &s_objet_argument) == d_erreur)
  104:     {
  105:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  106:         return;
  107:     }
  108: 
  109:     if ((*s_objet_argument).type == CHN)
  110:     {
  111:         if ((descripteur = fopen((unsigned char *) (*s_objet_argument).objet,
  112:                 "w")) == NULL)
  113:         {
  114:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  115:             return;
  116:         }
  117: 
  118:         l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
  119: 
  120:         while(l_fichier_courant != NULL)
  121:         {
  122:             if (fprintf(descripteur, "@ %c %d %lld %s\n",
  123:                     ((*l_fichier_courant).presence_axes == d_faux) ? 'F' : 'T',
  124:                     (*l_fichier_courant).dimensions,
  125:                     (*l_fichier_courant).systeme_axes,
  126:                     (*l_fichier_courant).type) < 0)
  127:             {
  128:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  129:                 return;
  130:             }
  131: 
  132:             if ((descripteur_graphique = fopen((*l_fichier_courant).nom, "r"))
  133:                     == NULL)
  134:             {
  135:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  136:                 return;
  137:             }
  138: 
  139:             while((caractere = getc(descripteur_graphique)) != EOF)
  140:             {
  141:                 if (putc(caractere, descripteur) < 0)
  142:                 {
  143:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  144:                     return;
  145:                 }
  146:             }
  147: 
  148:             if (fclose(descripteur_graphique) != 0)
  149:             {
  150:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  151:                 return;
  152:             }
  153: 
  154:             l_fichier_courant = (*l_fichier_courant).suivant;
  155:         }
  156: 
  157:         if (fclose(descripteur) != 0)
  158:         {
  159:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  160:             return;
  161:         }
  162: 
  163:     }
  164:     else if ((*s_objet_argument).type == LST)
  165:     {
  166:         l_element_courant = (struct_liste_chainee *) (*s_objet_argument).objet;
  167: 
  168:         while(l_element_courant != NULL)
  169:         {
  170:             if ((*(*l_element_courant).donnee).type != CHN)
  171:             {
  172:                 liberation(s_etat_processus, s_objet_argument);
  173: 
  174:                 (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  175:                 return;
  176:             }
  177: 
  178:             nombre_elements++;
  179: 
  180:             switch(nombre_elements)
  181:             {
  182:                 case 1 : /* Nom du fichier */
  183:                 {
  184:                     if (((*s_etat_processus).nom_fichier_gnuplot =
  185:                             malloc((strlen((unsigned char *)
  186:                             (*(*l_element_courant).donnee).objet) + 1) *
  187:                             sizeof(unsigned char))) == NULL)
  188:                     {
  189:                         (*s_etat_processus).erreur_systeme =
  190:                                 d_es_allocation_memoire;
  191:                         return;
  192:                     }
  193: 
  194:                     strcpy((*s_etat_processus).nom_fichier_gnuplot,
  195:                             (unsigned char *) (*(*l_element_courant).donnee)
  196:                             .objet);
  197: 
  198:                     break;
  199:                 }
  200: 
  201:                 case 2 : /* Type de fichier */
  202:                 {
  203:                     if (((*s_etat_processus).type_fichier_gnuplot =
  204:                             malloc((strlen((unsigned char *)
  205:                             (*(*l_element_courant).donnee).objet) + 1) *
  206:                             sizeof(unsigned char))) == NULL)
  207:                     {
  208:                         (*s_etat_processus).erreur_systeme =
  209:                                 d_es_allocation_memoire;
  210:                         return;
  211:                     }
  212: 
  213:                     strcpy((*s_etat_processus).type_fichier_gnuplot,
  214:                             (unsigned char *) (*(*l_element_courant).donnee)
  215:                             .objet);
  216: 
  217:                     break;
  218:                 }
  219: 
  220:                 default :
  221:                 {
  222:                     liberation(s_etat_processus, s_objet_argument);
  223: 
  224:                     (*s_etat_processus).erreur_execution =
  225:                             d_ex_argument_invalide;
  226:                     return;
  227:                 }
  228:             }
  229: 
  230:             l_element_courant = (*l_element_courant).suivant;
  231:         }
  232: 
  233:         appel_gnuplot(s_etat_processus, 'F');
  234:     }
  235:     else
  236:     {
  237:         liberation(s_etat_processus, s_objet_argument);
  238: 
  239:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  240:         return;
  241:     }
  242: 
  243:     liberation(s_etat_processus, s_objet_argument);
  244: 
  245:     return;
  246: }
  247: 
  248: 
  249: /*
  250: ================================================================================
  251:   Fonction 'label'
  252: ================================================================================
  253:   Entrées : pointeur sur une structure struct_processus
  254: --------------------------------------------------------------------------------
  255:   Sorties :
  256: --------------------------------------------------------------------------------
  257:   Effets de bord : néant
  258: ================================================================================
  259: */
  260: 
  261: void
  262: instruction_label(struct_processus *s_etat_processus)
  263: {
  264:     struct_liste_chainee        *l_element_courant;
  265: 
  266:     struct_objet                *s_objet_argument;
  267: 
  268:     integer8                    nombre_labels;
  269: 
  270:     (*s_etat_processus).erreur_execution = d_ex;
  271: 
  272:     if ((*s_etat_processus).affichage_arguments == 'Y')
  273:     {
  274:         printf("\n  LABEL ");
  275:         
  276:         if ((*s_etat_processus).langue == 'F')
  277:         {
  278:             printf("(spécification des labels sur les axes)\n\n");
  279:         }
  280:         else
  281:         {
  282:             printf("(axes labels specification)\n\n");
  283:         }
  284: 
  285:         printf("    1: %s\n\n", d_LST);
  286: 
  287:         if ((*s_etat_processus).langue == 'F')
  288:         {
  289:             printf("  Utilisation :\n\n");
  290:         }
  291:         else
  292:         {
  293:             printf("  Usage:\n\n");
  294:         }
  295: 
  296:         printf("    { \"label X\" \"label Y\" \"label Z\" } LABEL\n");
  297:         printf("    { \"label X\" } LABEL\n");
  298: 
  299:         return;
  300:     }
  301:     else if ((*s_etat_processus).test_instruction == 'Y')
  302:     {
  303:         (*s_etat_processus).nombre_arguments = -1;
  304:         return;
  305:     }
  306: 
  307:     nombre_labels = 0;
  308: 
  309:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  310:     {
  311:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  312:         {
  313:             return;
  314:         }
  315:     }
  316: 
  317:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  318:             &s_objet_argument) == d_erreur)
  319:     {
  320:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  321:         return;
  322:     }
  323: 
  324:     if ((*s_objet_argument).type == LST)
  325:     {
  326:         l_element_courant = (struct_liste_chainee *) (*s_objet_argument).objet;
  327: 
  328:         while(l_element_courant != NULL)
  329:         {
  330:             if ((*(*l_element_courant).donnee).type != CHN)
  331:             {
  332:                 liberation(s_etat_processus, s_objet_argument);
  333: 
  334:                 (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  335:                 return;
  336:             }
  337: 
  338:             nombre_labels++;
  339: 
  340:             switch(nombre_labels)
  341:             {
  342:                 case 1 :
  343:                 {
  344:                     free((*s_etat_processus).label_x);
  345: 
  346:                     if (((*s_etat_processus).label_x = malloc((strlen(
  347:                             (unsigned char *) (*(*l_element_courant).donnee)
  348:                             .objet) + 1) * sizeof(unsigned char))) == NULL)
  349:                     {
  350:                         (*s_etat_processus).erreur_systeme =
  351:                                 d_es_allocation_memoire;
  352:                         return;
  353:                     }
  354: 
  355:                     strcpy((*s_etat_processus).label_x, (unsigned char *)
  356:                             (*(*l_element_courant).donnee).objet);
  357: 
  358:                     break;
  359:                 }
  360: 
  361:                 case 2 :
  362:                 {
  363:                     free((*s_etat_processus).label_y);
  364: 
  365:                     if (((*s_etat_processus).label_y = malloc((strlen(
  366:                             (unsigned char *) (*(*l_element_courant).donnee)
  367:                             .objet) + 1) * sizeof(unsigned char))) == NULL)
  368:                     {
  369:                         (*s_etat_processus).erreur_systeme =
  370:                                 d_es_allocation_memoire;
  371:                         return;
  372:                     }
  373: 
  374:                     strcpy((*s_etat_processus).label_y, (unsigned char *)
  375:                             (*(*l_element_courant).donnee).objet);
  376: 
  377:                     break;
  378:                 }
  379: 
  380:                 case 3 :
  381:                 {
  382:                     free((*s_etat_processus).label_z);
  383: 
  384:                     if (((*s_etat_processus).label_z = malloc((strlen(
  385:                             (unsigned char *) (*(*l_element_courant).donnee)
  386:                             .objet) + 1) * sizeof(unsigned char))) == NULL)
  387:                     {
  388:                         (*s_etat_processus).erreur_systeme =
  389:                                 d_es_allocation_memoire;
  390:                         return;
  391:                     }
  392: 
  393:                     strcpy((*s_etat_processus).label_z, (unsigned char *)
  394:                             (*(*l_element_courant).donnee).objet);
  395: 
  396:                     break;
  397:                 }
  398: 
  399:                 default :
  400:                 {
  401:                     liberation(s_etat_processus, s_objet_argument);
  402: 
  403:                     (*s_etat_processus).erreur_execution =
  404:                             d_ex_argument_invalide;
  405:                     return;
  406:                 }
  407:             }
  408: 
  409:             l_element_courant = (*l_element_courant).suivant;
  410:         }
  411:     }
  412:     else
  413:     {
  414:         liberation(s_etat_processus, s_objet_argument);
  415: 
  416:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  417:         return;
  418:     }
  419: 
  420:     liberation(s_etat_processus, s_objet_argument);
  421: 
  422:     if (test_cfsf(s_etat_processus, 52) == d_faux)
  423:     {
  424:         if ((*s_etat_processus).fichiers_graphiques != NULL)
  425:         {
  426:             appel_gnuplot(s_etat_processus, 'N');
  427:         }
  428:     }
  429: 
  430:     return;
  431: }
  432: 
  433: 
  434: /*
  435: ================================================================================
  436:   Fonction 'logger'
  437: ================================================================================
  438:   Entrées : pointeur sur une structure struct_processus
  439: --------------------------------------------------------------------------------
  440:   Sorties :
  441: --------------------------------------------------------------------------------
  442:   Effets de bord : néant
  443: ================================================================================
  444: */
  445: 
  446: void
  447: instruction_logger(struct_processus *s_etat_processus)
  448: {
  449:     integer8                    longueur;
  450: 
  451:     struct_objet                *s_objet_argument;
  452: 
  453:     unsigned char               *tampon;
  454: 
  455:     (*s_etat_processus).erreur_execution = d_ex;
  456: 
  457:     if ((*s_etat_processus).affichage_arguments == 'Y')
  458:     {
  459:         printf("\n  LOGGER ");
  460:         
  461:         if ((*s_etat_processus).langue == 'F')
  462:         {
  463:             printf("(écriture d'un message de journalisation)\n\n");
  464:         }
  465:         else
  466:         {
  467:             printf("(send message to system logger)\n\n");
  468:         }
  469: 
  470:         printf("    1: %s\n", d_CHN);
  471: 
  472:         return;
  473:     }
  474:     else if ((*s_etat_processus).test_instruction == 'Y')
  475:     {
  476:         (*s_etat_processus).nombre_arguments = -1;
  477:         return;
  478:     }
  479: 
  480:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  481:     {
  482:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  483:         {
  484:             return;
  485:         }
  486:     }
  487: 
  488:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  489:             &s_objet_argument) == d_erreur)
  490:     {
  491:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  492:         return;
  493:     }
  494: 
  495:     if ((*s_objet_argument).type == CHN)
  496:     {
  497:         if ((tampon = formateur_flux(s_etat_processus,
  498:                 (unsigned char *) (*s_objet_argument).objet, &longueur))
  499:                 == NULL)
  500:         {
  501:             return;
  502:         }
  503: 
  504:         syslog(LOG_NOTICE, "%s", tampon);
  505:         free(tampon);
  506:     }
  507:     else
  508:     {
  509:         liberation(s_etat_processus, s_objet_argument);
  510: 
  511:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  512:         return;
  513:     }
  514: 
  515:     liberation(s_etat_processus, s_objet_argument);
  516: 
  517:     return;
  518: }
  519: 
  520: 
  521: /*
  522: ================================================================================
  523:   Fonction 'line'
  524: ================================================================================
  525:   Entrées : pointeur sur une structure struct_processus
  526: --------------------------------------------------------------------------------
  527:   Sorties :
  528: --------------------------------------------------------------------------------
  529:   Effets de bord : néant
  530: ================================================================================
  531: */
  532: 
  533: void
  534: instruction_line(struct_processus *s_etat_processus)
  535: {
  536:     file                        *fichier;
  537: 
  538:     struct_fichier_graphique    *l_fichier_candidat;
  539:     struct_fichier_graphique    *l_fichier_courant;
  540:     struct_fichier_graphique    *l_fichier_precedent;
  541: 
  542:     struct_objet                *s_objet_argument_1;
  543:     struct_objet                *s_objet_argument_2;
  544: 
  545:     unsigned char               *nom_fichier;
  546: 
  547:     (*s_etat_processus).erreur_execution = d_ex;
  548: 
  549:     if ((*s_etat_processus).affichage_arguments == 'Y')
  550:     {
  551:         printf("\n  LINE ");
  552:         
  553:         if ((*s_etat_processus).langue == 'F')
  554:         {
  555:             printf("(dessin d'un segment)\n\n");
  556:         }
  557:         else
  558:         {
  559:             printf("(draw line)\n\n");
  560:         }
  561: 
  562:         printf("    2: %s\n", d_CPL);
  563:         printf("    1: %s\n", d_CPL);
  564: 
  565:         return;
  566:     }
  567:     else if ((*s_etat_processus).test_instruction == 'Y')
  568:     {
  569:         (*s_etat_processus).nombre_arguments = -1;
  570:         return;
  571:     }
  572: 
  573:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  574:     {
  575:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  576:         {
  577:             return;
  578:         }
  579:     }
  580: 
  581:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  582:             &s_objet_argument_1) == d_erreur)
  583:     {
  584:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  585:         return;
  586:     }
  587: 
  588:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  589:             &s_objet_argument_2) == d_erreur)
  590:     {
  591:         liberation(s_etat_processus, s_objet_argument_1);
  592: 
  593:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  594:         return;
  595:     }
  596: 
  597:     // Vérification du nombre de dimensions de l'espace
  598: 
  599:     if (((*s_objet_argument_1).type == CPL) &&
  600:             ((*s_objet_argument_2).type == CPL))
  601:     {
  602:         /*
  603:          * Vérification de la présence d'un fichier de dessin
  604:          * parmi la liste des fichiers graphiques
  605:          */
  606: 
  607:         l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
  608:         l_fichier_candidat = NULL;
  609: 
  610:         while(l_fichier_courant != NULL)
  611:         {
  612:             if (strcmp((*l_fichier_courant).type, "DESSIN") == 0)
  613:             {
  614:                 l_fichier_candidat = l_fichier_courant;
  615:             }
  616: 
  617:             l_fichier_courant = (*l_fichier_courant).suivant;
  618:         }
  619: 
  620:         l_fichier_courant = l_fichier_candidat;
  621: 
  622:         if ((l_fichier_courant == NULL) ||
  623:                 ((*s_etat_processus).requete_nouveau_plan == d_vrai))
  624:         {
  625:             // Création d'un fichier
  626: 
  627:             (*s_etat_processus).requete_nouveau_plan = d_faux;
  628: 
  629:             if ((nom_fichier = creation_nom_fichier(s_etat_processus,
  630:                     (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
  631:             {
  632:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  633:                 return;
  634:             }
  635: 
  636:             if ((fichier = fopen(nom_fichier, "w+")) == NULL)
  637:             {
  638:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  639:                 return;
  640:             }
  641: 
  642:             l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
  643: 
  644:             if (l_fichier_courant == NULL)
  645:             {
  646:                 if (((*s_etat_processus).fichiers_graphiques =
  647:                         malloc(sizeof(struct_fichier_graphique))) == NULL)
  648:                 {
  649:                     (*s_etat_processus).erreur_systeme =
  650:                             d_es_allocation_memoire;
  651:                     return;
  652:                 }
  653: 
  654:                 (*(*s_etat_processus).fichiers_graphiques).suivant = NULL;
  655:                 (*(*s_etat_processus).fichiers_graphiques).nom = nom_fichier;
  656:                 (*(*s_etat_processus).fichiers_graphiques).legende = NULL;
  657:                 (*(*s_etat_processus).fichiers_graphiques).dimensions = 2;
  658:                 (*(*s_etat_processus).fichiers_graphiques).presence_axes =
  659:                         d_faux;
  660:                 (*(*s_etat_processus).fichiers_graphiques).systeme_axes =
  661:                         (*s_etat_processus).systeme_axes;
  662:                 strcpy((*(*s_etat_processus).fichiers_graphiques).type,
  663:                         "DESSIN");
  664:             }
  665:             else
  666:             {
  667:                 while(l_fichier_courant != NULL)
  668:                 {
  669:                     if ((*l_fichier_courant).dimensions != 2)
  670:                     {
  671:                         (*s_etat_processus).erreur_execution =
  672:                                 d_ex_dimensions_differentes;
  673:                         return;
  674:                     }
  675: 
  676:                     l_fichier_precedent = l_fichier_courant;
  677:                     l_fichier_courant = (*l_fichier_courant).suivant;
  678:                 }
  679: 
  680:                 l_fichier_courant = l_fichier_precedent;
  681: 
  682:                 if (((*l_fichier_courant).suivant =
  683:                         malloc(sizeof(struct_fichier_graphique))) == NULL)
  684:                 {
  685:                     (*s_etat_processus).erreur_systeme =
  686:                             d_es_allocation_memoire;
  687:                     return;
  688:                 }
  689: 
  690:                 l_fichier_courant = (*l_fichier_courant).suivant;
  691: 
  692:                 (*l_fichier_courant).suivant = NULL;
  693:                 (*l_fichier_courant).nom = nom_fichier;
  694:                 (*l_fichier_courant).legende = NULL;
  695:                 (*l_fichier_courant).dimensions = 2;
  696:                 (*l_fichier_courant).presence_axes = d_faux;
  697:                 (*l_fichier_courant).systeme_axes =
  698:                         (*s_etat_processus).systeme_axes;
  699:                 strcpy((*l_fichier_courant).type, "DESSIN");
  700:             }
  701:         }
  702:         else
  703:         {
  704:             // Le fichier préexiste.
  705: 
  706:             if ((fichier = fopen((*l_fichier_courant).nom, "a")) == NULL)
  707:             {
  708:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  709:                 return;
  710:             }
  711:         }
  712: 
  713:         /*
  714:          * Inscription du segment
  715:          */
  716: 
  717:         if (fprintf(fichier, "%f %f\n", (*((complex16 *)
  718:                 (*s_objet_argument_2).objet)).partie_reelle, (*((complex16 *)
  719:                 (*s_objet_argument_2).objet)).partie_imaginaire) < 0)
  720:         {
  721:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  722:             return;
  723:         }
  724: 
  725:         if (fprintf(fichier, "%f %f\n\n", (*((complex16 *)
  726:                 (*s_objet_argument_1).objet)).partie_reelle, (*((complex16 *)
  727:                 (*s_objet_argument_1).objet)).partie_imaginaire) < 0)
  728:         {
  729:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  730:             return;
  731:         }
  732: 
  733:         if (fclose(fichier) != 0)
  734:         {
  735:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  736:             return;
  737:         }
  738: 
  739:         (*s_etat_processus).mise_a_jour_trace_requise = d_vrai;
  740:     }
  741:     else
  742:     {
  743:         liberation(s_etat_processus, s_objet_argument_1);
  744:         liberation(s_etat_processus, s_objet_argument_2);
  745: 
  746:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  747:         return;
  748:     }
  749: 
  750:     liberation(s_etat_processus, s_objet_argument_1);
  751:     liberation(s_etat_processus, s_objet_argument_2);
  752: 
  753:     return;
  754: }
  755: 
  756: 
  757: /*
  758: ================================================================================
  759:   Fonction 'lq'
  760: ================================================================================
  761:   Entrées : pointeur sur une structure struct_processus
  762: --------------------------------------------------------------------------------
  763:   Sorties :
  764: --------------------------------------------------------------------------------
  765:   Effets de bord : néant
  766: ================================================================================
  767: */
  768: 
  769: void
  770: instruction_lq(struct_processus *s_etat_processus)
  771: {
  772:     complex16                   registre;
  773:     complex16                   *tau_complexe;
  774:     complex16                   *vecteur_complexe;
  775: 
  776:     real8                       *tau_reel;
  777:     real8                       *vecteur_reel;
  778: 
  779:     struct_liste_chainee        *registre_pile_last;
  780: 
  781:     struct_objet                *s_copie_argument;
  782:     struct_objet                *s_matrice_identite;
  783:     struct_objet                *s_objet;
  784:     struct_objet                *s_objet_argument;
  785:     struct_objet                *s_objet_resultat;
  786: 
  787:     integer8                    i;
  788:     integer8                    j;
  789:     integer8                    k;
  790:     integer8                    nombre_reflecteurs_elementaires;
  791: 
  792:     void                        *tau;
  793: 
  794:     (*s_etat_processus).erreur_execution = d_ex;
  795: 
  796:     if ((*s_etat_processus).affichage_arguments == 'Y')
  797:     {
  798:         printf("\n  LQ ");
  799:         
  800:         if ((*s_etat_processus).langue == 'F')
  801:         {
  802:             printf("(décomposition LQ)\n\n");
  803:         }
  804:         else
  805:         {
  806:             printf("(LQ décomposition)\n\n");
  807:         }
  808: 
  809:         printf("    1: %s, %s\n", d_MIN, d_MRL);
  810:         printf("->  2: %s\n", d_MRL);
  811:         printf("    1: %s\n\n", d_MRL);
  812: 
  813:         printf("    1: %s\n", d_MCX);
  814:         printf("->  2: %s\n", d_MCX);
  815:         printf("    1: %s\n", d_MCX);
  816: 
  817:         return;
  818:     }
  819:     else if ((*s_etat_processus).test_instruction == 'Y')
  820:     {
  821:         (*s_etat_processus).nombre_arguments = -1;
  822:         return;
  823:     }
  824: 
  825:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  826:     {
  827:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  828:         {
  829:             return;
  830:         }
  831:     }
  832: 
  833:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  834:             &s_objet_argument) == d_erreur)
  835:     {
  836:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  837:         return;
  838:     }
  839: 
  840:     if (((*s_objet_argument).type == MIN) ||
  841:             ((*s_objet_argument).type == MRL))
  842:     {
  843:         /*
  844:          * Matrice entière ou réelle
  845:          */
  846: 
  847:         if ((s_copie_argument = copie_objet(s_etat_processus,
  848:                 s_objet_argument, 'Q')) == NULL)
  849:         {
  850:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  851:             return;
  852:         }
  853: 
  854:         factorisation_lq(s_etat_processus, (*s_copie_argument).objet, &tau);
  855:         (*s_copie_argument).type = MRL;
  856: 
  857:         tau_reel = (real8 *) tau;
  858: 
  859:         if ((*s_etat_processus).erreur_systeme != d_es)
  860:         {
  861:             return;
  862:         }
  863: 
  864:         if (((*s_etat_processus).exception != d_ep) ||
  865:                 ((*s_etat_processus).erreur_execution != d_ex))
  866:         {
  867:             free(tau);
  868:             liberation(s_etat_processus, s_objet_argument);
  869:             liberation(s_etat_processus, s_copie_argument);
  870:             return;
  871:         }
  872: 
  873:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  874:                 s_copie_argument, 'O')) == NULL)
  875:         {
  876:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  877:             return;
  878:         }
  879: 
  880:         // Matrice L
  881: 
  882:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
  883:                 .nombre_lignes; i++)
  884:         {
  885:             for(j = i + 1; j < (*((struct_matrice *) (*s_objet_resultat)
  886:                     .objet)).nombre_colonnes; j++)
  887:             {
  888:                 ((real8 **) (*((struct_matrice *) (*s_objet_resultat).objet))
  889:                         .tableau)[i][j] = 0;
  890:             }
  891:         }
  892: 
  893:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  894:                 s_objet_resultat) == d_erreur)
  895:         {
  896:             return;
  897:         }
  898: 
  899:         // Matrice Q
  900: 
  901:         nombre_reflecteurs_elementaires = ((*((struct_matrice *)
  902:                 (*s_copie_argument).objet)).nombre_colonnes <
  903:                 (*((struct_matrice *) (*s_copie_argument).objet))
  904:                 .nombre_lignes) ? (*((struct_matrice *)
  905:                 (*s_copie_argument).objet)).nombre_colonnes
  906:                 : (*((struct_matrice *) (*s_copie_argument).objet))
  907:                 .nombre_lignes;
  908: 
  909:         registre_pile_last = NULL;
  910: 
  911:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
  912:         {
  913:             registre_pile_last = (*s_etat_processus).l_base_pile_last;
  914:             (*s_etat_processus).l_base_pile_last = NULL;
  915:         }
  916: 
  917:         if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
  918:         {
  919:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  920:             return;
  921:         }
  922: 
  923:         (*((integer8 *) (*s_objet).objet)) = (*((struct_matrice *)
  924:                 (*s_copie_argument).objet)).nombre_colonnes;
  925: 
  926:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  927:                 s_objet) == d_erreur)
  928:         {
  929:             return;
  930:         }
  931: 
  932:         instruction_idn(s_etat_processus);
  933: 
  934:         if (((*s_etat_processus).erreur_systeme != d_es) ||
  935:                 ((*s_etat_processus).erreur_execution != d_ex) ||
  936:                 ((*s_etat_processus).exception != d_ep))
  937:         {
  938:             liberation(s_etat_processus, s_copie_argument);
  939:             free(tau);
  940: 
  941:             if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  942:             {
  943:                 return;
  944:             }
  945: 
  946:             (*s_etat_processus).l_base_pile_last = registre_pile_last;
  947:             return;
  948:         }
  949: 
  950:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  951:                 &s_matrice_identite) == d_erreur)
  952:         {
  953:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  954:             return;
  955:         }
  956: 
  957:         for(i = 0; i < nombre_reflecteurs_elementaires; i++)
  958:         {
  959:             // Calcul de H(i) = I - tau * v * v'
  960: 
  961:             if ((s_objet = copie_objet(s_etat_processus, s_matrice_identite,
  962:                     'P')) == NULL)
  963:             {
  964:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  965:                 return;
  966:             }
  967: 
  968:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  969:                     s_objet) == d_erreur)
  970:             {
  971:                 return;
  972:             }
  973: 
  974:             if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
  975:             {
  976:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  977:                 return;
  978:             }
  979: 
  980:             (*((real8 *) (*s_objet).objet)) = tau_reel[i];
  981: 
  982:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  983:                     s_objet) == d_erreur)
  984:             {
  985:                 return;
  986:             }
  987: 
  988:             if ((s_objet = allocation(s_etat_processus, MRL)) == NULL)
  989:             {
  990:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  991:                 return;
  992:             }
  993: 
  994:             (*((struct_matrice *) (*s_objet).objet)).nombre_lignes =
  995:                     (*((struct_matrice *) (*s_copie_argument).objet))
  996:                     .nombre_colonnes;
  997:             (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes =
  998:                     (*((struct_matrice *) (*s_copie_argument).objet))
  999:                     .nombre_colonnes;
 1000: 
 1001:             if ((vecteur_reel = malloc(((size_t) (*((struct_matrice *)
 1002:                     (*s_objet).objet)).nombre_lignes) * sizeof(real8))) == NULL)
 1003:             {
 1004:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1005:                 return;
 1006:             }
 1007: 
 1008:             for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
 1009:                     .nombre_lignes; j++)
 1010:             {
 1011:                 if (j < i)
 1012:                 {
 1013:                     vecteur_reel[j] = 0;
 1014:                 }
 1015:                 else if (j == i)
 1016:                 {
 1017:                     vecteur_reel[j] = 1;
 1018:                 }
 1019:                 else
 1020:                 {
 1021:                     vecteur_reel[j] = ((real8 **) (*((struct_matrice *)
 1022:                             (*s_copie_argument).objet)).tableau)[i][j];
 1023:                 }
 1024:             }
 1025: 
 1026:             if (((*((struct_matrice *) (*s_objet).objet)).tableau =
 1027:                     malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
 1028:                     .nombre_lignes) * sizeof(real8 *))) == NULL)
 1029:             {
 1030:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1031:                 return;
 1032:             }
 1033: 
 1034:             for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
 1035:                     .nombre_lignes; j++)
 1036:             {
 1037:                 if ((((real8 **) (*((struct_matrice *) (*s_objet).objet))
 1038:                         .tableau)[j] = malloc(((size_t) (*((struct_matrice *)
 1039:                         (*s_objet).objet)).nombre_lignes) * sizeof(real8)))
 1040:                         == NULL)
 1041:                 {
 1042:                     (*s_etat_processus).erreur_systeme =
 1043:                             d_es_allocation_memoire;
 1044:                     return;
 1045:                 }
 1046: 
 1047:                 for(k = 0; k < (*((struct_matrice *) (*s_objet).objet))
 1048:                         .nombre_colonnes; k++)
 1049:                 {
 1050:                     ((real8 **) (*((struct_matrice *) (*s_objet).objet))
 1051:                             .tableau)[j][k] = vecteur_reel[j] * vecteur_reel[k];
 1052:                 }
 1053:             }
 1054: 
 1055:             free(vecteur_reel);
 1056: 
 1057:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1058:                     s_objet) == d_erreur)
 1059:             {
 1060:                 return;
 1061:             }
 1062: 
 1063:             instruction_multiplication(s_etat_processus);
 1064: 
 1065:             if (((*s_etat_processus).erreur_systeme != d_es) ||
 1066:                     ((*s_etat_processus).erreur_execution != d_ex) ||
 1067:                     ((*s_etat_processus).exception != d_ep))
 1068:             {
 1069:                 liberation(s_etat_processus, s_copie_argument);
 1070:                 liberation(s_etat_processus, s_matrice_identite);
 1071:                 free(tau);
 1072: 
 1073:                 if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1074:                 {
 1075:                     return;
 1076:                 }
 1077: 
 1078:                 (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1079:                 return;
 1080:             }
 1081: 
 1082:             instruction_moins(s_etat_processus);
 1083: 
 1084:             if (((*s_etat_processus).erreur_systeme != d_es) ||
 1085:                     ((*s_etat_processus).erreur_execution != d_ex) ||
 1086:                     ((*s_etat_processus).exception != d_ep))
 1087:             {
 1088:                 liberation(s_etat_processus, s_copie_argument);
 1089:                 liberation(s_etat_processus, s_matrice_identite);
 1090:                 free(tau);
 1091: 
 1092:                 if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1093:                 {
 1094:                     return;
 1095:                 }
 1096: 
 1097:                 (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1098:                 return;
 1099:             }
 1100: 
 1101:             if (i > 0)
 1102:             {
 1103:                 instruction_swap(s_etat_processus);
 1104: 
 1105:                 if (((*s_etat_processus).erreur_systeme != d_es) ||
 1106:                         ((*s_etat_processus).erreur_execution != d_ex) ||
 1107:                         ((*s_etat_processus).exception != d_ep))
 1108:                 {
 1109:                     liberation(s_etat_processus, s_copie_argument);
 1110:                     liberation(s_etat_processus, s_matrice_identite);
 1111:                     free(tau);
 1112: 
 1113:                     if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1114:                     {
 1115:                         return;
 1116:                     }
 1117: 
 1118:                     (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1119:                     return;
 1120:                 }
 1121: 
 1122:                 instruction_multiplication(s_etat_processus);
 1123: 
 1124:                 if (((*s_etat_processus).erreur_systeme != d_es) ||
 1125:                         ((*s_etat_processus).erreur_execution != d_ex) ||
 1126:                         ((*s_etat_processus).exception != d_ep))
 1127:                 {
 1128:                     liberation(s_etat_processus, s_copie_argument);
 1129:                     liberation(s_etat_processus, s_matrice_identite);
 1130:                     free(tau);
 1131: 
 1132:                     if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1133:                     {
 1134:                         return;
 1135:                     }
 1136: 
 1137:                     (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1138:                     return;
 1139:                 }
 1140:             }
 1141:         }
 1142: 
 1143:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1144:         {
 1145:             if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1146:             {
 1147:                 return;
 1148:             }
 1149: 
 1150:             (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1151:         }
 1152: 
 1153:         liberation(s_etat_processus, s_matrice_identite);
 1154:         liberation(s_etat_processus, s_copie_argument);
 1155:         free(tau);
 1156:     }
 1157:     else if ((*s_objet_argument).type == MCX)
 1158:     {
 1159:         /*
 1160:          * Matrice complexe
 1161:          */
 1162: 
 1163:         if ((s_copie_argument = copie_objet(s_etat_processus,
 1164:                 s_objet_argument, 'Q')) == NULL)
 1165:         {
 1166:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1167:             return;
 1168:         }
 1169: 
 1170:         factorisation_lq(s_etat_processus, (*s_copie_argument).objet, &tau);
 1171: 
 1172:         tau_complexe = (complex16 *) tau;
 1173: 
 1174:         if ((*s_etat_processus).erreur_systeme != d_es)
 1175:         {
 1176:             return;
 1177:         }
 1178: 
 1179:         if (((*s_etat_processus).exception != d_ep) ||
 1180:                 ((*s_etat_processus).erreur_execution != d_ex))
 1181:         {
 1182:             free(tau);
 1183:             liberation(s_etat_processus, s_objet_argument);
 1184:             liberation(s_etat_processus, s_copie_argument);
 1185:             return;
 1186:         }
 1187: 
 1188:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1189:                 s_copie_argument, 'O')) == NULL)
 1190:         {
 1191:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1192:             return;
 1193:         }
 1194: 
 1195:         // Matrice L
 1196: 
 1197:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
 1198:                 .nombre_lignes; i++)
 1199:         {
 1200:             for(j = i + 1; j < (*((struct_matrice *) (*s_objet_resultat)
 1201:                     .objet)).nombre_colonnes; j++)
 1202:             {
 1203:                 ((complex16 **) (*((struct_matrice *)
 1204:                         (*s_objet_resultat).objet)).tableau)[i][j]
 1205:                         .partie_reelle = 0;
 1206:                 ((complex16 **) (*((struct_matrice *)
 1207:                         (*s_objet_resultat).objet)).tableau)[i][j]
 1208:                         .partie_imaginaire = 0;
 1209:             }
 1210:         }
 1211: 
 1212:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1213:                 s_objet_resultat) == d_erreur)
 1214:         {
 1215:             return;
 1216:         }
 1217: 
 1218:         // Matrice Q
 1219: 
 1220:         nombre_reflecteurs_elementaires = ((*((struct_matrice *)
 1221:                 (*s_copie_argument).objet)).nombre_colonnes <
 1222:                 (*((struct_matrice *) (*s_copie_argument).objet))
 1223:                 .nombre_lignes) ? (*((struct_matrice *)
 1224:                 (*s_copie_argument).objet)).nombre_colonnes
 1225:                 : (*((struct_matrice *) (*s_copie_argument).objet))
 1226:                 .nombre_lignes;
 1227: 
 1228:         registre_pile_last = NULL;
 1229: 
 1230:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1231:         {
 1232:             registre_pile_last = (*s_etat_processus).l_base_pile_last;
 1233:             (*s_etat_processus).l_base_pile_last = NULL;
 1234:         }
 1235: 
 1236:         if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
 1237:         {
 1238:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1239:             return;
 1240:         }
 1241: 
 1242:         (*((integer8 *) (*s_objet).objet)) = (*((struct_matrice *)
 1243:                 (*s_copie_argument).objet)).nombre_colonnes;
 1244: 
 1245:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1246:                 s_objet) == d_erreur)
 1247:         {
 1248:             return;
 1249:         }
 1250: 
 1251:         instruction_idn(s_etat_processus);
 1252: 
 1253:         if (((*s_etat_processus).erreur_systeme != d_es) ||
 1254:                 ((*s_etat_processus).erreur_execution != d_ex) ||
 1255:                 ((*s_etat_processus).exception != d_ep))
 1256:         {
 1257:             liberation(s_etat_processus, s_copie_argument);
 1258:             free(tau);
 1259: 
 1260:             if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1261:             {
 1262:                 return;
 1263:             }
 1264: 
 1265:             (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1266:             return;
 1267:         }
 1268: 
 1269:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1270:                 &s_matrice_identite) == d_erreur)
 1271:         {
 1272:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1273:             return;
 1274:         }
 1275: 
 1276:         for(i = 0; i < nombre_reflecteurs_elementaires; i++)
 1277:         {
 1278:             // Calcul de H'(i) = (I - tau * v * v')'
 1279: 
 1280:             if ((s_objet = copie_objet(s_etat_processus, s_matrice_identite,
 1281:                     'P')) == NULL)
 1282:             {
 1283:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1284:                 return;
 1285:             }
 1286: 
 1287:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1288:                     s_objet) == d_erreur)
 1289:             {
 1290:                 return;
 1291:             }
 1292: 
 1293:             if ((s_objet = allocation(s_etat_processus, CPL)) == NULL)
 1294:             {
 1295:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1296:                 return;
 1297:             }
 1298: 
 1299:             (*((complex16 *) (*s_objet).objet)) = tau_complexe[i];
 1300: 
 1301:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1302:                     s_objet) == d_erreur)
 1303:             {
 1304:                 return;
 1305:             }
 1306: 
 1307:             if ((s_objet = allocation(s_etat_processus, MCX)) == NULL)
 1308:             {
 1309:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1310:                 return;
 1311:             }
 1312: 
 1313:             (*((struct_matrice *) (*s_objet).objet)).nombre_lignes =
 1314:                     (*((struct_matrice *) (*s_copie_argument).objet))
 1315:                     .nombre_colonnes;
 1316:             (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes =
 1317:                     (*((struct_matrice *) (*s_copie_argument).objet))
 1318:                     .nombre_colonnes;
 1319: 
 1320:             if ((vecteur_complexe = malloc(((size_t) (*((struct_matrice *)
 1321:                     (*s_objet).objet)).nombre_lignes) * sizeof(complex16)))
 1322:                     == NULL)
 1323:             {
 1324:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1325:                 return;
 1326:             }
 1327: 
 1328:             for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
 1329:                     .nombre_lignes; j++)
 1330:             {
 1331:                 if (j < i)
 1332:                 {
 1333:                     vecteur_complexe[j].partie_reelle = 0;
 1334:                     vecteur_complexe[j].partie_imaginaire = 0;
 1335:                 }
 1336:                 else if (j == i)
 1337:                 {
 1338:                     vecteur_complexe[j].partie_reelle = 1;
 1339:                     vecteur_complexe[j].partie_imaginaire = 0;
 1340:                 }
 1341:                 else
 1342:                 {
 1343:                     vecteur_complexe[j].partie_reelle =
 1344:                             ((complex16 **) (*((struct_matrice *)
 1345:                             (*s_copie_argument).objet)).tableau)[i][j]
 1346:                             .partie_reelle;
 1347:                     vecteur_complexe[j].partie_imaginaire =
 1348:                             -((complex16 **) (*((struct_matrice *)
 1349:                             (*s_copie_argument).objet)).tableau)[i][j]
 1350:                             .partie_imaginaire;
 1351:                 }
 1352:             }
 1353: 
 1354:             if (((*((struct_matrice *) (*s_objet).objet)).tableau =
 1355:                     malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
 1356:                     .nombre_lignes) * sizeof(complex16 *))) == NULL)
 1357:             {
 1358:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1359:                 return;
 1360:             }
 1361: 
 1362:             for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
 1363:                     .nombre_lignes; j++)
 1364:             {
 1365:                 if ((((complex16 **) (*((struct_matrice *) (*s_objet).objet))
 1366:                         .tableau)[j] = malloc(((size_t) (*((struct_matrice *)
 1367:                         (*s_objet).objet)).nombre_lignes) * sizeof(complex16)))
 1368:                         == NULL)
 1369:                 {
 1370:                     (*s_etat_processus).erreur_systeme =
 1371:                             d_es_allocation_memoire;
 1372:                     return;
 1373:                 }
 1374: 
 1375:                 for(k = 0; k < (*((struct_matrice *) (*s_objet).objet))
 1376:                         .nombre_colonnes; k++)
 1377:                 {
 1378:                     registre = vecteur_complexe[k];
 1379:                     registre.partie_imaginaire = -registre.partie_imaginaire;
 1380: 
 1381:                     f77multiplicationcc_(&(vecteur_complexe[j]), &registre,
 1382:                             &(((complex16 **) (*((struct_matrice *)
 1383:                             (*s_objet).objet)).tableau)[j][k]));
 1384:                 }
 1385:             }
 1386: 
 1387:             free(vecteur_complexe);
 1388: 
 1389:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1390:                     s_objet) == d_erreur)
 1391:             {
 1392:                 return;
 1393:             }
 1394: 
 1395:             instruction_multiplication(s_etat_processus);
 1396: 
 1397:             if (((*s_etat_processus).erreur_systeme != d_es) ||
 1398:                     ((*s_etat_processus).erreur_execution != d_ex) ||
 1399:                     ((*s_etat_processus).exception != d_ep))
 1400:             {
 1401:                 liberation(s_etat_processus, s_copie_argument);
 1402:                 liberation(s_etat_processus, s_matrice_identite);
 1403:                 free(tau);
 1404: 
 1405:                 if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1406:                 {
 1407:                     return;
 1408:                 }
 1409: 
 1410:                 (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1411:                 return;
 1412:             }
 1413: 
 1414:             instruction_moins(s_etat_processus);
 1415: 
 1416:             if (((*s_etat_processus).erreur_systeme != d_es) ||
 1417:                     ((*s_etat_processus).erreur_execution != d_ex) ||
 1418:                     ((*s_etat_processus).exception != d_ep))
 1419:             {
 1420:                 liberation(s_etat_processus, s_copie_argument);
 1421:                 liberation(s_etat_processus, s_matrice_identite);
 1422:                 free(tau);
 1423: 
 1424:                 if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1425:                 {
 1426:                     return;
 1427:                 }
 1428: 
 1429:                 (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1430:                 return;
 1431:             }
 1432: 
 1433:             instruction_trn(s_etat_processus);
 1434: 
 1435:             if (((*s_etat_processus).erreur_systeme != d_es) ||
 1436:                     ((*s_etat_processus).erreur_execution != d_ex) ||
 1437:                     ((*s_etat_processus).exception != d_ep))
 1438:             {
 1439:                 liberation(s_etat_processus, s_copie_argument);
 1440:                 liberation(s_etat_processus, s_matrice_identite);
 1441:                 free(tau);
 1442: 
 1443:                 if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1444:                 {
 1445:                     return;
 1446:                 }
 1447: 
 1448:                 (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1449:                 return;
 1450:             }
 1451: 
 1452:             if (i > 0)
 1453:             {
 1454:                 instruction_swap(s_etat_processus);
 1455: 
 1456:                 if (((*s_etat_processus).erreur_systeme != d_es) ||
 1457:                         ((*s_etat_processus).erreur_execution != d_ex) ||
 1458:                         ((*s_etat_processus).exception != d_ep))
 1459:                 {
 1460:                     liberation(s_etat_processus, s_copie_argument);
 1461:                     liberation(s_etat_processus, s_matrice_identite);
 1462:                     free(tau);
 1463: 
 1464:                     if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1465:                     {
 1466:                         return;
 1467:                     }
 1468: 
 1469:                     (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1470:                     return;
 1471:                 }
 1472: 
 1473:                 instruction_multiplication(s_etat_processus);
 1474: 
 1475:                 if (((*s_etat_processus).erreur_systeme != d_es) ||
 1476:                         ((*s_etat_processus).erreur_execution != d_ex) ||
 1477:                         ((*s_etat_processus).exception != d_ep))
 1478:                 {
 1479:                     liberation(s_etat_processus, s_copie_argument);
 1480:                     liberation(s_etat_processus, s_matrice_identite);
 1481:                     free(tau);
 1482: 
 1483:                     if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1484:                     {
 1485:                         return;
 1486:                     }
 1487: 
 1488:                     (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1489:                     return;
 1490:                 }
 1491:             }
 1492:         }
 1493: 
 1494:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1495:         {
 1496:             if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1497:             {
 1498:                 return;
 1499:             }
 1500: 
 1501:             (*s_etat_processus).l_base_pile_last = registre_pile_last;
 1502:         }
 1503: 
 1504:         liberation(s_etat_processus, s_matrice_identite);
 1505:         liberation(s_etat_processus, s_copie_argument);
 1506:         free(tau);
 1507:     }
 1508: 
 1509:     /*
 1510:      * Type d'argument invalide
 1511:      */
 1512: 
 1513:     else
 1514:     {
 1515:         liberation(s_etat_processus, s_objet_argument);
 1516: 
 1517:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1518:         return;
 1519:     }
 1520: 
 1521:     liberation(s_etat_processus, s_objet_argument);
 1522: 
 1523:     return;
 1524: }
 1525: 
 1526: 
 1527: /*
 1528: ================================================================================
 1529:   Fonction 'localization'
 1530: ================================================================================
 1531:   Entrées : pointeur sur une structure struct_processus
 1532: --------------------------------------------------------------------------------
 1533:   Sorties :
 1534: --------------------------------------------------------------------------------
 1535:   Effets de bord : néant
 1536: ================================================================================
 1537: */
 1538: 
 1539: void
 1540: instruction_localization(struct_processus *s_etat_processus)
 1541: {
 1542:     struct_objet            *s_objet_argument;
 1543: 
 1544:     (*s_etat_processus).erreur_execution = d_ex;
 1545: 
 1546:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1547:     {
 1548:         printf("\n  LOCALIZATION ");
 1549:         
 1550:         if ((*s_etat_processus).langue == 'F')
 1551:         {
 1552:             printf("(spécifie les variables de localisation)\n\n");
 1553:         }
 1554:         else
 1555:         {
 1556:             printf("(set locales)\n\n");
 1557:         }
 1558: 
 1559:         printf("    1: %s\n", d_CHN);
 1560:         return;
 1561:     }
 1562:     else if ((*s_etat_processus).test_instruction == 'Y')
 1563:     {
 1564:         (*s_etat_processus).nombre_arguments = -1;
 1565:         return;
 1566:     }
 1567: 
 1568:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1569:     {
 1570:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1571:         {
 1572:             return;
 1573:         }
 1574:     }
 1575: 
 1576:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1577:             &s_objet_argument) == d_erreur)
 1578:     {
 1579:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1580:         return;
 1581:     }
 1582: 
 1583:     if ((*s_objet_argument).type == CHN)
 1584:     {
 1585:         if (setlocale(LC_ALL, (unsigned char *) (*s_objet_argument).objet)
 1586:                 == NULL)
 1587:         {
 1588:             liberation(s_etat_processus, s_objet_argument);
 1589: 
 1590:             (*s_etat_processus).erreur_execution = d_ex_locales;
 1591:             return;
 1592:         }
 1593:     }
 1594:     else
 1595:     {
 1596:         liberation(s_etat_processus, s_objet_argument);
 1597: 
 1598:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1599:         return;
 1600:     }
 1601: 
 1602:     liberation(s_etat_processus, s_objet_argument);
 1603: 
 1604:     return;
 1605: }
 1606: 
 1607: 
 1608: /*
 1609: ================================================================================
 1610:   Fonction 'lcase'
 1611: ================================================================================
 1612:   Entrées : pointeur sur une structure struct_processus
 1613: --------------------------------------------------------------------------------
 1614:   Sorties :
 1615: --------------------------------------------------------------------------------
 1616:   Effets de bord : néant
 1617: ================================================================================
 1618: */
 1619: 
 1620: void
 1621: instruction_lcase(struct_processus *s_etat_processus)
 1622: {
 1623:     struct_objet            *s_objet_argument;
 1624:     struct_objet            *s_objet_resultat;
 1625: 
 1626:     (*s_etat_processus).erreur_execution = d_ex;
 1627: 
 1628:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1629:     {
 1630:         printf("\n  LCASE ");
 1631:         
 1632:         if ((*s_etat_processus).langue == 'F')
 1633:         {
 1634:             printf("(conversion d'une chaîne de caractères en minuscules)\n\n");
 1635:         }
 1636:         else
 1637:         {
 1638:             printf("(convert string to lower case)\n\n");
 1639:         }
 1640: 
 1641:         printf("    1: %s\n", d_CHN);
 1642:         printf("->  1: %s\n", d_CHN);
 1643:         return;
 1644:     }
 1645:     else if ((*s_etat_processus).test_instruction == 'Y')
 1646:     {
 1647:         (*s_etat_processus).nombre_arguments = -1;
 1648:         return;
 1649:     }
 1650: 
 1651:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1652:     {
 1653:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1654:         {
 1655:             return;
 1656:         }
 1657:     }
 1658: 
 1659:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1660:             &s_objet_argument) == d_erreur)
 1661:     {
 1662:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1663:         return;
 1664:     }
 1665: 
 1666:     if ((*s_objet_argument).type == CHN)
 1667:     {
 1668:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1669:                 s_objet_argument, 'O')) == NULL)
 1670:         {
 1671:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1672:             return;
 1673:         }
 1674: 
 1675:         liberation(s_etat_processus, s_objet_argument);
 1676:         conversion_chaine(s_etat_processus, (unsigned char *)
 1677:                 (*s_objet_resultat).objet, 'm');
 1678: 
 1679:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1680:                 s_objet_resultat) == d_erreur)
 1681:         {
 1682:             return;
 1683:         }
 1684:     }
 1685:     else
 1686:     {
 1687:         liberation(s_etat_processus, s_objet_argument);
 1688: 
 1689:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1690:         return;
 1691:     }
 1692: 
 1693:     return;
 1694: }
 1695: 
 1696: 
 1697: /*
 1698: ================================================================================
 1699:   Fonction 'l->t'
 1700: ================================================================================
 1701:   Entrées : pointeur sur une structure struct_processus
 1702: --------------------------------------------------------------------------------
 1703:   Sorties :
 1704: --------------------------------------------------------------------------------
 1705:   Effets de bord : néant
 1706: ================================================================================
 1707: */
 1708: 
 1709: void
 1710: instruction_l_vers_t(struct_processus *s_etat_processus)
 1711: {
 1712:     logical1                last;
 1713: 
 1714:     (*s_etat_processus).erreur_execution = d_ex;
 1715: 
 1716:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1717:     {
 1718:         printf("\n  L->T ");
 1719:         
 1720:         if ((*s_etat_processus).langue == 'F')
 1721:         {
 1722:             printf("(converison d'une liste en table)\n\n");
 1723:         }
 1724:         else
 1725:         {
 1726:             printf("(convert list to table)\n\n");
 1727:         }
 1728: 
 1729:         printf("    1: %s\n", d_LST);
 1730:         printf("->  1: %s\n", d_TAB);
 1731:         return;
 1732:     }
 1733:     else if ((*s_etat_processus).test_instruction == 'Y')
 1734:     {
 1735:         (*s_etat_processus).nombre_arguments = -1;
 1736:         return;
 1737:     }
 1738: 
 1739:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1740:     {
 1741:         last = d_vrai;
 1742:         cf(s_etat_processus, 31);
 1743: 
 1744:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1745:         {
 1746:             return;
 1747:         }
 1748:     }
 1749:     else
 1750:     {
 1751:         last = d_faux;
 1752:     }
 1753: 
 1754:     instruction_list_fleche(s_etat_processus);
 1755: 
 1756:     if (((*s_etat_processus).erreur_systeme == d_es) &&
 1757:             ((*s_etat_processus).erreur_execution == d_ex))
 1758:     {
 1759:         instruction_fleche_table(s_etat_processus);
 1760:     }
 1761: 
 1762:     if (last == d_vrai)
 1763:     {
 1764:         sf(s_etat_processus, 31);
 1765:     }
 1766: 
 1767:     return;
 1768: }
 1769: 
 1770: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>