Annotation of rpl/src/instructions_r4.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 'r->b'
! 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_r_vers_b(struct_processus *s_etat_processus)
! 40: {
! 41: struct_objet *s_objet_argument;
! 42: struct_objet *s_objet_resultat;
! 43:
! 44: (*s_etat_processus).erreur_execution = d_ex;
! 45:
! 46: if ((*s_etat_processus).affichage_arguments == 'Y')
! 47: {
! 48: printf("\n R->B ");
! 49:
! 50: if ((*s_etat_processus).langue == 'F')
! 51: {
! 52: printf("(réel vers binaire)\n\n");
! 53: }
! 54: else
! 55: {
! 56: printf("(real to binary)\n\n");
! 57: }
! 58:
! 59: printf(" 1: %s\n", d_INT);
! 60: printf("-> 1: %s\n", d_BIN);
! 61:
! 62: return;
! 63: }
! 64: else if ((*s_etat_processus).test_instruction == 'Y')
! 65: {
! 66: (*s_etat_processus).nombre_arguments = -1;
! 67: return;
! 68: }
! 69:
! 70: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 71: {
! 72: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 73: {
! 74: return;
! 75: }
! 76: }
! 77:
! 78: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 79: &s_objet_argument) == d_erreur)
! 80: {
! 81: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 82: return;
! 83: }
! 84:
! 85: if ((*s_objet_argument).type == INT)
! 86: {
! 87: if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
! 88: {
! 89: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 90: return;
! 91: }
! 92:
! 93: if ((*((integer8 *) (*s_objet_argument).objet)) < 0)
! 94: {
! 95: (*((logical8 *) (*s_objet_resultat).objet)) = 0;
! 96: }
! 97: else
! 98: {
! 99: (*((logical8 *) (*s_objet_resultat).objet)) = (*((integer8 *)
! 100: (*s_objet_argument).objet));
! 101: }
! 102: }
! 103: else
! 104: {
! 105: liberation(s_etat_processus, s_objet_argument);
! 106:
! 107: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 108: return;
! 109: }
! 110:
! 111: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 112: s_objet_resultat) == d_erreur)
! 113: {
! 114: return;
! 115: }
! 116:
! 117: liberation(s_etat_processus, s_objet_argument);
! 118: return;
! 119: }
! 120:
! 121:
! 122: /*
! 123: ================================================================================
! 124: Fonction 'rl'
! 125: ================================================================================
! 126: Entrées : pointeur sur une structure struct_processus
! 127: --------------------------------------------------------------------------------
! 128: Sorties :
! 129: --------------------------------------------------------------------------------
! 130: Effets de bord : néant
! 131: ================================================================================
! 132: */
! 133:
! 134: void
! 135: instruction_rl(struct_processus *s_etat_processus)
! 136: {
! 137: logical8 masque;
! 138: logical8 tampon;
! 139:
! 140: struct_objet *s_copie;
! 141: struct_objet *s_objet;
! 142:
! 143: unsigned long i;
! 144: unsigned long j;
! 145: unsigned long longueur;
! 146:
! 147: (*s_etat_processus).erreur_execution = d_ex;
! 148:
! 149: if ((*s_etat_processus).affichage_arguments == 'Y')
! 150: {
! 151: printf("\n RL ");
! 152:
! 153: if ((*s_etat_processus).langue == 'F')
! 154: {
! 155: printf("(rotation à gauche)\n\n");
! 156: }
! 157: else
! 158: {
! 159: printf("(rotate left)\n\n");
! 160: }
! 161:
! 162: printf(" 1: %s\n", d_BIN);
! 163: printf("-> 1: %s\n", d_BIN);
! 164:
! 165: return;
! 166: }
! 167: else if ((*s_etat_processus).test_instruction == 'Y')
! 168: {
! 169: (*s_etat_processus).nombre_arguments = -1;
! 170: return;
! 171: }
! 172:
! 173: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 174: {
! 175: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 176: {
! 177: return;
! 178: }
! 179: }
! 180:
! 181: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 182: &s_objet) == d_erreur)
! 183: {
! 184: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 185: return;
! 186: }
! 187:
! 188: if ((*s_objet).type == BIN)
! 189: {
! 190: if ((s_copie = copie_objet(s_etat_processus, s_objet, 'O')) == NULL)
! 191: {
! 192: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 193: return;
! 194: }
! 195:
! 196: longueur = 1;
! 197: j = 1;
! 198:
! 199: for(i = 37; i <= 42; i++)
! 200: {
! 201: longueur += (test_cfsf(s_etat_processus, (unsigned char) i)
! 202: == d_vrai) ? j : 0;
! 203: j *= 2;
! 204: }
! 205:
! 206: tampon = (*((logical8 *) (*s_copie).objet));
! 207: masque = ((logical8) 1) << (longueur - 1);
! 208:
! 209: if ((tampon & masque) == 0)
! 210: {
! 211: tampon <<= 1;
! 212: }
! 213: else
! 214: {
! 215: tampon <<= 1;
! 216: tampon |= (logical8) 1;
! 217: }
! 218:
! 219: for(masque = 0, i = 0; i < longueur; i++)
! 220: {
! 221: masque <<= 1;
! 222: masque |= (logical8) 1;
! 223: }
! 224:
! 225: tampon &= masque;
! 226: (*((logical8 *) (*s_copie).objet)) = tampon;
! 227:
! 228: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 229: s_copie) == d_erreur)
! 230: {
! 231: return;
! 232: }
! 233: }
! 234: else
! 235: {
! 236: liberation(s_etat_processus, s_objet);
! 237:
! 238: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 239: return;
! 240: }
! 241:
! 242: liberation(s_etat_processus, s_objet);
! 243:
! 244: return;
! 245: }
! 246:
! 247:
! 248: /*
! 249: ================================================================================
! 250: Fonction 'rlb'
! 251: ================================================================================
! 252: Entrées : pointeur sur une structure struct_processus
! 253: --------------------------------------------------------------------------------
! 254: Sorties :
! 255: --------------------------------------------------------------------------------
! 256: Effets de bord : néant
! 257: ================================================================================
! 258: */
! 259:
! 260: void
! 261: instruction_rlb(struct_processus *s_etat_processus)
! 262: {
! 263: struct_liste_chainee *l_base_pile;
! 264:
! 265: unsigned long i;
! 266:
! 267: (*s_etat_processus).erreur_execution = d_ex;
! 268:
! 269: if ((*s_etat_processus).affichage_arguments == 'Y')
! 270: {
! 271: printf("\n RLB ");
! 272:
! 273: if ((*s_etat_processus).langue == 'F')
! 274: {
! 275: printf("(rotation d'un octet vers la gauche)\n\n");
! 276: }
! 277: else
! 278: {
! 279: printf("(rotate left byte)\n\n");
! 280: }
! 281:
! 282: printf(" 1: %s\n", d_BIN);
! 283: printf("-> 1: %s\n", d_BIN);
! 284:
! 285: return;
! 286: }
! 287: else if ((*s_etat_processus).test_instruction == 'Y')
! 288: {
! 289: (*s_etat_processus).nombre_arguments = -1;
! 290: return;
! 291: }
! 292:
! 293: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 294: {
! 295: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 296: {
! 297: return;
! 298: }
! 299: }
! 300:
! 301: l_base_pile = (*s_etat_processus).l_base_pile_last;
! 302: (*s_etat_processus).l_base_pile_last = NULL;
! 303:
! 304: for(i = 0; i < 8; i++)
! 305: {
! 306: instruction_rl(s_etat_processus);
! 307:
! 308: if (((*s_etat_processus).erreur_systeme != d_es) ||
! 309: ((*s_etat_processus).erreur_execution != d_ex))
! 310: {
! 311: break;
! 312: }
! 313: }
! 314:
! 315: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 316: {
! 317: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 318: {
! 319: return;
! 320: }
! 321: }
! 322:
! 323: (*s_etat_processus).l_base_pile_last = l_base_pile;
! 324: return;
! 325: }
! 326:
! 327:
! 328: /*
! 329: ================================================================================
! 330: Fonction 'rr'
! 331: ================================================================================
! 332: Entrées : pointeur sur une structure struct_processus
! 333: --------------------------------------------------------------------------------
! 334: Sorties :
! 335: --------------------------------------------------------------------------------
! 336: Effets de bord : néant
! 337: ================================================================================
! 338: */
! 339:
! 340: void
! 341: instruction_rr(struct_processus *s_etat_processus)
! 342: {
! 343: logical8 masque;
! 344: logical8 tampon;
! 345:
! 346: struct_objet *s_copie;
! 347: struct_objet *s_objet;
! 348:
! 349: unsigned long i;
! 350: unsigned long j;
! 351: unsigned long longueur;
! 352:
! 353: (*s_etat_processus).erreur_execution = d_ex;
! 354:
! 355: if ((*s_etat_processus).affichage_arguments == 'Y')
! 356: {
! 357: printf("\n RR ");
! 358:
! 359: if ((*s_etat_processus).langue == 'F')
! 360: {
! 361: printf("(rotation à droite)\n\n");
! 362: }
! 363: else
! 364: {
! 365: printf("(rotate right)\n\n");
! 366: }
! 367:
! 368: printf(" 1: %s\n", d_BIN);
! 369: printf("-> 1: %s\n", d_BIN);
! 370:
! 371: return;
! 372: }
! 373: else if ((*s_etat_processus).test_instruction == 'Y')
! 374: {
! 375: (*s_etat_processus).nombre_arguments = -1;
! 376: return;
! 377: }
! 378:
! 379: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 380: {
! 381: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 382: {
! 383: return;
! 384: }
! 385: }
! 386:
! 387: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 388: &s_objet) == d_erreur)
! 389: {
! 390: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 391: return;
! 392: }
! 393:
! 394: if ((*s_objet).type == BIN)
! 395: {
! 396: if ((s_copie = copie_objet(s_etat_processus, s_objet, 'O')) == NULL)
! 397: {
! 398: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 399: return;
! 400: }
! 401:
! 402: longueur = 1;
! 403: j = 1;
! 404:
! 405: for(i = 37; i <= 42; i++)
! 406: {
! 407: longueur += (test_cfsf(s_etat_processus, (unsigned char) i)
! 408: == d_vrai) ? j : 0;
! 409: j *= 2;
! 410: }
! 411:
! 412: tampon = (*((logical8 *) (*s_copie).objet));
! 413: masque = (logical8) 1;
! 414:
! 415: if ((tampon & masque) == 0)
! 416: {
! 417: tampon >>= 1;
! 418: }
! 419: else
! 420: {
! 421: tampon >>= 1;
! 422: tampon |= (((logical8) 1) << (longueur - 1));
! 423: }
! 424:
! 425: for(masque = 0, i = 0; i < longueur; i++)
! 426: {
! 427: masque <<= 1;
! 428: masque |= 1;
! 429: }
! 430:
! 431: tampon &= masque;
! 432: (*((logical8 *) (*s_copie).objet)) = tampon;
! 433:
! 434: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 435: s_copie) == d_erreur)
! 436: {
! 437: return;
! 438: }
! 439: }
! 440: else
! 441: {
! 442: liberation(s_etat_processus, s_objet);
! 443:
! 444: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 445: return;
! 446: }
! 447:
! 448: liberation(s_etat_processus, s_objet);
! 449:
! 450: return;
! 451: }
! 452:
! 453:
! 454: /*
! 455: ================================================================================
! 456: Fonction 'rrb'
! 457: ================================================================================
! 458: Entrées : pointeur sur une structure struct_processus
! 459: --------------------------------------------------------------------------------
! 460: Sorties :
! 461: --------------------------------------------------------------------------------
! 462: Effets de bord : néant
! 463: ================================================================================
! 464: */
! 465:
! 466: void
! 467: instruction_rrb(struct_processus *s_etat_processus)
! 468: {
! 469: struct_liste_chainee *l_base_pile;
! 470:
! 471: unsigned long i;
! 472:
! 473: (*s_etat_processus).erreur_execution = d_ex;
! 474:
! 475: if ((*s_etat_processus).affichage_arguments == 'Y')
! 476: {
! 477: printf("\n RRB ");
! 478:
! 479: if ((*s_etat_processus).langue == 'F')
! 480: {
! 481: printf("(rotation d'un octet vers la droite)\n\n");
! 482: }
! 483: else
! 484: {
! 485: printf("(rotate right byte)\n\n");
! 486: }
! 487:
! 488: printf(" 1: %s\n", d_BIN);
! 489: printf("-> 1: %s\n", d_BIN);
! 490:
! 491: return;
! 492: }
! 493: else if ((*s_etat_processus).test_instruction == 'Y')
! 494: {
! 495: (*s_etat_processus).nombre_arguments = -1;
! 496: return;
! 497: }
! 498:
! 499: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 500: {
! 501: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 502: {
! 503: return;
! 504: }
! 505: }
! 506:
! 507: l_base_pile = (*s_etat_processus).l_base_pile_last;
! 508: (*s_etat_processus).l_base_pile_last = NULL;
! 509:
! 510: for(i = 0; i < 8; i++)
! 511: {
! 512: instruction_rr(s_etat_processus);
! 513:
! 514: if (((*s_etat_processus).erreur_systeme != d_es) ||
! 515: ((*s_etat_processus).erreur_execution != d_ex))
! 516: {
! 517: break;
! 518: }
! 519: }
! 520:
! 521: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 522: {
! 523: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 524: {
! 525: return;
! 526: }
! 527: }
! 528:
! 529: (*s_etat_processus).l_base_pile_last = l_base_pile;
! 530: return;
! 531: }
! 532:
! 533:
! 534: /*
! 535: ================================================================================
! 536: Fonction 'redraw'
! 537: ================================================================================
! 538: Entrées : pointeur sur une structure struct_processus
! 539: --------------------------------------------------------------------------------
! 540: Sorties :
! 541: --------------------------------------------------------------------------------
! 542: Effets de bord : néant
! 543: ================================================================================
! 544: */
! 545:
! 546: void
! 547: instruction_redraw(struct_processus *s_etat_processus)
! 548: {
! 549: (*s_etat_processus).erreur_execution = d_ex;
! 550:
! 551: if ((*s_etat_processus).affichage_arguments == 'Y')
! 552: {
! 553: printf("\n REDRAW ");
! 554:
! 555: if ((*s_etat_processus).langue == 'F')
! 556: {
! 557: printf("(redessine une courbe)\n\n");
! 558: printf(" Aucun argument\n");
! 559: }
! 560: else
! 561: {
! 562: printf("(redraw a graphic)\n\n");
! 563: printf(" No argument\n");
! 564: }
! 565:
! 566: return;
! 567: }
! 568: else if ((*s_etat_processus).test_instruction == 'Y')
! 569: {
! 570: (*s_etat_processus).nombre_arguments = -1;
! 571: return;
! 572: }
! 573:
! 574: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 575: {
! 576: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 577: {
! 578: return;
! 579: }
! 580: }
! 581:
! 582: if ((*s_etat_processus).mise_a_jour_trace_requise == d_vrai)
! 583: {
! 584: (*s_etat_processus).erreur_execution = d_ex_graphique_memorise;
! 585: return;
! 586: }
! 587:
! 588: if ((*s_etat_processus).fichiers_graphiques != NULL)
! 589: {
! 590: appel_gnuplot(s_etat_processus, 'N');
! 591: }
! 592:
! 593: return;
! 594: }
! 595:
! 596:
! 597: /*
! 598: ================================================================================
! 599: Fonction 'remove'
! 600: ================================================================================
! 601: Entrées : pointeur sur une structure struct_processus
! 602: --------------------------------------------------------------------------------
! 603: Sorties :
! 604: --------------------------------------------------------------------------------
! 605: Effets de bord : néant
! 606: ================================================================================
! 607: */
! 608:
! 609: void
! 610: instruction_remove(struct_processus *s_etat_processus)
! 611: {
! 612: struct_objet *s_objet_argument;
! 613:
! 614: (*s_etat_processus).erreur_execution = d_ex;
! 615:
! 616: if ((*s_etat_processus).affichage_arguments == 'Y')
! 617: {
! 618: printf("\n REMOVE ");
! 619:
! 620: if ((*s_etat_processus).langue == 'F')
! 621: {
! 622: printf("(retrait d'une bibliothèque dynamique)\n\n");
! 623: }
! 624: else
! 625: {
! 626: printf("(remove a shared library)\n\n");
! 627: }
! 628:
! 629: printf(" 1: %s\n", d_SLB);
! 630:
! 631: return;
! 632: }
! 633: else if ((*s_etat_processus).test_instruction == 'Y')
! 634: {
! 635: (*s_etat_processus).nombre_arguments = -1;
! 636: return;
! 637: }
! 638:
! 639: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 640: {
! 641: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 642: {
! 643: return;
! 644: }
! 645: }
! 646:
! 647: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 648: &s_objet_argument) == d_erreur)
! 649: {
! 650: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 651: return;
! 652: }
! 653:
! 654: if ((*s_objet_argument).type == SLB)
! 655: {
! 656: /*
! 657: * On ne décharge que les bibliothèques qui ont été chargées dans
! 658: * le couple pid/tid courant.
! 659: */
! 660:
! 661: if (((*((struct_bibliotheque *) (*s_objet_argument).objet)).pid ==
! 662: getpid()) && (pthread_equal((*((struct_bibliotheque *)
! 663: (*s_objet_argument).objet)).tid, pthread_self()) != 0))
! 664: {
! 665: if (retrait_bibliotheque(s_etat_processus,
! 666: (*s_objet_argument).objet) == d_erreur)
! 667: {
! 668: liberation(s_etat_processus, s_objet_argument);
! 669:
! 670: return;
! 671: }
! 672: }
! 673: }
! 674: else
! 675: {
! 676: liberation(s_etat_processus, s_objet_argument);
! 677:
! 678: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 679: return;
! 680: }
! 681:
! 682: liberation(s_etat_processus, s_objet_argument);
! 683:
! 684: return;
! 685: }
! 686:
! 687:
! 688: /*
! 689: ================================================================================
! 690: Fonction 'relax'
! 691: ================================================================================
! 692: Entrées : pointeur sur une structure struct_processus
! 693: --------------------------------------------------------------------------------
! 694: Sorties :
! 695: --------------------------------------------------------------------------------
! 696: Effets de bord : néant
! 697: ================================================================================
! 698: */
! 699:
! 700: void
! 701: instruction_relax(struct_processus *s_etat_processus)
! 702: {
! 703: (*s_etat_processus).erreur_execution = d_ex;
! 704:
! 705: if ((*s_etat_processus).affichage_arguments == 'Y')
! 706: {
! 707: printf("\n RELAX ");
! 708:
! 709: if ((*s_etat_processus).langue == 'F')
! 710: {
! 711: printf("(ne fait rien)\n\n");
! 712: printf(" Aucun argument\n");
! 713: }
! 714: else
! 715: {
! 716: printf("(do nothing)\n\n");
! 717: printf(" No argument\n");
! 718: }
! 719:
! 720: return;
! 721: }
! 722: else if ((*s_etat_processus).test_instruction == 'Y')
! 723: {
! 724: (*s_etat_processus).nombre_arguments = 1;
! 725: return;
! 726: }
! 727:
! 728: /*
! 729: * Cette instruction ne fait rien. Elle existe pour être symétrique
! 730: * à l'instruction CHS et permet de traiter les équations de façon
! 731: * simple (Ex : '+pi'). En principe, elle n'a pas a être appelée
! 732: * directement par l'utilisateur.
! 733: */
! 734:
! 735: return;
! 736: }
! 737:
! 738:
! 739: /*
! 740: ================================================================================
! 741: Fonction 'rewind'
! 742: ================================================================================
! 743: Entrées : pointeur sur une structure struct_processus
! 744: --------------------------------------------------------------------------------
! 745: Sorties :
! 746: --------------------------------------------------------------------------------
! 747: Effets de bord : néant
! 748: ================================================================================
! 749: */
! 750:
! 751: void
! 752: instruction_rewind(struct_processus *s_etat_processus)
! 753: {
! 754: file *descripteur;
! 755:
! 756: struct_objet *s_objet_argument;
! 757:
! 758: (*s_etat_processus).erreur_execution = d_ex;
! 759:
! 760: if ((*s_etat_processus).affichage_arguments == 'Y')
! 761: {
! 762: printf("\n REWIND ");
! 763:
! 764: if ((*s_etat_processus).langue == 'F')
! 765: {
! 766: printf("(retour au début d'un fichier)\n\n");
! 767: }
! 768: else
! 769: {
! 770: printf("(rewind a file)\n\n");
! 771: }
! 772:
! 773: printf(" 1: %s\n", d_FCH);
! 774:
! 775: return;
! 776: }
! 777: else if ((*s_etat_processus).test_instruction == 'Y')
! 778: {
! 779: (*s_etat_processus).nombre_arguments = -1;
! 780: return;
! 781: }
! 782:
! 783: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 784: {
! 785: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 786: {
! 787: return;
! 788: }
! 789: }
! 790:
! 791: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 792: &s_objet_argument) == d_erreur)
! 793: {
! 794: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 795: return;
! 796: }
! 797:
! 798: if ((*s_objet_argument).type == FCH)
! 799: {
! 800: if ((descripteur = descripteur_fichier(s_etat_processus,
! 801: (struct_fichier *) (*s_objet_argument).objet)) == NULL)
! 802: {
! 803: return;
! 804: }
! 805:
! 806: if (fseek(descripteur, (long) 0, SEEK_SET) != 0)
! 807: {
! 808: liberation(s_etat_processus, s_objet_argument);
! 809:
! 810: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 811: return;
! 812: }
! 813: }
! 814: else
! 815: {
! 816: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 817: return;
! 818: }
! 819:
! 820: liberation(s_etat_processus, s_objet_argument);
! 821:
! 822: return;
! 823: }
! 824:
! 825:
! 826: /*
! 827: ================================================================================
! 828: Fonction 'read'
! 829: ================================================================================
! 830: Entrées : pointeur sur une structure struct_processus
! 831: --------------------------------------------------------------------------------
! 832: Sorties :
! 833: --------------------------------------------------------------------------------
! 834: Effets de bord : néant
! 835: ================================================================================
! 836: */
! 837:
! 838: void
! 839: instruction_read(struct_processus *s_etat_processus)
! 840: {
! 841: file *descripteur;
! 842:
! 843: logical1 indicateur_48;
! 844: logical1 presence_chaine;
! 845: logical1 presence_indicateur;
! 846:
! 847: long longueur_effective;
! 848: long longueur_enregistrement;
! 849: long longueur_questure;
! 850: long niveau;
! 851: long pointeur;
! 852: long position_finale;
! 853: long position_initiale;
! 854:
! 855: socklen_t longueur_adresse;
! 856:
! 857: struct flock lock;
! 858:
! 859: struct sockaddr_un adresse_unix;
! 860: struct sockaddr_in adresse_ipv4;
! 861: struct sockaddr_in6 adresse_ipv6;
! 862:
! 863: struct timespec attente;
! 864:
! 865: struct_objet *s_objet_adresse;
! 866: struct_objet *s_objet_argument;
! 867: struct_objet *s_objet_resultat;
! 868: struct_objet *s_objet_type;
! 869:
! 870: unsigned char caractere;
! 871: unsigned char *tampon_lecture;
! 872: unsigned char *tampon;
! 873:
! 874: unsigned long i;
! 875:
! 876: (*s_etat_processus).erreur_execution = d_ex;
! 877:
! 878: attente.tv_sec = 0;
! 879: attente.tv_nsec = GRANULARITE_us * 1000;
! 880:
! 881: if ((*s_etat_processus).affichage_arguments == 'Y')
! 882: {
! 883: printf("\n READ ");
! 884:
! 885: if ((*s_etat_processus).langue == 'F')
! 886: {
! 887: printf("(lecture d'un enregistrement d'un fichier)\n\n");
! 888: }
! 889: else
! 890: {
! 891: printf("(read a record of a file)\n\n");
! 892: }
! 893:
! 894: printf(" 1: %s, %s\n", d_FCH, d_SCK);
! 895: printf(" To be fixed !\n");
! 896:
! 897: return;
! 898: }
! 899: else if ((*s_etat_processus).test_instruction == 'Y')
! 900: {
! 901: (*s_etat_processus).nombre_arguments = -1;
! 902: return;
! 903: }
! 904:
! 905: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 906: {
! 907: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 908: {
! 909: return;
! 910: }
! 911: }
! 912:
! 913: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 914: &s_objet_argument) == d_erreur)
! 915: {
! 916: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 917: return;
! 918: }
! 919:
! 920: if ((*s_objet_argument).type == FCH)
! 921: {
! 922: /*
! 923: * Vérification des verrous
! 924: */
! 925:
! 926: lock.l_type = F_RDLCK;
! 927: lock.l_whence = SEEK_SET;
! 928: lock.l_start = 0;
! 929: lock.l_len = 0;
! 930: lock.l_pid = getpid();
! 931:
! 932: if ((descripteur = descripteur_fichier(s_etat_processus,
! 933: (struct_fichier *) (*s_objet_argument).objet)) == NULL)
! 934: {
! 935: return;
! 936: }
! 937:
! 938: if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)
! 939: {
! 940: liberation(s_etat_processus, s_objet_argument);
! 941:
! 942: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 943: return;
! 944: }
! 945:
! 946: if (lock.l_type != F_UNLCK)
! 947: {
! 948: liberation(s_etat_processus, s_objet_argument);
! 949:
! 950: (*s_etat_processus).erreur_execution =
! 951: d_ex_fichier_verrouille;
! 952: return;
! 953: }
! 954:
! 955: /*
! 956: * Vérification de l'autorisation de lecture
! 957: */
! 958:
! 959: if ((*((struct_fichier *) (*s_objet_argument).objet)).protection == 'W')
! 960: {
! 961: liberation(s_etat_processus, s_objet_argument);
! 962:
! 963: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
! 964: return;
! 965: }
! 966: else if ((*((struct_fichier *) (*s_objet_argument).objet)).protection
! 967: == 'N')
! 968: {
! 969: if (fflush(descripteur) != 0)
! 970: {
! 971: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 972: return;
! 973: }
! 974: }
! 975:
! 976: if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire == 'N')
! 977: {
! 978: /*
! 979: * Fichiers formatés
! 980: */
! 981:
! 982: if ((*((struct_fichier *) (*s_objet_argument).objet)).acces == 'S')
! 983: {
! 984: /*
! 985: * Fichiers séquentiels
! 986: */
! 987:
! 988: longueur_questure = 256;
! 989:
! 990: if ((tampon_lecture = malloc(longueur_questure *
! 991: sizeof(unsigned char))) == NULL)
! 992: {
! 993: (*s_etat_processus).erreur_systeme =
! 994: d_es_allocation_memoire;
! 995: return;
! 996: }
! 997:
! 998: if ((position_initiale = ftell(descripteur)) == -1)
! 999: {
! 1000: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1001: return;
! 1002: }
! 1003:
! 1004: do
! 1005: {
! 1006: longueur_effective = fread(tampon_lecture,
! 1007: (size_t) sizeof(unsigned char), longueur_questure,
! 1008: descripteur);
! 1009:
! 1010: pointeur = 0;
! 1011: presence_indicateur = d_faux;
! 1012:
! 1013: while(pointeur < longueur_effective)
! 1014: {
! 1015: if (tampon_lecture[pointeur] == '{')
! 1016: {
! 1017: presence_indicateur = d_vrai;
! 1018: break;
! 1019: }
! 1020:
! 1021: position_initiale++;
! 1022: pointeur++;
! 1023: }
! 1024:
! 1025: if (presence_indicateur == d_vrai)
! 1026: {
! 1027: break;
! 1028: }
! 1029: } while(longueur_effective == longueur_questure);
! 1030:
! 1031: if (presence_indicateur == d_faux)
! 1032: {
! 1033: liberation(s_etat_processus, s_objet_argument);
! 1034: free(tampon_lecture);
! 1035:
! 1036: (*s_etat_processus).erreur_execution =
! 1037: d_ex_fin_de_fichier_atteinte;
! 1038: return;
! 1039: }
! 1040:
! 1041: position_finale = position_initiale + 1;
! 1042: presence_chaine = d_faux;
! 1043: niveau = 1;
! 1044:
! 1045: if (fseek(descripteur, position_finale, SEEK_SET) != 0)
! 1046: {
! 1047: liberation(s_etat_processus, s_objet_argument);
! 1048: free(tampon_lecture);
! 1049:
! 1050: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1051: return;
! 1052: }
! 1053:
! 1054: do
! 1055: {
! 1056: longueur_effective = fread(tampon_lecture,
! 1057: (size_t) sizeof(unsigned char), longueur_questure,
! 1058: descripteur);
! 1059:
! 1060: pointeur = 0;
! 1061: presence_indicateur = d_faux;
! 1062:
! 1063: while(pointeur < longueur_effective)
! 1064: {
! 1065: if (tampon_lecture[pointeur] == '"')
! 1066: {
! 1067: presence_chaine = (presence_chaine == d_vrai)
! 1068: ? d_faux : d_vrai;
! 1069: }
! 1070: else
! 1071: {
! 1072: if (presence_chaine == d_faux)
! 1073: {
! 1074: if (tampon_lecture[pointeur] == '{')
! 1075: {
! 1076: niveau++;
! 1077: }
! 1078: else if (tampon_lecture[pointeur] == '}')
! 1079: {
! 1080: niveau--;
! 1081: }
! 1082: }
! 1083: }
! 1084:
! 1085: position_finale++;
! 1086: pointeur++;
! 1087:
! 1088: if (niveau == 0)
! 1089: {
! 1090: presence_indicateur = d_vrai;
! 1091: break;
! 1092: }
! 1093: }
! 1094:
! 1095: if (presence_indicateur == d_vrai)
! 1096: {
! 1097: break;
! 1098: }
! 1099: } while(longueur_effective == longueur_questure);
! 1100:
! 1101: if (presence_indicateur == d_faux)
! 1102: {
! 1103: liberation(s_etat_processus, s_objet_argument);
! 1104: free(tampon_lecture);
! 1105:
! 1106: (*s_etat_processus).erreur_execution =
! 1107: d_ex_fin_de_fichier_atteinte;
! 1108: return;
! 1109: }
! 1110:
! 1111: free(tampon_lecture);
! 1112: longueur_enregistrement = position_finale - position_initiale;
! 1113:
! 1114: if ((tampon_lecture = malloc((longueur_enregistrement + 1) *
! 1115: sizeof(unsigned char))) == NULL)
! 1116: {
! 1117: (*s_etat_processus).erreur_systeme =
! 1118: d_es_allocation_memoire;
! 1119: return;
! 1120: }
! 1121:
! 1122: if (fseek(descripteur, position_initiale, SEEK_SET) != 0)
! 1123: {
! 1124: liberation(s_etat_processus, s_objet_argument);
! 1125: free(tampon_lecture);
! 1126:
! 1127: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1128: return;
! 1129: }
! 1130:
! 1131: longueur_effective = fread(tampon_lecture,
! 1132: (size_t) sizeof(unsigned char),
! 1133: (size_t) longueur_enregistrement,
! 1134: descripteur);
! 1135:
! 1136: if (longueur_effective != longueur_enregistrement)
! 1137: {
! 1138: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1139: return;
! 1140: }
! 1141:
! 1142: tampon_lecture[longueur_enregistrement] = d_code_fin_chaine;
! 1143: tampon = (*s_etat_processus).instruction_courante;
! 1144: (*s_etat_processus).instruction_courante = tampon_lecture;
! 1145:
! 1146: indicateur_48 = test_cfsf(s_etat_processus, 48);
! 1147: cf(s_etat_processus, 48);
! 1148:
! 1149: recherche_type(s_etat_processus);
! 1150:
! 1151: if ((*s_etat_processus).erreur_execution != d_ex)
! 1152: {
! 1153: (*s_etat_processus).instruction_courante = tampon;
! 1154: free(tampon_lecture);
! 1155:
! 1156: liberation(s_etat_processus, s_objet_argument);
! 1157:
! 1158: return;
! 1159: }
! 1160:
! 1161: if (indicateur_48 == d_vrai)
! 1162: {
! 1163: sf(s_etat_processus, 48);
! 1164: }
! 1165: else
! 1166: {
! 1167: cf(s_etat_processus, 48);
! 1168: }
! 1169:
! 1170: (*s_etat_processus).instruction_courante = tampon;
! 1171: free(tampon_lecture);
! 1172: }
! 1173: else if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
! 1174: == 'D')
! 1175: {
! 1176: }
! 1177: else
! 1178: {
! 1179: }
! 1180: }
! 1181: else if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire
! 1182: == 'Y')
! 1183: {
! 1184: /*
! 1185: * Fichiers non formatés
! 1186: */
! 1187: }
! 1188: else
! 1189: {
! 1190: /*
! 1191: * Fichiers de type FLOW
! 1192: */
! 1193: }
! 1194: }
! 1195: else if ((*s_objet_argument).type == SCK)
! 1196: {
! 1197: /*
! 1198: * Vérification de l'autorisation de lecture
! 1199: */
! 1200:
! 1201: if ((*((struct_socket *) (*s_objet_argument).objet)).protection == 'W')
! 1202: {
! 1203: liberation(s_etat_processus, s_objet_argument);
! 1204:
! 1205: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
! 1206: return;
! 1207: }
! 1208:
! 1209: /*
! 1210: * Vérification de l'écoute de la socket si celle-ci est connectée
! 1211: */
! 1212:
! 1213: if ((strcmp((*((struct_socket *) (*s_objet_argument).objet)).type,
! 1214: "STREAM") == 0) || (strcmp((*((struct_socket *)
! 1215: (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") == 0))
! 1216: {
! 1217: if ((*((struct_socket *) (*s_objet_argument).objet))
! 1218: .socket_en_ecoute == 'Y')
! 1219: {
! 1220: liberation(s_etat_processus, s_objet_argument);
! 1221:
! 1222: (*s_etat_processus).erreur_execution = d_ex_socket_en_ecoute;
! 1223: return;
! 1224: }
! 1225: }
! 1226:
! 1227: if ((*((struct_socket *) (*s_objet_argument).objet)).binaire == 'N')
! 1228: { // Socket formatée
! 1229: longueur_questure = 256;
! 1230:
! 1231: do
! 1232: {
! 1233: if ((tampon_lecture = malloc((longueur_questure + 1) *
! 1234: sizeof(unsigned char))) == NULL)
! 1235: {
! 1236: (*s_etat_processus).erreur_systeme =
! 1237: d_es_allocation_memoire;
! 1238: return;
! 1239: }
! 1240:
! 1241: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
! 1242: {
! 1243: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1244: return;
! 1245: }
! 1246:
! 1247: for(;;)
! 1248: {
! 1249: if ((*((struct_socket *) (*s_objet_argument).objet)).domaine
! 1250: == PF_UNIX)
! 1251: {
! 1252: longueur_adresse = sizeof(adresse_unix);
! 1253: longueur_effective = recvfrom((*((struct_socket *)
! 1254: (*s_objet_argument).objet)).socket,
! 1255: tampon_lecture, longueur_questure,
! 1256: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
! 1257: &adresse_unix, &longueur_adresse);
! 1258: }
! 1259: else if ((*((struct_socket *) (*s_objet_argument).objet))
! 1260: .domaine == PF_INET)
! 1261: {
! 1262: longueur_adresse = sizeof(adresse_ipv4);
! 1263: longueur_effective = recvfrom((*((struct_socket *)
! 1264: (*s_objet_argument).objet)).socket,
! 1265: tampon_lecture, longueur_questure,
! 1266: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
! 1267: &adresse_ipv4, &longueur_adresse);
! 1268: }
! 1269: else if ((*((struct_socket *) (*s_objet_argument).objet))
! 1270: .domaine == PF_INET6)
! 1271: {
! 1272: longueur_adresse = sizeof(adresse_ipv6);
! 1273: longueur_effective = recvfrom((*((struct_socket *)
! 1274: (*s_objet_argument).objet)).socket,
! 1275: tampon_lecture, longueur_questure,
! 1276: MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
! 1277: &adresse_ipv6, &longueur_adresse);
! 1278: }
! 1279: else
! 1280: {
! 1281: free(tampon_lecture);
! 1282: liberation(s_etat_processus, s_objet_argument);
! 1283:
! 1284: while(sem_wait(&((*s_etat_processus)
! 1285: .semaphore_fork)) == -1)
! 1286: {
! 1287: if (errno != EINTR)
! 1288: {
! 1289: (*s_etat_processus).erreur_systeme =
! 1290: d_es_processus;
! 1291: return;
! 1292: }
! 1293: }
! 1294:
! 1295: (*s_etat_processus).erreur_execution =
! 1296: d_ex_erreur_acces_fichier;
! 1297: return;
! 1298: }
! 1299:
! 1300: if (longueur_effective < 0)
! 1301: {
! 1302: nanosleep(&attente, NULL);
! 1303: scrutation_injection(s_etat_processus);
! 1304: }
! 1305:
! 1306: if (((*s_etat_processus).var_volatile_requete_arret == -1)
! 1307: || (longueur_effective >= 0))
! 1308: {
! 1309: break;
! 1310: }
! 1311: }
! 1312:
! 1313: while(sem_wait(&((*s_etat_processus).semaphore_fork))
! 1314: == -1)
! 1315: {
! 1316: if (errno != EINTR)
! 1317: {
! 1318: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1319: return;
! 1320: }
! 1321: }
! 1322:
! 1323: if ((*s_etat_processus).var_volatile_requete_arret == -1)
! 1324: {
! 1325:
! 1326: /*
! 1327: * Si le père tue le processus courant grâce au signal
! 1328: * SIGFSTOP, on ne renvoie pas d'erreur. Ce fonctionnement
! 1329: * correspond à l'utilisation de STOP sur le processus
! 1330: * en cours. La variable longueur_effective vaut '-1'.
! 1331: */
! 1332:
! 1333: free(tampon_lecture);
! 1334: liberation(s_etat_processus, s_objet_argument);
! 1335: return;
! 1336: }
! 1337:
! 1338: if (longueur_effective == -1)
! 1339: {
! 1340: free(tampon_lecture);
! 1341: liberation(s_etat_processus, s_objet_argument);
! 1342:
! 1343: (*s_etat_processus).erreur_execution =
! 1344: d_ex_erreur_acces_fichier;
! 1345: return;
! 1346: }
! 1347:
! 1348: position_initiale = 0;
! 1349: presence_indicateur = d_faux;
! 1350:
! 1351: do
! 1352: {
! 1353: if (tampon_lecture[position_initiale] == '{')
! 1354: {
! 1355: presence_indicateur = d_vrai;
! 1356: break;
! 1357: }
! 1358:
! 1359: position_initiale++;
! 1360: } while(position_initiale < longueur_effective);
! 1361:
! 1362:
! 1363: if (presence_indicateur == d_vrai)
! 1364: {
! 1365: position_finale = position_initiale + 1;
! 1366: presence_chaine = d_faux;
! 1367: presence_indicateur = d_faux;
! 1368: niveau = 1;
! 1369:
! 1370: while(position_finale < longueur_effective)
! 1371: {
! 1372: caractere = tampon_lecture[position_finale];
! 1373:
! 1374: if (caractere == '"')
! 1375: {
! 1376: presence_chaine = (presence_chaine == d_vrai)
! 1377: ? d_faux : d_vrai;
! 1378: }
! 1379: else
! 1380: {
! 1381: if (presence_chaine == d_faux)
! 1382: {
! 1383: if (caractere == '{')
! 1384: {
! 1385: niveau++;
! 1386: }
! 1387: else if (caractere == '}')
! 1388: {
! 1389: niveau--;
! 1390: }
! 1391: }
! 1392: }
! 1393:
! 1394: if (niveau == 0)
! 1395: {
! 1396: presence_indicateur = d_vrai;
! 1397: break;
! 1398: }
! 1399:
! 1400: position_finale++;
! 1401: }
! 1402: }
! 1403:
! 1404: if (presence_indicateur == d_faux)
! 1405: {
! 1406: if (longueur_effective < longueur_questure)
! 1407: {
! 1408: liberation(s_etat_processus, s_objet_argument);
! 1409: free(tampon_lecture);
! 1410:
! 1411: (*s_etat_processus).erreur_execution =
! 1412: d_ex_fin_de_fichier_atteinte;
! 1413: return;
! 1414: }
! 1415:
! 1416: free(tampon_lecture);
! 1417: longueur_questure *= 2;
! 1418: }
! 1419: } while(presence_indicateur == d_faux);
! 1420:
! 1421: tampon_lecture[++position_finale] = d_code_fin_chaine;
! 1422: tampon = (*s_etat_processus).instruction_courante;
! 1423: (*s_etat_processus).instruction_courante = &(tampon_lecture
! 1424: [position_initiale]);
! 1425:
! 1426: indicateur_48 = test_cfsf(s_etat_processus, 48);
! 1427: cf(s_etat_processus, 48);
! 1428:
! 1429: recherche_type(s_etat_processus);
! 1430:
! 1431: if ((*s_etat_processus).erreur_execution != d_ex)
! 1432: {
! 1433: (*s_etat_processus).instruction_courante = tampon;
! 1434: free(tampon_lecture);
! 1435:
! 1436: liberation(s_etat_processus, s_objet_argument);
! 1437:
! 1438: return;
! 1439: }
! 1440:
! 1441: if (indicateur_48 == d_vrai)
! 1442: {
! 1443: sf(s_etat_processus, 48);
! 1444: }
! 1445: else
! 1446: {
! 1447: cf(s_etat_processus, 48);
! 1448: }
! 1449:
! 1450: (*s_etat_processus).instruction_courante = tampon;
! 1451:
! 1452: /*
! 1453: * Création de la liste de sortie
! 1454: */
! 1455:
! 1456: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1457: &s_objet_type) == d_erreur)
! 1458: {
! 1459: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1460: return;
! 1461: }
! 1462:
! 1463: if ((s_objet_resultat = allocation(s_etat_processus, LST))
! 1464: == NULL)
! 1465: {
! 1466: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1467: return;
! 1468: }
! 1469:
! 1470: if (((*s_objet_resultat).objet =
! 1471: allocation_maillon(s_etat_processus)) == NULL)
! 1472: {
! 1473: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1474: return;
! 1475: }
! 1476:
! 1477: (*((struct_liste_chainee *) (*s_objet_resultat).objet))
! 1478: .donnee = s_objet_type;
! 1479:
! 1480: if (((*((struct_liste_chainee *) (*s_objet_resultat).objet))
! 1481: .suivant = allocation_maillon(s_etat_processus)) == NULL)
! 1482: {
! 1483: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1484: return;
! 1485: }
! 1486:
! 1487: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
! 1488: .suivant = NULL;
! 1489:
! 1490: if ((s_objet_adresse = allocation(s_etat_processus, LST))
! 1491: == NULL)
! 1492: {
! 1493: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1494: return;
! 1495: }
! 1496:
! 1497: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
! 1498: .donnee = s_objet_adresse;
! 1499:
! 1500: /*
! 1501: * Les informations concernant la cible sont valides si
! 1502: * la socket est non connectée et des domaines INET ou INET6.
! 1503: * Dans tous les autres cas, on renvoie une liste vide.
! 1504: */
! 1505:
! 1506: if (((*((struct_socket *) (*s_objet_argument).objet)).domaine
! 1507: == PF_UNIX) || (strcmp((*((struct_socket *)
! 1508: (*s_objet_argument).objet)).type, "STREAM") == 0) ||
! 1509: (strcmp((*((struct_socket *) (*s_objet_argument).objet))
! 1510: .type, "SEQUENTIAL DATAGRAM") == 0))
! 1511: {
! 1512: longueur_adresse = 0;
! 1513: recvfrom((*((struct_socket *)
! 1514: (*s_objet_argument).objet)).socket, tampon_lecture,
! 1515: position_finale, MSG_DONTWAIT,
! 1516: NULL, &longueur_adresse);
! 1517:
! 1518: (*s_objet_adresse).objet = NULL;
! 1519: }
! 1520: else if ((*((struct_socket *) (*s_objet_argument).objet))
! 1521: .domaine == PF_INET)
! 1522: {
! 1523: longueur_adresse = sizeof(adresse_ipv4);
! 1524: recvfrom((*((struct_socket *)
! 1525: (*s_objet_argument).objet)).socket, tampon_lecture,
! 1526: position_finale, MSG_DONTWAIT,
! 1527: (struct sockaddr *) &adresse_ipv4, &longueur_adresse);
! 1528:
! 1529: if (((*s_objet_adresse).objet =
! 1530: allocation_maillon(s_etat_processus)) == NULL)
! 1531: {
! 1532: (*s_etat_processus).erreur_systeme =
! 1533: d_es_allocation_memoire;
! 1534: return;
! 1535: }
! 1536:
! 1537: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
! 1538: .donnee = allocation(s_etat_processus, VIN)) == NULL)
! 1539: {
! 1540: (*s_etat_processus).erreur_systeme =
! 1541: d_es_allocation_memoire;
! 1542: return;
! 1543: }
! 1544:
! 1545: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
! 1546: (*s_objet_adresse).objet)).donnee).objet)).taille = 4;
! 1547:
! 1548: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
! 1549: (*s_objet_adresse).objet)).donnee).objet)).tableau =
! 1550: malloc(4 * sizeof(integer8))) == NULL)
! 1551: {
! 1552: (*s_etat_processus).erreur_systeme =
! 1553: d_es_allocation_memoire;
! 1554: return;
! 1555: }
! 1556:
! 1557: ((integer8 *) (*((struct_vecteur *)
! 1558: (*(*((struct_liste_chainee *) (*s_objet_adresse)
! 1559: .objet)).donnee).objet)).tableau)[0] =
! 1560: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF;
! 1561: ((integer8 *) (*((struct_vecteur *)
! 1562: (*(*((struct_liste_chainee *) (*s_objet_adresse)
! 1563: .objet)).donnee).objet)).tableau)[1] =
! 1564: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF;
! 1565: ((integer8 *) (*((struct_vecteur *)
! 1566: (*(*((struct_liste_chainee *) (*s_objet_adresse)
! 1567: .objet)).donnee).objet)).tableau)[2] =
! 1568: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF;
! 1569: ((integer8 *) (*((struct_vecteur *)
! 1570: (*(*((struct_liste_chainee *) (*s_objet_adresse)
! 1571: .objet)).donnee).objet)).tableau)[3] =
! 1572: ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF;
! 1573:
! 1574: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
! 1575: .suivant = allocation_maillon(s_etat_processus))
! 1576: == NULL)
! 1577: {
! 1578: (*s_etat_processus).erreur_systeme =
! 1579: d_es_allocation_memoire;
! 1580: return;
! 1581: }
! 1582:
! 1583: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
! 1584: .suivant).donnee = allocation(s_etat_processus, INT))
! 1585: == NULL)
! 1586: {
! 1587: (*s_etat_processus).erreur_systeme =
! 1588: d_es_allocation_memoire;
! 1589: return;
! 1590: }
! 1591:
! 1592: (*((integer8 *) (*(*(*((struct_liste_chainee *)
! 1593: (*s_objet_adresse) .objet)).suivant).donnee).objet)) =
! 1594: (integer8) ntohs(adresse_ipv4.sin_port);
! 1595:
! 1596: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
! 1597: .suivant).suivant = NULL;
! 1598: }
! 1599: else if ((*((struct_socket *) (*s_objet_argument).objet))
! 1600: .domaine == PF_INET6)
! 1601: {
! 1602: longueur_adresse = sizeof(adresse_ipv6);
! 1603: recvfrom((*((struct_socket *)
! 1604: (*s_objet_argument).objet)).socket, tampon_lecture,
! 1605: position_finale, MSG_DONTWAIT,
! 1606: (struct sockaddr *) &adresse_ipv6, &longueur_adresse);
! 1607:
! 1608: if (((*s_objet_adresse).objet =
! 1609: allocation_maillon(s_etat_processus)) == NULL)
! 1610: {
! 1611: (*s_etat_processus).erreur_systeme =
! 1612: d_es_allocation_memoire;
! 1613: return;
! 1614: }
! 1615:
! 1616: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
! 1617: .donnee = allocation(s_etat_processus, VIN)) == NULL)
! 1618: {
! 1619: (*s_etat_processus).erreur_systeme =
! 1620: d_es_allocation_memoire;
! 1621: return;
! 1622: }
! 1623:
! 1624: (*((struct_vecteur *) (*(*((struct_liste_chainee *)
! 1625: (*s_objet_adresse).objet)).donnee).objet)).taille = 16;
! 1626:
! 1627: if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
! 1628: (*s_objet_adresse).objet)).donnee).objet)).tableau =
! 1629: malloc(16 * sizeof(integer8))) == NULL)
! 1630: {
! 1631: (*s_etat_processus).erreur_systeme =
! 1632: d_es_allocation_memoire;
! 1633: return;
! 1634: }
! 1635:
! 1636: for(i = 0; i < 16; i++)
! 1637: {
! 1638: ((integer8 *) (*((struct_vecteur *)
! 1639: (*(*((struct_liste_chainee *) (*s_objet_adresse)
! 1640: .objet)).donnee).objet)).tableau)[0] =
! 1641: adresse_ipv6.sin6_addr.s6_addr[i];
! 1642: }
! 1643:
! 1644: if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
! 1645: .suivant = allocation_maillon(s_etat_processus))
! 1646: == NULL)
! 1647: {
! 1648: (*s_etat_processus).erreur_systeme =
! 1649: d_es_allocation_memoire;
! 1650: return;
! 1651: }
! 1652:
! 1653: if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
! 1654: .suivant).donnee = allocation(s_etat_processus, INT))
! 1655: == NULL)
! 1656: {
! 1657: (*s_etat_processus).erreur_systeme =
! 1658: d_es_allocation_memoire;
! 1659: return;
! 1660: }
! 1661:
! 1662: (*((integer8 *) (*(*(*((struct_liste_chainee *)
! 1663: (*s_objet_adresse) .objet)).suivant).donnee).objet)) =
! 1664: (integer8) ntohs(adresse_ipv6.sin6_port);
! 1665:
! 1666: (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
! 1667: .suivant).suivant = NULL;
! 1668: }
! 1669: else
! 1670: {
! 1671: longueur_adresse = 0;
! 1672: recvfrom((*((struct_socket *)
! 1673: (*s_objet_argument).objet)).socket, tampon_lecture,
! 1674: position_finale, MSG_DONTWAIT,
! 1675: NULL, &longueur_adresse);
! 1676: }
! 1677:
! 1678: free(tampon_lecture);
! 1679:
! 1680: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1681: s_objet_resultat) == d_erreur)
! 1682: {
! 1683: return;
! 1684: }
! 1685: }
! 1686: else
! 1687: {
! 1688: /* FLOW ou UNFORMATTED */
! 1689: }
! 1690: }
! 1691: else
! 1692: {
! 1693: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1694: return;
! 1695: }
! 1696:
! 1697: liberation(s_etat_processus, s_objet_argument);
! 1698:
! 1699: return;
! 1700: }
! 1701:
! 1702: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>