Annotation of rpl/src/instructions_r6.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 'recv'
! 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_recv(struct_processus *s_etat_processus)
! 40: {
! 41: integer8 nombre_donnees;
! 42:
! 43: sig_atomic_t registre_stop;
! 44:
! 45: ssize_t longueur_ecriture;
! 46:
! 47: struct_liste_chainee *l_element_courant;
! 48:
! 49: struct_objet *s_objet_argument;
! 50: struct_objet *s_objet_resultat;
! 51:
! 52: struct sigaction action;
! 53: struct sigaction registre;
! 54:
! 55: (*s_etat_processus).erreur_execution = d_ex;
! 56:
! 57: if ((*s_etat_processus).affichage_arguments == 'Y')
! 58: {
! 59: printf("\n RECV ");
! 60:
! 61: if ((*s_etat_processus).langue == 'F')
! 62: {
! 63: printf("(réception de données d'un processus fils)\n\n");
! 64: }
! 65: else
! 66: {
! 67: printf("(data reception from child process)\n\n");
! 68: }
! 69:
! 70: printf(" 1: %s\n", d_PRC);
! 71: printf("-> 1: %s (0)\n\n", d_INT);
! 72:
! 73: printf(" 1: %s\n", d_PRC);
! 74: printf("-> 2: %s, %s, %s, %s, %s, %s,\n"
! 75: " %s, %s, %s, %s, %s,\n"
! 76: " %s, %s, %s, %s\n",
! 77: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
! 78: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN);
! 79: printf(" 1: %s (-1)\n", d_INT);
! 80:
! 81: return;
! 82: }
! 83: else if ((*s_etat_processus).test_instruction == 'Y')
! 84: {
! 85: (*s_etat_processus).nombre_arguments = -1;
! 86: return;
! 87: }
! 88:
! 89: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 90: {
! 91: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 92: {
! 93: return;
! 94: }
! 95: }
! 96:
! 97: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 98: &s_objet_argument) == d_erreur)
! 99: {
! 100: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 101: return;
! 102: }
! 103:
! 104: if ((*s_objet_argument).type == PRC)
! 105: {
! 106: /*
! 107: * Le champ de la structure nombre_objets_dans_pipe à jour
! 108: * est celui présent dans *s_etat_processus et non celui
! 109: * de la structure présente dans la pile opérationnelle.
! 110: */
! 111:
! 112: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 113: {
! 114: (*s_etat_processus).erreur_systeme_processus_fils =
! 115: d_es_processus;
! 116: return;
! 117: }
! 118:
! 119: l_element_courant = (struct_liste_chainee *)
! 120: (*s_etat_processus).l_base_pile_processus;
! 121: nombre_donnees = -1;
! 122:
! 123: while(l_element_courant != NULL)
! 124: {
! 125: if ((*(*((struct_processus_fils *) (*s_objet_argument).objet))
! 126: .thread).processus_detache == d_vrai)
! 127: {
! 128: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 129: .donnee).objet)).thread).processus_detache == d_faux)
! 130: {
! 131: l_element_courant = (*l_element_courant).suivant;
! 132: continue;
! 133: }
! 134:
! 135: if ((*(*((struct_processus_fils *) (*s_objet_argument).objet))
! 136: .thread).pid == (*(*((struct_processus_fils *)
! 137: (*(*l_element_courant).donnee).objet)).thread).pid)
! 138: {
! 139: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
! 140: (*s_objet_argument).objet)).thread).mutex)) != 0)
! 141: {
! 142: (*s_etat_processus).erreur_systeme = d_es_processus;
! 143: return;
! 144: }
! 145:
! 146: nombre_donnees = (*(*((struct_processus_fils *)
! 147: (*(*l_element_courant).donnee).objet)).thread)
! 148: .nombre_objets_dans_pipe;
! 149:
! 150: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
! 151: (*s_objet_argument).objet)).thread).mutex)) != 0)
! 152: {
! 153: (*s_etat_processus).erreur_systeme = d_es_processus;
! 154: return;
! 155: }
! 156:
! 157: break;
! 158: }
! 159: }
! 160: else
! 161: {
! 162: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
! 163: .donnee).objet)).thread).processus_detache == d_vrai)
! 164: {
! 165: l_element_courant = (*l_element_courant).suivant;
! 166: continue;
! 167: }
! 168:
! 169: if ((pthread_equal((*(*((struct_processus_fils *)
! 170: (*s_objet_argument).objet)).thread).tid,
! 171: (*(*((struct_processus_fils *) (*(*l_element_courant)
! 172: .donnee).objet)).thread).tid) != 0) &&
! 173: ((*(*((struct_processus_fils *)
! 174: (*s_objet_argument).objet)).thread).pid ==
! 175: (*(*((struct_processus_fils *) (*(*l_element_courant)
! 176: .donnee).objet)).thread).pid))
! 177: {
! 178: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
! 179: (*s_objet_argument).objet)).thread).mutex)) != 0)
! 180: {
! 181: (*s_etat_processus).erreur_systeme = d_es_processus;
! 182: return;
! 183: }
! 184:
! 185: nombre_donnees = (*(*((struct_processus_fils *)
! 186: (*(*l_element_courant).donnee).objet)).thread)
! 187: .nombre_objets_dans_pipe;
! 188:
! 189: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
! 190: (*s_objet_argument).objet)).thread).mutex)) != 0)
! 191: {
! 192: (*s_etat_processus).erreur_systeme = d_es_processus;
! 193: return;
! 194: }
! 195:
! 196: break;
! 197: }
! 198: }
! 199:
! 200: l_element_courant = (*l_element_courant).suivant;
! 201: }
! 202:
! 203: /*
! 204: * 0 : aucune donnée dans le pipe du processus.
! 205: * -1 : processus absent de la pile
! 206: */
! 207:
! 208: if (nombre_donnees == -1)
! 209: {
! 210: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 211: {
! 212: (*s_etat_processus).erreur_systeme_processus_fils =
! 213: d_es_processus;
! 214: return;
! 215: }
! 216:
! 217: (*s_etat_processus).erreur_execution = d_ex_processus;
! 218: return;
! 219: }
! 220: else if (nombre_donnees == 0)
! 221: {
! 222: /*
! 223: * On empile une valeur nulle
! 224: */
! 225:
! 226: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 227: {
! 228: (*s_etat_processus).erreur_systeme_processus_fils =
! 229: d_es_processus;
! 230: return;
! 231: }
! 232:
! 233: if ((s_objet_resultat = allocation(s_etat_processus, INT))
! 234: == NULL)
! 235: {
! 236: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 237: return;
! 238: }
! 239:
! 240: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
! 241:
! 242: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 243: s_objet_resultat) == d_erreur)
! 244: {
! 245: return;
! 246: }
! 247:
! 248: liberation(s_etat_processus, s_objet_argument);
! 249:
! 250: return;
! 251: }
! 252:
! 253: registre_stop = (*s_etat_processus)
! 254: .var_volatile_traitement_retarde_stop;
! 255: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
! 256:
! 257: if ((*s_etat_processus).profilage == d_vrai)
! 258: {
! 259: profilage(s_etat_processus, "Interprocess or interthread "
! 260: "communications (RECV)");
! 261:
! 262: if ((*s_etat_processus).erreur_systeme != d_es)
! 263: {
! 264: return;
! 265: }
! 266: }
! 267:
! 268: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
! 269: {
! 270: (*s_etat_processus).erreur_systeme = d_es_processus;
! 271: return;
! 272: }
! 273:
! 274: if ((s_objet_resultat = lecture_pipe(s_etat_processus,
! 275: (*(*((struct_processus_fils *) (*s_objet_argument).objet))
! 276: .thread).pipe_objets[0])) == NULL)
! 277: {
! 278: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
! 279: {
! 280: if (errno != EINTR)
! 281: {
! 282: (*s_etat_processus).erreur_systeme = d_es_processus;
! 283: return;
! 284: }
! 285: }
! 286:
! 287: if (registre_stop == 0)
! 288: {
! 289: if ((*s_etat_processus).var_volatile_traitement_retarde_stop
! 290: == -1)
! 291: {
! 292: (*s_etat_processus).var_volatile_requete_arret = -1;
! 293: }
! 294:
! 295: (*s_etat_processus).var_volatile_traitement_retarde_stop
! 296: = registre_stop;
! 297: }
! 298:
! 299: if ((*s_etat_processus).profilage == d_vrai)
! 300: {
! 301: profilage(s_etat_processus, NULL);
! 302: }
! 303:
! 304: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 305: return;
! 306: }
! 307:
! 308: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
! 309: {
! 310: if (errno != EINTR)
! 311: {
! 312: (*s_etat_processus).erreur_systeme = d_es_processus;
! 313: return;
! 314: }
! 315: }
! 316:
! 317: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
! 318: (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0)
! 319: {
! 320: (*s_etat_processus).erreur_systeme = d_es_processus;
! 321: return;
! 322: }
! 323:
! 324: (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet))
! 325: .thread).nombre_objets_dans_pipe--;
! 326:
! 327: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
! 328: (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0)
! 329: {
! 330: (*s_etat_processus).erreur_systeme = d_es_processus;
! 331: return;
! 332: }
! 333:
! 334: action.sa_handler = SIG_IGN;
! 335: action.sa_flags = SA_ONSTACK;
! 336:
! 337: if (sigaction(SIGPIPE, &action, ®istre) != 0)
! 338: {
! 339: if (registre_stop == 0)
! 340: {
! 341: if ((*s_etat_processus).var_volatile_traitement_retarde_stop
! 342: == -1)
! 343: {
! 344: (*s_etat_processus).var_volatile_requete_arret = -1;
! 345: }
! 346:
! 347: (*s_etat_processus).var_volatile_traitement_retarde_stop
! 348: = registre_stop;
! 349: }
! 350:
! 351: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 352:
! 353: if ((*s_etat_processus).profilage == d_vrai)
! 354: {
! 355: profilage(s_etat_processus, NULL);
! 356: }
! 357:
! 358: (*s_etat_processus).erreur_systeme = d_es_signal;
! 359: return;
! 360: }
! 361:
! 362: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
! 363: {
! 364: (*s_etat_processus).erreur_systeme = d_es_processus;
! 365: return;
! 366: }
! 367:
! 368: while((longueur_ecriture = write_atomic(s_etat_processus,
! 369: (*(*((struct_processus_fils *) (*(*l_element_courant)
! 370: .donnee).objet)).thread).pipe_nombre_injections[1], "+",
! 371: sizeof(unsigned char))) != sizeof(unsigned char))
! 372: {
! 373: if (longueur_ecriture == -1)
! 374: {
! 375: // Le processus n'existe plus.
! 376: break;
! 377: }
! 378: }
! 379:
! 380: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
! 381: {
! 382: if (errno != EINTR)
! 383: {
! 384: (*s_etat_processus).erreur_systeme = d_es_processus;
! 385: return;
! 386: }
! 387: }
! 388:
! 389: if ((*s_etat_processus).profilage == d_vrai)
! 390: {
! 391: profilage(s_etat_processus, NULL);
! 392: }
! 393:
! 394: if (registre_stop == 0)
! 395: {
! 396: if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
! 397: {
! 398: (*s_etat_processus).var_volatile_requete_arret = -1;
! 399: }
! 400:
! 401: (*s_etat_processus).var_volatile_traitement_retarde_stop
! 402: = registre_stop;
! 403: }
! 404:
! 405: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
! 406: {
! 407: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 408:
! 409: (*s_etat_processus).erreur_systeme = d_es_signal;
! 410: return;
! 411: }
! 412:
! 413: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 414: {
! 415: (*s_etat_processus).erreur_systeme_processus_fils =
! 416: d_es_processus;
! 417: }
! 418: }
! 419: else
! 420: {
! 421: liberation(s_etat_processus, s_objet_argument);
! 422:
! 423: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 424: return;
! 425: }
! 426:
! 427: liberation(s_etat_processus, s_objet_argument);
! 428:
! 429: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 430: s_objet_resultat) == d_erreur)
! 431: {
! 432: return;
! 433: }
! 434:
! 435: /*
! 436: * On rajoute "-1" dans la pile.
! 437: */
! 438:
! 439: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
! 440: {
! 441: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 442: return;
! 443: }
! 444:
! 445: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
! 446:
! 447: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 448: s_objet_resultat) == d_erreur)
! 449: {
! 450: return;
! 451: }
! 452:
! 453: return;
! 454: }
! 455:
! 456:
! 457: /*
! 458: ================================================================================
! 459: Fonction 'row->'
! 460: ================================================================================
! 461: Entrées :
! 462: --------------------------------------------------------------------------------
! 463: Sorties :
! 464: --------------------------------------------------------------------------------
! 465: Effets de bord : néant
! 466: ================================================================================
! 467: */
! 468:
! 469: void
! 470: instruction_row_fleche(struct_processus *s_etat_processus)
! 471: {
! 472: struct_objet *s_objet;
! 473: struct_objet *s_objet_elementaire;
! 474:
! 475: unsigned long i;
! 476: unsigned long j;
! 477:
! 478: (*s_etat_processus).erreur_execution = d_ex;
! 479:
! 480: if ((*s_etat_processus).affichage_arguments == 'Y')
! 481: {
! 482: printf("\n ROW-> ");
! 483:
! 484: if ((*s_etat_processus).langue == 'F')
! 485: {
! 486: printf("(extraction des lignes d'une matrice)\n\n");
! 487: }
! 488: else
! 489: {
! 490: printf("(extract matrix rows)\n\n");
! 491: }
! 492:
! 493: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
! 494: printf("-> n: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
! 495: printf(" ...\n");
! 496: printf(" 2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
! 497: printf(" 1: %s\n", d_INT);
! 498:
! 499: return;
! 500: }
! 501: else if ((*s_etat_processus).test_instruction == 'Y')
! 502: {
! 503: (*s_etat_processus).nombre_arguments = -1;
! 504: return;
! 505: }
! 506:
! 507: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 508: {
! 509: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 510: {
! 511: return;
! 512: }
! 513: }
! 514:
! 515: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 516: &s_objet) == d_erreur)
! 517: {
! 518: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 519: return;
! 520: }
! 521:
! 522: if ((*s_objet).type == MIN)
! 523: {
! 524: for(i = 0; i < (*((struct_matrice *)
! 525: (*s_objet).objet)).nombre_lignes; i++)
! 526: {
! 527: if ((s_objet_elementaire = allocation(s_etat_processus, MIN))
! 528: == NULL)
! 529: {
! 530: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 531: return;
! 532: }
! 533:
! 534: (*((struct_matrice *) (*s_objet_elementaire).objet))
! 535: .nombre_lignes = 1;
! 536: (*((struct_matrice *) (*s_objet_elementaire).objet))
! 537: .nombre_colonnes = (*((struct_matrice *) (*s_objet).objet))
! 538: .nombre_colonnes;
! 539:
! 540: if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
! 541: malloc(sizeof(integer8 *))) == NULL)
! 542: {
! 543: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 544: return;
! 545: }
! 546:
! 547: if ((((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
! 548: .objet)).tableau)[0] = malloc((*((struct_matrice *)
! 549: (*s_objet_elementaire).objet)).nombre_colonnes *
! 550: sizeof(integer8))) == NULL)
! 551: {
! 552: (*s_etat_processus).erreur_systeme =
! 553: d_es_allocation_memoire;
! 554: return;
! 555: }
! 556:
! 557: for(j = 0; j < (*((struct_matrice *) (*s_objet_elementaire).objet))
! 558: .nombre_colonnes; j++)
! 559: {
! 560: ((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
! 561: .objet)).tableau)[0][j] =
! 562: ((integer8 **) (*((struct_matrice *)
! 563: (*s_objet).objet)).tableau)[i][j];
! 564: }
! 565:
! 566: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 567: s_objet_elementaire) == d_erreur)
! 568: {
! 569: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 570: return;
! 571: }
! 572: }
! 573: }
! 574: else if ((*s_objet).type == MRL)
! 575: {
! 576: for(i = 0; i < (*((struct_matrice *)
! 577: (*s_objet).objet)).nombre_lignes; i++)
! 578: {
! 579: if ((s_objet_elementaire = allocation(s_etat_processus, MRL))
! 580: == NULL)
! 581: {
! 582: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 583: return;
! 584: }
! 585:
! 586: (*((struct_matrice *) (*s_objet_elementaire).objet))
! 587: .nombre_lignes = 1;
! 588: (*((struct_matrice *) (*s_objet_elementaire).objet))
! 589: .nombre_colonnes = (*((struct_matrice *) (*s_objet).objet))
! 590: .nombre_colonnes;
! 591:
! 592: if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
! 593: malloc(sizeof(real8 *))) == NULL)
! 594: {
! 595: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 596: return;
! 597: }
! 598:
! 599: if ((((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
! 600: .objet)).tableau)[0] = malloc((*((struct_matrice *)
! 601: (*s_objet_elementaire).objet)).nombre_colonnes *
! 602: sizeof(real8))) == NULL)
! 603: {
! 604: (*s_etat_processus).erreur_systeme =
! 605: d_es_allocation_memoire;
! 606: return;
! 607: }
! 608:
! 609: for(j = 0; j < (*((struct_matrice *) (*s_objet_elementaire).objet))
! 610: .nombre_colonnes; j++)
! 611: {
! 612: ((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
! 613: .objet)).tableau)[0][j] =
! 614: ((real8 **) (*((struct_matrice *)
! 615: (*s_objet).objet)).tableau)[i][j];
! 616: }
! 617:
! 618: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 619: s_objet_elementaire) == d_erreur)
! 620: {
! 621: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 622: return;
! 623: }
! 624: }
! 625: }
! 626: else if ((*s_objet).type == MCX)
! 627: {
! 628: for(i = 0; i < (*((struct_matrice *)
! 629: (*s_objet).objet)).nombre_lignes; i++)
! 630: {
! 631: if ((s_objet_elementaire = allocation(s_etat_processus, MCX))
! 632: == NULL)
! 633: {
! 634: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 635: return;
! 636: }
! 637:
! 638: (*((struct_matrice *) (*s_objet_elementaire).objet))
! 639: .nombre_lignes = 1;
! 640: (*((struct_matrice *) (*s_objet_elementaire).objet))
! 641: .nombre_colonnes = (*((struct_matrice *) (*s_objet).objet))
! 642: .nombre_colonnes;
! 643:
! 644: if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
! 645: malloc(sizeof(complex16 *))) == NULL)
! 646: {
! 647: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 648: return;
! 649: }
! 650:
! 651: if ((((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
! 652: .objet)).tableau)[0] = malloc((*((struct_matrice *)
! 653: (*s_objet_elementaire).objet)).nombre_colonnes *
! 654: sizeof(complex16))) == NULL)
! 655: {
! 656: (*s_etat_processus).erreur_systeme =
! 657: d_es_allocation_memoire;
! 658: return;
! 659: }
! 660:
! 661: for(j = 0; j < (*((struct_matrice *) (*s_objet_elementaire).objet))
! 662: .nombre_colonnes; j++)
! 663: {
! 664: ((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
! 665: .objet)).tableau)[0][j].partie_reelle =
! 666: ((complex16 **) (*((struct_matrice *)
! 667: (*s_objet).objet)).tableau)[i][j].partie_reelle;
! 668: ((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
! 669: .objet)).tableau)[0][j].partie_imaginaire =
! 670: ((complex16 **) (*((struct_matrice *)
! 671: (*s_objet).objet)).tableau)[i][j].partie_imaginaire;
! 672: }
! 673:
! 674: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 675: s_objet_elementaire) == d_erreur)
! 676: {
! 677: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 678: return;
! 679: }
! 680: }
! 681: }
! 682: else
! 683: {
! 684: liberation(s_etat_processus, s_objet);
! 685:
! 686: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 687: return;
! 688: }
! 689:
! 690: if ((s_objet_elementaire = allocation(s_etat_processus, INT)) == NULL)
! 691: {
! 692: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 693: return;
! 694: }
! 695:
! 696: (*((integer8 *) (*s_objet_elementaire).objet)) =
! 697: (*((struct_matrice *) (*s_objet).objet)).nombre_lignes;
! 698:
! 699: liberation(s_etat_processus, s_objet);
! 700:
! 701: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 702: s_objet_elementaire) == d_erreur)
! 703: {
! 704: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 705: return;
! 706: }
! 707:
! 708: return;
! 709: }
! 710:
! 711:
! 712: /*
! 713: ================================================================================
! 714: Fonction 'rdate'
! 715: ================================================================================
! 716: Entrées : pointeur sur une structure struct_processus
! 717: --------------------------------------------------------------------------------
! 718: Sorties :
! 719: --------------------------------------------------------------------------------
! 720: Effets de bord : néant
! 721: ================================================================================
! 722: */
! 723:
! 724: void
! 725: instruction_rdate(struct_processus *s_etat_processus)
! 726: {
! 727: struct_objet *s_objet;
! 728: struct_objet *s_objet_argument;
! 729:
! 730: struct timeval horodatage;
! 731:
! 732: (*s_etat_processus).erreur_execution = d_ex;
! 733:
! 734: if ((*s_etat_processus).affichage_arguments == 'Y')
! 735: {
! 736: printf("\n RDATE ");
! 737:
! 738: if ((*s_etat_processus).langue == 'F')
! 739: {
! 740: printf("(information sur la date et l'heure avec offset)\n\n");
! 741: }
! 742: else
! 743: {
! 744: printf("(date and time with offset)\n\n");
! 745: }
! 746:
! 747: printf(" 1: %s\n", d_INT);
! 748: printf("-> 1: %s\n", d_LST);
! 749:
! 750: return;
! 751: }
! 752: else if ((*s_etat_processus).test_instruction == 'Y')
! 753: {
! 754: (*s_etat_processus).nombre_arguments = 1;
! 755: return;
! 756: }
! 757:
! 758: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 759: {
! 760: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 761: {
! 762: return;
! 763: }
! 764: }
! 765:
! 766: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 767: &s_objet_argument) == d_erreur)
! 768: {
! 769: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 770: return;
! 771: }
! 772:
! 773: if ((*s_objet_argument).type == INT)
! 774: {
! 775: gettimeofday(&horodatage, NULL);
! 776: horodatage.tv_sec += (*((integer8 *) (*s_objet_argument).objet));
! 777:
! 778: if (horodatage.tv_sec < 0)
! 779: {
! 780: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 781:
! 782: liberation(s_etat_processus, s_objet_argument);
! 783: return;
! 784: }
! 785:
! 786: if ((s_objet = formateur_date(s_etat_processus, &horodatage)) == NULL)
! 787: {
! 788: liberation(s_etat_processus, s_objet_argument);
! 789: return;
! 790: }
! 791:
! 792: liberation(s_etat_processus, s_objet_argument);
! 793: }
! 794: else
! 795: {
! 796: liberation(s_etat_processus, s_objet_argument);
! 797:
! 798: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 799: return;
! 800: }
! 801:
! 802: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 803: s_objet) == d_erreur)
! 804: {
! 805: return;
! 806: }
! 807:
! 808: return;
! 809: }
! 810:
! 811:
! 812: /*
! 813: ================================================================================
! 814: Fonction 'rclswi'
! 815: ================================================================================
! 816: Entrées : pointeur sur une structure struct_processus
! 817: --------------------------------------------------------------------------------
! 818: Sorties :
! 819: --------------------------------------------------------------------------------
! 820: Effets de bord : néant
! 821: ================================================================================
! 822: */
! 823:
! 824: void
! 825: instruction_rclswi(struct_processus *s_etat_processus)
! 826: {
! 827: integer8 interruption;
! 828:
! 829: struct_objet *s_objet_argument;
! 830: struct_objet *s_objet_resultat;
! 831:
! 832: (*s_etat_processus).erreur_execution = d_ex;
! 833:
! 834: if ((*s_etat_processus).affichage_arguments == 'Y')
! 835: {
! 836: printf("\n RCLSWI ");
! 837:
! 838: if ((*s_etat_processus).langue == 'F')
! 839: {
! 840: printf("(rappel d'une interruption logicielle)\n\n");
! 841: }
! 842: else
! 843: {
! 844: printf("(recall software interrupt)\n\n");
! 845: }
! 846:
! 847: printf(" 1: %s\n", d_INT);
! 848: printf("-> 1: %s, %s\n", d_NOM, d_RPN);
! 849:
! 850: return;
! 851: }
! 852: else if ((*s_etat_processus).test_instruction == 'Y')
! 853: {
! 854: (*s_etat_processus).nombre_arguments = -1;
! 855: return;
! 856: }
! 857:
! 858: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 859: {
! 860: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 861: {
! 862: return;
! 863: }
! 864: }
! 865:
! 866: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 867: &s_objet_argument) == d_erreur)
! 868: {
! 869: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 870: return;
! 871: }
! 872:
! 873: if ((*s_objet_argument).type == INT)
! 874: {
! 875: interruption = (*((integer8 *) (*s_objet_argument).objet));
! 876:
! 877: if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
! 878: {
! 879: liberation(s_etat_processus, s_objet_argument);
! 880:
! 881: (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
! 882: return;
! 883: }
! 884:
! 885: if ((*s_etat_processus).corps_interruptions[interruption - 1] == NULL)
! 886: {
! 887: liberation(s_etat_processus, s_objet_argument);
! 888:
! 889: (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
! 890: return;
! 891: }
! 892:
! 893: if ((s_objet_resultat = copie_objet(s_etat_processus,
! 894: (*s_etat_processus).corps_interruptions[interruption - 1], 'P'))
! 895: == NULL)
! 896: {
! 897: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 898: return;
! 899: }
! 900: }
! 901: else
! 902: {
! 903: liberation(s_etat_processus, s_objet_argument);
! 904:
! 905: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 906: return;
! 907: }
! 908:
! 909: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 910: s_objet_resultat) == d_erreur)
! 911: {
! 912: return;
! 913: }
! 914:
! 915: return;
! 916: }
! 917:
! 918:
! 919: /*
! 920: ================================================================================
! 921: Fonction 'revlist'
! 922: ================================================================================
! 923: Entrées : pointeur sur une structure struct_processus
! 924: --------------------------------------------------------------------------------
! 925: Sorties :
! 926: --------------------------------------------------------------------------------
! 927: Effets de bord : néant
! 928: ================================================================================
! 929: */
! 930:
! 931: void
! 932: instruction_revlist(struct_processus *s_etat_processus)
! 933: {
! 934: struct_liste_chainee *l_ancienne_base;
! 935: struct_liste_chainee *l_nouvelle_base;
! 936:
! 937: struct_objet *s_objet_argument;
! 938: struct_objet *s_objet_intermediaire;
! 939: struct_objet *s_objet_resultat;
! 940:
! 941: (*s_etat_processus).erreur_execution = d_ex;
! 942:
! 943: if ((*s_etat_processus).affichage_arguments == 'Y')
! 944: {
! 945: printf("\n REVLIST ");
! 946:
! 947: if ((*s_etat_processus).langue == 'F')
! 948: {
! 949: printf("(inverse les éléments d'une liste)\n\n");
! 950: }
! 951: else
! 952: {
! 953: printf("(inverts list elements)\n\n");
! 954: }
! 955:
! 956: printf(" 1: %s\n", d_LST);
! 957: printf("-> 1: %s\n", d_LST);
! 958:
! 959: return;
! 960: }
! 961: else if ((*s_etat_processus).test_instruction == 'Y')
! 962: {
! 963: (*s_etat_processus).nombre_arguments = -1;
! 964: return;
! 965: }
! 966:
! 967: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 968: {
! 969: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 970: {
! 971: return;
! 972: }
! 973: }
! 974:
! 975: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 976: &s_objet_argument) == d_erreur)
! 977: {
! 978: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 979: return;
! 980: }
! 981:
! 982: if ((*s_objet_argument).type == LST)
! 983: {
! 984: if ((s_objet_resultat = copie_objet(s_etat_processus,
! 985: s_objet_argument, 'N')) == NULL)
! 986: {
! 987: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 988: return;
! 989: }
! 990:
! 991: l_ancienne_base = (*s_objet_resultat).objet;
! 992: l_nouvelle_base = NULL;
! 993:
! 994: while(l_ancienne_base != NULL)
! 995: {
! 996: if (depilement(s_etat_processus, &l_ancienne_base,
! 997: &s_objet_intermediaire) == d_erreur)
! 998: {
! 999: (*s_etat_processus).erreur_systeme = d_es_pile_vide;
! 1000: return;
! 1001: }
! 1002:
! 1003: if (empilement(s_etat_processus, &l_nouvelle_base,
! 1004: s_objet_intermediaire) == d_erreur)
! 1005: {
! 1006: return;
! 1007: }
! 1008: }
! 1009:
! 1010: (*s_objet_resultat).objet = l_nouvelle_base;
! 1011: }
! 1012: else
! 1013: {
! 1014: liberation(s_etat_processus, s_objet_argument);
! 1015:
! 1016: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1017: return;
! 1018: }
! 1019:
! 1020: liberation(s_etat_processus, s_objet_argument);
! 1021:
! 1022: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1023: s_objet_resultat) == d_erreur)
! 1024: {
! 1025: return;
! 1026: }
! 1027:
! 1028: return;
! 1029: }
! 1030:
! 1031:
! 1032: /*
! 1033: ================================================================================
! 1034: Fonction 'rstop'
! 1035: ================================================================================
! 1036: Entrées :
! 1037: --------------------------------------------------------------------------------
! 1038: Sorties :
! 1039: --------------------------------------------------------------------------------
! 1040: Effets de bord : néant
! 1041: ================================================================================
! 1042: */
! 1043:
! 1044: void
! 1045: instruction_rstop(struct_processus *s_etat_processus)
! 1046: {
! 1047: (*s_etat_processus).erreur_execution = d_ex;
! 1048:
! 1049: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1050: {
! 1051: printf("\n RSTOP ");
! 1052:
! 1053: if ((*s_etat_processus).langue == 'F')
! 1054: {
! 1055: printf("(libère le signal stop)\n\n");
! 1056: printf(" Aucun argument\n");
! 1057: }
! 1058: else
! 1059: {
! 1060: printf("(release stop signal)\n\n");
! 1061: printf(" No argument\n");
! 1062: }
! 1063:
! 1064: return;
! 1065: }
! 1066: else if ((*s_etat_processus).test_instruction == 'Y')
! 1067: {
! 1068: (*s_etat_processus).nombre_arguments = -1;
! 1069: return;
! 1070: }
! 1071:
! 1072: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1073: {
! 1074: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 1075: {
! 1076: return;
! 1077: }
! 1078: }
! 1079:
! 1080: if ((*s_etat_processus).var_volatile_traitement_retarde_stop == 0)
! 1081: {
! 1082: (*s_etat_processus).erreur_execution = d_ex_stop;
! 1083: return;
! 1084: }
! 1085:
! 1086: if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
! 1087: {
! 1088: (*s_etat_processus).var_volatile_requete_arret = -1;
! 1089: }
! 1090:
! 1091: (*s_etat_processus).var_volatile_traitement_retarde_stop = 0;
! 1092:
! 1093: return;
! 1094: }
! 1095:
! 1096:
! 1097: /*
! 1098: ================================================================================
! 1099: fonction 'rfuse'
! 1100: ================================================================================
! 1101: entrées :
! 1102: --------------------------------------------------------------------------------
! 1103: sorties :
! 1104: --------------------------------------------------------------------------------
! 1105: effets de bord : néant
! 1106: ================================================================================
! 1107: */
! 1108:
! 1109: void
! 1110: instruction_rfuse(struct_processus *s_etat_processus)
! 1111: {
! 1112: struct_objet *s_objet_resultat;
! 1113:
! 1114: (*s_etat_processus).erreur_execution = d_ex;
! 1115:
! 1116: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1117: {
! 1118: printf("\n RFUSE ");
! 1119:
! 1120: if ((*s_etat_processus).langue == 'F')
! 1121: {
! 1122: printf("(valeur courante du fusible)\n\n");
! 1123: }
! 1124: else
! 1125: {
! 1126: printf("(remaining fuse value)\n\n");
! 1127: }
! 1128:
! 1129: printf("-> 1: %s\n", d_REL);
! 1130: return;
! 1131: }
! 1132: else if ((*s_etat_processus).test_instruction == 'Y')
! 1133: {
! 1134: (*s_etat_processus).nombre_arguments = -1;
! 1135: return;
! 1136: }
! 1137:
! 1138: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1139: {
! 1140: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 1141: {
! 1142: return;
! 1143: }
! 1144: }
! 1145:
! 1146: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
! 1147: {
! 1148: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1149: return;
! 1150: }
! 1151:
! 1152: (*((real8 *) (*s_objet_resultat).objet)) =
! 1153: (*s_etat_processus).temps_maximal_cpu;
! 1154:
! 1155: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1156: s_objet_resultat) == d_erreur)
! 1157: {
! 1158: return;
! 1159: }
! 1160:
! 1161: return;
! 1162: }
! 1163:
! 1164:
! 1165: /*
! 1166: ================================================================================
! 1167: fonction 'rdgn'
! 1168: ================================================================================
! 1169: entrées :
! 1170: --------------------------------------------------------------------------------
! 1171: sorties :
! 1172: --------------------------------------------------------------------------------
! 1173: effets de bord : néant
! 1174: ================================================================================
! 1175: */
! 1176:
! 1177: void
! 1178: instruction_rdgn(struct_processus *s_etat_processus)
! 1179: {
! 1180: const gsl_rng_type **type_courant;
! 1181: const gsl_rng_type **types;
! 1182:
! 1183: const unsigned char *message = "UNINITIALIZED RANDOM GENERATOR";
! 1184:
! 1185: long dernier;
! 1186: long i;
! 1187: long j;
! 1188: long premier;
! 1189:
! 1190: struct_objet *s_objet_argument;
! 1191: struct_objet *s_objet_resultat;
! 1192:
! 1193: unsigned char *requete;
! 1194: unsigned char **types_generateurs;
! 1195:
! 1196: unsigned long nombre_types;
! 1197:
! 1198: (*s_etat_processus).erreur_execution = d_ex;
! 1199:
! 1200: types = gsl_rng_types_setup();
! 1201:
! 1202: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1203: {
! 1204: printf("\n RDGN ");
! 1205:
! 1206: if ((*s_etat_processus).langue == 'F')
! 1207: {
! 1208: printf("(choix du générateur de nombres aléatoires)\n\n");
! 1209: }
! 1210: else
! 1211: {
! 1212: printf("(random number generator specification)\n\n");
! 1213: }
! 1214:
! 1215: printf(" 1: %s\n\n", d_CHN);
! 1216:
! 1217: printf(" 1: \"QUERY\"\n");
! 1218: printf("-> 1: %s\n\n", d_CHN);
! 1219:
! 1220: if ((*s_etat_processus).langue == 'F')
! 1221: {
! 1222: printf(" Générateurs disponibles :\n\n");
! 1223: }
! 1224: else
! 1225: {
! 1226: printf(" Available generators:\n\n");
! 1227: }
! 1228:
! 1229: for(nombre_types = 0, type_courant = types;
! 1230: (*type_courant) != NULL; type_courant++, nombre_types++);
! 1231:
! 1232: if ((types_generateurs = malloc(nombre_types * sizeof(unsigned char *)))
! 1233: == NULL)
! 1234: {
! 1235: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1236: return;
! 1237: }
! 1238:
! 1239: for(i = 0, type_courant = types; (*type_courant) != NULL;
! 1240: type_courant++, i++)
! 1241: {
! 1242: if ((types_generateurs[i] = malloc((strlen((**type_courant).name)
! 1243: + 1) * sizeof(unsigned char))) == NULL)
! 1244: {
! 1245: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1246: return;
! 1247: }
! 1248:
! 1249: strcpy(types_generateurs[i], (**type_courant).name);
! 1250: }
! 1251:
! 1252: // Tri des types de générateurs (tri shaker)
! 1253:
! 1254: premier = 1;
! 1255: dernier = nombre_types - 2;
! 1256:
! 1257: while((dernier - premier) >= 2)
! 1258: {
! 1259: for(j = 2, i = premier; i <= dernier; i++)
! 1260: {
! 1261: if (strcmp(types_generateurs[i], types_generateurs[i + 1]) > 0)
! 1262: {
! 1263: swap(&(types_generateurs[i]),
! 1264: &(types_generateurs[i + 1]),
! 1265: sizeof(unsigned char *));
! 1266: j = i;
! 1267: }
! 1268: }
! 1269:
! 1270: dernier = j;
! 1271: i = nombre_types - 2;
! 1272:
! 1273: for(i = dernier; i >= premier; i--)
! 1274: {
! 1275: if (strcmp(types_generateurs[i - 1], types_generateurs[i]) > 0)
! 1276: {
! 1277: swap(&(types_generateurs[i - 1]),
! 1278: &(types_generateurs[i]),
! 1279: sizeof(unsigned char *));
! 1280: j = i;
! 1281: }
! 1282: }
! 1283:
! 1284: premier = j;
! 1285: }
! 1286:
! 1287: for(i = 0; i < (long) nombre_types; i++)
! 1288: {
! 1289: printf(" - %s\n", types_generateurs[i]);
! 1290: free(types_generateurs[i]);
! 1291: }
! 1292:
! 1293: free(types_generateurs);
! 1294: return;
! 1295: }
! 1296: else if ((*s_etat_processus).test_instruction == 'Y')
! 1297: {
! 1298: (*s_etat_processus).nombre_arguments = -1;
! 1299: return;
! 1300: }
! 1301:
! 1302: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1303: {
! 1304: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 1305: {
! 1306: return;
! 1307: }
! 1308: }
! 1309:
! 1310: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1311: &s_objet_argument) == d_erreur)
! 1312: {
! 1313: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1314: return;
! 1315: }
! 1316:
! 1317: if ((*s_objet_argument).type == CHN)
! 1318: {
! 1319: if ((requete = conversion_majuscule((unsigned char *)
! 1320: (*s_objet_argument).objet)) == NULL)
! 1321: {
! 1322: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1323: return;
! 1324: }
! 1325:
! 1326: if (strcmp(requete, "QUERY") == 0)
! 1327: {
! 1328: /*
! 1329: * Récupération du type du générateur
! 1330: */
! 1331:
! 1332: free(requete);
! 1333:
! 1334: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
! 1335: {
! 1336: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1337: return;
! 1338: }
! 1339:
! 1340: if ((*s_etat_processus).type_generateur_aleatoire == NULL)
! 1341: {
! 1342: if (((*s_objet_resultat).objet = malloc((strlen(message) + 1) *
! 1343: sizeof(unsigned char))) == NULL)
! 1344: {
! 1345: (*s_etat_processus).erreur_systeme =
! 1346: d_es_allocation_memoire;
! 1347: return;
! 1348: }
! 1349:
! 1350: strcpy((unsigned char *) (*s_objet_resultat).objet, message);
! 1351: }
! 1352: else
! 1353: {
! 1354: if (((*s_objet_resultat).objet = conversion_majuscule(
! 1355: (unsigned char *) gsl_rng_name(
! 1356: (*s_etat_processus).generateur_aleatoire))) == NULL)
! 1357: {
! 1358: (*s_etat_processus).erreur_systeme =
! 1359: d_es_allocation_memoire;
! 1360: return;
! 1361: }
! 1362: }
! 1363:
! 1364: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1365: s_objet_resultat) == d_erreur)
! 1366: {
! 1367: return;
! 1368: }
! 1369: }
! 1370: else
! 1371: {
! 1372: /*
! 1373: * Affectation d'un nouveau type de générateur
! 1374: */
! 1375:
! 1376: # include "generateurs.c"
! 1377:
! 1378: free(requete);
! 1379:
! 1380: if ((*s_etat_processus).generateur_aleatoire != NULL)
! 1381: {
! 1382: liberation_generateur_aleatoire(s_etat_processus);
! 1383: }
! 1384:
! 1385: initialisation_generateur_aleatoire(s_etat_processus, d_vrai, 0);
! 1386: }
! 1387: }
! 1388: else
! 1389: {
! 1390: liberation(s_etat_processus, s_objet_argument);
! 1391:
! 1392: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1393: return;
! 1394: }
! 1395:
! 1396: liberation(s_etat_processus, s_objet_argument);
! 1397:
! 1398: return;
! 1399: }
! 1400:
! 1401:
! 1402: /*
! 1403: ================================================================================
! 1404: fonction 'rank'
! 1405: ================================================================================
! 1406: entrées :
! 1407: --------------------------------------------------------------------------------
! 1408: sorties :
! 1409: --------------------------------------------------------------------------------
! 1410: effets de bord : néant
! 1411: ================================================================================
! 1412: */
! 1413:
! 1414: void
! 1415: instruction_rank(struct_processus *s_etat_processus)
! 1416: {
! 1417: struct_objet *s_objet_argument;
! 1418: struct_objet *s_objet_resultat;
! 1419:
! 1420: (*s_etat_processus).erreur_execution = d_ex;
! 1421:
! 1422: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1423: {
! 1424: printf("\n RANK ");
! 1425:
! 1426: if ((*s_etat_processus).langue == 'F')
! 1427: {
! 1428: printf("(rang de la matrice)\n\n");
! 1429: }
! 1430: else
! 1431: {
! 1432: printf("(matrix rank)\n\n");
! 1433: }
! 1434:
! 1435: printf(" 1: %s, %s, %s\n", d_MIN, d_REL, d_MCX);
! 1436: printf("-> 1: %s\n", d_INT);
! 1437:
! 1438: return;
! 1439: }
! 1440: else if ((*s_etat_processus).test_instruction == 'Y')
! 1441: {
! 1442: (*s_etat_processus).nombre_arguments = -1;
! 1443: return;
! 1444: }
! 1445:
! 1446: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1447: {
! 1448: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 1449: {
! 1450: return;
! 1451: }
! 1452: }
! 1453:
! 1454: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1455: &s_objet_argument) == d_erreur)
! 1456: {
! 1457: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1458: return;
! 1459: }
! 1460:
! 1461: if (((*s_objet_argument).type == MIN) ||
! 1462: ((*s_objet_argument).type == MRL) ||
! 1463: ((*s_objet_argument).type == MCX))
! 1464: {
! 1465: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
! 1466: {
! 1467: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1468: return;
! 1469: }
! 1470:
! 1471: rang(s_etat_processus, (*s_objet_argument).objet,
! 1472: (*s_objet_resultat).objet);
! 1473:
! 1474: if ((*s_etat_processus).erreur_systeme != d_es)
! 1475: {
! 1476: return;
! 1477: }
! 1478:
! 1479: if (((*s_etat_processus).erreur_execution != d_ex) ||
! 1480: ((*s_etat_processus).exception != d_ep))
! 1481: {
! 1482: liberation(s_etat_processus, s_objet_argument);
! 1483: liberation(s_etat_processus, s_objet_resultat);
! 1484: return;
! 1485: }
! 1486: }
! 1487: else
! 1488: {
! 1489: liberation(s_etat_processus, s_objet_argument);
! 1490:
! 1491: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1492: return;
! 1493: }
! 1494:
! 1495: liberation(s_etat_processus, s_objet_argument);
! 1496:
! 1497: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1498: s_objet_resultat) == d_erreur)
! 1499: {
! 1500: return;
! 1501: }
! 1502:
! 1503: return;
! 1504: }
! 1505:
! 1506:
! 1507: /*
! 1508: ================================================================================
! 1509: Fonction 'recode'
! 1510: ================================================================================
! 1511: Entrées :
! 1512: --------------------------------------------------------------------------------
! 1513: Sorties :
! 1514: --------------------------------------------------------------------------------
! 1515: Effets de bord : néant
! 1516: ================================================================================
! 1517: */
! 1518:
! 1519: void
! 1520: instruction_recode(struct_processus *s_etat_processus)
! 1521: {
! 1522: struct_objet *s_objet_argument_1;
! 1523: struct_objet *s_objet_argument_2;
! 1524: struct_objet *s_objet_argument_3;
! 1525: struct_objet *s_objet_resultat;
! 1526:
! 1527: unsigned char *encodage_destination;
! 1528: unsigned char *encodage_source;
! 1529: unsigned char *tampon;
! 1530:
! 1531: (*s_etat_processus).erreur_execution = d_ex;
! 1532:
! 1533: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1534: {
! 1535: printf("\n RECODE ");
! 1536:
! 1537: if ((*s_etat_processus).langue == 'F')
! 1538: {
! 1539: printf("(conversion d'encodage d'une chaîne de caractères)\n\n");
! 1540: }
! 1541: else
! 1542: {
! 1543: printf("(string recodage)\n\n");
! 1544: }
! 1545:
! 1546: printf(" 3: %s\n", d_CHN);
! 1547: printf(" 2: %s\n", d_CHN);
! 1548: printf(" 1: %s\n", d_CHN);
! 1549: printf("-> 1: %s\n\n", d_CHN);
! 1550:
! 1551: if ((*s_etat_processus).langue == 'F')
! 1552: {
! 1553: printf(" Utilisation :\n\n");
! 1554: }
! 1555: else
! 1556: {
! 1557: printf(" Usage:\n\n");
! 1558: }
! 1559:
! 1560: printf(" \"string\" \"ISO8859-1\" \"UTF-8\" recode\n");
! 1561: printf(" \"string\" \"ISO8859-1\" \"UTF-8//TRANSLIT\" recode\n");
! 1562: printf(" \"string\" \"ISO8859-1\" \"UTF-8//IGNORE\" recode\n");
! 1563: return;
! 1564: }
! 1565: else if ((*s_etat_processus).test_instruction == 'Y')
! 1566: {
! 1567: (*s_etat_processus).nombre_arguments = -1;
! 1568: return;
! 1569: }
! 1570:
! 1571: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1572: {
! 1573: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
! 1574: {
! 1575: return;
! 1576: }
! 1577: }
! 1578:
! 1579: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1580: &s_objet_argument_1) == d_erreur)
! 1581: {
! 1582: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1583: return;
! 1584: }
! 1585:
! 1586: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1587: &s_objet_argument_2) == d_erreur)
! 1588: {
! 1589: liberation(s_etat_processus, s_objet_argument_1);
! 1590:
! 1591: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1592: return;
! 1593: }
! 1594:
! 1595: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1596: &s_objet_argument_3) == d_erreur)
! 1597: {
! 1598: liberation(s_etat_processus, s_objet_argument_1);
! 1599: liberation(s_etat_processus, s_objet_argument_2);
! 1600:
! 1601: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1602: return;
! 1603: }
! 1604:
! 1605: if (((*s_objet_argument_1).type == CHN) &&
! 1606: ((*s_objet_argument_2).type == CHN) &&
! 1607: ((*s_objet_argument_3).type == CHN))
! 1608: {
! 1609: if ((encodage_source = conversion_majuscule((unsigned char *)
! 1610: (*s_objet_argument_2).objet)) == NULL)
! 1611: {
! 1612: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1613: return;
! 1614: }
! 1615:
! 1616: if ((encodage_destination = conversion_majuscule((unsigned char *)
! 1617: (*s_objet_argument_1).objet)) == NULL)
! 1618: {
! 1619: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1620: return;
! 1621: }
! 1622:
! 1623: tampon = reencodage(s_etat_processus,
! 1624: (*s_objet_argument_3).objet, encodage_source,
! 1625: encodage_destination);
! 1626:
! 1627: free(encodage_destination);
! 1628: free(encodage_source);
! 1629:
! 1630: if (tampon == NULL)
! 1631: {
! 1632: liberation(s_etat_processus, s_objet_argument_1);
! 1633: liberation(s_etat_processus, s_objet_argument_2);
! 1634: liberation(s_etat_processus, s_objet_argument_3);
! 1635: return;
! 1636: }
! 1637:
! 1638: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
! 1639: {
! 1640: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1641: return;
! 1642: }
! 1643:
! 1644: (*s_objet_resultat).objet = tampon;
! 1645: }
! 1646: else
! 1647: {
! 1648: liberation(s_etat_processus, s_objet_argument_1);
! 1649: liberation(s_etat_processus, s_objet_argument_2);
! 1650: liberation(s_etat_processus, s_objet_argument_3);
! 1651:
! 1652: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1653: return;
! 1654: }
! 1655:
! 1656: liberation(s_etat_processus, s_objet_argument_1);
! 1657: liberation(s_etat_processus, s_objet_argument_2);
! 1658: liberation(s_etat_processus, s_objet_argument_3);
! 1659:
! 1660: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1661: s_objet_resultat) == d_erreur)
! 1662: {
! 1663: return;
! 1664: }
! 1665:
! 1666: return;
! 1667: }
! 1668:
! 1669:
! 1670: /*
! 1671: ================================================================================
! 1672: Fonction 'repl'
! 1673: ================================================================================
! 1674: Entrées :
! 1675: --------------------------------------------------------------------------------
! 1676: Sorties :
! 1677: --------------------------------------------------------------------------------
! 1678: Effets de bord : néant
! 1679: ================================================================================
! 1680: */
! 1681:
! 1682: void
! 1683: instruction_repl(struct_processus *s_etat_processus)
! 1684: {
! 1685: integer8 position;
! 1686:
! 1687: long difference;
! 1688: long difference_ecriture;
! 1689: long difference_lecture;
! 1690: long nombre_occurrences;
! 1691:
! 1692: struct_liste_chainee *l_element_a_supprimer;
! 1693: struct_liste_chainee *l_element_courant;
! 1694: struct_liste_chainee *l_element_courant_2;
! 1695: struct_liste_chainee *l_element_precedent;
! 1696: struct_liste_chainee *l_element_precedent_2;
! 1697:
! 1698: struct_objet *s_objet_argument_1;
! 1699: struct_objet *s_objet_argument_2;
! 1700: struct_objet *s_objet_argument_3;
! 1701: struct_objet *s_objet_intermediaire;
! 1702: struct_objet *s_objet_resultat;
! 1703:
! 1704: unsigned char *ancien_pointeur_ecriture;
! 1705: unsigned char *ancien_pointeur_lecture;
! 1706: unsigned char *pointeur_ecriture;
! 1707: unsigned char *pointeur_lecture;
! 1708:
! 1709: (*s_etat_processus).erreur_execution = d_ex;
! 1710:
! 1711: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1712: {
! 1713: printf("\n REPL ");
! 1714:
! 1715: if ((*s_etat_processus).langue == 'F')
! 1716: {
! 1717: printf("(remplacement d'éléments dans une liste ou une chaîne)");
! 1718: }
! 1719: else
! 1720: {
! 1721: printf("(replace elements in list or string)\n\n");
! 1722: }
! 1723:
! 1724: printf(" 3: %s\n", d_LST);
! 1725: printf(" 2: %s\n", d_INT);
! 1726: printf(" 1: %s\n", d_LST);
! 1727: printf("-> 1: %s\n\n", d_LST);
! 1728:
! 1729: printf(" 3: %s\n", d_CHN);
! 1730: printf(" 2: %s\n", d_CHN);
! 1731: printf(" 1: %s\n", d_CHN);
! 1732: printf("-> 1: %s\n\n", d_CHN);
! 1733: return;
! 1734: }
! 1735: else if ((*s_etat_processus).test_instruction == 'Y')
! 1736: {
! 1737: (*s_etat_processus).nombre_arguments = -1;
! 1738: return;
! 1739: }
! 1740:
! 1741: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1742: {
! 1743: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
! 1744: {
! 1745: return;
! 1746: }
! 1747: }
! 1748:
! 1749: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1750: &s_objet_argument_1) == d_erreur)
! 1751: {
! 1752: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1753: return;
! 1754: }
! 1755:
! 1756: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1757: &s_objet_argument_2) == d_erreur)
! 1758: {
! 1759: liberation(s_etat_processus, s_objet_argument_1);
! 1760:
! 1761: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1762: return;
! 1763: }
! 1764:
! 1765: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1766: &s_objet_argument_3) == d_erreur)
! 1767: {
! 1768: liberation(s_etat_processus, s_objet_argument_1);
! 1769: liberation(s_etat_processus, s_objet_argument_2);
! 1770:
! 1771: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1772: return;
! 1773: }
! 1774:
! 1775: if (((*s_objet_argument_1).type == CHN) &&
! 1776: ((*s_objet_argument_2).type == CHN) &&
! 1777: ((*s_objet_argument_3).type == CHN))
! 1778: {
! 1779: if (strcmp((unsigned char *) (*s_objet_argument_2).objet, "") == 0)
! 1780: {
! 1781: liberation(s_etat_processus, s_objet_argument_1);
! 1782: liberation(s_etat_processus, s_objet_argument_2);
! 1783: liberation(s_etat_processus, s_objet_argument_3);
! 1784:
! 1785: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 1786: return;
! 1787: }
! 1788:
! 1789: nombre_occurrences = 0;
! 1790: pointeur_lecture = (unsigned char *) (*s_objet_argument_3).objet;
! 1791:
! 1792: for(;;)
! 1793: {
! 1794: pointeur_lecture = strstr(pointeur_lecture, (unsigned char *)
! 1795: (*s_objet_argument_2).objet);
! 1796:
! 1797: if (pointeur_lecture == NULL)
! 1798: {
! 1799: break;
! 1800: }
! 1801:
! 1802: pointeur_lecture++;
! 1803: nombre_occurrences++;
! 1804: }
! 1805:
! 1806: // Différence est positive si la nouvelle chaîne est plus longue
! 1807: // que la chaîne originelle.
! 1808:
! 1809: difference = strlen((unsigned char *) (*s_objet_argument_1).objet)
! 1810: - strlen((unsigned char *) (*s_objet_argument_2).objet);
! 1811:
! 1812: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
! 1813: {
! 1814: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1815: return;
! 1816: }
! 1817:
! 1818: if (((*s_objet_resultat).objet = malloc((strlen((unsigned char *)
! 1819: (*s_objet_argument_3).objet) + (nombre_occurrences *
! 1820: difference) + 1) * sizeof(unsigned char))) == NULL)
! 1821: {
! 1822: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1823: return;
! 1824: }
! 1825:
! 1826: pointeur_lecture = (unsigned char *) (*s_objet_argument_3).objet;
! 1827: pointeur_ecriture = (unsigned char *) (*s_objet_resultat).objet;
! 1828: difference_lecture = strlen((unsigned char *)
! 1829: (*s_objet_argument_2).objet);
! 1830: difference_ecriture = strlen((unsigned char *)
! 1831: (*s_objet_argument_1).objet);
! 1832:
! 1833: for(;;)
! 1834: {
! 1835: ancien_pointeur_lecture = pointeur_lecture;
! 1836: ancien_pointeur_ecriture = pointeur_ecriture;
! 1837:
! 1838: pointeur_lecture = strstr(ancien_pointeur_lecture,
! 1839: (unsigned char *) (*s_objet_argument_2).objet);
! 1840:
! 1841: if (pointeur_lecture == NULL)
! 1842: {
! 1843: strcpy(ancien_pointeur_ecriture, ancien_pointeur_lecture);
! 1844: break;
! 1845: }
! 1846:
! 1847: strncpy(ancien_pointeur_ecriture, ancien_pointeur_lecture,
! 1848: pointeur_lecture - ancien_pointeur_lecture);
! 1849: strcpy(ancien_pointeur_ecriture +
! 1850: (pointeur_lecture - ancien_pointeur_lecture),
! 1851: (unsigned char *) (*s_objet_argument_1).objet);
! 1852:
! 1853: pointeur_ecriture += difference_ecriture +
! 1854: (pointeur_lecture - ancien_pointeur_lecture);
! 1855: pointeur_lecture += difference_lecture;
! 1856: }
! 1857: }
! 1858: else if (((*s_objet_argument_1).type == LST) &&
! 1859: ((*s_objet_argument_2).type == INT) &&
! 1860: ((*s_objet_argument_3).type == LST))
! 1861: {
! 1862: if ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0)
! 1863: {
! 1864: liberation(s_etat_processus, s_objet_argument_1);
! 1865: liberation(s_etat_processus, s_objet_argument_2);
! 1866: liberation(s_etat_processus, s_objet_argument_3);
! 1867:
! 1868: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 1869: return;
! 1870: }
! 1871:
! 1872: if ((s_objet_resultat = copie_objet(s_etat_processus,
! 1873: s_objet_argument_3, 'N')) == NULL)
! 1874: {
! 1875: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1876: return;
! 1877: }
! 1878:
! 1879: l_element_courant = (*s_objet_resultat).objet;
! 1880: l_element_precedent = NULL;
! 1881: position = 1;
! 1882:
! 1883: while(position < (*((integer8 *) (*s_objet_argument_2).objet)))
! 1884: {
! 1885: if (l_element_courant == NULL)
! 1886: {
! 1887: liberation(s_etat_processus, s_objet_argument_1);
! 1888: liberation(s_etat_processus, s_objet_argument_2);
! 1889: liberation(s_etat_processus, s_objet_argument_3);
! 1890: liberation(s_etat_processus, s_objet_resultat);
! 1891:
! 1892: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 1893: return;
! 1894: }
! 1895:
! 1896: position++;
! 1897: l_element_precedent = l_element_courant;
! 1898: l_element_courant = (*l_element_courant).suivant;
! 1899: }
! 1900:
! 1901: l_element_a_supprimer = l_element_courant;
! 1902:
! 1903: if (l_element_courant == NULL)
! 1904: {
! 1905: liberation(s_etat_processus, s_objet_argument_1);
! 1906: liberation(s_etat_processus, s_objet_argument_2);
! 1907: liberation(s_etat_processus, s_objet_argument_3);
! 1908: liberation(s_etat_processus, s_objet_resultat);
! 1909:
! 1910: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 1911: return;
! 1912: }
! 1913:
! 1914: if ((s_objet_intermediaire = copie_objet(s_etat_processus,
! 1915: s_objet_argument_1, 'N')) == NULL)
! 1916: {
! 1917: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1918: return;
! 1919: }
! 1920:
! 1921: if (l_element_precedent == NULL)
! 1922: {
! 1923: (*s_objet_resultat).objet = (*s_objet_intermediaire).objet;
! 1924: }
! 1925: else
! 1926: {
! 1927: (*l_element_precedent).suivant = (*s_objet_intermediaire).objet;
! 1928: }
! 1929:
! 1930: // (*l_element_precedent).suivant contient le premier maillon
! 1931: // de la liste accrochée, l_element_a_supprimer est le premier maillons
! 1932: // à supprimer.
! 1933:
! 1934: l_element_courant = (*s_objet_intermediaire).objet;
! 1935: (*s_objet_intermediaire).objet = l_element_a_supprimer;
! 1936:
! 1937: l_element_courant_2 = l_element_a_supprimer;
! 1938: l_element_precedent_2 = NULL;
! 1939:
! 1940: for(;;)
! 1941: {
! 1942: if (l_element_courant == NULL)
! 1943: {
! 1944: // La nouvelle liste est plus courte. On raboute les éléments
! 1945: // restant de l'ancienne liste à la nouvelle.
! 1946:
! 1947: if (l_element_precedent == NULL)
! 1948: {
! 1949: (*s_objet_resultat).objet = l_element_courant_2;
! 1950: }
! 1951: else
! 1952: {
! 1953: (*l_element_precedent).suivant = l_element_courant_2;
! 1954: }
! 1955:
! 1956: if (l_element_precedent_2 == NULL)
! 1957: {
! 1958: (*s_objet_intermediaire).objet = NULL;
! 1959: }
! 1960: else
! 1961: {
! 1962: (*l_element_precedent_2).suivant = NULL;
! 1963: }
! 1964:
! 1965: break;
! 1966: }
! 1967:
! 1968: if (l_element_courant_2 == NULL)
! 1969: {
! 1970: // L'ancienne liste est plus courte.
! 1971: break;
! 1972: }
! 1973:
! 1974: l_element_precedent = l_element_courant;
! 1975: l_element_precedent_2 = l_element_courant_2;
! 1976: l_element_courant = (*l_element_courant).suivant;
! 1977: l_element_courant_2 = (*l_element_courant_2).suivant;
! 1978: }
! 1979:
! 1980: liberation(s_etat_processus, s_objet_intermediaire);
! 1981: }
! 1982: else
! 1983: {
! 1984: liberation(s_etat_processus, s_objet_argument_1);
! 1985: liberation(s_etat_processus, s_objet_argument_2);
! 1986: liberation(s_etat_processus, s_objet_argument_3);
! 1987:
! 1988: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1989: return;
! 1990: }
! 1991:
! 1992: liberation(s_etat_processus, s_objet_argument_1);
! 1993: liberation(s_etat_processus, s_objet_argument_2);
! 1994: liberation(s_etat_processus, s_objet_argument_3);
! 1995:
! 1996: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1997: s_objet_resultat) == d_erreur)
! 1998: {
! 1999: return;
! 2000: }
! 2001:
! 2002: return;
! 2003: }
! 2004:
! 2005: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>