Annotation of rpl/src/interface_cas.cpp, revision 1.71

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

CVSweb interface <joel.bertrand@systella.fr>