Annotation of rpl/src/instructions_g4.c, revision 1.1
1.1 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.9
! 4: Copyright (C) 1989-2010 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 'getc'
! 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_getc(struct_processus *s_etat_processus)
! 40: {
! 41: logical1 presence_variable;
! 42: logical1 variable_partagee;
! 43:
! 44: struct_liste_chainee *l_element_courant;
! 45:
! 46: struct_objet *s_objet_argument_1;
! 47: struct_objet *s_objet_argument_2;
! 48: struct_objet *s_objet_resultat;
! 49:
! 50: unsigned long i;
! 51: unsigned long j;
! 52: unsigned long colonne;
! 53: unsigned long nombre_colonnes;
! 54:
! 55: (*s_etat_processus).erreur_execution = d_ex;
! 56:
! 57: if ((*s_etat_processus).affichage_arguments == 'Y')
! 58: {
! 59: printf("\n GETC ");
! 60:
! 61: if ((*s_etat_processus).langue == 'F')
! 62: {
! 63: printf("(prend une colonne)\n\n");
! 64: }
! 65: else
! 66: {
! 67: printf("(get column)\n\n");
! 68: }
! 69:
! 70: printf(" 2: %s, %s, %s, %s\n", d_MIN, d_MRL, d_MCX, d_NOM);
! 71: printf(" 1: %s\n", d_LST);
! 72: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
! 73:
! 74: return;
! 75: }
! 76: else if ((*s_etat_processus).test_instruction == 'Y')
! 77: {
! 78: (*s_etat_processus).nombre_arguments = -1;
! 79: return;
! 80: }
! 81:
! 82: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 83: {
! 84: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
! 85: {
! 86: return;
! 87: }
! 88: }
! 89:
! 90: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 91: &s_objet_argument_1) == d_erreur)
! 92: {
! 93: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 94: return;
! 95: }
! 96:
! 97: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 98: &s_objet_argument_2) == d_erreur)
! 99: {
! 100: liberation(s_etat_processus, s_objet_argument_1);
! 101:
! 102: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 103: return;
! 104: }
! 105:
! 106: if ((*s_objet_argument_2).type == NOM)
! 107: {
! 108: if (recherche_variable(s_etat_processus, (*((struct_nom *)
! 109: (*s_objet_argument_2).objet)).nom) == d_faux)
! 110: {
! 111: liberation(s_etat_processus, s_objet_argument_1);
! 112: liberation(s_etat_processus, s_objet_argument_2);
! 113:
! 114: (*s_etat_processus).erreur_systeme = d_es;
! 115: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 116:
! 117: return;
! 118: }
! 119:
! 120: liberation(s_etat_processus, s_objet_argument_2);
! 121:
! 122: s_objet_argument_2 = (*s_etat_processus).s_liste_variables
! 123: [(*s_etat_processus).position_variable_courante].objet;
! 124: presence_variable = d_vrai;
! 125:
! 126: if (s_objet_argument_2 == NULL)
! 127: {
! 128: // Variable partagée
! 129:
! 130: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 131: .s_liste_variables_partagees).mutex)) != 0)
! 132: {
! 133: (*s_etat_processus).erreur_systeme = d_es_processus;
! 134: return;
! 135: }
! 136:
! 137: if (recherche_variable_partagee(s_etat_processus,
! 138: (*s_etat_processus).s_liste_variables
! 139: [(*s_etat_processus).position_variable_courante].nom,
! 140: (*s_etat_processus).s_liste_variables
! 141: [(*s_etat_processus).position_variable_courante]
! 142: .variable_partagee, (*s_etat_processus).s_liste_variables
! 143: [(*s_etat_processus).position_variable_courante].origine)
! 144: == d_faux)
! 145: {
! 146: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 147: .s_liste_variables_partagees).mutex)) != 0)
! 148: {
! 149: (*s_etat_processus).erreur_systeme = d_es_processus;
! 150: return;
! 151: }
! 152:
! 153: liberation(s_etat_processus, s_objet_argument_1);
! 154:
! 155: (*s_etat_processus).erreur_systeme = d_es;
! 156: (*s_etat_processus).erreur_execution =
! 157: d_ex_variable_non_definie;
! 158:
! 159: return;
! 160: }
! 161:
! 162: s_objet_argument_2 = (*(*s_etat_processus)
! 163: .s_liste_variables_partagees).table
! 164: [(*(*s_etat_processus).s_liste_variables_partagees)
! 165: .position_variable].objet;
! 166: variable_partagee = d_vrai;
! 167: }
! 168: else
! 169: {
! 170: variable_partagee = d_faux;
! 171: }
! 172: }
! 173: else
! 174: {
! 175: presence_variable = d_faux;
! 176: variable_partagee = d_faux;
! 177: }
! 178:
! 179: if (((*s_objet_argument_2).type == MIN) ||
! 180: ((*s_objet_argument_2).type == MRL) ||
! 181: ((*s_objet_argument_2).type == MCX))
! 182: {
! 183: if ((*s_objet_argument_1).type == LST)
! 184: {
! 185: l_element_courant = (struct_liste_chainee *)
! 186: (*s_objet_argument_1).objet;
! 187: nombre_colonnes = 0;
! 188:
! 189: while(l_element_courant != NULL)
! 190: {
! 191: if ((*(*l_element_courant).donnee).type != INT)
! 192: {
! 193: liberation(s_etat_processus, s_objet_argument_1);
! 194:
! 195: if (variable_partagee == d_vrai)
! 196: {
! 197: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 198: .s_liste_variables_partagees).mutex)) != 0)
! 199: {
! 200: (*s_etat_processus).erreur_systeme = d_es_processus;
! 201: return;
! 202: }
! 203: }
! 204:
! 205: if (presence_variable == d_faux)
! 206: {
! 207: liberation(s_etat_processus, s_objet_argument_2);
! 208: }
! 209:
! 210: (*s_etat_processus).erreur_execution =
! 211: d_ex_erreur_type_argument;
! 212: return;
! 213: }
! 214:
! 215: if (((*((integer8 *) (*(*l_element_courant).donnee).objet))
! 216: <= 0) || ((*((integer8 *) (*(*l_element_courant).donnee)
! 217: .objet)) > (integer8) (*((struct_matrice *)
! 218: (*s_objet_argument_2).objet)).nombre_colonnes))
! 219: {
! 220: liberation(s_etat_processus, s_objet_argument_1);
! 221:
! 222: if (variable_partagee == d_vrai)
! 223: {
! 224: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 225: .s_liste_variables_partagees).mutex)) != 0)
! 226: {
! 227: (*s_etat_processus).erreur_systeme = d_es_processus;
! 228: return;
! 229: }
! 230: }
! 231:
! 232: if (presence_variable == d_faux)
! 233: {
! 234: liberation(s_etat_processus, s_objet_argument_2);
! 235: }
! 236:
! 237: (*s_etat_processus).erreur_execution =
! 238: d_ex_argument_invalide;
! 239: return;
! 240: }
! 241:
! 242: nombre_colonnes++;
! 243: l_element_courant = (*l_element_courant).suivant;
! 244: }
! 245:
! 246: if (nombre_colonnes == 0)
! 247: {
! 248: liberation(s_etat_processus, s_objet_argument_1);
! 249:
! 250: if (variable_partagee == d_vrai)
! 251: {
! 252: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 253: .s_liste_variables_partagees).mutex)) != 0)
! 254: {
! 255: (*s_etat_processus).erreur_systeme = d_es_processus;
! 256: return;
! 257: }
! 258: }
! 259:
! 260: if (presence_variable == d_faux)
! 261: {
! 262: liberation(s_etat_processus, s_objet_argument_2);
! 263: }
! 264:
! 265: (*s_etat_processus).erreur_execution =
! 266: d_ex_erreur_type_argument;
! 267: return;
! 268: }
! 269:
! 270: if ((s_objet_resultat = allocation(s_etat_processus,
! 271: (*s_objet_argument_2).type)) == NULL)
! 272: {
! 273: if (variable_partagee == d_vrai)
! 274: {
! 275: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 276: .s_liste_variables_partagees).mutex)) != 0)
! 277: {
! 278: (*s_etat_processus).erreur_systeme = d_es_processus;
! 279: return;
! 280: }
! 281: }
! 282:
! 283: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 284: return;
! 285: }
! 286:
! 287: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
! 288: nombre_colonnes;
! 289: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
! 290: (*((struct_matrice *) (*s_objet_argument_2).objet))
! 291: .nombre_lignes;
! 292:
! 293: switch((*((struct_matrice *) (*s_objet_resultat).objet)).type)
! 294: {
! 295: case 'I' :
! 296: {
! 297: (*s_objet_resultat).type = MIN;
! 298:
! 299: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 300: .tableau = malloc((*((struct_matrice *)
! 301: (*s_objet_resultat).objet)).nombre_lignes *
! 302: sizeof(integer8 *))) == NULL)
! 303: {
! 304: if (variable_partagee == d_vrai)
! 305: {
! 306: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 307: .s_liste_variables_partagees).mutex)) != 0)
! 308: {
! 309: (*s_etat_processus).erreur_systeme =
! 310: d_es_processus;
! 311: return;
! 312: }
! 313: }
! 314:
! 315: (*s_etat_processus).erreur_systeme =
! 316: d_es_allocation_memoire;
! 317: return;
! 318: }
! 319:
! 320: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
! 321: .objet)).nombre_lignes; i++)
! 322: {
! 323: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 324: .tableau[i] = malloc(nombre_colonnes *
! 325: sizeof(integer8))) == NULL)
! 326: {
! 327: if (variable_partagee == d_vrai)
! 328: {
! 329: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 330: .s_liste_variables_partagees).mutex))
! 331: != 0)
! 332: {
! 333: (*s_etat_processus).erreur_systeme =
! 334: d_es_processus;
! 335: return;
! 336: }
! 337: }
! 338:
! 339: (*s_etat_processus).erreur_systeme =
! 340: d_es_allocation_memoire;
! 341: return;
! 342: }
! 343:
! 344: }
! 345:
! 346: l_element_courant = (struct_liste_chainee *)
! 347: (*s_objet_argument_1).objet;
! 348: j = 0;
! 349:
! 350: while(l_element_courant != NULL)
! 351: {
! 352: colonne = (*((integer8 *) (*(*l_element_courant).donnee)
! 353: .objet)) - 1;
! 354:
! 355: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
! 356: .objet)).nombre_lignes; i++)
! 357: {
! 358: ((integer8 **) (*((struct_matrice *)
! 359: (*s_objet_resultat).objet)).tableau)[i][j] =
! 360: ((integer8 **) (*((struct_matrice *)
! 361: (*s_objet_argument_2).objet))
! 362: .tableau)[i][colonne];
! 363: }
! 364:
! 365: l_element_courant = (*l_element_courant).suivant;
! 366: j++;
! 367: }
! 368:
! 369: break;
! 370: }
! 371:
! 372: case 'R' :
! 373: {
! 374: (*s_objet_resultat).type = MRL;
! 375:
! 376: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 377: .tableau = malloc((*((struct_matrice *)
! 378: (*s_objet_resultat).objet)).nombre_lignes *
! 379: sizeof(real8 *))) == NULL)
! 380: {
! 381: if (variable_partagee == d_vrai)
! 382: {
! 383: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 384: .s_liste_variables_partagees).mutex)) != 0)
! 385: {
! 386: (*s_etat_processus).erreur_systeme =
! 387: d_es_processus;
! 388: return;
! 389: }
! 390: }
! 391:
! 392: (*s_etat_processus).erreur_systeme =
! 393: d_es_allocation_memoire;
! 394: return;
! 395: }
! 396:
! 397: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
! 398: .objet)).nombre_lignes; i++)
! 399: {
! 400: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 401: .tableau[i] = malloc(nombre_colonnes *
! 402: sizeof(real8))) == NULL)
! 403: {
! 404: if (variable_partagee == d_vrai)
! 405: {
! 406: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 407: .s_liste_variables_partagees).mutex))
! 408: != 0)
! 409: {
! 410: (*s_etat_processus).erreur_systeme =
! 411: d_es_processus;
! 412: return;
! 413: }
! 414: }
! 415:
! 416: (*s_etat_processus).erreur_systeme =
! 417: d_es_allocation_memoire;
! 418: return;
! 419: }
! 420:
! 421: }
! 422:
! 423: l_element_courant = (struct_liste_chainee *)
! 424: (*s_objet_argument_1).objet;
! 425: j = 0;
! 426:
! 427: while(l_element_courant != NULL)
! 428: {
! 429: colonne = (*((integer8 *) (*(*l_element_courant).donnee)
! 430: .objet)) - 1;
! 431:
! 432: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
! 433: .objet)).nombre_lignes; i++)
! 434: {
! 435: ((real8 **) (*((struct_matrice *)
! 436: (*s_objet_resultat).objet)).tableau)[i][j] =
! 437: ((real8 **) (*((struct_matrice *)
! 438: (*s_objet_argument_2).objet))
! 439: .tableau)[i][colonne];
! 440: }
! 441:
! 442: l_element_courant = (*l_element_courant).suivant;
! 443: j++;
! 444: }
! 445:
! 446: break;
! 447: }
! 448:
! 449: case 'C' :
! 450: {
! 451: (*s_objet_resultat).type = MCX;
! 452:
! 453: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 454: .tableau = malloc((*((struct_matrice *)
! 455: (*s_objet_resultat).objet)).nombre_lignes *
! 456: sizeof(complex16 *))) == NULL)
! 457: {
! 458: if (variable_partagee == d_vrai)
! 459: {
! 460: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 461: .s_liste_variables_partagees).mutex)) != 0)
! 462: {
! 463: (*s_etat_processus).erreur_systeme =
! 464: d_es_processus;
! 465: return;
! 466: }
! 467: }
! 468:
! 469: (*s_etat_processus).erreur_systeme =
! 470: d_es_allocation_memoire;
! 471: return;
! 472: }
! 473:
! 474: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
! 475: .objet)).nombre_lignes; i++)
! 476: {
! 477: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 478: .tableau[i] = malloc(nombre_colonnes *
! 479: sizeof(complex16))) == NULL)
! 480: {
! 481: if (variable_partagee == d_vrai)
! 482: {
! 483: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 484: .s_liste_variables_partagees).mutex))
! 485: != 0)
! 486: {
! 487: (*s_etat_processus).erreur_systeme =
! 488: d_es_processus;
! 489: return;
! 490: }
! 491: }
! 492:
! 493: (*s_etat_processus).erreur_systeme =
! 494: d_es_allocation_memoire;
! 495: return;
! 496: }
! 497:
! 498: }
! 499:
! 500: l_element_courant = (struct_liste_chainee *)
! 501: (*s_objet_argument_1).objet;
! 502: j = 0;
! 503:
! 504: while(l_element_courant != NULL)
! 505: {
! 506: colonne = (*((integer8 *) (*(*l_element_courant).donnee)
! 507: .objet)) - 1;
! 508:
! 509: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
! 510: .objet)).nombre_lignes; i++)
! 511: {
! 512: ((complex16 **) (*((struct_matrice *)
! 513: (*s_objet_resultat).objet)).tableau)[i][j]
! 514: .partie_reelle =
! 515: ((complex16 **) (*((struct_matrice *)
! 516: (*s_objet_argument_2).objet))
! 517: .tableau)[i][colonne].partie_reelle;
! 518: ((complex16 **) (*((struct_matrice *)
! 519: (*s_objet_resultat).objet)).tableau)[i][j]
! 520: .partie_imaginaire =
! 521: ((complex16 **) (*((struct_matrice *)
! 522: (*s_objet_argument_2).objet))
! 523: .tableau)[i][colonne].partie_imaginaire;
! 524: }
! 525:
! 526: l_element_courant = (*l_element_courant).suivant;
! 527: j++;
! 528: }
! 529:
! 530: break;
! 531: }
! 532: }
! 533: }
! 534: else
! 535: {
! 536: liberation(s_etat_processus, s_objet_argument_1);
! 537:
! 538: if (variable_partagee == d_vrai)
! 539: {
! 540: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 541: .s_liste_variables_partagees).mutex)) != 0)
! 542: {
! 543: (*s_etat_processus).erreur_systeme =
! 544: d_es_processus;
! 545: return;
! 546: }
! 547: }
! 548:
! 549: if (presence_variable == d_faux)
! 550: {
! 551: liberation(s_etat_processus, s_objet_argument_2);
! 552: }
! 553:
! 554: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 555: return;
! 556: }
! 557: }
! 558: else
! 559: {
! 560: liberation(s_etat_processus, s_objet_argument_1);
! 561:
! 562: if (variable_partagee == d_vrai)
! 563: {
! 564: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 565: .s_liste_variables_partagees).mutex)) != 0)
! 566: {
! 567: (*s_etat_processus).erreur_systeme =
! 568: d_es_processus;
! 569: return;
! 570: }
! 571: }
! 572:
! 573: if (presence_variable == d_faux)
! 574: {
! 575: liberation(s_etat_processus, s_objet_argument_2);
! 576: }
! 577:
! 578: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 579: return;
! 580: }
! 581:
! 582: liberation(s_etat_processus, s_objet_argument_1);
! 583:
! 584: if (variable_partagee == d_vrai)
! 585: {
! 586: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 587: .s_liste_variables_partagees).mutex)) != 0)
! 588: {
! 589: (*s_etat_processus).erreur_systeme =
! 590: d_es_processus;
! 591: return;
! 592: }
! 593: }
! 594:
! 595: if (presence_variable == d_faux)
! 596: {
! 597: liberation(s_etat_processus, s_objet_argument_2);
! 598: }
! 599:
! 600: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 601: s_objet_resultat) == d_erreur)
! 602: {
! 603: return;
! 604: }
! 605:
! 606: return;
! 607: }
! 608:
! 609:
! 610: /*
! 611: ================================================================================
! 612: Fonction 'getr'
! 613: ================================================================================
! 614: Entrées : pointeur sur une structure struct_processus
! 615: --------------------------------------------------------------------------------
! 616: Sorties :
! 617: --------------------------------------------------------------------------------
! 618: Effets de bord : néant
! 619: ================================================================================
! 620: */
! 621:
! 622: void
! 623: instruction_getr(struct_processus *s_etat_processus)
! 624: {
! 625: logical1 presence_variable;
! 626: logical1 variable_partagee;
! 627:
! 628: struct_liste_chainee *l_element_courant;
! 629:
! 630: struct_objet *s_objet_argument_1;
! 631: struct_objet *s_objet_argument_2;
! 632: struct_objet *s_objet_resultat;
! 633:
! 634: unsigned long i;
! 635: unsigned long j;
! 636: unsigned long ligne;
! 637: unsigned long nombre_lignes;
! 638:
! 639: (*s_etat_processus).erreur_execution = d_ex;
! 640:
! 641: if ((*s_etat_processus).affichage_arguments == 'Y')
! 642: {
! 643: printf("\n GETR ");
! 644:
! 645: if ((*s_etat_processus).langue == 'F')
! 646: {
! 647: printf("(prend une ligne)\n\n");
! 648: }
! 649: else
! 650: {
! 651: printf("(get row)\n\n");
! 652: }
! 653:
! 654: printf(" 2: %s, %s, %s, %s\n", d_MIN, d_MRL, d_MCX, d_NOM);
! 655: printf(" 1: %s\n", d_LST);
! 656: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
! 657:
! 658: return;
! 659: }
! 660: else if ((*s_etat_processus).test_instruction == 'Y')
! 661: {
! 662: (*s_etat_processus).nombre_arguments = -1;
! 663: return;
! 664: }
! 665:
! 666: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 667: {
! 668: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
! 669: {
! 670: return;
! 671: }
! 672: }
! 673:
! 674: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 675: &s_objet_argument_1) == d_erreur)
! 676: {
! 677: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 678: return;
! 679: }
! 680:
! 681: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 682: &s_objet_argument_2) == d_erreur)
! 683: {
! 684: liberation(s_etat_processus, s_objet_argument_1);
! 685:
! 686: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 687: return;
! 688: }
! 689:
! 690: if ((*s_objet_argument_2).type == NOM)
! 691: {
! 692: if (recherche_variable(s_etat_processus, (*((struct_nom *)
! 693: (*s_objet_argument_2).objet)).nom) == d_faux)
! 694: {
! 695: (*s_etat_processus).erreur_systeme = d_es;
! 696: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 697:
! 698: return;
! 699: }
! 700:
! 701: liberation(s_etat_processus, s_objet_argument_2);
! 702:
! 703: s_objet_argument_2 = (*s_etat_processus).s_liste_variables
! 704: [(*s_etat_processus).position_variable_courante].objet;
! 705: presence_variable = d_vrai;
! 706:
! 707: if (s_objet_argument_2 == NULL)
! 708: {
! 709: // Variable partagée
! 710:
! 711: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 712: .s_liste_variables_partagees).mutex)) != 0)
! 713: {
! 714: (*s_etat_processus).erreur_systeme = d_es_processus;
! 715: return;
! 716: }
! 717:
! 718: if (recherche_variable_partagee(s_etat_processus,
! 719: (*s_etat_processus).s_liste_variables
! 720: [(*s_etat_processus).position_variable_courante].nom,
! 721: (*s_etat_processus).s_liste_variables
! 722: [(*s_etat_processus).position_variable_courante]
! 723: .variable_partagee, (*s_etat_processus).s_liste_variables
! 724: [(*s_etat_processus).position_variable_courante].origine)
! 725: == d_faux)
! 726: {
! 727: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 728: .s_liste_variables_partagees).mutex)) != 0)
! 729: {
! 730: (*s_etat_processus).erreur_systeme = d_es_processus;
! 731: return;
! 732: }
! 733:
! 734: liberation(s_etat_processus, s_objet_argument_1);
! 735:
! 736: (*s_etat_processus).erreur_systeme = d_es;
! 737: (*s_etat_processus).erreur_execution =
! 738: d_ex_variable_non_definie;
! 739:
! 740: return;
! 741: }
! 742:
! 743: s_objet_argument_2 = (*(*s_etat_processus)
! 744: .s_liste_variables_partagees).table
! 745: [(*(*s_etat_processus).s_liste_variables_partagees)
! 746: .position_variable].objet;
! 747: variable_partagee = d_vrai;
! 748: }
! 749: else
! 750: {
! 751: variable_partagee = d_faux;
! 752: }
! 753: }
! 754: else
! 755: {
! 756: presence_variable = d_faux;
! 757: variable_partagee = d_faux;
! 758: }
! 759:
! 760: if (((*s_objet_argument_2).type == MIN) ||
! 761: ((*s_objet_argument_2).type == MRL) ||
! 762: ((*s_objet_argument_2).type == MCX))
! 763: {
! 764: if ((*s_objet_argument_1).type == LST)
! 765: {
! 766: l_element_courant = (struct_liste_chainee *)
! 767: (*s_objet_argument_1).objet;
! 768: nombre_lignes = 0;
! 769:
! 770: while(l_element_courant != NULL)
! 771: {
! 772: if ((*(*l_element_courant).donnee).type != INT)
! 773: {
! 774: liberation(s_etat_processus, s_objet_argument_1);
! 775:
! 776: if (variable_partagee == d_vrai)
! 777: {
! 778: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 779: .s_liste_variables_partagees).mutex)) != 0)
! 780: {
! 781: (*s_etat_processus).erreur_systeme =
! 782: d_es_processus;
! 783: return;
! 784: }
! 785: }
! 786:
! 787: if (presence_variable == d_faux)
! 788: {
! 789: liberation(s_etat_processus, s_objet_argument_2);
! 790: }
! 791:
! 792: (*s_etat_processus).erreur_execution =
! 793: d_ex_erreur_type_argument;
! 794: return;
! 795: }
! 796:
! 797: if (((*((integer8 *) (*(*l_element_courant).donnee).objet))
! 798: <= 0) || ((*((integer8 *) (*(*l_element_courant).donnee)
! 799: .objet)) > (integer8) (*((struct_matrice *)
! 800: (*s_objet_argument_2).objet)).nombre_lignes))
! 801: {
! 802: liberation(s_etat_processus, s_objet_argument_1);
! 803:
! 804: if (variable_partagee == d_vrai)
! 805: {
! 806: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 807: .s_liste_variables_partagees).mutex)) != 0)
! 808: {
! 809: (*s_etat_processus).erreur_systeme =
! 810: d_es_processus;
! 811: return;
! 812: }
! 813: }
! 814:
! 815: if (presence_variable == d_faux)
! 816: {
! 817: liberation(s_etat_processus, s_objet_argument_2);
! 818: }
! 819:
! 820: (*s_etat_processus).erreur_execution =
! 821: d_ex_argument_invalide;
! 822: return;
! 823: }
! 824:
! 825: nombre_lignes++;
! 826: l_element_courant = (*l_element_courant).suivant;
! 827: }
! 828:
! 829: if (nombre_lignes == 0)
! 830: {
! 831: liberation(s_etat_processus, s_objet_argument_1);
! 832:
! 833: if (variable_partagee == d_vrai)
! 834: {
! 835: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 836: .s_liste_variables_partagees).mutex)) != 0)
! 837: {
! 838: (*s_etat_processus).erreur_systeme =
! 839: d_es_processus;
! 840: return;
! 841: }
! 842: }
! 843:
! 844: if (presence_variable == d_faux)
! 845: {
! 846: liberation(s_etat_processus, s_objet_argument_2);
! 847: }
! 848:
! 849: (*s_etat_processus).erreur_execution =
! 850: d_ex_erreur_type_argument;
! 851: return;
! 852: }
! 853:
! 854: if ((s_objet_resultat = allocation(s_etat_processus,
! 855: (*s_objet_argument_2).type)) == NULL)
! 856: {
! 857: if (variable_partagee == d_vrai)
! 858: {
! 859: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 860: .s_liste_variables_partagees).mutex)) != 0)
! 861: {
! 862: (*s_etat_processus).erreur_systeme =
! 863: d_es_processus;
! 864: return;
! 865: }
! 866: }
! 867:
! 868: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 869: return;
! 870: }
! 871:
! 872: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
! 873: nombre_lignes;
! 874: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
! 875: (*((struct_matrice *) (*s_objet_argument_2).objet))
! 876: .nombre_colonnes;
! 877:
! 878: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
! 879: malloc(nombre_lignes * sizeof(void *))) == NULL)
! 880: {
! 881: if (variable_partagee == d_vrai)
! 882: {
! 883: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 884: .s_liste_variables_partagees).mutex)) != 0)
! 885: {
! 886: (*s_etat_processus).erreur_systeme =
! 887: d_es_processus;
! 888: return;
! 889: }
! 890: }
! 891:
! 892: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 893: return;
! 894: }
! 895:
! 896: switch((*((struct_matrice *) (*s_objet_resultat).objet)).type)
! 897: {
! 898: case 'I' :
! 899: {
! 900: (*s_objet_resultat).type = MIN;
! 901:
! 902: l_element_courant = (struct_liste_chainee *)
! 903: (*s_objet_argument_1).objet;
! 904: i = 0;
! 905:
! 906: while(l_element_courant != NULL)
! 907: {
! 908: ligne = (*((integer8 *) (*(*l_element_courant).donnee)
! 909: .objet)) - 1;
! 910:
! 911: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 912: .tableau[i] = malloc((*((struct_matrice *)
! 913: (*s_objet_resultat).objet)).nombre_colonnes *
! 914: sizeof(integer8))) == NULL)
! 915: {
! 916: if (variable_partagee == d_vrai)
! 917: {
! 918: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 919: .s_liste_variables_partagees).mutex))
! 920: != 0)
! 921: {
! 922: (*s_etat_processus).erreur_systeme =
! 923: d_es_processus;
! 924: return;
! 925: }
! 926: }
! 927:
! 928: (*s_etat_processus).erreur_systeme =
! 929: d_es_allocation_memoire;
! 930: return;
! 931: }
! 932:
! 933: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat)
! 934: .objet)).nombre_colonnes; j++)
! 935: {
! 936: ((integer8 **) (*((struct_matrice *)
! 937: (*s_objet_resultat).objet)).tableau)[i][j] =
! 938: ((integer8 **) (*((struct_matrice *)
! 939: (*s_objet_argument_2).objet))
! 940: .tableau)[ligne][j];
! 941: }
! 942:
! 943: l_element_courant = (*l_element_courant).suivant;
! 944: i++;
! 945: }
! 946:
! 947: break;
! 948: }
! 949:
! 950: case 'R' :
! 951: {
! 952: (*s_objet_resultat).type = MRL;
! 953:
! 954: l_element_courant = (struct_liste_chainee *)
! 955: (*s_objet_argument_1).objet;
! 956: i = 0;
! 957:
! 958: while(l_element_courant != NULL)
! 959: {
! 960: ligne = (*((integer8 *) (*(*l_element_courant).donnee)
! 961: .objet)) - 1;
! 962:
! 963: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 964: .tableau[i] = malloc((*((struct_matrice *)
! 965: (*s_objet_resultat).objet)).nombre_colonnes *
! 966: sizeof(real8))) == NULL)
! 967: {
! 968: if (variable_partagee == d_vrai)
! 969: {
! 970: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 971: .s_liste_variables_partagees).mutex))
! 972: != 0)
! 973: {
! 974: (*s_etat_processus).erreur_systeme =
! 975: d_es_processus;
! 976: return;
! 977: }
! 978: }
! 979:
! 980: (*s_etat_processus).erreur_systeme =
! 981: d_es_allocation_memoire;
! 982: return;
! 983: }
! 984:
! 985: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat)
! 986: .objet)).nombre_colonnes; j++)
! 987: {
! 988: ((real8 **) (*((struct_matrice *)
! 989: (*s_objet_resultat).objet)).tableau)[i][j] =
! 990: ((real8 **) (*((struct_matrice *)
! 991: (*s_objet_argument_2).objet))
! 992: .tableau)[ligne][j];
! 993: }
! 994:
! 995: l_element_courant = (*l_element_courant).suivant;
! 996: i++;
! 997: }
! 998:
! 999: break;
! 1000: }
! 1001:
! 1002: case 'C' :
! 1003: {
! 1004: (*s_objet_resultat).type = MCX;
! 1005:
! 1006: l_element_courant = (struct_liste_chainee *)
! 1007: (*s_objet_argument_1).objet;
! 1008: i = 0;
! 1009:
! 1010: while(l_element_courant != NULL)
! 1011: {
! 1012: ligne = (*((integer8 *) (*(*l_element_courant).donnee)
! 1013: .objet)) - 1;
! 1014:
! 1015: if (((*((struct_matrice *) (*s_objet_resultat).objet))
! 1016: .tableau[i] = malloc((*((struct_matrice *)
! 1017: (*s_objet_resultat).objet)).nombre_colonnes *
! 1018: sizeof(complex16))) == NULL)
! 1019: {
! 1020: if (variable_partagee == d_vrai)
! 1021: {
! 1022: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1023: .s_liste_variables_partagees).mutex))
! 1024: != 0)
! 1025: {
! 1026: (*s_etat_processus).erreur_systeme =
! 1027: d_es_processus;
! 1028: return;
! 1029: }
! 1030: }
! 1031:
! 1032: (*s_etat_processus).erreur_systeme =
! 1033: d_es_allocation_memoire;
! 1034: return;
! 1035: }
! 1036:
! 1037: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat)
! 1038: .objet)).nombre_colonnes; j++)
! 1039: {
! 1040: ((complex16 **) (*((struct_matrice *)
! 1041: (*s_objet_resultat).objet)).tableau)[i][j]
! 1042: .partie_reelle =
! 1043: ((complex16 **) (*((struct_matrice *)
! 1044: (*s_objet_argument_2).objet))
! 1045: .tableau)[ligne][j].partie_reelle;
! 1046: ((complex16 **) (*((struct_matrice *)
! 1047: (*s_objet_resultat).objet)).tableau)[i][j]
! 1048: .partie_imaginaire =
! 1049: ((complex16 **) (*((struct_matrice *)
! 1050: (*s_objet_argument_2).objet))
! 1051: .tableau)[ligne][j].partie_imaginaire;
! 1052: }
! 1053:
! 1054: l_element_courant = (*l_element_courant).suivant;
! 1055: i++;
! 1056: }
! 1057:
! 1058: break;
! 1059: }
! 1060: }
! 1061: }
! 1062: else
! 1063: {
! 1064: liberation(s_etat_processus, s_objet_argument_1);
! 1065:
! 1066: if (variable_partagee == d_vrai)
! 1067: {
! 1068: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1069: .s_liste_variables_partagees).mutex))
! 1070: != 0)
! 1071: {
! 1072: (*s_etat_processus).erreur_systeme =
! 1073: d_es_processus;
! 1074: return;
! 1075: }
! 1076: }
! 1077:
! 1078: if (presence_variable == d_faux)
! 1079: {
! 1080: liberation(s_etat_processus, s_objet_argument_2);
! 1081: }
! 1082:
! 1083: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1084: return;
! 1085: }
! 1086: }
! 1087: else
! 1088: {
! 1089: liberation(s_etat_processus, s_objet_argument_1);
! 1090:
! 1091: if (variable_partagee == d_vrai)
! 1092: {
! 1093: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1094: .s_liste_variables_partagees).mutex))
! 1095: != 0)
! 1096: {
! 1097: (*s_etat_processus).erreur_systeme =
! 1098: d_es_processus;
! 1099: return;
! 1100: }
! 1101: }
! 1102:
! 1103: if (presence_variable == d_faux)
! 1104: {
! 1105: liberation(s_etat_processus, s_objet_argument_2);
! 1106: }
! 1107:
! 1108: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1109: return;
! 1110: }
! 1111:
! 1112: liberation(s_etat_processus, s_objet_argument_1);
! 1113:
! 1114: if (variable_partagee == d_vrai)
! 1115: {
! 1116: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1117: .s_liste_variables_partagees).mutex))
! 1118: != 0)
! 1119: {
! 1120: (*s_etat_processus).erreur_systeme =
! 1121: d_es_processus;
! 1122: return;
! 1123: }
! 1124: }
! 1125:
! 1126: if (presence_variable == d_faux)
! 1127: {
! 1128: liberation(s_etat_processus, s_objet_argument_2);
! 1129: }
! 1130:
! 1131: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1132: s_objet_resultat) == d_erreur)
! 1133: {
! 1134: return;
! 1135: }
! 1136:
! 1137: return;
! 1138: }
! 1139:
! 1140:
! 1141: /*
! 1142: ================================================================================
! 1143: Fonction 'gamma'
! 1144: ================================================================================
! 1145: Entrées : pointeur sur une structure struct_processus
! 1146: --------------------------------------------------------------------------------
! 1147: Sorties :
! 1148: --------------------------------------------------------------------------------
! 1149: Effets de bord : néant
! 1150: ================================================================================
! 1151: */
! 1152:
! 1153: void
! 1154: instruction_gamma(struct_processus *s_etat_processus)
! 1155: {
! 1156: double argument_imaginaire;
! 1157: double argument_reel;
! 1158:
! 1159: gsl_sf_result argument;
! 1160: gsl_sf_result ln_module;
! 1161: gsl_sf_result resultat;
! 1162:
! 1163: int statut;
! 1164:
! 1165: struct_liste_chainee *l_element_courant;
! 1166: struct_liste_chainee *l_element_precedent;
! 1167:
! 1168: struct_objet *s_copie_argument;
! 1169: struct_objet *s_objet_argument;
! 1170: struct_objet *s_objet_resultat;
! 1171:
! 1172: (*s_etat_processus).erreur_execution = d_ex;
! 1173:
! 1174: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1175: {
! 1176: printf("\n GAMMA ");
! 1177:
! 1178: if ((*s_etat_processus).langue == 'F')
! 1179: {
! 1180: printf("(fonction gamma)\n\n");
! 1181: }
! 1182: else
! 1183: {
! 1184: printf("(gamma function)\n\n");
! 1185: }
! 1186:
! 1187: printf(" 1: %s, %s\n", d_INT, d_REL);
! 1188: printf("-> 1: %s\n\n", d_REL);
! 1189:
! 1190: printf(" 1: %s\n", d_CPL);
! 1191: printf("-> 1: %s\n\n", d_CPL);
! 1192:
! 1193: printf(" 1: %s, %s\n", d_NOM, d_ALG);
! 1194: printf("-> 1: %s\n\n", d_ALG);
! 1195:
! 1196: printf(" 1: %s\n", d_RPN);
! 1197: printf("-> 1: %s\n", d_RPN);
! 1198:
! 1199: return;
! 1200: }
! 1201: else if ((*s_etat_processus).test_instruction == 'Y')
! 1202: {
! 1203: (*s_etat_processus).nombre_arguments = 1;
! 1204: return;
! 1205: }
! 1206:
! 1207: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1208: {
! 1209: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 1210: {
! 1211: return;
! 1212: }
! 1213: }
! 1214:
! 1215: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1216: &s_objet_argument) == d_erreur)
! 1217: {
! 1218: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1219: return;
! 1220: }
! 1221:
! 1222: statut = GSL_SUCCESS;
! 1223:
! 1224: /*
! 1225: --------------------------------------------------------------------------------
! 1226: Entier ou réel
! 1227: --------------------------------------------------------------------------------
! 1228: */
! 1229:
! 1230: if (((*s_objet_argument).type == INT) ||
! 1231: ((*s_objet_argument).type == REL))
! 1232: {
! 1233: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
! 1234: {
! 1235: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1236: return;
! 1237: }
! 1238:
! 1239: if ((*s_objet_argument).type == INT)
! 1240: {
! 1241: argument_reel = (*((integer8 *) (*s_objet_argument).objet));
! 1242: }
! 1243: else
! 1244: {
! 1245: argument_reel = (*((real8 *) (*s_objet_argument).objet));
! 1246: }
! 1247:
! 1248: statut = gsl_sf_gamma_e(argument_reel, &resultat);
! 1249:
! 1250: (*((real8 *) (*s_objet_resultat).objet)) = resultat.val;
! 1251: }
! 1252:
! 1253: /*
! 1254: --------------------------------------------------------------------------------
! 1255: Complexe
! 1256: --------------------------------------------------------------------------------
! 1257: */
! 1258:
! 1259: else if ((*s_objet_argument).type == CPL)
! 1260: {
! 1261: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
! 1262: {
! 1263: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1264: return;
! 1265: }
! 1266:
! 1267: argument_reel = (*((complex16 *) (*s_objet_argument).objet))
! 1268: .partie_reelle;
! 1269: argument_imaginaire = (*((complex16 *) (*s_objet_argument).objet))
! 1270: .partie_imaginaire;
! 1271:
! 1272: statut = gsl_sf_lngamma_complex_e(argument_reel, argument_imaginaire,
! 1273: &ln_module, &argument);
! 1274:
! 1275: (*((complex16 *) (*s_objet_resultat).objet)).partie_reelle =
! 1276: exp(ln_module.val) * cos(argument.val);
! 1277: (*((complex16 *) (*s_objet_resultat).objet)).partie_imaginaire =
! 1278: exp(ln_module.val) * sin(argument.val);
! 1279: }
! 1280:
! 1281: /*
! 1282: --------------------------------------------------------------------------------
! 1283: Nom
! 1284: --------------------------------------------------------------------------------
! 1285: */
! 1286:
! 1287: else if ((*s_objet_argument).type == NOM)
! 1288: {
! 1289: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
! 1290: {
! 1291: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1292: return;
! 1293: }
! 1294:
! 1295: if (((*s_objet_resultat).objet =
! 1296: allocation_maillon(s_etat_processus)) == NULL)
! 1297: {
! 1298: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1299: return;
! 1300: }
! 1301:
! 1302: l_element_courant = (*s_objet_resultat).objet;
! 1303:
! 1304: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1305: == NULL)
! 1306: {
! 1307: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1308: return;
! 1309: }
! 1310:
! 1311: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1312: .nombre_arguments = 0;
! 1313: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1314: .fonction = instruction_vers_niveau_superieur;
! 1315:
! 1316: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1317: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 1318: {
! 1319: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1320: return;
! 1321: }
! 1322:
! 1323: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1324: .nom_fonction, "<<");
! 1325:
! 1326: if (((*l_element_courant).suivant =
! 1327: allocation_maillon(s_etat_processus)) == NULL)
! 1328: {
! 1329: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1330: return;
! 1331: }
! 1332:
! 1333: l_element_courant = (*l_element_courant).suivant;
! 1334: (*l_element_courant).donnee = s_objet_argument;
! 1335:
! 1336: if (((*l_element_courant).suivant =
! 1337: allocation_maillon(s_etat_processus)) == NULL)
! 1338: {
! 1339: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1340: return;
! 1341: }
! 1342:
! 1343: l_element_courant = (*l_element_courant).suivant;
! 1344:
! 1345: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1346: == NULL)
! 1347: {
! 1348: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1349: return;
! 1350: }
! 1351:
! 1352: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1353: .nombre_arguments = 1;
! 1354: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1355: .fonction = instruction_gamma;
! 1356:
! 1357: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1358: .nom_fonction = malloc(6 * sizeof(unsigned char))) == NULL)
! 1359: {
! 1360: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1361: return;
! 1362: }
! 1363:
! 1364: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1365: .nom_fonction, "GAMMA");
! 1366:
! 1367: if (((*l_element_courant).suivant =
! 1368: allocation_maillon(s_etat_processus)) == NULL)
! 1369: {
! 1370: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1371: return;
! 1372: }
! 1373:
! 1374: l_element_courant = (*l_element_courant).suivant;
! 1375:
! 1376: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1377: == NULL)
! 1378: {
! 1379: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1380: return;
! 1381: }
! 1382:
! 1383: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1384: .nombre_arguments = 0;
! 1385: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1386: .fonction = instruction_vers_niveau_inferieur;
! 1387:
! 1388: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1389: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 1390: {
! 1391: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1392: return;
! 1393: }
! 1394:
! 1395: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1396: .nom_fonction, ">>");
! 1397:
! 1398: (*l_element_courant).suivant = NULL;
! 1399: s_objet_argument = NULL;
! 1400: }
! 1401:
! 1402: /*
! 1403: --------------------------------------------------------------------------------
! 1404: Expression
! 1405: --------------------------------------------------------------------------------
! 1406: */
! 1407:
! 1408: else if (((*s_objet_argument).type == ALG) ||
! 1409: ((*s_objet_argument).type == RPN))
! 1410: {
! 1411: if ((s_copie_argument = copie_objet(s_etat_processus,
! 1412: s_objet_argument, 'N')) == NULL)
! 1413: {
! 1414: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1415: return;
! 1416: }
! 1417:
! 1418: l_element_courant = (struct_liste_chainee *)
! 1419: (*s_copie_argument).objet;
! 1420: l_element_precedent = l_element_courant;
! 1421:
! 1422: while((*l_element_courant).suivant != NULL)
! 1423: {
! 1424: l_element_precedent = l_element_courant;
! 1425: l_element_courant = (*l_element_courant).suivant;
! 1426: }
! 1427:
! 1428: if (((*l_element_precedent).suivant =
! 1429: allocation_maillon(s_etat_processus)) == NULL)
! 1430: {
! 1431: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1432: return;
! 1433: }
! 1434:
! 1435: if (((*(*l_element_precedent).suivant).donnee =
! 1436: allocation(s_etat_processus, FCT)) == NULL)
! 1437: {
! 1438: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1439: return;
! 1440: }
! 1441:
! 1442: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
! 1443: .donnee).objet)).nombre_arguments = 1;
! 1444: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
! 1445: .donnee).objet)).fonction = instruction_gamma;
! 1446:
! 1447: if (((*((struct_fonction *) (*(*(*l_element_precedent)
! 1448: .suivant).donnee).objet)).nom_fonction =
! 1449: malloc(6 * sizeof(unsigned char))) == NULL)
! 1450: {
! 1451: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1452: return;
! 1453: }
! 1454:
! 1455: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
! 1456: .suivant).donnee).objet)).nom_fonction, "GAMMA");
! 1457:
! 1458: (*(*l_element_precedent).suivant).suivant = l_element_courant;
! 1459:
! 1460: s_objet_resultat = s_copie_argument;
! 1461: }
! 1462:
! 1463: /*
! 1464: --------------------------------------------------------------------------------
! 1465: Argument absurde
! 1466: --------------------------------------------------------------------------------
! 1467: */
! 1468:
! 1469: else
! 1470: {
! 1471: liberation(s_etat_processus, s_objet_argument);
! 1472:
! 1473: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1474: return;
! 1475: }
! 1476:
! 1477: if (statut != GSL_SUCCESS)
! 1478: {
! 1479: traitement_asynchrone_exceptions_gsl(s_etat_processus);
! 1480: liberation(s_etat_processus, s_objet_resultat);
! 1481: }
! 1482: else
! 1483: {
! 1484: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1485: s_objet_resultat) == d_erreur)
! 1486: {
! 1487: return;
! 1488: }
! 1489: }
! 1490:
! 1491: liberation(s_etat_processus, s_objet_argument);
! 1492:
! 1493: return;
! 1494: }
! 1495:
! 1496: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>