File:  [local] / rpl / src / interface_cas.cpp
Revision 1.64: download - view: text, annotated - select for diffs - revision graph
Thu Jan 16 08:57:42 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Correction d'un problème de compilation avec g++ 9.2 (cast dans rpl.h).

    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: #ifdef RPLCAS
   24: #   define RPLCXX
   25: 
   26: // Giac inclut <semaphore.h> et définit sem_t. Or l'émulation
   27: // des IPCS POSIX requiert une redéfinition de sem_t.
   28: 
   29: #   ifdef IPCS_SYSV
   30: //      NetBSD : _SEMAPHORE_H_
   31: #       define _SEMAPHORE_H_
   32: //      Linux : _SEMAPHORE_H
   33: #       define _SEMAPHORE_H
   34: #   endif
   35: 
   36: #   pragma GCC diagnostic push
   37: #   pragma GCC diagnostic ignored "-Wstrict-aliasing"
   38: #   pragma GCC diagnostic ignored "-Wunused-parameter"
   39: #   pragma GCC diagnostic ignored "-Wempty-body"
   40: #   pragma GCC diagnostic ignored "-Wunknown-pragmas"
   41: #   include "giacPCH.h"
   42: #   pragma GCC diagnostic pop
   43: 
   44: #   undef PACKAGE
   45: #   undef PACKAGE_NAME
   46: #   undef PACKAGE_STRING
   47: #   undef PACKAGE_TARNAME
   48: #   undef PACKAGE_VERSION
   49: #   undef VERSION
   50: #endif
   51: 
   52: extern "C"
   53: {
   54: #   define __RPLCAS
   55: #   include "rpl-conv.h"
   56: }
   57: 
   58: #include <iostream>
   59: 
   60: using namespace std;
   61: 
   62: #ifdef RPLCAS
   63:     using namespace giac;
   64: #endif
   65: 
   66: void
   67: initialisation_contexte_cas(struct_processus *s_etat_processus)
   68: {
   69:     s_etat_processus->contexte_cas = NULL;
   70:     return;
   71: }
   72: 
   73: void
   74: liberation_contexte_cas(struct_processus *s_etat_processus)
   75: {
   76:     if (s_etat_processus->contexte_cas != NULL)
   77:     {
   78: #       ifdef RPLCAS
   79:         delete reinterpret_cast<giac::context *>(
   80:                 s_etat_processus->contexte_cas);
   81: #       endif
   82:         s_etat_processus->contexte_cas = NULL;
   83:     }
   84: 
   85:     return;
   86: }
   87: 
   88: #ifdef RPLCAS
   89: static unsigned char *
   90: conversion_rpl_vers_cas(struct_processus *s_etat_processus,
   91:         struct_objet **s_objet)
   92: {
   93:     logical1                drapeau;
   94: 
   95:     struct_liste_chainee    *l_element_courant;
   96: 
   97:     struct_objet            *s_objet_temporaire;
   98: 
   99:     t_8_bits                registre[8];
  100: 
  101:     unsigned char           *resultat;
  102:     unsigned char           *index;
  103: 
  104:     for(int i = 0; i < 8; i++)
  105:     {
  106:         registre[i] = s_etat_processus->drapeaux_etat[i];
  107:     }
  108: 
  109:     sf(s_etat_processus, 35);
  110:     cf(s_etat_processus, 48);
  111:     cf(s_etat_processus, 49);
  112:     cf(s_etat_processus, 50);
  113:     cf(s_etat_processus, 53);
  114:     cf(s_etat_processus, 54);
  115:     cf(s_etat_processus, 55);
  116:     cf(s_etat_processus, 56);
  117: 
  118:     // GIAC considère que les fonctions sont écrites en minuscules. Le RPL/2
  119:     // part de l'hypothèse inverse. Il faut donc convertir en minuscules tous
  120:     // les noms de fonction. Les fonctions ne peuvent apparaître que dans le
  121:     // cas d'un objet de type ALG.
  122: 
  123:     if ((*s_objet)->type == NOM)
  124:     {
  125:         if (strcmp((const char *) reinterpret_cast<unsigned char *>(
  126:                 reinterpret_cast<struct_nom *>((*s_objet)->objet)->nom),
  127:                 "infinity") == 0)
  128:         {
  129:             if (evaluation(s_etat_processus, *s_objet, 'N') == d_erreur)
  130:             {
  131:                 return(NULL);
  132:             }
  133: 
  134:             liberation(s_etat_processus, *s_objet);
  135: 
  136:             if (depilement(s_etat_processus, &(s_etat_processus
  137:                     ->l_base_pile), s_objet) == d_erreur)
  138:             {
  139:                 return(NULL);
  140:             }
  141:         }
  142:     }
  143:     else if ((*s_objet)->type == ALG)
  144:     {
  145:         if ((s_objet_temporaire = copie_objet(s_etat_processus,
  146:                 (*s_objet), 'O')) == NULL)
  147:         {
  148:             s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  149:             return(NULL);
  150:         }
  151: 
  152:         liberation(s_etat_processus, (*s_objet));
  153:         (*s_objet) = s_objet_temporaire;
  154: 
  155:         // Si l'expression contient la fonction infinity, on commence par
  156:         // forcer une évaluation numérique.
  157: 
  158:         l_element_courant = reinterpret_cast<struct_liste_chainee *>(
  159:                 (*s_objet)->objet);
  160:         drapeau = d_faux;
  161: 
  162:         while(l_element_courant != NULL)
  163:         {
  164:             if (l_element_courant->donnee->type == NOM)
  165:             {
  166:                 if (strcmp((const char *) reinterpret_cast<unsigned char *>(
  167:                         reinterpret_cast<struct_nom *>(
  168:                         l_element_courant->donnee->objet)->nom),
  169:                         "infinity") == 0)
  170:                 {
  171:                     drapeau = d_vrai;
  172:                     break;
  173:                 }
  174:             }
  175: 
  176:             l_element_courant = l_element_courant->suivant;
  177:         }
  178: 
  179:         if (drapeau == d_vrai)
  180:         {
  181:             if (evaluation(s_etat_processus, *s_objet, 'N') == d_erreur)
  182:             {
  183:                 return(NULL);
  184:             }
  185: 
  186:             liberation(s_etat_processus, *s_objet);
  187: 
  188:             if (depilement(s_etat_processus, &(s_etat_processus
  189:                     ->l_base_pile), s_objet) == d_erreur)
  190:             {
  191:                 return(NULL);
  192:             }
  193:         }
  194:     }
  195: 
  196:     if ((*s_objet)->type == ALG)
  197:     {
  198: 
  199:         l_element_courant = reinterpret_cast<struct_liste_chainee *>(
  200:                 (*s_objet)->objet);
  201: 
  202:         while(l_element_courant != NULL)
  203:         {
  204:             if (l_element_courant->donnee->type == FCT)
  205:             {
  206:                 unsigned char       *ptr;
  207: 
  208:                 ptr = reinterpret_cast<unsigned char *>(
  209:                         reinterpret_cast<struct_fonction *>(
  210:                         l_element_courant->donnee->objet)->nom_fonction);
  211: 
  212:                 while((*ptr) != d_code_fin_chaine)
  213:                 {
  214:                     int c = (*ptr);
  215: 
  216:                     if (isalpha(c))
  217:                     {
  218:                         c = tolower(c);
  219:                         (*ptr) = (unsigned char) c;
  220:                     }
  221: 
  222:                     ptr++;
  223:                 }
  224:             }
  225: 
  226:             l_element_courant = l_element_courant->suivant;
  227:         }
  228:     }
  229: 
  230:     resultat = formateur(s_etat_processus, 0, (*s_objet));
  231: 
  232:     // Il faut remplacer les occurrences de 'relax' par '    +'.
  233: 
  234:     index = resultat;
  235:     while((index = reinterpret_cast<unsigned char *>(
  236:             strstr(reinterpret_cast<char *>(index),
  237:             (const char *) "relax"))) != NULL)
  238:     {
  239:         memcpy(reinterpret_cast<char *>(index), "    +", 5);
  240:     }
  241: 
  242:     // Si le résultat vaut infinity, on rajoute le signe +.
  243: 
  244:     if (strcmp(reinterpret_cast<char *>(resultat), "infinity") == 0)
  245:     {
  246:         if ((resultat = reinterpret_cast<unsigned char *>(
  247:                 realloc(resultat, (strlen(reinterpret_cast<char *>(
  248:                 resultat)) + 2) * sizeof(unsigned char)))) == NULL)
  249:         {
  250:             s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  251:             return(NULL);
  252:         }
  253: 
  254:         strcpy(reinterpret_cast<char *>(resultat), "+infinity");
  255:     }
  256: 
  257:     if (resultat[0] == '\'')
  258:     {
  259:         resultat[0] = ' ';
  260:         resultat[strlen((const char *) resultat) - 1] = ' ';
  261:     }
  262: 
  263:     for(int i = 0; i < 8; i++)
  264:     {
  265:         s_etat_processus->drapeaux_etat[i] = registre[i];
  266:     }
  267: 
  268:     return(resultat);
  269: }
  270: 
  271: 
  272: static void
  273: conversion_cas_vers_rpl(struct_processus *s_etat_processus,
  274:         unsigned char *expression)
  275: {
  276:     logical1                    drapeau;
  277: 
  278:     struct_liste_chainee        *l_element_courant;
  279: 
  280:     struct_objet                *s_objet;
  281: 
  282:     unsigned char               *registre;
  283: 
  284:     registre = s_etat_processus->instruction_courante;
  285:     s_etat_processus->instruction_courante = expression;
  286:     recherche_type(s_etat_processus);
  287:     s_etat_processus->instruction_courante = registre;
  288: 
  289:     if ((s_etat_processus->l_base_pile == NULL) ||
  290:             (s_etat_processus->erreur_execution != d_ex) ||
  291:             (s_etat_processus->erreur_systeme != d_es))
  292:     {
  293:         return;
  294:     }
  295: 
  296:     // Le niveau 1 de la pile opérationnelle contient l'expression
  297:     // à convertir.
  298: 
  299:     if (depilement(s_etat_processus, &(s_etat_processus
  300:             ->l_base_pile), &s_objet) == d_erreur)
  301:     {
  302:         return;
  303:     }
  304: 
  305:     if ((s_objet->type == ALG) || (s_objet->type == RPN))
  306:     {
  307:         // On transcrit les fonctions de GIAC vers le RPL/2.
  308: 
  309:         l_element_courant = reinterpret_cast<struct_liste_chainee *>(
  310:                 s_objet->objet);
  311:         drapeau = d_faux;
  312: 
  313:         // S'il y a une valeur infini, on force l'évaluation de l'expression.
  314: 
  315:         while(l_element_courant != NULL)
  316:         {
  317:             if (l_element_courant->donnee->type == NOM)
  318:             {
  319:                 if (strcmp((const char *) reinterpret_cast<unsigned char *>(
  320:                         reinterpret_cast<struct_nom *>(
  321:                         l_element_courant->donnee->objet)->nom),
  322:                         "infinity") == 0)
  323:                 {
  324:                     drapeau = d_vrai;
  325:                     break;
  326:                 }
  327:             }
  328: 
  329:             l_element_courant = l_element_courant->suivant;
  330:         }
  331: 
  332:         if (drapeau == d_vrai)
  333:         {
  334:             if (evaluation(s_etat_processus, s_objet, 'N') == d_erreur)
  335:             {
  336:                 return;
  337:             }
  338: 
  339:             liberation(s_etat_processus, s_objet);
  340: 
  341:             if (depilement(s_etat_processus, &(s_etat_processus
  342:                     ->l_base_pile), &s_objet) == d_erreur)
  343:             {
  344:                 return;
  345:             }
  346:         }
  347:     }
  348: 
  349:     if ((s_objet->type == ALG) || (s_objet->type == RPN))
  350:     {
  351:         l_element_courant = reinterpret_cast<struct_liste_chainee *>(
  352:                 s_objet->objet);
  353: 
  354:         while(l_element_courant != NULL)
  355:         {
  356:             if (l_element_courant->donnee->type == FCT)
  357:             {
  358:                 // Nous sommes en présence d'un nom, donc de quelque chose
  359:                 // qui n'est pas reconnu comme un mot-clef du RPL/2. S'il
  360:                 // s'agit d'un mot-clef de GIAC, on le convertit.
  361: 
  362:                 if ((strcmp((const char *)
  363:                         reinterpret_cast<struct_fonction *>(l_element_courant
  364:                         ->donnee->objet)->nom_fonction, "quote") == 0) ||
  365:                         (strcmp((const char *)
  366:                         reinterpret_cast<struct_fonction *>(l_element_courant
  367:                         ->donnee->objet)->nom_fonction, "nop") == 0))
  368:                 {
  369:                     liberation(s_etat_processus, l_element_courant->donnee);
  370: 
  371:                     if ((l_element_courant->donnee =
  372:                             allocation(s_etat_processus, FCT)) == NULL)
  373:                     {
  374:                         s_etat_processus->erreur_systeme =
  375:                                 d_es_allocation_memoire;
  376:                         return;
  377:                     }
  378: 
  379:                     if ((((struct_fonction *) l_element_courant->donnee->objet)
  380:                             ->nom_fonction = reinterpret_cast<unsigned char *>(
  381:                             malloc(6 * sizeof(unsigned char))))
  382:                             == NULL)
  383:                     {
  384:                         s_etat_processus->erreur_systeme =
  385:                                 d_es_allocation_memoire;
  386:                         return;
  387:                     }
  388: 
  389:                     strcpy(reinterpret_cast<char *>(
  390:                             reinterpret_cast<struct_fonction *>(
  391:                             l_element_courant->donnee->objet)->nom_fonction),
  392:                             "RELAX");
  393:                 }
  394:             }
  395: 
  396:             l_element_courant = l_element_courant->suivant;
  397:         }
  398:     }
  399: 
  400:     if (empilement(s_etat_processus, &(s_etat_processus->l_base_pile),
  401:             s_objet) == d_erreur)
  402:     {
  403:         return;
  404:     }
  405: 
  406:     return;
  407: }
  408: #endif
  409: 
  410: 
  411: /*
  412: ================================================================================
  413:   Fonction 'interface_cas'
  414: ================================================================================
  415:   Entrées : commande à effectuer.
  416:   Le contrôle des types est effectué dans la fonction appelant interface_cas().
  417: --------------------------------------------------------------------------------
  418:   Sorties : retour par la pile.
  419: --------------------------------------------------------------------------------
  420:   Effets de bord : néant
  421: ================================================================================
  422: */
  423: 
  424: #pragma GCC diagnostic push
  425: #pragma GCC diagnostic ignored "-Wunused-parameter"
  426: void
  427: interface_cas(struct_processus *s_etat_processus,
  428:         enum t_rplcas_commandes commande)
  429: {
  430: #ifdef RPLCAS
  431:     struct_objet            *s_objet_argument_1;
  432:     struct_objet            *s_objet_argument_2;
  433:     struct_objet            *s_objet_temporaire;
  434: 
  435:     struct_liste_chainee    *l_element_courant;
  436: 
  437:     unsigned char           *argument_1;
  438:     unsigned char           *argument_2;
  439:     unsigned char           *argument_3;
  440:     unsigned char           *argument_4;
  441: 
  442:     unsigned int            position;
  443: 
  444:     giac::context           *contexte;
  445: 
  446:     if (s_etat_processus->contexte_cas == NULL)
  447:     {
  448:         try
  449:         {
  450:             s_etat_processus->contexte_cas = new giac::context;
  451:         }
  452:         catch(bad_alloc &exception)
  453:         {
  454:             s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  455:             return;
  456:         }
  457:         catch(...)
  458:         {
  459:             s_etat_processus->erreur_execution = d_ex_erreur_interne_rplcas;
  460:             return;
  461:         }
  462:     }
  463: 
  464:     contexte = reinterpret_cast<giac::context *>(
  465:             s_etat_processus->contexte_cas);
  466: 
  467:     if ((s_etat_processus->erreur_execution != d_ex) ||
  468:             (s_etat_processus->erreur_systeme != d_es))
  469:     {
  470:         return;
  471:     }
  472: 
  473:     switch(commande)
  474:     {
  475:         case RPLCAS_INTEGRATION:
  476:         {
  477:             if (depilement(s_etat_processus, &(s_etat_processus->l_base_pile),
  478:                     &s_objet_argument_1) == d_erreur)
  479:             {
  480:                 s_etat_processus->erreur_execution = d_ex_manque_argument;
  481:                 return;
  482:             }
  483: 
  484:             if (depilement(s_etat_processus, &(s_etat_processus->l_base_pile),
  485:                     &s_objet_argument_2) == d_erreur)
  486:             {
  487:                 liberation(s_etat_processus, s_objet_argument_1);
  488:                 s_etat_processus->erreur_execution = d_ex_manque_argument;
  489:                 return;
  490:             }
  491: 
  492:             if ((argument_1 = conversion_rpl_vers_cas(s_etat_processus,
  493:                     &s_objet_argument_1)) == NULL)
  494:             {
  495:                 s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  496:                 return;
  497:             }
  498: 
  499:             if ((argument_2 = conversion_rpl_vers_cas(s_etat_processus,
  500:                     &s_objet_argument_2)) == NULL)
  501:             {
  502:                 s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  503:                 return;
  504:             }
  505: 
  506:             liberation(s_etat_processus, s_objet_argument_1);
  507:             liberation(s_etat_processus, s_objet_argument_2);
  508: 
  509:             try
  510:             {
  511:                 gen variable(
  512:                         string(reinterpret_cast<const char *>(argument_1)),
  513:                         contexte);
  514:                 gen expression(
  515:                         string(reinterpret_cast<const char *>(argument_2)),
  516:                         contexte);
  517: 
  518:                 gen resultat = integrate_gen(expression, variable,
  519:                         contexte);
  520:                 string chaine = "'" + resultat.print() + "'";
  521: 
  522:                 conversion_cas_vers_rpl(s_etat_processus,
  523:                         reinterpret_cast<unsigned char *>(const_cast<char *>(
  524:                         chaine.c_str())));
  525:             }
  526:             catch(bad_alloc &exception)
  527:             {
  528:                 s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  529:             }
  530:             catch(...)
  531:             {
  532:                 s_etat_processus->erreur_execution = d_ex_erreur_interne_rplcas;
  533:             }
  534: 
  535:             free(argument_1);
  536:             free(argument_2);
  537: 
  538:             break;
  539:         }
  540: 
  541:         case RPLCAS_LIMITE:
  542:         {
  543:             if (depilement(s_etat_processus, &(s_etat_processus->l_base_pile),
  544:                     &s_objet_argument_1) == d_erreur)
  545:             {
  546:                 s_etat_processus->erreur_execution = d_ex_manque_argument;
  547:                 return;
  548:             }
  549: 
  550:             if (depilement(s_etat_processus, &(s_etat_processus->l_base_pile),
  551:                     &s_objet_argument_2) == d_erreur)
  552:             {
  553:                 liberation(s_etat_processus, s_objet_argument_1);
  554:                 s_etat_processus->erreur_execution = d_ex_manque_argument;
  555:                 return;
  556:             }
  557: 
  558:             // Fonction
  559: 
  560:             if ((argument_2 = conversion_rpl_vers_cas(s_etat_processus,
  561:                     &s_objet_argument_2)) == NULL)
  562:             {
  563:                 s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  564:                 return;
  565:             }
  566: 
  567:             // On parcourt la liste. Cette liste est tout d'abord copiée
  568:             // car on est susceptible de modifier le second élément.
  569: 
  570:             if ((s_objet_temporaire = copie_objet(s_etat_processus,
  571:                     s_objet_argument_1, 'O')) == NULL)
  572:             {
  573:                 s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  574:                 return;
  575:             }
  576: 
  577:             liberation(s_etat_processus, s_objet_argument_1);
  578:             s_objet_argument_1 = s_objet_temporaire;
  579: 
  580:             l_element_courant = reinterpret_cast<struct_liste_chainee *>
  581:                     (s_objet_argument_1->objet);
  582:             position = 1;
  583:             argument_1 = NULL;
  584:             argument_3 = NULL;
  585:             argument_4 = NULL;
  586: 
  587:             while(l_element_courant != NULL)
  588:             {
  589:                 switch(position)
  590:                 {
  591:                     case 1:
  592:                     {
  593:                         // Variable
  594: 
  595:                         if ((argument_1 = reinterpret_cast<unsigned char *>
  596:                                 (malloc((strlen((const char *)
  597:                                 ((struct_variable *) (l_element_courant
  598:                                 ->donnee->objet))->nom)
  599:                                 + 1) * sizeof(unsigned char)))) == NULL)
  600:                         {
  601:                             s_etat_processus->erreur_systeme =
  602:                                     d_es_allocation_memoire;
  603:                             return;
  604:                         }
  605: 
  606:                         strcpy(reinterpret_cast<char *>(argument_1),
  607:                                 (const char *) ((struct_variable *)
  608:                                 (l_element_courant->donnee->objet))->nom);
  609:                         break;
  610:                     }
  611: 
  612:                     case 2:
  613:                     {
  614:                         // Valeur
  615:                         if ((argument_3 = conversion_rpl_vers_cas(
  616:                                 s_etat_processus,
  617:                                 &(l_element_courant->donnee))) == NULL)
  618:                         {
  619:                             s_etat_processus->erreur_systeme =
  620:                                     d_es_allocation_memoire;
  621:                             return;
  622:                         }
  623: 
  624:                         break;
  625:                     }
  626: 
  627:                     case 3:
  628:                     {
  629:                         // Direction
  630: 
  631:                         if ((argument_4 = reinterpret_cast<unsigned char *>
  632:                                 (malloc((strlen((const char *)
  633:                                 ((struct_fonction *) (l_element_courant
  634:                                 ->donnee->objet))->nom_fonction)
  635:                                 + 1) * sizeof(unsigned char)))) == NULL)
  636:                         {
  637:                             s_etat_processus->erreur_systeme =
  638:                                     d_es_allocation_memoire;
  639:                             return;
  640:                         }
  641: 
  642:                         strcpy(reinterpret_cast<char *>(argument_4),
  643:                                 (const char *) ((struct_fonction *)
  644:                                 (l_element_courant->donnee->objet))
  645:                                 ->nom_fonction);
  646:                         break;
  647:                     }
  648:                 }
  649: 
  650:                 l_element_courant = (*l_element_courant).suivant;
  651:                 position++;
  652:             }
  653: 
  654:             liberation(s_etat_processus, s_objet_argument_1);
  655:             liberation(s_etat_processus, s_objet_argument_2);
  656: 
  657:             try
  658:             {
  659:                 int             direction;
  660: 
  661:                 if (argument_4 == NULL)
  662:                 {
  663:                     direction = 0;
  664:                 }
  665:                 else
  666:                 {
  667:                     direction = (strcmp((const char *) argument_4, "+") == 0)
  668:                             ? 1 : -1;
  669:                 }
  670: 
  671:                 gen expression(
  672:                         string(reinterpret_cast<const char *>(argument_2)),
  673:                         contexte);
  674:                 identificateur variable(
  675:                         string(reinterpret_cast<const char *>(argument_1)));
  676:                 gen valeur(string(reinterpret_cast<const char *>
  677:                         (argument_3)), contexte);
  678: 
  679:                 gen resultat = limit(expression, variable, valeur, direction,
  680:                         contexte);
  681:                 string chaine = "'" + resultat.print() + "'";
  682: 
  683:                 conversion_cas_vers_rpl(s_etat_processus,
  684:                         reinterpret_cast<unsigned char *>(const_cast<char *>(
  685:                         chaine.c_str())));
  686:             }
  687:             catch(bad_alloc &exception)
  688:             {
  689:                 s_etat_processus->erreur_systeme = d_es_allocation_memoire;
  690:             }
  691:             catch(...)
  692:             {
  693:                 s_etat_processus->erreur_execution = d_ex_erreur_interne_rplcas;
  694:             }
  695: 
  696:             free(argument_1);
  697:             free(argument_2);
  698:             free(argument_3);
  699: 
  700:             if (argument_4 != NULL)
  701:             {
  702:                 free(argument_4);
  703:             }
  704: 
  705:             break;
  706:         }
  707:     }
  708: 
  709:     return;
  710: #else
  711: 
  712:     if (s_etat_processus->langue == 'F')
  713:     {
  714:         printf("+++Attention : RPL/CAS non compilé !\n");
  715:     }
  716:     else
  717:     {
  718:         printf("+++Warning : RPL/CAS not available !\n");
  719:     }
  720: 
  721:     fflush(stdout);
  722: 
  723:     return;
  724: 
  725: #endif
  726: }
  727: #pragma GCC diagnostic pop
  728: 
  729: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>