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