Annotation of rpl/src/interface_cas.cpp, revision 1.4
1.1 bertrand 1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.0.prerelease.3
4: Copyright (C) 1989-2011 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:
1.2 bertrand 22:
23: #include "giac.h"
24:
1.3 bertrand 25: #undef PACKAGE
26: #undef PACKAGE_NAME
27: #undef PACKAGE_STRING
28: #undef PACKAGE_TARNAME
29: #undef PACKAGE_VERSION
30: #undef VERSION
31:
1.1 bertrand 32: extern "C"
33: {
1.3 bertrand 34: # define __RPLCAS
1.1 bertrand 35: # include "rpl-conv.h"
36: }
37:
38: #include <iostream>
39:
40: using namespace std;
1.2 bertrand 41: using namespace giac;
42:
1.1 bertrand 43:
1.4 ! bertrand 44: static unsigned char *
! 45: conversion_rpl_vers_cas(struct_processus *s_etat_processus,
! 46: struct_objet **s_objet)
! 47: {
! 48: struct_liste_chainee *l_element_courant;
! 49:
! 50: struct_objet *s_objet_temporaire;
! 51:
! 52: t_8_bits registre[8];
! 53:
! 54: unsigned char *resultat;
! 55:
! 56: for(int i = 0; i < 8; i++)
! 57: {
! 58: registre[i] = s_etat_processus->drapeaux_etat[i];
! 59: }
! 60:
! 61: cf(s_etat_processus, 48);
! 62: cf(s_etat_processus, 49);
! 63: cf(s_etat_processus, 50);
! 64: cf(s_etat_processus, 53);
! 65: cf(s_etat_processus, 54);
! 66: cf(s_etat_processus, 55);
! 67: cf(s_etat_processus, 56);
! 68:
! 69: // GIAC considère que les fonctions sont écrites en minuscules. Le RPL/2
! 70: // part de l'hypothèse inverse. Il faut donc convertir en minuscules tous
! 71: // les noms de fonction. Les fonctions ne peuvent apparaître que dans le
! 72: // cas d'un objet de type ALG.
! 73:
! 74: if ((*s_objet)->type == ALG)
! 75: {
! 76: if ((*s_objet)->nombre_occurrences > 1)
! 77: {
! 78: if ((s_objet_temporaire = copie_objet(s_etat_processus,
! 79: (*s_objet), 'O')) == NULL)
! 80: {
! 81: s_etat_processus->erreur_systeme = d_es_allocation_memoire;
! 82: return(NULL);
! 83: }
! 84:
! 85: liberation(s_etat_processus, (*s_objet));
! 86: (*s_objet) = s_objet_temporaire;
! 87: }
! 88:
! 89: l_element_courant = reinterpret_cast<struct_liste_chainee *>(
! 90: (*s_objet)->objet);
! 91:
! 92: while(l_element_courant != NULL)
! 93: {
! 94: if (l_element_courant->donnee->type == FCT)
! 95: {
! 96: unsigned char *ptr;
! 97:
! 98: ptr = reinterpret_cast<unsigned char *>(((struct_fonction *)
! 99: l_element_courant->donnee->objet)->nom_fonction);
! 100:
! 101: while((*ptr) != d_code_fin_chaine)
! 102: {
! 103: int c = (*ptr);
! 104:
! 105: if (isalpha(c))
! 106: {
! 107: c = tolower(c);
! 108: (*ptr) = (unsigned char) c;
! 109: }
! 110:
! 111: ptr++;
! 112: }
! 113: }
! 114:
! 115: l_element_courant = l_element_courant->suivant;
! 116: }
! 117: }
! 118:
! 119: resultat = formateur(s_etat_processus, 0, (*s_objet));
! 120: resultat[0] = ' ';
! 121: resultat[strlen((const char *) resultat) - 1] = ' ';
! 122:
! 123: for(int i = 0; i < 8; i++)
! 124: {
! 125: s_etat_processus->drapeaux_etat[i] = registre[i];
! 126: }
! 127:
! 128: return(resultat);
! 129: }
! 130:
! 131:
! 132: static void
! 133: conversion_cas_vers_rpl(struct_processus *s_etat_processus,
! 134: struct_objet *s_objet)
! 135: {
! 136: struct_liste_chainee *l_element_courant;
! 137: struct_liste_chainee *l_element_precedent;
! 138:
! 139: if ((s_objet->type == ALG) || (s_objet->type == RPN))
! 140: {
! 141: // On transcrit les fonctions de GIAC vers le RPL/2.
! 142:
! 143: l_element_precedent = NULL;
! 144: l_element_courant = reinterpret_cast<struct_liste_chainee *>(
! 145: s_objet->objet);
! 146:
! 147: while(l_element_courant != NULL)
! 148: {
! 149: if (l_element_courant->donnee->type == FCT)
! 150: {
! 151: // Nous sommes en présence d'un nom, donc de quelque chose
! 152: // qui n'est pas reconnu comme un mot-clef du RPL/2. S'il
! 153: // s'agit d'un mot-clef de GIAC, on le convertit.
! 154:
! 155: if (strcmp(const_cast<const char *>(reinterpret_cast<char *>(
! 156: ((struct_fonction *) l_element_courant->donnee
! 157: ->objet)->nom_fonction)), "quote") == 0)
! 158: {
! 159: liberation(s_etat_processus, l_element_courant->donnee);
! 160:
! 161: if ((l_element_courant->donnee =
! 162: allocation(s_etat_processus, FCT)) == NULL)
! 163: {
! 164: s_etat_processus->erreur_systeme =
! 165: d_es_allocation_memoire;
! 166: return;
! 167: }
! 168:
! 169: if ((((struct_fonction *) l_element_courant->donnee->objet)
! 170: ->nom_fonction = reinterpret_cast<unsigned char *>(
! 171: malloc(6 * sizeof(unsigned char))))
! 172: == NULL)
! 173: {
! 174: s_etat_processus->erreur_systeme =
! 175: d_es_allocation_memoire;
! 176: return;
! 177: }
! 178:
! 179: strcpy(reinterpret_cast<char *>(((struct_fonction *)
! 180: l_element_courant->donnee->objet)->nom_fonction),
! 181: "RELAX");
! 182: }
! 183: }
! 184:
! 185: l_element_precedent = l_element_courant;
! 186: l_element_courant = l_element_courant->suivant;
! 187: }
! 188: }
! 189:
! 190: return;
! 191: }
! 192:
! 193:
1.1 bertrand 194: /*
195: ================================================================================
196: Fonction 'interface_cas'
197: ================================================================================
1.4 ! bertrand 198: Entrées : commande à effectuer.
! 199: Le contrôle des types est effectué dans la fonction appelant interface_cas().
1.1 bertrand 200: --------------------------------------------------------------------------------
1.4 ! bertrand 201: Sorties : retour par la pile.
1.1 bertrand 202: --------------------------------------------------------------------------------
203: Effets de bord : néant
204: ================================================================================
205: */
206:
1.3 bertrand 207: void
1.1 bertrand 208: interface_cas(struct_processus *s_etat_processus,
1.3 bertrand 209: enum t_rplcas_commandes commande)
1.1 bertrand 210: {
1.4 ! bertrand 211: struct_objet *s_objet_argument_1;
! 212: struct_objet *s_objet_argument_2;
! 213:
1.3 bertrand 214: unsigned char *argument_1;
1.4 ! bertrand 215: unsigned char *argument_2;
! 216: unsigned char *registre;
1.3 bertrand 217:
218: switch(commande)
219: {
1.4 ! bertrand 220: case RPLCAS_INTEGRATION:
! 221: {
! 222: if (depilement(s_etat_processus, &(s_etat_processus->l_base_pile),
! 223: &s_objet_argument_1) == d_erreur)
! 224: {
! 225: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 226: return;
! 227: }
! 228:
! 229: if (depilement(s_etat_processus, &(s_etat_processus->l_base_pile),
! 230: &s_objet_argument_2) == d_erreur)
! 231: {
! 232: liberation(s_etat_processus, s_objet_argument_1);
! 233: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 234: return;
! 235: }
! 236:
! 237: if ((argument_1 = conversion_rpl_vers_cas(s_etat_processus,
! 238: &s_objet_argument_1)) == NULL)
! 239: {
! 240: s_etat_processus->erreur_systeme = d_es_allocation_memoire;
! 241: return;
! 242: }
! 243:
! 244: if ((argument_2 = conversion_rpl_vers_cas(s_etat_processus,
! 245: &s_objet_argument_2)) == NULL)
! 246: {
! 247: s_etat_processus->erreur_systeme = d_es_allocation_memoire;
! 248: return;
! 249: }
! 250:
! 251: liberation(s_etat_processus, s_objet_argument_1);
! 252: liberation(s_etat_processus, s_objet_argument_2);
! 253:
! 254: gen variable(string(reinterpret_cast<const char *>(argument_1)),
! 255: giac::context0);
! 256: gen expression(string(reinterpret_cast<const char *>(argument_2)),
! 257: giac::context0);
! 258:
! 259: free(argument_1);
! 260: free(argument_2);
! 261:
! 262: gen resultat = integrate(expression, variable, giac::context0);
! 263: string chaine = "'" + resultat.print() + "'";
! 264:
! 265: registre = s_etat_processus->instruction_courante;
! 266: s_etat_processus->instruction_courante =
! 267: reinterpret_cast<unsigned char*>(const_cast<char *>
! 268: (chaine.c_str()));
! 269:
! 270: recherche_type(s_etat_processus);
! 271:
! 272: if (s_etat_processus->l_base_pile != NULL)
! 273: {
! 274: conversion_cas_vers_rpl(s_etat_processus,
! 275: s_etat_processus->l_base_pile->donnee);
! 276: }
! 277:
! 278: s_etat_processus->instruction_courante = registre;
! 279:
! 280: break;
! 281: }
! 282:
1.3 bertrand 283: case RPLCAS_LIMITE:
284: {
285: break;
286: }
287: }
1.1 bertrand 288:
1.3 bertrand 289: return;
1.1 bertrand 290: }
291:
292: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>