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

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.32
    4:   Copyright (C) 1989-2020 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'xroot'
   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_xroot(struct_processus *s_etat_processus)
   40: {
   41:     real8                       argument;
   42:     real8                       module;
   43: 
   44:     struct_liste_chainee        *l_element_courant;
   45:     struct_liste_chainee        *l_element_precedent;
   46: 
   47:     struct_objet                *s_copie_argument_1;
   48:     struct_objet                *s_copie_argument_2;
   49:     struct_objet                *s_objet_argument_1;
   50:     struct_objet                *s_objet_argument_2;
   51:     struct_objet                *s_objet_resultat;
   52: 
   53:     unsigned long               nombre_elements;
   54: 
   55:     (*s_etat_processus).erreur_execution = d_ex;
   56: 
   57:     if ((*s_etat_processus).affichage_arguments == 'Y')
   58:     {
   59:         printf("\n  XROOT ");
   60: 
   61:         if ((*s_etat_processus).langue == 'F')
   62:         {
   63:             printf("(racine n-ième)\n\n");
   64:         }
   65:         else
   66:         {
   67:             printf("(Nth root)\n\n");
   68:         }
   69: 
   70:         printf("    2: %s, %s, %s\n", d_INT, d_REL, d_CPL);
   71:         printf("    1: %s\n", d_INT);
   72:         printf("->  1: %s, %s\n\n", d_REL, d_CPL);
   73: 
   74:         printf("    2: %s, %s, %s, %s, %s, %s\n",
   75:                 d_INT, d_REL, d_CPL, d_NOM, d_ALG, d_RPN);
   76:         printf("    1: %s, %s, %s, %s, %s, %s\n",
   77:                 d_INT, d_REL, d_CPL, d_NOM, d_ALG, d_RPN);
   78:         printf("->  1: %s, %s\n", d_ALG, d_RPN);
   79: 
   80:         return;
   81:     }
   82:     else if ((*s_etat_processus).test_instruction == 'Y')
   83:     {
   84:         (*s_etat_processus).nombre_arguments = 2;
   85:         return;
   86:     }
   87: 
   88:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   89:     {
   90:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
   91:         {
   92:             return;
   93:         }
   94:     }
   95: 
   96:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
   97:             &s_objet_argument_1) == d_erreur)
   98:     {
   99:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  100:         return;
  101:     }
  102: 
  103:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  104:             &s_objet_argument_2) == d_erreur)
  105:     {
  106:         liberation(s_etat_processus, s_objet_argument_1);
  107: 
  108:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  109:         return;
  110:     }
  111: 
  112: /*
  113: --------------------------------------------------------------------------------
  114:   Racines n-ièmes de scalaires
  115: --------------------------------------------------------------------------------
  116: */
  117: 
  118:     if (((*s_objet_argument_1).type == INT) &&
  119:             ((*s_objet_argument_2).type == INT))
  120:     {
  121:         if ((*((integer8 *) (*s_objet_argument_1).objet)) <= 0)
  122:         {
  123:             liberation(s_etat_processus, s_objet_argument_1);
  124:             liberation(s_etat_processus, s_objet_argument_2);
  125: 
  126:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  127:             return;
  128:         }
  129: 
  130:         if (((*((integer8 *) (*s_objet_argument_2).objet)) < 0) &&
  131:                 (((*((integer8 *) (*s_objet_argument_1).objet)) % 2) == 0))
  132:         {
  133:             /*
  134:              * Résultat Y^(1/X) complexe si X impair et Y négatif
  135:              */
  136: 
  137:             if ((s_objet_resultat = allocation(s_etat_processus, CPL))
  138:                     == NULL)
  139:             {
  140:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  141:                 return;
  142:             }
  143: 
  144:             module = abs((real8) (*((integer8 *) (*s_objet_argument_2).objet)));
  145:             argument = ((*((integer8 *) (*s_objet_argument_2).objet)) >= 0)
  146:                     ? 0 : (4 * atan((double) 1));
  147: 
  148:             argument /= ((double) (*((integer8 *) (*s_objet_argument_1)
  149:                     .objet)));
  150:             module = pow(module, ((double) 1) / ((double) (*((integer8 *)
  151:                     (*s_objet_argument_1).objet))));
  152: 
  153:             (*((complex16 *) (*s_objet_resultat).objet)).partie_reelle =
  154:                     module * cos(argument);
  155:             (*((complex16 *) (*s_objet_resultat).objet)).partie_imaginaire =
  156:                     module * sin(argument);
  157:         }
  158:         else
  159:         {
  160:             /*
  161:              * Résultat réel
  162:              */
  163: 
  164:             if ((s_objet_resultat = allocation(s_etat_processus, REL))
  165:                     == NULL)
  166:             {
  167:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  168:                 return;
  169:             }
  170: 
  171:             if ((*((integer8 *) (*s_objet_argument_2).objet)) >= 0)
  172:             {
  173:                 (*((real8 *) (*s_objet_resultat).objet)) = pow(((double)
  174:                         (*((integer8 *) (*s_objet_argument_2).objet))),
  175:                         ((double) 1) / ((double) (*((integer8 *)
  176:                         (*s_objet_argument_1).objet))));
  177:             }
  178:             else
  179:             {
  180:                 (*((real8 *) (*s_objet_resultat).objet)) = -pow(((double)
  181:                         -(*((integer8 *) (*s_objet_argument_2).objet))),
  182:                         ((double) 1) / ((double) (*((integer8 *)
  183:                         (*s_objet_argument_1).objet))));
  184:             }
  185:         }
  186:     }
  187:     else if (((*s_objet_argument_1).type == INT) &&
  188:             ((*s_objet_argument_2).type == REL))
  189:     {
  190:         if ((*((integer8 *) (*s_objet_argument_1).objet)) <= 0)
  191:         {
  192:             liberation(s_etat_processus, s_objet_argument_1);
  193:             liberation(s_etat_processus, s_objet_argument_2);
  194: 
  195:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  196:             return;
  197:         }
  198: 
  199:         if (((*((real8 *) (*s_objet_argument_2).objet)) < 0) &&
  200:                 (((*((integer8 *) (*s_objet_argument_1).objet)) % 2) == 0))
  201:         {
  202:             /*
  203:              * Résultat Y^(1/X) complexe si X impair et Y négatif
  204:              */
  205: 
  206:             if ((s_objet_resultat = allocation(s_etat_processus, CPL))
  207:                     == NULL)
  208:             {
  209:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  210:                 return;
  211:             }
  212: 
  213:             module = abs((*((real8 *) (*s_objet_argument_2).objet)));
  214:             argument = ((*((real8 *) (*s_objet_argument_2).objet)) >= 0)
  215:                     ? 0 : (4 * atan((double) 1));
  216: 
  217:             argument /= ((double) (*((integer8 *) (*s_objet_argument_1)
  218:                     .objet)));
  219:             module = pow(module, ((double) 1) / ((double) (*((integer8 *)
  220:                     (*s_objet_argument_1).objet))));
  221: 
  222:             (*((complex16 *) (*s_objet_resultat).objet)).partie_reelle =
  223:                     module * cos(argument);
  224:             (*((complex16 *) (*s_objet_resultat).objet)).partie_imaginaire =
  225:                     module * sin(argument);
  226:         }
  227:         else
  228:         {
  229:             /*
  230:              * Résultat réel
  231:              */
  232: 
  233:             if ((s_objet_resultat = allocation(s_etat_processus, REL))
  234:                     == NULL)
  235:             {
  236:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  237:                 return;
  238:             }
  239: 
  240:             if ((*((real8 *) (*s_objet_argument_2).objet)) >= 0)
  241:             {
  242:                 (*((real8 *) (*s_objet_resultat).objet)) = pow(
  243:                         (*((real8 *) (*s_objet_argument_2).objet)),
  244:                         ((double) 1) / ((double) (*((integer8 *)
  245:                         (*s_objet_argument_1).objet))));
  246:             }
  247:             else
  248:             {
  249:                 (*((real8 *) (*s_objet_resultat).objet)) = -pow(
  250:                         -(*((real8 *) (*s_objet_argument_2).objet)),
  251:                         ((double) 1) / ((double) (*((integer8 *)
  252:                         (*s_objet_argument_1).objet))));
  253:             }
  254:         }
  255:     }
  256:     else if (((*s_objet_argument_1).type == INT) &&
  257:             ((*s_objet_argument_2).type == CPL))
  258:     {
  259:         if ((*((integer8 *) (*s_objet_argument_1).objet)) <= 0)
  260:         {
  261:             liberation(s_etat_processus, s_objet_argument_1);
  262:             liberation(s_etat_processus, s_objet_argument_2);
  263: 
  264:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  265:             return;
  266:         }
  267: 
  268:         if ((s_objet_resultat = allocation(s_etat_processus, CPL))
  269:                 == NULL)
  270:         {
  271:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  272:             return;
  273:         }
  274: 
  275:         f77absc_(((struct_complexe16 *) (*s_objet_argument_2).objet), &module);
  276: 
  277:         argument = atan2((*((struct_complexe16 *) (*s_objet_argument_2).objet))
  278:                 .partie_imaginaire, (*((struct_complexe16 *)
  279:                 (*s_objet_argument_2).objet)).partie_reelle);
  280: 
  281:         argument /= ((double) (*((integer8 *) (*s_objet_argument_1).objet)));
  282:         module = pow(module, ((double) 1) / ((double) (*((integer8 *)
  283:                 (*s_objet_argument_1).objet))));
  284: 
  285:         (*((complex16 *) (*s_objet_resultat).objet)).partie_reelle =
  286:                 module * cos(argument);
  287:         (*((complex16 *) (*s_objet_resultat).objet)).partie_imaginaire =
  288:                 module * sin(argument);
  289:     }
  290: 
  291: /*
  292: --------------------------------------------------------------------------------
  293:   Résultat sous forme d'expression algébrique
  294: --------------------------------------------------------------------------------
  295: */
  296: 
  297:     else if ((((*s_objet_argument_2).type == NOM) &&
  298:             (((*s_objet_argument_1).type == NOM) ||
  299:             ((*s_objet_argument_1).type == INT))) ||
  300:             ((((*s_objet_argument_2).type == INT) ||
  301:             ((*s_objet_argument_2).type == REL) ||
  302:             ((*s_objet_argument_2).type == CPL)) &&
  303:             ((*s_objet_argument_1).type == NOM)))
  304:     {
  305:         if ((s_objet_resultat = allocation(s_etat_processus, ALG))
  306:                 == NULL)
  307:         {
  308:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  309:             return;
  310:         }
  311: 
  312:         if (((*s_objet_resultat).objet =
  313:                 allocation_maillon(s_etat_processus)) == NULL)
  314:         {
  315:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  316:             return;
  317:         }
  318: 
  319:         l_element_courant = (*s_objet_resultat).objet;
  320: 
  321:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  322:                 == NULL)
  323:         {
  324:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  325:             return;
  326:         }
  327: 
  328:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  329:                 .nombre_arguments = 2;
  330:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  331:                 .fonction = instruction_vers_niveau_superieur;
  332: 
  333:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  334:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  335:         {
  336:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  337:             return;
  338:         }
  339: 
  340:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  341:                 .nom_fonction, "<<");
  342: 
  343:         if (((*l_element_courant).suivant =
  344:                 allocation_maillon(s_etat_processus)) == NULL)
  345:         {
  346:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  347:             return;
  348:         }
  349: 
  350:         l_element_courant = (*l_element_courant).suivant;
  351:         (*l_element_courant).donnee = s_objet_argument_2;
  352: 
  353:         if (((*l_element_courant).suivant =
  354:                 allocation_maillon(s_etat_processus)) == NULL)
  355:         {
  356:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  357:             return;
  358:         }
  359: 
  360:         l_element_courant = (*l_element_courant).suivant;
  361:         (*l_element_courant).donnee = s_objet_argument_1;
  362: 
  363:         if (((*l_element_courant).suivant =
  364:                 allocation_maillon(s_etat_processus)) == NULL)
  365:         {
  366:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  367:             return;
  368:         }
  369: 
  370:         l_element_courant = (*l_element_courant).suivant;
  371: 
  372:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  373:                 == NULL)
  374:         {
  375:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  376:             return;
  377:         }
  378: 
  379:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  380:                 .nombre_arguments = 2;
  381:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  382:                 .fonction = instruction_xroot;
  383: 
  384:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  385:                 .nom_fonction = malloc(6 * sizeof(unsigned char))) == NULL)
  386:         {
  387:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  388:             return;
  389:         }
  390: 
  391:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  392:                 .nom_fonction, "XROOT");
  393: 
  394:         if (((*l_element_courant).suivant =
  395:                 allocation_maillon(s_etat_processus)) == NULL)
  396:         {
  397:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  398:             return;
  399:         }
  400: 
  401:         l_element_courant = (*l_element_courant).suivant;
  402: 
  403:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  404:                 == NULL)
  405:         {
  406:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  407:             return;
  408:         }
  409: 
  410:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  411:                 .nombre_arguments = 2;
  412:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  413:                 .fonction = instruction_vers_niveau_inferieur;
  414: 
  415:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  416:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  417:         {
  418:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  419:             return;
  420:         }
  421: 
  422:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  423:                 .nom_fonction, ">>");
  424: 
  425:         (*l_element_courant).suivant = NULL;
  426: 
  427:         s_objet_argument_1 = NULL;
  428:         s_objet_argument_2 = NULL;
  429:     }
  430: 
  431:     /*
  432:      * Expression / Nom ou valeur numérique
  433:      */
  434: 
  435:     else if ((((*s_objet_argument_1).type == ALG) ||
  436:             ((*s_objet_argument_1).type == RPN)) &&
  437:             (((*s_objet_argument_2).type == NOM) ||
  438:             ((*s_objet_argument_2).type == INT) ||
  439:             ((*s_objet_argument_2).type == REL) ||
  440:             ((*s_objet_argument_2).type == CPL)))
  441:     {
  442:         nombre_elements = 0;
  443:         l_element_courant = (struct_liste_chainee *)
  444:                 (*s_objet_argument_1).objet;
  445: 
  446:         while(l_element_courant != NULL)
  447:         {
  448:             nombre_elements++;
  449:             l_element_courant = (*l_element_courant).suivant;
  450:         }
  451: 
  452:         if (nombre_elements == 2)
  453:         {
  454:             liberation(s_etat_processus, s_objet_argument_1);
  455:             liberation(s_etat_processus, s_objet_argument_2);
  456: 
  457:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  458:             return;
  459:         }
  460: 
  461:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  462:                 s_objet_argument_1, 'N')) == NULL)
  463:         {
  464:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  465:             return;
  466:         }
  467: 
  468:         l_element_courant = (struct_liste_chainee *)
  469:                 (*s_objet_resultat).objet;
  470:         l_element_precedent = l_element_courant;
  471:         l_element_courant = (*l_element_courant).suivant;
  472: 
  473:         if (((*l_element_precedent).suivant =
  474:                 allocation_maillon(s_etat_processus)) == NULL)
  475:         {
  476:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  477:             return;
  478:         }
  479: 
  480:         (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
  481:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
  482: 
  483:         while((*l_element_courant).suivant != NULL)
  484:         {
  485:             l_element_precedent = l_element_courant;
  486:             l_element_courant = (*l_element_courant).suivant;
  487:         }
  488: 
  489:         if (((*l_element_precedent).suivant =
  490:                 allocation_maillon(s_etat_processus)) == NULL)
  491:         {
  492:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  493:             return;
  494:         }
  495: 
  496:         if (((*(*l_element_precedent).suivant).donnee =
  497:                 allocation(s_etat_processus, FCT)) == NULL)
  498:         {
  499:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  500:             return;
  501:         }
  502: 
  503:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
  504:                 .donnee).objet)).nombre_arguments = 2;
  505:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
  506:                 .donnee).objet)).fonction = instruction_xroot;
  507: 
  508:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
  509:                 .suivant).donnee).objet)).nom_fonction =
  510:                 malloc(6 * sizeof(unsigned char))) == NULL)
  511:         {
  512:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  513:             return;
  514:         }
  515: 
  516:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
  517:                 .suivant).donnee).objet)).nom_fonction, "XROOT");
  518: 
  519:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
  520: 
  521:         s_objet_argument_2 = NULL;
  522:     }
  523: 
  524:     /*
  525:      * Expression / Nom ou valeur numérique
  526:      */
  527: 
  528:     else if ((((*s_objet_argument_1).type == NOM) ||
  529:             ((*s_objet_argument_1).type == INT)) &&
  530:             (((*s_objet_argument_2).type == ALG) ||
  531:             ((*s_objet_argument_2).type == RPN)))
  532:     {
  533:         nombre_elements = 0;
  534:         l_element_courant = (struct_liste_chainee *)
  535:                 (*s_objet_argument_2).objet;
  536: 
  537:         while(l_element_courant != NULL)
  538:         {
  539:             nombre_elements++;
  540:             l_element_courant = (*l_element_courant).suivant;
  541:         }
  542: 
  543:         if (nombre_elements == 2)
  544:         {
  545:             liberation(s_etat_processus, s_objet_argument_1);
  546:             liberation(s_etat_processus, s_objet_argument_2);
  547: 
  548:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  549:             return;
  550:         }
  551: 
  552:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  553:                 s_objet_argument_2, 'N')) == NULL)
  554:         {
  555:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  556:             return;
  557:         }
  558: 
  559:         l_element_courant = (struct_liste_chainee *)
  560:                 (*s_objet_resultat).objet;
  561:         l_element_precedent = l_element_courant;
  562: 
  563:         while((*l_element_courant).suivant != NULL)
  564:         {
  565:             l_element_precedent = l_element_courant;
  566:             l_element_courant = (*l_element_courant).suivant;
  567:         }
  568: 
  569:         if (((*l_element_precedent).suivant =
  570:                 allocation_maillon(s_etat_processus)) == NULL)
  571:         {
  572:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  573:             return;
  574:         }
  575: 
  576:         (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
  577:         l_element_precedent = (*l_element_precedent).suivant;
  578: 
  579:         if (((*l_element_precedent).suivant =
  580:                 allocation_maillon(s_etat_processus)) == NULL)
  581:         {
  582:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  583:             return;
  584:         }
  585: 
  586:         if (((*(*l_element_precedent).suivant).donnee =
  587:                 allocation(s_etat_processus, FCT)) == NULL)
  588:         {
  589:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  590:             return;
  591:         }
  592: 
  593:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
  594:                 .donnee).objet)).nombre_arguments = 2;
  595:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
  596:                 .donnee).objet)).fonction = instruction_xroot;
  597: 
  598:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
  599:                 .suivant).donnee).objet)).nom_fonction =
  600:                 malloc(6 * sizeof(unsigned char))) == NULL)
  601:         {
  602:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  603:             return;
  604:         }
  605: 
  606:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
  607:                 .suivant).donnee).objet)).nom_fonction, "XROOT");
  608: 
  609:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
  610: 
  611:         s_objet_argument_1 = NULL;
  612:     }
  613: 
  614:     /*
  615:      * Expression / Expression
  616:      */
  617: 
  618:     else if ((((*s_objet_argument_1).type == ALG) &&
  619:             ((*s_objet_argument_2).type == ALG)) ||
  620:             (((*s_objet_argument_1).type == RPN) &&
  621:             ((*s_objet_argument_2).type == RPN)))
  622:     {
  623:         nombre_elements = 0;
  624:         l_element_courant = (struct_liste_chainee *)
  625:                 (*s_objet_argument_1).objet;
  626: 
  627:         while(l_element_courant != NULL)
  628:         {
  629:             nombre_elements++;
  630:             l_element_courant = (*l_element_courant).suivant;
  631:         }
  632: 
  633:         if (nombre_elements == 2)
  634:         {
  635:             liberation(s_etat_processus, s_objet_argument_1);
  636:             liberation(s_etat_processus, s_objet_argument_2);
  637: 
  638:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  639:             return;
  640:         }
  641: 
  642:         nombre_elements = 0;
  643:         l_element_courant = (struct_liste_chainee *)
  644:                 (*s_objet_argument_2).objet;
  645: 
  646:         while(l_element_courant != NULL)
  647:         {
  648:             nombre_elements++;
  649:             l_element_courant = (*l_element_courant).suivant;
  650:         }
  651: 
  652:         if (nombre_elements == 2)
  653:         {
  654:             liberation(s_etat_processus, s_objet_argument_1);
  655:             liberation(s_etat_processus, s_objet_argument_2);
  656: 
  657:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  658:             return;
  659:         }
  660: 
  661:         if ((s_copie_argument_1 = copie_objet(s_etat_processus,
  662:                 s_objet_argument_1, 'N')) == NULL)
  663:         {
  664:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  665:             return;
  666:         }
  667: 
  668:         if ((s_copie_argument_2 = copie_objet(s_etat_processus,
  669:                 s_objet_argument_2, 'N')) == NULL)
  670:         {
  671:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  672:             return;
  673:         }
  674: 
  675:         l_element_courant = (struct_liste_chainee *)
  676:                 (*s_copie_argument_1).objet;
  677:         (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
  678:                 (*s_copie_argument_1).objet)).suivant;
  679: 
  680:         liberation(s_etat_processus, (*l_element_courant).donnee);
  681:         free(l_element_courant);
  682: 
  683:         l_element_courant = (struct_liste_chainee *)
  684:                 (*s_copie_argument_2).objet;
  685:         l_element_precedent = l_element_courant;
  686:         s_objet_resultat = s_copie_argument_2;
  687: 
  688:         while((*l_element_courant).suivant != NULL)
  689:         {
  690:             l_element_precedent = l_element_courant;
  691:             l_element_courant = (*l_element_courant).suivant;
  692:         }
  693: 
  694:         liberation(s_etat_processus, (*l_element_courant).donnee);
  695:         free(l_element_courant);
  696: 
  697:         (*l_element_precedent).suivant = (struct_liste_chainee *)
  698:                 (*s_copie_argument_1).objet;
  699:         free(s_copie_argument_1);
  700: 
  701:         l_element_courant = (*l_element_precedent).suivant;
  702:         while((*l_element_courant).suivant != NULL)
  703:         {
  704:             l_element_precedent = l_element_courant;
  705:             l_element_courant = (*l_element_courant).suivant;
  706:         }
  707: 
  708:         if (((*l_element_precedent).suivant =
  709:                 allocation_maillon(s_etat_processus)) == NULL)
  710:         {
  711:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  712:             return;
  713:         }
  714: 
  715:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
  716:         l_element_courant = (*l_element_precedent).suivant;
  717: 
  718:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  719:                 == NULL)
  720:         {
  721:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  722:             return;
  723:         }
  724: 
  725:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  726:                 .nombre_arguments = 2;
  727:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  728:                 .fonction = instruction_xroot;
  729: 
  730:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  731:                 .nom_fonction = malloc(6 * sizeof(unsigned char))) == NULL)
  732:         {
  733:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  734:             return;
  735:         }
  736: 
  737:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  738:                 .nom_fonction, "XROOT");
  739:     }
  740:     else
  741:     {
  742:         liberation(s_etat_processus, s_objet_argument_1);
  743:         liberation(s_etat_processus, s_objet_argument_2);
  744: 
  745:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  746:         return;
  747:     }
  748: 
  749:     liberation(s_etat_processus, s_objet_argument_1);
  750:     liberation(s_etat_processus, s_objet_argument_2);
  751: 
  752:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  753:             s_objet_resultat) == d_erreur)
  754:     {
  755:         return;
  756:     }
  757: 
  758:     return;
  759: }
  760: 
  761: 
  762: /*
  763: ================================================================================
  764:   Fonction 'xcol'
  765: ================================================================================
  766:   Entrées : pointeur sur une structure struct_processus
  767: --------------------------------------------------------------------------------
  768:   Sorties :
  769: --------------------------------------------------------------------------------
  770:   Effets de bord : néant
  771: ================================================================================
  772: */
  773: 
  774: void
  775: instruction_xcol(struct_processus *s_etat_processus)
  776: {
  777:     struct_objet            *s_objet_argument;
  778: 
  779:     (*s_etat_processus).erreur_execution = d_ex;
  780: 
  781:     if ((*s_etat_processus).affichage_arguments == 'Y')
  782:     {
  783:         printf("\n  XCOL ");
  784: 
  785:         if ((*s_etat_processus).langue == 'F')
  786:         {
  787:             printf("(définition de la colonne statistique X)\n\n");
  788:         }
  789:         else
  790:         {
  791:             printf("(definition of statistical X column)\n\n");
  792:         }
  793: 
  794:         printf("    1: %s\n", d_INT);
  795: 
  796:         return;
  797:     }
  798:     else if ((*s_etat_processus).test_instruction == 'Y')
  799:     {
  800:         (*s_etat_processus).nombre_arguments = -1;
  801:         return;
  802:     }
  803: 
  804:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  805:     {
  806:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  807:         {
  808:             return;
  809:         }
  810:     }
  811: 
  812:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  813:             &s_objet_argument) == d_erreur)
  814:     {
  815:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  816:         return;
  817:     }
  818: 
  819:     if ((*s_objet_argument).type == INT)
  820:     {
  821:         if ((*((integer8 *) (*s_objet_argument).objet)) <= 0)
  822:         {
  823:             liberation(s_etat_processus, s_objet_argument);
  824: 
  825:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  826:             return;
  827:         }
  828: 
  829:         (*s_etat_processus).colonne_statistique_1 =
  830:                 (*((integer8 *) (*s_objet_argument).objet));
  831:     }
  832:     else
  833:     {
  834:         liberation(s_etat_processus, s_objet_argument);
  835: 
  836:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  837:         return;
  838:     }
  839: 
  840:     liberation(s_etat_processus, s_objet_argument);
  841: 
  842:     return;
  843: }
  844: 
  845: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>