Annotation of rpl/src/instructions_d4.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 'delete'
! 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_delete(struct_processus *s_etat_processus)
! 40: {
! 41: file *fichier;
! 42:
! 43: logical1 erreur;
! 44: logical1 existence;
! 45: logical1 ouverture;
! 46:
! 47: struct_objet *s_objet_argument;
! 48:
! 49: struct flock lock;
! 50:
! 51: struct stat requete;
! 52:
! 53: unsigned long unite;
! 54:
! 55: (*s_etat_processus).erreur_execution = d_ex;
! 56:
! 57: if ((*s_etat_processus).affichage_arguments == 'Y')
! 58: {
! 59: printf("\n DELETE ");
! 60:
! 61: if ((*s_etat_processus).langue == 'F')
! 62: {
! 63: printf("(effacement d'un fichier)\n\n");
! 64: }
! 65: else
! 66: {
! 67: printf("(delete a file)\n\n");
! 68: }
! 69:
! 70: printf(" 1: %s\n", d_CHN);
! 71:
! 72: return;
! 73: }
! 74: else if ((*s_etat_processus).test_instruction == 'Y')
! 75: {
! 76: (*s_etat_processus).nombre_arguments = -1;
! 77: return;
! 78: }
! 79:
! 80: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 81: {
! 82: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 83: {
! 84: return;
! 85: }
! 86: }
! 87:
! 88: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 89: &s_objet_argument) == d_erreur)
! 90: {
! 91: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 92: return;
! 93: }
! 94:
! 95: if ((*s_objet_argument).type == CHN)
! 96: {
! 97: if (stat((unsigned char *) (*s_objet_argument).objet,
! 98: &requete) != 0)
! 99: {
! 100: liberation(s_etat_processus, s_objet_argument);
! 101:
! 102: (*s_etat_processus).erreur_execution =
! 103: d_ex_erreur_acces_fichier;
! 104: return;
! 105: }
! 106:
! 107: if (S_ISREG(requete.st_mode)) // Fichier régulier
! 108: {
! 109: if ((fichier = fopen((unsigned char *)
! 110: (*s_objet_argument).objet, "r+")) == NULL)
! 111: {
! 112: liberation(s_etat_processus, s_objet_argument);
! 113:
! 114: (*s_etat_processus).erreur_execution =
! 115: d_ex_erreur_acces_fichier;
! 116: return;
! 117: }
! 118:
! 119: lock.l_type = F_WRLCK;
! 120: lock.l_whence = SEEK_SET;
! 121: lock.l_start = 0;
! 122: lock.l_len = 0;
! 123: lock.l_pid = getpid();
! 124:
! 125: if (fcntl(fileno(fichier), F_GETLK, &lock) == -1)
! 126: {
! 127: if (fclose(fichier) != 0)
! 128: {
! 129: liberation(s_etat_processus, s_objet_argument);
! 130:
! 131: (*s_etat_processus).erreur_execution =
! 132: d_ex_erreur_acces_fichier;
! 133: return;
! 134: }
! 135:
! 136: liberation(s_etat_processus, s_objet_argument);
! 137:
! 138: (*s_etat_processus).erreur_execution =
! 139: d_ex_erreur_acces_fichier;
! 140: return;
! 141: }
! 142:
! 143: if (lock.l_type != F_UNLCK)
! 144: {
! 145: liberation(s_etat_processus, s_objet_argument);
! 146:
! 147: (*s_etat_processus).erreur_execution =
! 148: d_ex_erreur_acces_fichier;
! 149: return;
! 150: }
! 151:
! 152: erreur = caracteristiques_fichier(s_etat_processus,
! 153: (unsigned char *) (*s_objet_argument).objet,
! 154: &existence, &ouverture, &unite);
! 155:
! 156: if ((erreur != d_absence_erreur) || (ouverture == d_vrai))
! 157: {
! 158: liberation(s_etat_processus, s_objet_argument);
! 159:
! 160: (*s_etat_processus).erreur_execution =
! 161: d_ex_erreur_acces_fichier;
! 162: return;
! 163: }
! 164:
! 165: if (destruction_fichier((unsigned char *)
! 166: (*s_objet_argument).objet) == d_erreur)
! 167: {
! 168: liberation(s_etat_processus, s_objet_argument);
! 169:
! 170: (*s_etat_processus).erreur_execution =
! 171: d_ex_erreur_acces_fichier;
! 172: return;
! 173: }
! 174: }
! 175: else // Socket
! 176: {
! 177: if (unlink((unsigned char *) (*s_objet_argument).objet) != 0)
! 178: {
! 179: liberation(s_etat_processus, s_objet_argument);
! 180:
! 181: (*s_etat_processus).erreur_execution =
! 182: d_ex_erreur_acces_fichier;
! 183: return;
! 184: }
! 185: }
! 186: }
! 187: else
! 188: {
! 189: liberation(s_etat_processus, s_objet_argument);
! 190:
! 191: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 192: return;
! 193: }
! 194:
! 195: liberation(s_etat_processus, s_objet_argument);
! 196:
! 197: return;
! 198: }
! 199:
! 200:
! 201: /*
! 202: ================================================================================
! 203: Fonction 'date'
! 204: ================================================================================
! 205: Entrées : pointeur sur une structure struct_processus
! 206: --------------------------------------------------------------------------------
! 207: Sorties :
! 208: --------------------------------------------------------------------------------
! 209: Effets de bord : néant
! 210: ================================================================================
! 211: */
! 212:
! 213: void
! 214: instruction_date(struct_processus *s_etat_processus)
! 215: {
! 216: struct_objet *s_objet;
! 217:
! 218: struct timeval horodatage;
! 219:
! 220: (*s_etat_processus).erreur_execution = d_ex;
! 221:
! 222: if ((*s_etat_processus).affichage_arguments == 'Y')
! 223: {
! 224: printf("\n DATE ");
! 225:
! 226: if ((*s_etat_processus).langue == 'F')
! 227: {
! 228: printf("(information sur la date et l'heure)\n\n");
! 229: }
! 230: else
! 231: {
! 232: printf("(date and time)\n\n");
! 233: }
! 234:
! 235: printf("-> 1: %s\n", d_LST);
! 236:
! 237: return;
! 238: }
! 239: else if ((*s_etat_processus).test_instruction == 'Y')
! 240: {
! 241: (*s_etat_processus).nombre_arguments = -1;
! 242: return;
! 243: }
! 244:
! 245: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 246: {
! 247: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 248: {
! 249: return;
! 250: }
! 251: }
! 252:
! 253: gettimeofday(&horodatage, NULL);
! 254:
! 255: if ((s_objet = formateur_date(s_etat_processus, &horodatage)) == NULL)
! 256: {
! 257: return;
! 258: }
! 259:
! 260: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 261: s_objet) == d_erreur)
! 262: {
! 263: return;
! 264: }
! 265:
! 266: return;
! 267: }
! 268:
! 269:
! 270: /*
! 271: ================================================================================
! 272: Fonction 'drws'
! 273: ================================================================================
! 274: Entrées : pointeur sur une structure struct_processus
! 275: --------------------------------------------------------------------------------
! 276: Sorties :
! 277: --------------------------------------------------------------------------------
! 278: Effets de bord : néant
! 279: ================================================================================
! 280: */
! 281:
! 282: void
! 283: instruction_drws(struct_processus *s_etat_processus)
! 284: {
! 285: file *fichier;
! 286:
! 287: int dimensions;
! 288:
! 289: logical1 presence_variable;
! 290: logical1 matrice_entiere;
! 291:
! 292: long i;
! 293:
! 294: struct_objet *s_objet_statistique;
! 295:
! 296: unsigned char *nom_fichier;
! 297:
! 298: unsigned long j;
! 299:
! 300: struct_fichier_graphique *l_fichier_courant;
! 301: struct_fichier_graphique *l_fichier_precedent;
! 302:
! 303: (*s_etat_processus).erreur_execution = d_ex;
! 304:
! 305: if ((*s_etat_processus).affichage_arguments == 'Y')
! 306: {
! 307: printf("\n DRWS ");
! 308:
! 309: if ((*s_etat_processus).langue == 'F')
! 310: {
! 311: printf("(affiche une série statistique)\n\n");
! 312: printf(" Aucun argument\n");
! 313: }
! 314: else
! 315: {
! 316: printf("(draw statistical data)\n\n");
! 317: printf(" No argument\n");
! 318: }
! 319:
! 320: return;
! 321: }
! 322: else if ((*s_etat_processus).test_instruction == 'Y')
! 323: {
! 324: (*s_etat_processus).nombre_arguments = -1;
! 325: return;
! 326: }
! 327:
! 328: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 329: {
! 330: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 331: {
! 332: return;
! 333: }
! 334: }
! 335:
! 336: /*
! 337: * Vérification de la présence de la matrice statistique
! 338: */
! 339:
! 340: if (recherche_variable(s_etat_processus, ds_sdat) == d_faux)
! 341: {
! 342: /*
! 343: * Aucune variable ds_sdat n'existe.
! 344: */
! 345:
! 346: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
! 347: (*s_etat_processus).erreur_systeme = d_es;
! 348:
! 349: return;
! 350: }
! 351:
! 352: i = (*s_etat_processus).position_variable_courante;
! 353: presence_variable = d_faux;
! 354:
! 355: while(i >= 0)
! 356: {
! 357: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 358: ds_sdat) == 0) && ((*s_etat_processus)
! 359: .s_liste_variables[i].niveau == 1))
! 360: {
! 361: presence_variable = d_vrai;
! 362: break;
! 363: }
! 364:
! 365: i--;
! 366: }
! 367:
! 368: if (presence_variable == d_faux)
! 369: {
! 370: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
! 371: return;
! 372: }
! 373:
! 374: if ((s_objet_statistique = (*s_etat_processus).s_liste_variables[i].objet)
! 375: == NULL)
! 376: {
! 377: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
! 378: return;
! 379: }
! 380:
! 381: if ((*s_objet_statistique).type == MIN)
! 382: {
! 383: matrice_entiere = d_vrai;
! 384: }
! 385: else if ((*s_objet_statistique).type == MRL)
! 386: {
! 387: matrice_entiere = d_faux;
! 388: }
! 389: else
! 390: {
! 391: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 392: return;
! 393: }
! 394:
! 395: /*
! 396: * Création du fichier graphique temporaire
! 397: */
! 398:
! 399: if ((nom_fichier = creation_nom_fichier(s_etat_processus,
! 400: (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
! 401: {
! 402: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 403: return;
! 404: }
! 405:
! 406: if ((fichier = fopen(nom_fichier, "w+")) == NULL)
! 407: {
! 408: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 409: return;
! 410: }
! 411:
! 412: switch((*((struct_matrice *) (*s_objet_statistique).objet)).nombre_colonnes)
! 413: {
! 414:
! 415: /*
! 416: * Une seule colonne
! 417: */
! 418:
! 419: case 1 :
! 420: {
! 421: dimensions = 2;
! 422:
! 423: for(j = 0; j < (*((struct_matrice *) (*s_objet_statistique).objet))
! 424: .nombre_lignes; j++)
! 425: {
! 426: if (matrice_entiere == d_vrai)
! 427: {
! 428: if (fprintf(fichier, "%f %f\n", (double) j, (double)
! 429: ((integer8 **) (*((struct_matrice *)
! 430: (*s_objet_statistique).objet)).tableau)[j][0]) < 0)
! 431: {
! 432: (*s_etat_processus).erreur_systeme =
! 433: d_es_erreur_fichier;
! 434: return;
! 435: }
! 436: }
! 437: else
! 438: {
! 439: if (fprintf(fichier, "%f %f\n", (double) j, (double)
! 440: ((real8 **) (*((struct_matrice *)
! 441: (*s_objet_statistique).objet)).tableau)[j][0]) < 0)
! 442: {
! 443: (*s_etat_processus).erreur_systeme =
! 444: d_es_erreur_fichier;
! 445: return;
! 446: }
! 447: }
! 448: }
! 449:
! 450: break;
! 451: }
! 452:
! 453: /*
! 454: * Deux colonnes ou plus
! 455: */
! 456:
! 457: default :
! 458: {
! 459: dimensions = 2;
! 460:
! 461: if (((*s_etat_processus).colonne_statistique_1 < 1) ||
! 462: ((*s_etat_processus).colonne_statistique_2 < 1) ||
! 463: ((*s_etat_processus).colonne_statistique_1 > (signed long)
! 464: (*((struct_matrice *) (*s_objet_statistique).objet))
! 465: .nombre_colonnes) ||
! 466: ((*s_etat_processus).colonne_statistique_2 > (signed long)
! 467: (*((struct_matrice *) (*s_objet_statistique).objet))
! 468: .nombre_colonnes))
! 469: {
! 470: if (fclose(fichier) != 0)
! 471: {
! 472: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 473: return;
! 474: }
! 475:
! 476: if (destruction_fichier(nom_fichier) == d_erreur)
! 477: {
! 478: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 479: return;
! 480: }
! 481:
! 482: free(nom_fichier);
! 483:
! 484: (*s_etat_processus).erreur_execution =
! 485: d_ex_observations_inexistantes;
! 486: return;
! 487: }
! 488:
! 489: for(j = 0; j < (*((struct_matrice *) (*s_objet_statistique).objet))
! 490: .nombre_lignes; j++)
! 491: {
! 492: if (matrice_entiere == d_vrai)
! 493: {
! 494: if (fprintf(fichier, "%f %f\n", (double) ((integer8 **)
! 495: (*((struct_matrice *) (*s_objet_statistique).objet))
! 496: .tableau)[j][(*s_etat_processus)
! 497: .colonne_statistique_1 - 1], (double) ((integer8 **)
! 498: (*((struct_matrice *) (*s_objet_statistique).objet))
! 499: .tableau)[j][(*s_etat_processus)
! 500: .colonne_statistique_2 - 1]) < 0)
! 501: {
! 502: (*s_etat_processus).erreur_systeme =
! 503: d_es_erreur_fichier;
! 504: return;
! 505: }
! 506: }
! 507: else
! 508: {
! 509: if (fprintf(fichier, "%f %f\n", (double) ((real8 **)
! 510: (*((struct_matrice *) (*s_objet_statistique).objet))
! 511: .tableau)[j][(*s_etat_processus)
! 512: .colonne_statistique_1 - 1], (double) ((real8 **)
! 513: (*((struct_matrice *) (*s_objet_statistique).objet))
! 514: .tableau)[j][(*s_etat_processus)
! 515: .colonne_statistique_2 - 1]) < 0)
! 516: {
! 517: (*s_etat_processus).erreur_systeme =
! 518: d_es_erreur_fichier;
! 519: return;
! 520: }
! 521: }
! 522: }
! 523:
! 524: break;
! 525: }
! 526: }
! 527:
! 528: /*
! 529: * Fermeture du fichier graphique
! 530: */
! 531:
! 532: if (fclose(fichier) != 0)
! 533: {
! 534: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 535: return;
! 536: }
! 537:
! 538: /*
! 539: * Chaînage du fichier temporaire à la liste des fichiers graphiques
! 540: */
! 541:
! 542: l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
! 543:
! 544: if (l_fichier_courant == NULL)
! 545: {
! 546: if (((*s_etat_processus).fichiers_graphiques = malloc(
! 547: sizeof(struct_fichier_graphique))) == NULL)
! 548: {
! 549: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 550: return;
! 551: }
! 552:
! 553: (*(*s_etat_processus).fichiers_graphiques).suivant = NULL;
! 554: (*(*s_etat_processus).fichiers_graphiques).nom = nom_fichier;
! 555: (*(*s_etat_processus).fichiers_graphiques).legende = NULL;
! 556: (*(*s_etat_processus).fichiers_graphiques).dimensions = dimensions;
! 557: (*(*s_etat_processus).fichiers_graphiques).presence_axes = d_faux;
! 558: (*(*s_etat_processus).fichiers_graphiques).systeme_axes =
! 559: (*s_etat_processus).systeme_axes;
! 560: strcpy((*(*s_etat_processus).fichiers_graphiques).type,
! 561: (*s_etat_processus).type_trace_sigma);
! 562: }
! 563: else
! 564: {
! 565: while(l_fichier_courant != NULL)
! 566: {
! 567: if ((*l_fichier_courant).dimensions != dimensions)
! 568: {
! 569: (*s_etat_processus).erreur_execution =
! 570: d_ex_dimensions_differentes;
! 571: return;
! 572: }
! 573:
! 574: l_fichier_precedent = l_fichier_courant;
! 575: l_fichier_courant = (*l_fichier_courant).suivant;
! 576: }
! 577:
! 578: l_fichier_courant = l_fichier_precedent;
! 579:
! 580: if (((*l_fichier_courant).suivant = malloc(
! 581: sizeof(struct_fichier_graphique))) == NULL)
! 582: {
! 583: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 584: return;
! 585: }
! 586:
! 587: l_fichier_courant = (*l_fichier_courant).suivant;
! 588:
! 589: (*l_fichier_courant).suivant = NULL;
! 590: (*l_fichier_courant).nom = nom_fichier;
! 591: (*l_fichier_courant).legende = NULL;
! 592: (*l_fichier_courant).dimensions = dimensions;
! 593: (*l_fichier_courant).presence_axes = d_faux;
! 594: (*l_fichier_courant).systeme_axes = (*s_etat_processus).systeme_axes;
! 595: strcpy((*l_fichier_courant).type, (*s_etat_processus).type_trace_sigma);
! 596: }
! 597:
! 598: /*
! 599: * Affichage du graphique
! 600: */
! 601:
! 602: appel_gnuplot(s_etat_processus, 'N');
! 603: (*s_etat_processus).erreur_execution = d_ex;
! 604: (*s_etat_processus).exception = d_ep;
! 605:
! 606: return;
! 607: }
! 608:
! 609:
! 610: /*
! 611: ================================================================================
! 612: Fonction 'decr'
! 613: ================================================================================
! 614: Entrées :
! 615: --------------------------------------------------------------------------------
! 616: Sorties :
! 617: --------------------------------------------------------------------------------
! 618: Effets de bord : néant
! 619: ================================================================================
! 620: */
! 621:
! 622: void
! 623: instruction_decr(struct_processus *s_etat_processus)
! 624: {
! 625: logical1 variable_partagee;
! 626:
! 627: struct_objet *s_copie_argument;
! 628: struct_objet *s_objet_argument;
! 629:
! 630: (*s_etat_processus).erreur_execution = d_ex;
! 631:
! 632: if ((*s_etat_processus).affichage_arguments == 'Y')
! 633: {
! 634: printf("\n DECR ");
! 635:
! 636: if ((*s_etat_processus).langue == 'F')
! 637: {
! 638: printf("(décrémentation)\n\n");
! 639: }
! 640: else
! 641: {
! 642: printf("(decrementation)\n\n");
! 643: }
! 644:
! 645: printf(" 1: %s\n", d_INT);
! 646: printf("-> 1: %s\n\n", d_INT);
! 647:
! 648: printf(" 1: %s\n", d_NOM);
! 649:
! 650: return;
! 651: }
! 652: else if ((*s_etat_processus).test_instruction == 'Y')
! 653: {
! 654: (*s_etat_processus).nombre_arguments = -1;
! 655: return;
! 656: }
! 657:
! 658: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 659: {
! 660: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 661: {
! 662: return;
! 663: }
! 664: }
! 665:
! 666: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 667: &s_objet_argument) == d_erreur)
! 668: {
! 669: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 670: return;
! 671: }
! 672:
! 673: if ((*s_objet_argument).type == INT)
! 674: {
! 675: if ((s_copie_argument = copie_objet(s_etat_processus,
! 676: s_objet_argument, 'O')) == NULL)
! 677: {
! 678: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 679: return;
! 680: }
! 681:
! 682: liberation(s_etat_processus, s_objet_argument);
! 683: s_objet_argument = s_copie_argument;
! 684:
! 685: (*((integer8 *) (*s_objet_argument).objet))--;
! 686:
! 687: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 688: s_objet_argument) == d_erreur)
! 689: {
! 690: return;
! 691: }
! 692: }
! 693: else if ((*s_objet_argument).type == NOM)
! 694: {
! 695: if (recherche_variable(s_etat_processus, (*((struct_nom *)
! 696: (*s_objet_argument).objet)).nom) == d_faux)
! 697: {
! 698: (*s_etat_processus).erreur_systeme = d_es;
! 699: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 700:
! 701: return;
! 702: }
! 703:
! 704: liberation(s_etat_processus, s_objet_argument);
! 705:
! 706: if ((*s_etat_processus).s_liste_variables
! 707: [(*s_etat_processus).position_variable_courante]
! 708: .variable_verrouillee == d_vrai)
! 709: {
! 710: (*s_etat_processus).erreur_execution =
! 711: d_ex_variable_verrouillee;
! 712: return;
! 713: }
! 714:
! 715: if ((*s_etat_processus).s_liste_variables
! 716: [(*s_etat_processus).position_variable_courante].objet
! 717: == NULL)
! 718: {
! 719: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 720: .s_liste_variables_partagees).mutex)) != 0)
! 721: {
! 722: (*s_etat_processus).erreur_systeme = d_es_processus;
! 723: return;
! 724: }
! 725:
! 726: if (recherche_variable_partagee(s_etat_processus,
! 727: (*s_etat_processus).s_liste_variables
! 728: [(*s_etat_processus).position_variable_courante].nom,
! 729: (*s_etat_processus).s_liste_variables
! 730: [(*s_etat_processus).position_variable_courante]
! 731: .variable_partagee, (*s_etat_processus).s_liste_variables
! 732: [(*s_etat_processus).position_variable_courante]
! 733: .origine) == d_faux)
! 734: {
! 735: (*s_etat_processus).erreur_systeme = d_es;
! 736: (*s_etat_processus).erreur_execution =
! 737: d_ex_variable_non_definie;
! 738:
! 739: return;
! 740: }
! 741:
! 742: s_objet_argument = (*(*s_etat_processus)
! 743: .s_liste_variables_partagees).table
! 744: [(*(*s_etat_processus).s_liste_variables_partagees)
! 745: .position_variable].objet;
! 746: variable_partagee = d_vrai;
! 747: }
! 748: else
! 749: {
! 750: s_objet_argument = (*s_etat_processus).s_liste_variables
! 751: [(*s_etat_processus).position_variable_courante].objet;
! 752: variable_partagee = d_faux;
! 753: }
! 754:
! 755: if ((s_copie_argument = copie_objet(s_etat_processus,
! 756: s_objet_argument, 'O')) == NULL)
! 757: {
! 758: if (variable_partagee == d_vrai)
! 759: {
! 760: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 761: .s_liste_variables_partagees).mutex)) != 0)
! 762: {
! 763: (*s_etat_processus).erreur_systeme = d_es_processus;
! 764: return;
! 765: }
! 766: }
! 767:
! 768: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 769: return;
! 770: }
! 771:
! 772: liberation(s_etat_processus, s_objet_argument);
! 773:
! 774: if (variable_partagee == d_vrai)
! 775: {
! 776: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 777: .position_variable_courante].objet = NULL;
! 778: (*(*s_etat_processus)
! 779: .s_liste_variables_partagees).table
! 780: [(*(*s_etat_processus).s_liste_variables_partagees)
! 781: .position_variable].objet = s_copie_argument;
! 782: }
! 783: else
! 784: {
! 785: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 786: .position_variable_courante].objet = s_copie_argument;
! 787: }
! 788:
! 789: if ((*s_copie_argument).type == INT)
! 790: {
! 791: (*((integer8 *) (*s_copie_argument).objet))--;
! 792:
! 793: if (variable_partagee == d_vrai)
! 794: {
! 795: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 796: .s_liste_variables_partagees).mutex)) != 0)
! 797: {
! 798: (*s_etat_processus).erreur_systeme = d_es_processus;
! 799: return;
! 800: }
! 801: }
! 802: }
! 803: else
! 804: {
! 805: if (variable_partagee == d_vrai)
! 806: {
! 807: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 808: .s_liste_variables_partagees).mutex)) != 0)
! 809: {
! 810: (*s_etat_processus).erreur_systeme = d_es_processus;
! 811: return;
! 812: }
! 813: }
! 814:
! 815: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 816: return;
! 817: }
! 818: }
! 819: else
! 820: {
! 821: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 822:
! 823: liberation(s_etat_processus, s_objet_argument);
! 824: return;
! 825: }
! 826:
! 827: return;
! 828: }
! 829:
! 830: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>