Annotation of rpl/src/instructions_t2.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 'trn'
! 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_trn(struct_processus *s_etat_processus)
! 40: {
! 41: struct_objet *s_objet_argument;
! 42: struct_objet *s_objet_resultat;
! 43:
! 44: logical1 argument_nom;
! 45: logical1 variable_partagee;
! 46:
! 47: unsigned long i;
! 48: unsigned long j;
! 49:
! 50: (*s_etat_processus).erreur_execution = d_ex;
! 51:
! 52: if ((*s_etat_processus).affichage_arguments == 'Y')
! 53: {
! 54: printf("\n TRN ");
! 55:
! 56: if ((*s_etat_processus).langue == 'F')
! 57: {
! 58: printf("(transposition)\n\n");
! 59: }
! 60: else
! 61: {
! 62: printf("(transposition)\n\n");
! 63: }
! 64:
! 65: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
! 66: printf("-> 1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
! 67:
! 68: printf(" 1: %s\n", d_NOM);
! 69:
! 70: return;
! 71: }
! 72: else if ((*s_etat_processus).test_instruction == 'Y')
! 73: {
! 74: (*s_etat_processus).nombre_arguments = -1;
! 75: return;
! 76: }
! 77:
! 78: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 79: {
! 80: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 81: {
! 82: return;
! 83: }
! 84: }
! 85:
! 86: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 87: &s_objet_argument) == d_erreur)
! 88: {
! 89: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 90: return;
! 91: }
! 92:
! 93: variable_partagee = d_faux;
! 94:
! 95: if ((*s_objet_argument).type == NOM)
! 96: {
! 97: argument_nom = d_vrai;
! 98:
! 99: if (recherche_variable(s_etat_processus, (*((struct_nom *)
! 100: (*s_objet_argument).objet)).nom) == d_faux)
! 101: {
! 102: (*s_etat_processus).erreur_systeme = d_es;
! 103: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 104:
! 105: liberation(s_etat_processus, s_objet_argument);
! 106:
! 107: return;
! 108: }
! 109:
! 110: liberation(s_etat_processus, s_objet_argument);
! 111:
! 112: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 113: .position_variable_courante].variable_verrouillee == d_vrai)
! 114: {
! 115: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
! 116: return;
! 117: }
! 118:
! 119: if ((*s_etat_processus).s_liste_variables
! 120: [(*s_etat_processus).position_variable_courante].objet != NULL)
! 121: {
! 122: s_objet_argument = (*s_etat_processus).s_liste_variables
! 123: [(*s_etat_processus).position_variable_courante].objet;
! 124: }
! 125: else
! 126: {
! 127: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 128: .s_liste_variables_partagees).mutex)) != 0)
! 129: {
! 130: (*s_etat_processus).erreur_systeme = d_es_processus;
! 131: return;
! 132: }
! 133:
! 134: if (recherche_variable_partagee(s_etat_processus,
! 135: (*s_etat_processus).s_liste_variables
! 136: [(*s_etat_processus).position_variable_courante].nom,
! 137: (*s_etat_processus).s_liste_variables
! 138: [(*s_etat_processus).position_variable_courante]
! 139: .variable_partagee, (*s_etat_processus).s_liste_variables
! 140: [(*s_etat_processus).position_variable_courante].origine)
! 141: == d_faux)
! 142: {
! 143: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 144: .s_liste_variables_partagees).mutex)) != 0)
! 145: {
! 146: (*s_etat_processus).erreur_systeme = d_es_processus;
! 147: return;
! 148: }
! 149:
! 150: (*s_etat_processus).erreur_systeme = d_es;
! 151: (*s_etat_processus).erreur_execution =
! 152: d_ex_variable_non_definie;
! 153:
! 154: liberation(s_etat_processus, s_objet_argument);
! 155:
! 156: return;
! 157: }
! 158:
! 159: variable_partagee = d_vrai;
! 160: }
! 161: }
! 162: else
! 163: {
! 164: argument_nom = d_faux;
! 165: }
! 166:
! 167: /*
! 168: --------------------------------------------------------------------------------
! 169: Matrice transposée d'une matrice entière
! 170: --------------------------------------------------------------------------------
! 171: */
! 172:
! 173: if ((*s_objet_argument).type == MIN)
! 174: {
! 175: if ((s_objet_resultat = allocation(s_etat_processus, MIN)) == NULL)
! 176: {
! 177: if (variable_partagee == d_vrai)
! 178: {
! 179: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 180: .s_liste_variables_partagees).mutex)) != 0)
! 181: {
! 182: (*s_etat_processus).erreur_systeme = d_es_processus;
! 183: return;
! 184: }
! 185: }
! 186:
! 187: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 188: return;
! 189: }
! 190:
! 191: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
! 192: (*((struct_matrice *) (*s_objet_argument).objet))
! 193: .nombre_colonnes;
! 194: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
! 195: (*((struct_matrice *) (*s_objet_argument).objet))
! 196: .nombre_lignes;
! 197:
! 198: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
! 199: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
! 200: .nombre_lignes * sizeof(integer8 *))) == NULL)
! 201: {
! 202: if (variable_partagee == d_vrai)
! 203: {
! 204: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 205: .s_liste_variables_partagees).mutex)) != 0)
! 206: {
! 207: (*s_etat_processus).erreur_systeme = d_es_processus;
! 208: return;
! 209: }
! 210: }
! 211:
! 212: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 213: return;
! 214: }
! 215:
! 216: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
! 217: .nombre_lignes; i++)
! 218: {
! 219: if ((((integer8 **) (*((struct_matrice *) (*s_objet_resultat)
! 220: .objet)).tableau)[i] =
! 221: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
! 222: .nombre_colonnes * sizeof(integer8))) == NULL)
! 223: {
! 224: if (variable_partagee == d_vrai)
! 225: {
! 226: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 227: .s_liste_variables_partagees).mutex)) != 0)
! 228: {
! 229: (*s_etat_processus).erreur_systeme = d_es_processus;
! 230: return;
! 231: }
! 232: }
! 233:
! 234: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 235: return;
! 236: }
! 237:
! 238: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
! 239: .nombre_colonnes; j++)
! 240: {
! 241: ((integer8 **) (*((struct_matrice *) (*s_objet_resultat)
! 242: .objet)).tableau)[i][j] =
! 243: ((integer8 **) (*((struct_matrice *)
! 244: (*s_objet_argument).objet)).tableau)[j][i];
! 245: }
! 246: }
! 247: }
! 248:
! 249: /*
! 250: --------------------------------------------------------------------------------
! 251: Matrice tranposée d'une matrice réelle
! 252: --------------------------------------------------------------------------------
! 253: */
! 254:
! 255: else if ((*s_objet_argument).type == MRL)
! 256: {
! 257: if ((s_objet_resultat = allocation(s_etat_processus, MRL)) == NULL)
! 258: {
! 259: if (variable_partagee == d_vrai)
! 260: {
! 261: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 262: .s_liste_variables_partagees).mutex)) != 0)
! 263: {
! 264: (*s_etat_processus).erreur_systeme = d_es_processus;
! 265: return;
! 266: }
! 267: }
! 268:
! 269: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 270: return;
! 271: }
! 272:
! 273: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
! 274: (*((struct_matrice *) (*s_objet_argument).objet))
! 275: .nombre_colonnes;
! 276: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
! 277: (*((struct_matrice *) (*s_objet_argument).objet))
! 278: .nombre_lignes;
! 279:
! 280: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
! 281: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
! 282: .nombre_lignes * sizeof(real8 *))) == NULL)
! 283: {
! 284: if (variable_partagee == d_vrai)
! 285: {
! 286: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 287: .s_liste_variables_partagees).mutex)) != 0)
! 288: {
! 289: (*s_etat_processus).erreur_systeme = d_es_processus;
! 290: return;
! 291: }
! 292: }
! 293:
! 294: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 295: return;
! 296: }
! 297:
! 298: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
! 299: .nombre_lignes; i++)
! 300: {
! 301: if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat)
! 302: .objet)).tableau)[i] =
! 303: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
! 304: .nombre_colonnes * sizeof(real8))) == NULL)
! 305: {
! 306: if (variable_partagee == d_vrai)
! 307: {
! 308: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 309: .s_liste_variables_partagees).mutex)) != 0)
! 310: {
! 311: (*s_etat_processus).erreur_systeme = d_es_processus;
! 312: return;
! 313: }
! 314: }
! 315:
! 316: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 317: return;
! 318: }
! 319:
! 320: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
! 321: .nombre_colonnes; j++)
! 322: {
! 323: ((real8 **) (*((struct_matrice *) (*s_objet_resultat)
! 324: .objet)).tableau)[i][j] =
! 325: ((real8 **) (*((struct_matrice *)
! 326: (*s_objet_argument).objet)).tableau)[j][i];
! 327: }
! 328: }
! 329: }
! 330:
! 331: /*
! 332: --------------------------------------------------------------------------------
! 333: Matrice transposée (et conjuguée) d'une matrice complexe
! 334: --------------------------------------------------------------------------------
! 335: */
! 336:
! 337: else if ((*s_objet_argument).type == MCX)
! 338: {
! 339: if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
! 340: {
! 341: if (variable_partagee == d_vrai)
! 342: {
! 343: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 344: .s_liste_variables_partagees).mutex)) != 0)
! 345: {
! 346: (*s_etat_processus).erreur_systeme = d_es_processus;
! 347: return;
! 348: }
! 349: }
! 350:
! 351: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 352: return;
! 353: }
! 354:
! 355: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
! 356: (*((struct_matrice *) (*s_objet_argument).objet))
! 357: .nombre_colonnes;
! 358: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
! 359: (*((struct_matrice *) (*s_objet_argument).objet))
! 360: .nombre_lignes;
! 361:
! 362: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
! 363: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
! 364: .nombre_lignes * sizeof(struct_complexe16 *))) == NULL)
! 365: {
! 366: if (variable_partagee == d_vrai)
! 367: {
! 368: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 369: .s_liste_variables_partagees).mutex)) != 0)
! 370: {
! 371: (*s_etat_processus).erreur_systeme = d_es_processus;
! 372: return;
! 373: }
! 374: }
! 375:
! 376: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 377: return;
! 378: }
! 379:
! 380: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
! 381: .nombre_lignes; i++)
! 382: {
! 383: if ((((struct_complexe16 **) (*((struct_matrice *)
! 384: (*s_objet_resultat).objet)).tableau)[i] =
! 385: malloc((*((struct_matrice *)
! 386: (*s_objet_resultat).objet)).nombre_colonnes *
! 387: sizeof(struct_complexe16))) == NULL)
! 388: {
! 389: if (variable_partagee == d_vrai)
! 390: {
! 391: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 392: .s_liste_variables_partagees).mutex)) != 0)
! 393: {
! 394: (*s_etat_processus).erreur_systeme = d_es_processus;
! 395: return;
! 396: }
! 397: }
! 398:
! 399: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 400: return;
! 401: }
! 402:
! 403: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
! 404: .nombre_colonnes; j++)
! 405: {
! 406: ((struct_complexe16 **) (*((struct_matrice *)
! 407: (*s_objet_resultat).objet)).tableau)[i][j]
! 408: .partie_reelle =
! 409: ((struct_complexe16 **) (*((struct_matrice *)
! 410: (*s_objet_argument).objet)).tableau)[j][i]
! 411: .partie_reelle;
! 412: ((struct_complexe16 **) (*((struct_matrice *)
! 413: (*s_objet_resultat).objet)).tableau)[i][j]
! 414: .partie_imaginaire =
! 415: -((struct_complexe16 **) (*((struct_matrice *)
! 416: (*s_objet_argument).objet)).tableau)[j][i]
! 417: .partie_imaginaire;
! 418: }
! 419: }
! 420: }
! 421:
! 422: /*
! 423: --------------------------------------------------------------------------------
! 424: Fonction transposée impossible à réaliser
! 425: --------------------------------------------------------------------------------
! 426: */
! 427:
! 428: else
! 429: {
! 430: if (argument_nom == d_faux)
! 431: {
! 432: liberation(s_etat_processus, s_objet_argument);
! 433: }
! 434:
! 435: if (variable_partagee == d_vrai)
! 436: {
! 437: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 438: .s_liste_variables_partagees).mutex)) != 0)
! 439: {
! 440: (*s_etat_processus).erreur_systeme = d_es_processus;
! 441: return;
! 442: }
! 443: }
! 444:
! 445: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 446: return;
! 447: }
! 448:
! 449: liberation(s_etat_processus, s_objet_argument);
! 450:
! 451: if (argument_nom == d_faux)
! 452: {
! 453: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 454: s_objet_resultat) == d_erreur)
! 455: {
! 456: return;
! 457: }
! 458: }
! 459: else
! 460: {
! 461: if (variable_partagee == d_vrai)
! 462: {
! 463: (*(*s_etat_processus).s_liste_variables_partagees).table
! 464: [(*(*s_etat_processus).s_liste_variables_partagees)
! 465: .position_variable].objet = s_objet_resultat;
! 466:
! 467: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 468: .s_liste_variables_partagees).mutex)) != 0)
! 469: {
! 470: (*s_etat_processus).erreur_systeme = d_es_processus;
! 471: return;
! 472: }
! 473: }
! 474: else
! 475: {
! 476: (*s_etat_processus).s_liste_variables
! 477: [(*s_etat_processus).position_variable_courante].objet =
! 478: s_objet_resultat;
! 479: }
! 480: }
! 481:
! 482: return;
! 483: }
! 484:
! 485:
! 486: /*
! 487: ================================================================================
! 488: Fonction 'tot'
! 489: ================================================================================
! 490: Entrées : pointeur sur une structure struct_processus
! 491: --------------------------------------------------------------------------------
! 492: Sorties :
! 493: --------------------------------------------------------------------------------
! 494: Effets de bord : néant
! 495: ================================================================================
! 496: */
! 497:
! 498: void
! 499: instruction_tot(struct_processus *s_etat_processus)
! 500: {
! 501: logical1 presence_variable;
! 502:
! 503: long i;
! 504:
! 505: struct_objet *s_objet_statistique;
! 506: struct_objet *s_objet_resultat;
! 507: struct_objet *s_objet_temporaire;
! 508:
! 509: unsigned long nombre_colonnes;
! 510:
! 511: (*s_etat_processus).erreur_execution = d_ex;
! 512:
! 513: if ((*s_etat_processus).affichage_arguments == 'Y')
! 514: {
! 515: printf("\n TOT ");
! 516:
! 517: if ((*s_etat_processus).langue == 'F')
! 518: {
! 519: printf("(somme des colonnes statistiques)\n\n");
! 520: }
! 521: else
! 522: {
! 523: printf("(sum of statistical columns)\n\n");
! 524: }
! 525:
! 526: printf("-> 1: %s, %s, %s, %s\n", d_INT, d_REL, d_VIN, d_REL);
! 527:
! 528: return;
! 529: }
! 530: else if ((*s_etat_processus).test_instruction == 'Y')
! 531: {
! 532: (*s_etat_processus).nombre_arguments = -1;
! 533: return;
! 534: }
! 535:
! 536: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 537: {
! 538: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 539: {
! 540: return;
! 541: }
! 542: }
! 543:
! 544: /*
! 545: * Recherche d'une variable globale référencée par SIGMA
! 546: */
! 547:
! 548: if (recherche_variable(s_etat_processus, ds_sdat) == d_faux)
! 549: {
! 550: /*
! 551: * Aucune variable SIGMA
! 552: */
! 553:
! 554: (*s_etat_processus).erreur_systeme = d_es;
! 555: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
! 556: return;
! 557: }
! 558: else
! 559: {
! 560: /*
! 561: * Il existe une variable locale SIGMA. Reste à vérifier l'existence
! 562: * d'une variable SIGMA globale...
! 563: */
! 564:
! 565: i = (*s_etat_processus).position_variable_courante;
! 566: presence_variable = d_faux;
! 567:
! 568: while(i >= 0)
! 569: {
! 570: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 571: ds_sdat) == 0) && ((*s_etat_processus)
! 572: .s_liste_variables[i].niveau == 1))
! 573: {
! 574: presence_variable = d_vrai;
! 575: break;
! 576: }
! 577:
! 578: i--;
! 579: }
! 580:
! 581: if (presence_variable == d_faux)
! 582: {
! 583: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
! 584: return;
! 585: }
! 586: else
! 587: {
! 588: (*s_etat_processus).position_variable_courante = i;
! 589:
! 590: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
! 591: {
! 592: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
! 593: return;
! 594: }
! 595:
! 596: if (((*((*s_etat_processus).s_liste_variables
! 597: [(*s_etat_processus).position_variable_courante].objet))
! 598: .type != MIN) && ((*((*s_etat_processus)
! 599: .s_liste_variables[(*s_etat_processus)
! 600: .position_variable_courante].objet)).type != MRL))
! 601: {
! 602: (*s_etat_processus).erreur_execution =
! 603: d_ex_matrice_statistique_invalide;
! 604: return;
! 605: }
! 606:
! 607: nombre_colonnes = (*((struct_matrice *) (*((*s_etat_processus)
! 608: .s_liste_variables[(*s_etat_processus)
! 609: .position_variable_courante].objet)).objet))
! 610: .nombre_colonnes;
! 611: }
! 612: }
! 613:
! 614: if (nombre_colonnes == 0)
! 615: {
! 616: (*s_etat_processus).erreur_execution =
! 617: d_ex_matrice_statistique_invalide;
! 618: return;
! 619: }
! 620:
! 621: s_objet_statistique = ((*s_etat_processus).s_liste_variables
! 622: [(*s_etat_processus).position_variable_courante]).objet;
! 623:
! 624: if (((*s_objet_statistique).type == MIN) ||
! 625: ((*s_objet_statistique).type == MRL))
! 626: {
! 627: if ((s_objet_resultat = allocation(s_etat_processus, NON)) == NULL)
! 628: {
! 629: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 630: return;
! 631: }
! 632:
! 633: if (((*s_objet_resultat).objet = sommation_statistique(
! 634: (struct_matrice *) (*s_objet_statistique).objet)) == NULL)
! 635: {
! 636: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 637: return;
! 638: }
! 639:
! 640: if (nombre_colonnes == 1)
! 641: {
! 642: if ((*((struct_vecteur *) (*s_objet_resultat).objet)).type == 'I')
! 643: {
! 644: (*s_objet_resultat).type = VIN;
! 645: s_objet_temporaire = s_objet_resultat;
! 646:
! 647: if ((s_objet_resultat = allocation(s_etat_processus, INT))
! 648: == NULL)
! 649: {
! 650: (*s_etat_processus).erreur_systeme =
! 651: d_es_allocation_memoire;
! 652: return;
! 653: }
! 654:
! 655: (*((integer8 *) (*s_objet_resultat).objet)) =
! 656: ((integer8 *) (*((struct_vecteur *)
! 657: (*s_objet_temporaire).objet)).tableau)[0];
! 658:
! 659: liberation(s_etat_processus, s_objet_temporaire);
! 660: }
! 661: else
! 662: {
! 663: (*s_objet_resultat).type = VRL;
! 664: s_objet_temporaire = s_objet_resultat;
! 665:
! 666: if ((s_objet_resultat = allocation(s_etat_processus, REL))
! 667: == NULL)
! 668: {
! 669: (*s_etat_processus).erreur_systeme =
! 670: d_es_allocation_memoire;
! 671: return;
! 672: }
! 673:
! 674: (*((real8 *) (*s_objet_resultat).objet)) =
! 675: ((real8 *) (*((struct_vecteur *)
! 676: (*s_objet_temporaire).objet)).tableau)[0];
! 677:
! 678: liberation(s_etat_processus, s_objet_temporaire);
! 679: }
! 680: }
! 681: else
! 682: {
! 683: if ((*((struct_vecteur *) (*s_objet_resultat).objet)).type == 'I')
! 684: {
! 685: (*s_objet_resultat).type = VIN;
! 686: }
! 687: else
! 688: {
! 689: (*s_objet_resultat).type = VRL;
! 690: }
! 691: }
! 692:
! 693: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 694: s_objet_resultat) == d_erreur)
! 695: {
! 696: return;
! 697: }
! 698: }
! 699: else
! 700: {
! 701: (*s_etat_processus).erreur_execution =
! 702: d_ex_matrice_statistique_invalide;
! 703: return;
! 704: }
! 705:
! 706: return;
! 707: }
! 708:
! 709:
! 710: /*
! 711: ================================================================================
! 712: Fonction 'title'
! 713: ================================================================================
! 714: Entrées :
! 715: --------------------------------------------------------------------------------
! 716: Sorties :
! 717: --------------------------------------------------------------------------------
! 718: Effets de bord : néant
! 719: ================================================================================
! 720: */
! 721:
! 722: void
! 723: instruction_title(struct_processus *s_etat_processus)
! 724: {
! 725: struct_objet *s_objet;
! 726:
! 727: (*s_etat_processus).erreur_execution = d_ex;
! 728:
! 729: if ((*s_etat_processus).affichage_arguments == 'Y')
! 730: {
! 731: printf("\n TITLE ");
! 732:
! 733: if ((*s_etat_processus).langue == 'F')
! 734: {
! 735: printf("(titre d'un graphique)\n\n");
! 736: }
! 737: else
! 738: {
! 739: printf("(title of graphic)\n\n");
! 740: }
! 741:
! 742: printf(" 1: %s\n", d_CHN);
! 743:
! 744: return;
! 745: }
! 746: else if ((*s_etat_processus).test_instruction == 'Y')
! 747: {
! 748: (*s_etat_processus).nombre_arguments = -1;
! 749: return;
! 750: }
! 751:
! 752: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 753: {
! 754: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 755: {
! 756: return;
! 757: }
! 758: }
! 759:
! 760: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 761: &s_objet) == d_erreur)
! 762: {
! 763: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 764: return;
! 765: }
! 766:
! 767: if ((*s_objet).type == CHN)
! 768: {
! 769: free((*s_etat_processus).titre);
! 770:
! 771: if (((*s_etat_processus).titre = malloc((strlen((unsigned char *)
! 772: (*s_objet).objet) + 1) * sizeof(unsigned char))) == NULL)
! 773: {
! 774: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 775: return;
! 776: }
! 777:
! 778: strcpy((*s_etat_processus).titre, (unsigned char *) (*s_objet).objet);
! 779: liberation(s_etat_processus, s_objet);
! 780: }
! 781: else
! 782: {
! 783: liberation(s_etat_processus, s_objet);
! 784:
! 785: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 786: return;
! 787: }
! 788:
! 789: if (test_cfsf(s_etat_processus, 52) == d_faux)
! 790: {
! 791: if ((*s_etat_processus).fichiers_graphiques != NULL)
! 792: {
! 793: appel_gnuplot(s_etat_processus, 'N');
! 794: }
! 795: }
! 796:
! 797: return;
! 798: }
! 799:
! 800:
! 801: /*
! 802: ================================================================================
! 803: Fonction 'time'
! 804: ================================================================================
! 805: Entrées :
! 806: --------------------------------------------------------------------------------
! 807: Sorties :
! 808: --------------------------------------------------------------------------------
! 809: Effets de bord : néant
! 810: ================================================================================
! 811: */
! 812:
! 813: void
! 814: instruction_time(struct_processus *s_etat_processus)
! 815: {
! 816: struct rusage s_usage_processus_fils;
! 817: struct rusage s_usage_processus_pere;
! 818:
! 819: struct_liste_chainee *l_element_courant;
! 820:
! 821: struct_objet *s_objet;
! 822:
! 823: (*s_etat_processus).erreur_execution = d_ex;
! 824:
! 825: if ((*s_etat_processus).affichage_arguments == 'Y')
! 826: {
! 827: printf("\n TIME ");
! 828:
! 829: if ((*s_etat_processus).langue == 'F')
! 830: {
! 831: printf("(temps CPU)\n\n");
! 832: }
! 833: else
! 834: {
! 835: printf("(CPU time)\n\n");
! 836: }
! 837:
! 838: printf("-> 1: %s\n", d_LST);
! 839:
! 840: return;
! 841: }
! 842: else if ((*s_etat_processus).test_instruction == 'Y')
! 843: {
! 844: (*s_etat_processus).nombre_arguments = -1;
! 845: return;
! 846: }
! 847:
! 848: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 849: {
! 850: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 851: {
! 852: return;
! 853: }
! 854: }
! 855:
! 856: /*
! 857: * Lecture des différents temps
! 858: */
! 859:
! 860: if ((getrusage(RUSAGE_SELF, &s_usage_processus_pere)) != 0)
! 861: {
! 862: (*s_etat_processus).erreur_systeme = d_es_processus;
! 863: return;
! 864: }
! 865:
! 866: if ((getrusage(RUSAGE_CHILDREN, &s_usage_processus_fils)) != 0)
! 867: {
! 868: (*s_etat_processus).erreur_systeme = d_es_processus;
! 869: return;
! 870: }
! 871:
! 872: /*
! 873: * Initialisation de la liste
! 874: */
! 875:
! 876: if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
! 877: {
! 878: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 879: return;
! 880: }
! 881:
! 882: /*
! 883: * User time du processus père (séquenceur)
! 884: */
! 885:
! 886: if ((l_element_courant = allocation_maillon(s_etat_processus)) == NULL)
! 887: {
! 888: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 889: return;
! 890: }
! 891:
! 892: (*s_objet).objet = l_element_courant;
! 893:
! 894: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
! 895: == NULL)
! 896: {
! 897: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 898: return;
! 899: }
! 900:
! 901: (*((real8 *) (*(*l_element_courant).donnee).objet)) =
! 902: s_usage_processus_pere.ru_utime.tv_sec +
! 903: (((real8) s_usage_processus_pere.ru_utime.tv_usec) /
! 904: ((real8) 1E6));
! 905:
! 906: /*
! 907: * System time du processus père
! 908: */
! 909:
! 910: if (((*l_element_courant).suivant =
! 911: allocation_maillon(s_etat_processus)) == NULL)
! 912: {
! 913: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 914: return;
! 915: }
! 916:
! 917: l_element_courant = (*l_element_courant).suivant;
! 918:
! 919: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
! 920: == NULL)
! 921: {
! 922: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 923: return;
! 924: }
! 925:
! 926: (*((real8 *) (*(*l_element_courant).donnee).objet)) =
! 927: s_usage_processus_pere.ru_stime.tv_sec +
! 928: (((real8) s_usage_processus_pere.ru_stime.tv_usec) /
! 929: ((real8) 1E6));
! 930:
! 931: /*
! 932: * User time des processus fils achevés
! 933: */
! 934:
! 935: if (((*l_element_courant).suivant =
! 936: allocation_maillon(s_etat_processus)) == NULL)
! 937: {
! 938: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 939: return;
! 940: }
! 941:
! 942: l_element_courant = (*l_element_courant).suivant;
! 943:
! 944: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
! 945: == NULL)
! 946: {
! 947: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 948: return;
! 949: }
! 950:
! 951: (*((real8 *) (*(*l_element_courant).donnee).objet)) =
! 952: s_usage_processus_fils.ru_utime.tv_sec +
! 953: (((real8) s_usage_processus_fils.ru_utime.tv_usec) /
! 954: ((real8) 1E6));
! 955:
! 956: /*
! 957: * System time des processus fils achevés
! 958: */
! 959:
! 960: if (((*l_element_courant).suivant =
! 961: allocation_maillon(s_etat_processus)) == NULL)
! 962: {
! 963: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 964: return;
! 965: }
! 966:
! 967: l_element_courant = (*l_element_courant).suivant;
! 968:
! 969: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
! 970: == NULL)
! 971: {
! 972: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 973: return;
! 974: }
! 975:
! 976: (*((real8 *) (*(*l_element_courant).donnee).objet)) =
! 977: s_usage_processus_fils.ru_stime.tv_sec +
! 978: (((real8) s_usage_processus_fils.ru_stime.tv_usec) /
! 979: ((real8) 1E6));
! 980:
! 981: /*
! 982: * Fermeture de la liste
! 983: */
! 984:
! 985: (*l_element_courant).suivant = NULL;
! 986:
! 987: /*
! 988: * Empilement du résultat
! 989: */
! 990:
! 991: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 992: s_objet) == d_erreur)
! 993: {
! 994: return;
! 995: }
! 996:
! 997: return;
! 998: }
! 999:
! 1000:
! 1001: /*
! 1002: ================================================================================
! 1003: Fonction 'taylr'
! 1004: ================================================================================
! 1005: Entrées :
! 1006: --------------------------------------------------------------------------------
! 1007: Sorties :
! 1008: --------------------------------------------------------------------------------
! 1009: Effets de bord : néant
! 1010: ================================================================================
! 1011: */
! 1012:
! 1013: void
! 1014: instruction_taylr(struct_processus *s_etat_processus)
! 1015: {
! 1016: integer8 i;
! 1017:
! 1018: logical1 last_valide;
! 1019: logical1 zero;
! 1020:
! 1021: struct_liste_chainee *l_element_courant;
! 1022:
! 1023: struct_objet *s_objet_argument;
! 1024: struct_objet *s_objet_argument_1;
! 1025: struct_objet *s_objet_argument_2;
! 1026: struct_objet *s_objet_argument_3;
! 1027: struct_objet *s_objet_argument_4;
! 1028: struct_objet *s_objet_resultat;
! 1029: struct_objet *s_objet_variable_derivation;
! 1030:
! 1031: struct_variable s_variable;
! 1032:
! 1033: (*s_etat_processus).erreur_execution = d_ex;
! 1034:
! 1035: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1036: {
! 1037: printf("\n TAYLR ");
! 1038:
! 1039: if ((*s_etat_processus).langue == 'F')
! 1040: {
! 1041: printf("(série de Taylor)\n\n");
! 1042: }
! 1043: else
! 1044: {
! 1045: printf("(Taylor serie)\n\n");
! 1046: }
! 1047:
! 1048: printf(" 4: %s\n", d_ALG);
! 1049: printf(" 3: %s\n", d_NOM);
! 1050: printf(" 2: %s, %s\n", d_INT, d_REL);
! 1051: printf(" 1: %s\n", d_INT);
! 1052: printf("-> 1: %s\n\n", d_ALG);
! 1053:
! 1054: return;
! 1055: }
! 1056: else if ((*s_etat_processus).test_instruction == 'Y')
! 1057: {
! 1058: (*s_etat_processus).nombre_arguments = -1;
! 1059: return;
! 1060: }
! 1061:
! 1062: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
! 1063: {
! 1064: if (empilement_pile_last(s_etat_processus, 4) == d_erreur)
! 1065: {
! 1066: return;
! 1067: }
! 1068: }
! 1069:
! 1070: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1071: &s_objet_argument_1) == d_erreur)
! 1072: {
! 1073: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1074: return;
! 1075: }
! 1076:
! 1077: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1078: &s_objet_argument_2) == d_erreur)
! 1079: {
! 1080: liberation(s_etat_processus, s_objet_argument_1);
! 1081:
! 1082: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1083: return;
! 1084: }
! 1085:
! 1086: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1087: &s_objet_argument_3) == d_erreur)
! 1088: {
! 1089: liberation(s_etat_processus, s_objet_argument_1);
! 1090: liberation(s_etat_processus, s_objet_argument_2);
! 1091:
! 1092: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1093: return;
! 1094: }
! 1095:
! 1096: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1097: &s_objet_argument_4) == d_erreur)
! 1098: {
! 1099: liberation(s_etat_processus, s_objet_argument_1);
! 1100: liberation(s_etat_processus, s_objet_argument_2);
! 1101: liberation(s_etat_processus, s_objet_argument_3);
! 1102: liberation(s_etat_processus, s_objet_argument_4);
! 1103:
! 1104: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1105: return;
! 1106: }
! 1107:
! 1108: if (((*s_objet_argument_4).type == ALG) &&
! 1109: ((*s_objet_argument_3).type == NOM) &&
! 1110: (((*s_objet_argument_2).type == INT) ||
! 1111: ((*s_objet_argument_2).type == REL)) &&
! 1112: ((*s_objet_argument_1).type == INT))
! 1113: {
! 1114: if ((*((integer8 *) (*s_objet_argument_1).objet)) <= 0)
! 1115: {
! 1116: liberation(s_etat_processus, s_objet_argument_1);
! 1117: liberation(s_etat_processus, s_objet_argument_2);
! 1118: liberation(s_etat_processus, s_objet_argument_3);
! 1119: liberation(s_etat_processus, s_objet_argument_4);
! 1120:
! 1121: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 1122: return;
! 1123: }
! 1124:
! 1125: if ((*s_objet_argument_2).type == REL)
! 1126: {
! 1127: if ((*((real8 *) (*s_objet_argument_2).objet)) == 0)
! 1128: {
! 1129: zero = d_vrai;
! 1130: }
! 1131: else
! 1132: {
! 1133: zero = d_faux;
! 1134: }
! 1135: }
! 1136: else
! 1137: {
! 1138: if ((*((integer8 *) (*s_objet_argument_2).objet)) == 0)
! 1139: {
! 1140: zero = d_vrai;
! 1141: }
! 1142: else
! 1143: {
! 1144: zero = d_faux;
! 1145: }
! 1146: }
! 1147:
! 1148: /*
! 1149: * Conversion du drapeau symbole des variables symboliques
! 1150: */
! 1151:
! 1152: l_element_courant = (*s_objet_argument_4).objet;
! 1153:
! 1154: while(l_element_courant != NULL)
! 1155: {
! 1156: if ((*(*l_element_courant).donnee).type == NOM)
! 1157: {
! 1158: if (strcmp((*((struct_nom *) (*(*l_element_courant).donnee)
! 1159: .objet)).nom, (*((struct_nom *) (*s_objet_argument_3)
! 1160: .objet)).nom) == 0)
! 1161: {
! 1162: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 1163: .symbole = d_faux;
! 1164: }
! 1165: }
! 1166:
! 1167: l_element_courant = (*l_element_courant).suivant;
! 1168: }
! 1169:
! 1170: /*
! 1171: * Création de la variable locale et initialisation
! 1172: */
! 1173:
! 1174: (*s_etat_processus).niveau_courant++;
! 1175:
! 1176: if ((s_variable.nom = malloc((strlen((*((struct_nom *)
! 1177: (*s_objet_argument_3).objet)).nom) + 1) *
! 1178: sizeof(unsigned char))) == NULL)
! 1179: {
! 1180: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1181: return;
! 1182: }
! 1183:
! 1184: s_variable.niveau = (*s_etat_processus).niveau_courant;
! 1185: strcpy(s_variable.nom, (*((struct_nom *) (*s_objet_argument_3)
! 1186: .objet)).nom);
! 1187:
! 1188: if ((s_variable.objet = copie_objet(s_etat_processus,
! 1189: s_objet_argument_2, 'O')) == NULL)
! 1190: {
! 1191: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1192: return;
! 1193: }
! 1194:
! 1195: if (creation_variable(s_etat_processus, &s_variable, 'V', 'P')
! 1196: == d_erreur)
! 1197: {
! 1198: return;
! 1199: }
! 1200:
! 1201: /*
! 1202: * Création de la série
! 1203: */
! 1204:
! 1205: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
! 1206: {
! 1207: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1208: return;
! 1209: }
! 1210:
! 1211: if (((*s_objet_resultat).objet =
! 1212: allocation_maillon(s_etat_processus)) == NULL)
! 1213: {
! 1214: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1215: return;
! 1216: }
! 1217:
! 1218: l_element_courant = (*s_objet_resultat).objet;
! 1219:
! 1220: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1221: == NULL)
! 1222: {
! 1223: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1224: return;
! 1225: }
! 1226:
! 1227: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1228: .nombre_arguments = 0;
! 1229: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1230: .fonction = instruction_vers_niveau_superieur;
! 1231:
! 1232: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1233: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 1234: {
! 1235: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1236: return;
! 1237: }
! 1238:
! 1239: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1240: .nom_fonction, "<<");
! 1241:
! 1242: if (last_valide == d_vrai)
! 1243: {
! 1244: cf(s_etat_processus, 31);
! 1245: }
! 1246:
! 1247: /*
! 1248: * Calcul de la série de Taylor
! 1249: *
! 1250: * s(x) = \sum_{i=0}{n} (1/i!)*((d^i f(x=a))/d(x^i)*(x-a)^i)
! 1251: */
! 1252:
! 1253: for(i = 0; (i <= (*((integer8 *) (*s_objet_argument_1).objet))) &&
! 1254: ((*s_etat_processus).var_volatile_requete_arret == 0); i++)
! 1255: {
! 1256: /*
! 1257: * Calcul de ((d^i f(x=a))/d(x^i)*(x-a)^i)/i!
! 1258: */
! 1259:
! 1260: if (i != 0)
! 1261: {
! 1262: // Calcul de la valeur de la dérivée n-ième
! 1263: // Expression empilée puis dérivée et sauvegardée dans
! 1264: // s_argument_4.
! 1265:
! 1266: if (empilement(s_etat_processus, &((*s_etat_processus)
! 1267: .l_base_pile), s_objet_argument_4) == d_erreur)
! 1268: {
! 1269: if (last_valide == d_vrai)
! 1270: {
! 1271: sf(s_etat_processus, 31);
! 1272: }
! 1273:
! 1274: return;
! 1275: }
! 1276:
! 1277: if ((s_objet_variable_derivation =
! 1278: copie_objet(s_etat_processus, s_objet_argument_3, 'O'))
! 1279: == NULL)
! 1280: {
! 1281: (*s_etat_processus).erreur_systeme =
! 1282: d_es_allocation_memoire;
! 1283: return;
! 1284: }
! 1285:
! 1286: if (empilement(s_etat_processus, &((*s_etat_processus)
! 1287: .l_base_pile), s_objet_variable_derivation) == d_erreur)
! 1288: {
! 1289: if (last_valide == d_vrai)
! 1290: {
! 1291: sf(s_etat_processus, 31);
! 1292: }
! 1293:
! 1294: return;
! 1295: }
! 1296:
! 1297: instruction_der(s_etat_processus);
! 1298:
! 1299: if ((*s_etat_processus).erreur_execution != d_ex)
! 1300: {
! 1301: liberation(s_etat_processus, s_objet_argument_1);
! 1302: liberation(s_etat_processus, s_objet_argument_2);
! 1303: liberation(s_etat_processus, s_objet_argument_3);
! 1304:
! 1305: (*l_element_courant).suivant = NULL;
! 1306:
! 1307: liberation(s_etat_processus, s_objet_resultat);
! 1308:
! 1309: if (last_valide == d_vrai)
! 1310: {
! 1311: sf(s_etat_processus, 31);
! 1312: }
! 1313:
! 1314: return;
! 1315: }
! 1316: else if ((*s_etat_processus).erreur_systeme != d_es)
! 1317: {
! 1318: return;
! 1319: }
! 1320:
! 1321: if ((*s_etat_processus).var_volatile_requete_arret != 0)
! 1322: {
! 1323: /*
! 1324: * instruction_der() n'a rien renvoyé dans la pile. On
! 1325: * injecte une valeur nulle dans s_objet_argument_4.
! 1326: */
! 1327:
! 1328: if ((s_objet_argument_4 = allocation(s_etat_processus,
! 1329: INT)) == NULL)
! 1330: {
! 1331: (*s_etat_processus).erreur_systeme =
! 1332: d_es_allocation_memoire;
! 1333: return;
! 1334: }
! 1335: }
! 1336: else if (depilement(s_etat_processus, &((*s_etat_processus)
! 1337: .l_base_pile), &s_objet_argument_4) == d_erreur)
! 1338: {
! 1339: liberation(s_etat_processus, s_objet_argument_1);
! 1340: liberation(s_etat_processus, s_objet_argument_2);
! 1341: liberation(s_etat_processus, s_objet_argument_3);
! 1342:
! 1343: (*l_element_courant).suivant = NULL;
! 1344:
! 1345: liberation(s_etat_processus, s_objet_resultat);
! 1346:
! 1347: if (last_valide == d_vrai)
! 1348: {
! 1349: sf(s_etat_processus, 31);
! 1350: }
! 1351:
! 1352: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1353: return;
! 1354: }
! 1355: }
! 1356:
! 1357: if (evaluation(s_etat_processus, s_objet_argument_4, 'E')
! 1358: == d_erreur)
! 1359: {
! 1360: liberation(s_etat_processus, s_objet_argument_1);
! 1361: liberation(s_etat_processus, s_objet_argument_2);
! 1362: liberation(s_etat_processus, s_objet_argument_3);
! 1363: liberation(s_etat_processus, s_objet_argument_4);
! 1364:
! 1365: (*l_element_courant).suivant = NULL;
! 1366:
! 1367: liberation(s_etat_processus, s_objet_resultat);
! 1368:
! 1369: if (last_valide == d_vrai)
! 1370: {
! 1371: sf(s_etat_processus, 31);
! 1372: }
! 1373:
! 1374: return;
! 1375: }
! 1376:
! 1377: // Division par i!
! 1378:
! 1379: if (i > 1)
! 1380: {
! 1381:
! 1382: if ((s_objet_argument = allocation(s_etat_processus, INT))
! 1383: == NULL)
! 1384: {
! 1385: (*s_etat_processus).erreur_systeme =
! 1386: d_es_allocation_memoire;
! 1387: return;
! 1388: }
! 1389:
! 1390: (*((integer8 *) (*s_objet_argument).objet)) = i;
! 1391:
! 1392: if (empilement(s_etat_processus, &((*s_etat_processus)
! 1393: .l_base_pile), s_objet_argument) == d_erreur)
! 1394: {
! 1395: liberation(s_etat_processus, s_objet_argument_1);
! 1396: liberation(s_etat_processus, s_objet_argument_2);
! 1397: liberation(s_etat_processus, s_objet_argument_3);
! 1398: liberation(s_etat_processus, s_objet_argument_4);
! 1399:
! 1400: (*l_element_courant).suivant = NULL;
! 1401:
! 1402: liberation(s_etat_processus, s_objet_resultat);
! 1403: liberation(s_etat_processus, s_objet_argument);
! 1404:
! 1405: if (last_valide == d_vrai)
! 1406: {
! 1407: sf(s_etat_processus, 31);
! 1408: }
! 1409:
! 1410: return;
! 1411: }
! 1412:
! 1413: if (i > 2)
! 1414: {
! 1415: instruction_fact(s_etat_processus);
! 1416:
! 1417: if ((*s_etat_processus).erreur_execution != d_ex)
! 1418: {
! 1419: liberation(s_etat_processus, s_objet_argument_1);
! 1420: liberation(s_etat_processus, s_objet_argument_2);
! 1421: liberation(s_etat_processus, s_objet_argument_3);
! 1422: liberation(s_etat_processus, s_objet_argument_4);
! 1423:
! 1424: (*l_element_courant).suivant = NULL;
! 1425:
! 1426: liberation(s_etat_processus, s_objet_resultat);
! 1427:
! 1428: if (last_valide == d_vrai)
! 1429: {
! 1430: sf(s_etat_processus, 31);
! 1431: }
! 1432:
! 1433: return;
! 1434: }
! 1435: else if ((*s_etat_processus).erreur_systeme != d_es)
! 1436: {
! 1437: return;
! 1438: }
! 1439: }
! 1440:
! 1441: instruction_division(s_etat_processus);
! 1442:
! 1443: if ((*s_etat_processus).erreur_execution != d_ex)
! 1444: {
! 1445: liberation(s_etat_processus, s_objet_argument_1);
! 1446: liberation(s_etat_processus, s_objet_argument_2);
! 1447: liberation(s_etat_processus, s_objet_argument_3);
! 1448: liberation(s_etat_processus, s_objet_argument_4);
! 1449:
! 1450: (*l_element_courant).suivant = NULL;
! 1451:
! 1452: liberation(s_etat_processus, s_objet_resultat);
! 1453:
! 1454: if (last_valide == d_vrai)
! 1455: {
! 1456: sf(s_etat_processus, 31);
! 1457: }
! 1458:
! 1459: return;
! 1460: }
! 1461: else if ((*s_etat_processus).erreur_systeme != d_es)
! 1462: {
! 1463: return;
! 1464: }
! 1465: }
! 1466:
! 1467: if (((*l_element_courant).suivant =
! 1468: allocation_maillon(s_etat_processus)) == NULL)
! 1469: {
! 1470: (*s_etat_processus).erreur_systeme =
! 1471: d_es_allocation_memoire;
! 1472: return;
! 1473: }
! 1474:
! 1475: l_element_courant = (*l_element_courant).suivant;
! 1476:
! 1477: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1478: .l_base_pile), &((*l_element_courant).donnee))
! 1479: == d_erreur)
! 1480: {
! 1481: liberation(s_etat_processus, s_objet_argument_1);
! 1482: liberation(s_etat_processus, s_objet_argument_2);
! 1483: liberation(s_etat_processus, s_objet_argument_3);
! 1484: liberation(s_etat_processus, s_objet_argument_4);
! 1485:
! 1486: (*l_element_courant).donnee = NULL;
! 1487: (*l_element_courant).suivant = NULL;
! 1488:
! 1489: liberation(s_etat_processus, s_objet_resultat);
! 1490:
! 1491: if (last_valide == d_vrai)
! 1492: {
! 1493: sf(s_etat_processus, 31);
! 1494: }
! 1495:
! 1496: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1497: return;
! 1498: }
! 1499:
! 1500: /*
! 1501: * Multiplication par le terme (x-a)**i
! 1502: */
! 1503:
! 1504: if (i != 0)
! 1505: {
! 1506: if (((*l_element_courant).suivant =
! 1507: allocation_maillon(s_etat_processus)) == NULL)
! 1508: {
! 1509: (*s_etat_processus).erreur_systeme =
! 1510: d_es_allocation_memoire;
! 1511: return;
! 1512: }
! 1513:
! 1514: l_element_courant = (*l_element_courant).suivant;
! 1515:
! 1516: if (((*l_element_courant).donnee =
! 1517: copie_objet(s_etat_processus, s_objet_argument_3, 'O'))
! 1518: == NULL)
! 1519: {
! 1520: (*s_etat_processus).erreur_systeme =
! 1521: d_es_allocation_memoire;
! 1522: return;
! 1523: }
! 1524:
! 1525: if (zero == d_faux)
! 1526: {
! 1527: if (((*l_element_courant).suivant =
! 1528: allocation_maillon(s_etat_processus)) == NULL)
! 1529: {
! 1530: (*s_etat_processus).erreur_systeme =
! 1531: d_es_allocation_memoire;
! 1532: return;
! 1533: }
! 1534:
! 1535: l_element_courant = (*l_element_courant).suivant;
! 1536:
! 1537: if (((*l_element_courant).donnee =
! 1538: copie_objet(s_etat_processus, s_objet_argument_2,
! 1539: 'O')) == NULL)
! 1540: {
! 1541: (*s_etat_processus).erreur_systeme =
! 1542: d_es_allocation_memoire;
! 1543: return;
! 1544: }
! 1545:
! 1546: if (((*l_element_courant).suivant =
! 1547: allocation_maillon(s_etat_processus)) == NULL)
! 1548: {
! 1549: (*s_etat_processus).erreur_systeme =
! 1550: d_es_allocation_memoire;
! 1551: return;
! 1552: }
! 1553:
! 1554: l_element_courant = (*l_element_courant).suivant;
! 1555:
! 1556: if (((*l_element_courant).donnee =
! 1557: allocation(s_etat_processus, FCT)) == NULL)
! 1558: {
! 1559: (*s_etat_processus).erreur_systeme =
! 1560: d_es_allocation_memoire;
! 1561: return;
! 1562: }
! 1563:
! 1564: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1565: .objet)).nombre_arguments = 0;
! 1566: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1567: .objet)).fonction = instruction_moins;
! 1568:
! 1569: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1570: .objet)).nom_fonction = malloc(2 *
! 1571: sizeof(unsigned char))) == NULL)
! 1572: {
! 1573: (*s_etat_processus).erreur_systeme =
! 1574: d_es_allocation_memoire;
! 1575: return;
! 1576: }
! 1577:
! 1578: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1579: .objet)).nom_fonction, "-");
! 1580: }
! 1581:
! 1582: if (i > 1)
! 1583: {
! 1584: if (((*l_element_courant).suivant =
! 1585: allocation_maillon(s_etat_processus)) == NULL)
! 1586: {
! 1587: (*s_etat_processus).erreur_systeme =
! 1588: d_es_allocation_memoire;
! 1589: return;
! 1590: }
! 1591:
! 1592: l_element_courant = (*l_element_courant).suivant;
! 1593:
! 1594: if (((*l_element_courant).donnee =
! 1595: allocation(s_etat_processus, INT)) == NULL)
! 1596: {
! 1597: (*s_etat_processus).erreur_systeme =
! 1598: d_es_allocation_memoire;
! 1599: return;
! 1600: }
! 1601:
! 1602: (*((integer8 *) (*(*l_element_courant).donnee).objet)) = i;
! 1603:
! 1604: if (((*l_element_courant).suivant =
! 1605: allocation_maillon(s_etat_processus)) == NULL)
! 1606: {
! 1607: (*s_etat_processus).erreur_systeme =
! 1608: d_es_allocation_memoire;
! 1609: return;
! 1610: }
! 1611:
! 1612: l_element_courant = (*l_element_courant).suivant;
! 1613:
! 1614: if (((*l_element_courant).donnee =
! 1615: allocation(s_etat_processus, FCT)) == NULL)
! 1616: {
! 1617: (*s_etat_processus).erreur_systeme =
! 1618: d_es_allocation_memoire;
! 1619: return;
! 1620: }
! 1621:
! 1622: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1623: .objet)).nombre_arguments = 0;
! 1624: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1625: .objet)).fonction = instruction_puissance;
! 1626:
! 1627: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1628: .objet)).nom_fonction = malloc(2 *
! 1629: sizeof(unsigned char))) == NULL)
! 1630: {
! 1631: (*s_etat_processus).erreur_systeme =
! 1632: d_es_allocation_memoire;
! 1633: return;
! 1634: }
! 1635:
! 1636: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1637: .objet)).nom_fonction, "^");
! 1638: }
! 1639:
! 1640: if (((*l_element_courant).suivant =
! 1641: allocation_maillon(s_etat_processus)) == NULL)
! 1642: {
! 1643: (*s_etat_processus).erreur_systeme =
! 1644: d_es_allocation_memoire;
! 1645: return;
! 1646: }
! 1647:
! 1648: l_element_courant = (*l_element_courant).suivant;
! 1649:
! 1650: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1651: FCT)) == NULL)
! 1652: {
! 1653: (*s_etat_processus).erreur_systeme =
! 1654: d_es_allocation_memoire;
! 1655: return;
! 1656: }
! 1657:
! 1658: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1659: .nombre_arguments = 0;
! 1660: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1661: .fonction = instruction_multiplication;
! 1662:
! 1663: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1664: .objet)).nom_fonction = malloc(2 *
! 1665: sizeof(unsigned char))) == NULL)
! 1666: {
! 1667: (*s_etat_processus).erreur_systeme =
! 1668: d_es_allocation_memoire;
! 1669: return;
! 1670: }
! 1671:
! 1672: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1673: .objet)).nom_fonction, "*");
! 1674:
! 1675: if (((*l_element_courant).suivant =
! 1676: allocation_maillon(s_etat_processus)) == NULL)
! 1677: {
! 1678: (*s_etat_processus).erreur_systeme =
! 1679: d_es_allocation_memoire;
! 1680: return;
! 1681: }
! 1682:
! 1683: l_element_courant = (*l_element_courant).suivant;
! 1684:
! 1685: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1686: FCT)) == NULL)
! 1687: {
! 1688: (*s_etat_processus).erreur_systeme =
! 1689: d_es_allocation_memoire;
! 1690: return;
! 1691: }
! 1692:
! 1693: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1694: .nombre_arguments = 0;
! 1695: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1696: .fonction = instruction_plus;
! 1697:
! 1698: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1699: .objet)).nom_fonction = malloc(2 *
! 1700: sizeof(unsigned char))) == NULL)
! 1701: {
! 1702: (*s_etat_processus).erreur_systeme =
! 1703: d_es_allocation_memoire;
! 1704: return;
! 1705: }
! 1706:
! 1707: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1708: .objet)).nom_fonction, "+");
! 1709: }
! 1710: }
! 1711:
! 1712: /*
! 1713: * Fermeture de l'expression
! 1714: */
! 1715:
! 1716: if (last_valide == d_vrai)
! 1717: {
! 1718: sf(s_etat_processus, 31);
! 1719: }
! 1720:
! 1721: if (((*l_element_courant).suivant =
! 1722: allocation_maillon(s_etat_processus)) == NULL)
! 1723: {
! 1724: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1725: return;
! 1726: }
! 1727:
! 1728: l_element_courant = (*l_element_courant).suivant;
! 1729:
! 1730: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1731: == NULL)
! 1732: {
! 1733: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1734: return;
! 1735: }
! 1736:
! 1737: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1738: .nombre_arguments = 0;
! 1739: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1740: .fonction = instruction_vers_niveau_inferieur;
! 1741:
! 1742: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1743: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 1744: {
! 1745: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1746: return;
! 1747: }
! 1748:
! 1749: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1750: .nom_fonction, ">>");
! 1751:
! 1752: (*l_element_courant).suivant = NULL;
! 1753:
! 1754: /*
! 1755: * Destruction de la variable locale
! 1756: */
! 1757:
! 1758: (*s_etat_processus).niveau_courant--;
! 1759:
! 1760: if (retrait_variable(s_etat_processus, (*((struct_nom *)
! 1761: (*s_objet_argument_3).objet)).nom, 'L') == d_erreur)
! 1762: {
! 1763: liberation(s_etat_processus, s_objet_argument_1);
! 1764: liberation(s_etat_processus, s_objet_argument_2);
! 1765: liberation(s_etat_processus, s_objet_argument_3);
! 1766: liberation(s_etat_processus, s_objet_argument_4);
! 1767: liberation(s_etat_processus, s_objet_resultat);
! 1768:
! 1769: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 1770: return;
! 1771: }
! 1772: }
! 1773: else
! 1774: {
! 1775: liberation(s_etat_processus, s_objet_argument_1);
! 1776: liberation(s_etat_processus, s_objet_argument_2);
! 1777: liberation(s_etat_processus, s_objet_argument_3);
! 1778: liberation(s_etat_processus, s_objet_argument_4);
! 1779:
! 1780: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1781: return;
! 1782: }
! 1783:
! 1784: liberation(s_etat_processus, s_objet_argument_1);
! 1785: liberation(s_etat_processus, s_objet_argument_2);
! 1786: liberation(s_etat_processus, s_objet_argument_3);
! 1787: liberation(s_etat_processus, s_objet_argument_4);
! 1788:
! 1789: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1790: s_objet_resultat) == d_erreur)
! 1791: {
! 1792: return;
! 1793: }
! 1794:
! 1795: return;
! 1796: }
! 1797:
! 1798:
! 1799: /*
! 1800: ================================================================================
! 1801: Fonction 'target'
! 1802: ================================================================================
! 1803: Entrées :
! 1804: --------------------------------------------------------------------------------
! 1805: Sorties :
! 1806: --------------------------------------------------------------------------------
! 1807: Effets de bord : néant
! 1808: ================================================================================
! 1809: */
! 1810:
! 1811: void
! 1812: instruction_target(struct_processus *s_etat_processus)
! 1813: {
! 1814: struct_liste_chainee *l_element_courant;
! 1815:
! 1816: struct addrinfo *resolution;
! 1817: struct addrinfo *resolution_courante;
! 1818:
! 1819: struct_objet *s_objet_argument_1;
! 1820: struct_objet *s_objet_argument_2;
! 1821:
! 1822: unsigned long i;
! 1823: unsigned long nombre_elements;
! 1824:
! 1825: (*s_etat_processus).erreur_execution = d_ex;
! 1826:
! 1827: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1828: {
! 1829: printf("\n TARGET ");
! 1830:
! 1831: if ((*s_etat_processus).langue == 'F')
! 1832: {
! 1833: printf("(cible d'une socket non connectée)\n\n");
! 1834: }
! 1835: else
! 1836: {
! 1837: printf("(target of unconnected socket)\n\n");
! 1838: }
! 1839:
! 1840: printf(" 2: %s, %s\n", d_CHN, d_LST);
! 1841: printf(" 1: %s\n", d_SCK);
! 1842: printf("-> 1: %s\n", d_SCK);
! 1843:
! 1844: return;
! 1845: }
! 1846: else if ((*s_etat_processus).test_instruction == 'Y')
! 1847: {
! 1848: (*s_etat_processus).nombre_arguments = -1;
! 1849: return;
! 1850: }
! 1851:
! 1852: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1853: {
! 1854: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
! 1855: {
! 1856: return;
! 1857: }
! 1858: }
! 1859:
! 1860: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1861: &s_objet_argument_1) == d_erreur)
! 1862: {
! 1863: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1864: return;
! 1865: }
! 1866:
! 1867: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1868: &s_objet_argument_2) == d_erreur)
! 1869: {
! 1870: liberation(s_etat_processus, s_objet_argument_1);
! 1871:
! 1872: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1873: return;
! 1874: }
! 1875:
! 1876: if ((*s_objet_argument_1).type == SCK)
! 1877: {
! 1878:
! 1879: /*
! 1880: * Vérification du type de socket
! 1881: */
! 1882:
! 1883: if ((strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type,
! 1884: "STREAM") == 0) || (strcmp((*((struct_socket *)
! 1885: (*s_objet_argument_1).objet)).type, "SEQUENTIAL DATAGRAM")
! 1886: == 0))
! 1887: {
! 1888: liberation(s_etat_processus, s_objet_argument_1);
! 1889: liberation(s_etat_processus, s_objet_argument_2);
! 1890:
! 1891: (*s_etat_processus).erreur_execution =
! 1892: d_ex_erreur_parametre_fichier;
! 1893: return;
! 1894: }
! 1895:
! 1896: if ((*s_objet_argument_2).type == CHN)
! 1897: {
! 1898: /*
! 1899: * La socket ne peut être que du domaine UNIX
! 1900: */
! 1901:
! 1902: if ((*((struct_socket *) (*s_objet_argument_1).objet)).domaine
! 1903: != PF_UNIX)
! 1904: {
! 1905: liberation(s_etat_processus, s_objet_argument_1);
! 1906: liberation(s_etat_processus, s_objet_argument_2);
! 1907:
! 1908: (*s_etat_processus).erreur_execution =
! 1909: d_ex_erreur_parametre_fichier;
! 1910: return;
! 1911: }
! 1912:
! 1913: free((*((struct_socket *) (*s_objet_argument_1).objet))
! 1914: .adresse_distante);
! 1915:
! 1916: if (((*((struct_socket *) (*s_objet_argument_1).objet))
! 1917: .adresse_distante = malloc((strlen((unsigned char *)
! 1918: (*s_objet_argument_2).objet) + 1) * sizeof(unsigned char)))
! 1919: == NULL)
! 1920: {
! 1921: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1922: return;
! 1923: }
! 1924:
! 1925: strcpy((*((struct_socket *) (*s_objet_argument_1).objet))
! 1926: .adresse_distante, (unsigned char *)
! 1927: (*s_objet_argument_2).objet);
! 1928: }
! 1929: else if ((*s_objet_argument_2).type == LST)
! 1930: {
! 1931: l_element_courant = (struct_liste_chainee *)
! 1932: (*s_objet_argument_2).objet;
! 1933: nombre_elements = 0;
! 1934:
! 1935: while(l_element_courant != NULL)
! 1936: {
! 1937: nombre_elements++;
! 1938: l_element_courant = (*l_element_courant).suivant;
! 1939: }
! 1940:
! 1941: if (nombre_elements != 2)
! 1942: {
! 1943: liberation(s_etat_processus, s_objet_argument_1);
! 1944: liberation(s_etat_processus, s_objet_argument_2);
! 1945:
! 1946: (*s_etat_processus).erreur_execution =
! 1947: d_ex_erreur_parametre_fichier;
! 1948: return;
! 1949: }
! 1950:
! 1951: l_element_courant = (struct_liste_chainee *)
! 1952: (*s_objet_argument_2).objet;
! 1953:
! 1954: if ((*(*l_element_courant).donnee).type == VIN)
! 1955: {
! 1956: if ((*((struct_vecteur *) (*(*l_element_courant).donnee).objet))
! 1957: .taille == 4)
! 1958: {
! 1959: if ((*((struct_socket *) (*s_objet_argument_1).objet))
! 1960: .domaine != PF_INET)
! 1961: {
! 1962: liberation(s_etat_processus, s_objet_argument_1);
! 1963: liberation(s_etat_processus, s_objet_argument_2);
! 1964:
! 1965: (*s_etat_processus).erreur_execution =
! 1966: d_ex_erreur_parametre_fichier;
! 1967: return;
! 1968: }
! 1969:
! 1970: free((*((struct_socket *) (*s_objet_argument_1).objet))
! 1971: .adresse_distante);
! 1972:
! 1973: if (((*((struct_socket *) (*s_objet_argument_1)
! 1974: .objet)).adresse_distante = malloc(22 *
! 1975: sizeof(unsigned char))) == NULL)
! 1976: {
! 1977: (*s_etat_processus).erreur_systeme =
! 1978: d_es_allocation_memoire;
! 1979: return;
! 1980: }
! 1981:
! 1982: (*((struct_socket *) (*s_objet_argument_1).objet))
! 1983: .adresse_distante[0] = d_code_fin_chaine;
! 1984:
! 1985: for(i = 0; i < 4; i++)
! 1986: {
! 1987: if ((((integer8 *) (*((struct_vecteur *)
! 1988: (*(*l_element_courant).donnee).objet)).tableau)
! 1989: [i] >= 0) && (((integer8 *)
! 1990: (*((struct_vecteur *) (*(*l_element_courant)
! 1991: .donnee).objet)).tableau)[i] <= 255))
! 1992: {
! 1993: sprintf((*((struct_socket *) (*s_objet_argument_1)
! 1994: .objet)).adresse_distante,
! 1995: (i == 0) ? "%s%d" : "%s.%d",
! 1996: (*((struct_socket *) (*s_objet_argument_1)
! 1997: .objet)).adresse_distante, (int)
! 1998: ((integer8 *) (*((struct_vecteur *)
! 1999: (*(*l_element_courant).donnee).objet))
! 2000: .tableau)[i]);
! 2001: }
! 2002: else
! 2003: {
! 2004: liberation(s_etat_processus, s_objet_argument_1);
! 2005: liberation(s_etat_processus, s_objet_argument_2);
! 2006:
! 2007: (*s_etat_processus).erreur_execution =
! 2008: d_ex_erreur_parametre_fichier;
! 2009: return;
! 2010: }
! 2011: }
! 2012: }
! 2013: else if ((*((struct_vecteur *) (*(*l_element_courant).donnee)
! 2014: .objet)).taille == 16)
! 2015: {
! 2016: if ((*((struct_socket *) (*s_objet_argument_1).objet))
! 2017: .domaine != PF_INET6)
! 2018: {
! 2019: liberation(s_etat_processus, s_objet_argument_1);
! 2020: liberation(s_etat_processus, s_objet_argument_2);
! 2021:
! 2022: (*s_etat_processus).erreur_execution =
! 2023: d_ex_erreur_parametre_fichier;
! 2024: return;
! 2025: }
! 2026:
! 2027: free((*((struct_socket *) (*s_objet_argument_1).objet))
! 2028: .adresse_distante);
! 2029:
! 2030: if (((*((struct_socket *) (*s_objet_argument_1)
! 2031: .objet)).adresse_distante = malloc(55 *
! 2032: sizeof(unsigned char))) == NULL)
! 2033: {
! 2034: (*s_etat_processus).erreur_systeme =
! 2035: d_es_allocation_memoire;
! 2036: return;
! 2037: }
! 2038:
! 2039: (*((struct_socket *) (*s_objet_argument_1).objet))
! 2040: .adresse_distante[0] = d_code_fin_chaine;
! 2041:
! 2042: for(i = 0; i < 16; i++)
! 2043: {
! 2044: if ((((integer8 *) (*((struct_vecteur *)
! 2045: (*(*l_element_courant).donnee).objet)).tableau)
! 2046: [i] >= 0) && (((integer8 *)
! 2047: (*((struct_vecteur *) (*(*l_element_courant)
! 2048: .donnee).objet)).tableau)[i] <= 255))
! 2049: {
! 2050: sprintf((*((struct_socket *) (*s_objet_argument_1)
! 2051: .objet)).adresse_distante,
! 2052: (i == 0) ? "%s%d" : "%s:%X",
! 2053: (*((struct_socket *) (*s_objet_argument_1)
! 2054: .objet)).adresse_distante, (int)
! 2055: ((integer8 *) (*((struct_vecteur *)
! 2056: (*(*l_element_courant).donnee).objet))
! 2057: .tableau)[i]);
! 2058: }
! 2059: else
! 2060: {
! 2061: liberation(s_etat_processus, s_objet_argument_1);
! 2062: liberation(s_etat_processus, s_objet_argument_2);
! 2063:
! 2064: (*s_etat_processus).erreur_execution =
! 2065: d_ex_erreur_parametre_fichier;
! 2066: return;
! 2067: }
! 2068: }
! 2069: }
! 2070: else
! 2071: {
! 2072: liberation(s_etat_processus, s_objet_argument_1);
! 2073: liberation(s_etat_processus, s_objet_argument_2);
! 2074:
! 2075: (*s_etat_processus).erreur_execution =
! 2076: d_ex_erreur_parametre_fichier;
! 2077: return;
! 2078: }
! 2079: }
! 2080: else if ((*(*l_element_courant).donnee).type == CHN)
! 2081: {
! 2082: resolution = NULL;
! 2083:
! 2084: if (getaddrinfo((unsigned char *) (*(*l_element_courant)
! 2085: .donnee).objet, NULL, NULL, &resolution) != 0)
! 2086: {
! 2087: liberation(s_etat_processus, s_objet_argument_1);
! 2088: liberation(s_etat_processus, s_objet_argument_2);
! 2089:
! 2090: if (resolution != NULL)
! 2091: {
! 2092: freeaddrinfo(resolution);
! 2093: }
! 2094:
! 2095: (*s_etat_processus).erreur_execution =
! 2096: d_ex_erreur_acces_fichier;
! 2097: return;
! 2098: }
! 2099:
! 2100: if ((*((struct_socket *) (*s_objet_argument_1).objet))
! 2101: .domaine == PF_INET)
! 2102: { // Résolution du nom en IPv4
! 2103: resolution_courante = resolution;
! 2104:
! 2105: while(resolution_courante != NULL)
! 2106: {
! 2107: if ((*resolution_courante).ai_family == AF_INET)
! 2108: {
! 2109: break;
! 2110: }
! 2111:
! 2112: resolution_courante = (*resolution_courante).ai_next;
! 2113: }
! 2114:
! 2115: if (resolution_courante == NULL)
! 2116: {
! 2117: liberation(s_etat_processus, s_objet_argument_1);
! 2118: liberation(s_etat_processus, s_objet_argument_2);
! 2119:
! 2120: freeaddrinfo(resolution);
! 2121:
! 2122: (*s_etat_processus).erreur_execution =
! 2123: d_ex_erreur_acces_fichier;
! 2124: return;
! 2125: }
! 2126:
! 2127: free((*((struct_socket *) (*s_objet_argument_1).objet))
! 2128: .adresse_distante);
! 2129:
! 2130: if (((*((struct_socket *) (*s_objet_argument_1)
! 2131: .objet)).adresse_distante = malloc(22 *
! 2132: sizeof(unsigned char))) == NULL)
! 2133: {
! 2134: (*s_etat_processus).erreur_systeme =
! 2135: d_es_allocation_memoire;
! 2136: return;
! 2137: }
! 2138:
! 2139: sprintf((*((struct_socket *) (*s_objet_argument_1).objet))
! 2140: .adresse_distante, "%d.%d.%d.%d",
! 2141: (ntohl((*((struct sockaddr_in *)
! 2142: (*resolution_courante).ai_addr)).sin_addr.s_addr)
! 2143: >> 24) & 0xFF,
! 2144: (ntohl((*((struct sockaddr_in *)
! 2145: (*resolution_courante).ai_addr)).sin_addr.s_addr)
! 2146: >> 16) & 0xFF,
! 2147: (ntohl((*((struct sockaddr_in *)
! 2148: (*resolution_courante).ai_addr)).sin_addr.s_addr)
! 2149: >> 8) & 0xFF,
! 2150: ntohl((*((struct sockaddr_in *)
! 2151: (*resolution_courante).ai_addr)).sin_addr.s_addr)
! 2152: & 0xFF);
! 2153: }
! 2154: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
! 2155: .domaine == PF_INET6)
! 2156: { // Résolution du nom en IPv6
! 2157: resolution_courante = resolution;
! 2158:
! 2159: while(resolution_courante != NULL)
! 2160: {
! 2161: if ((*resolution_courante).ai_family == AF_INET6)
! 2162: {
! 2163: break;
! 2164: }
! 2165:
! 2166: resolution_courante = (*resolution_courante).ai_next;
! 2167: }
! 2168:
! 2169: if (resolution_courante == NULL)
! 2170: {
! 2171: liberation(s_etat_processus, s_objet_argument_1);
! 2172: liberation(s_etat_processus, s_objet_argument_2);
! 2173:
! 2174: freeaddrinfo(resolution);
! 2175:
! 2176: (*s_etat_processus).erreur_execution =
! 2177: d_ex_erreur_acces_fichier;
! 2178: return;
! 2179: }
! 2180:
! 2181: if (((*((struct_socket *) (*s_objet_argument_1)
! 2182: .objet)).adresse_distante = malloc(55 *
! 2183: sizeof(unsigned char))) == NULL)
! 2184: {
! 2185: (*s_etat_processus).erreur_systeme =
! 2186: d_es_allocation_memoire;
! 2187: return;
! 2188: }
! 2189:
! 2190: (*((struct_socket *) (*s_objet_argument_1).objet))
! 2191: .adresse_distante[0] = d_code_fin_chaine;
! 2192:
! 2193: for(i = 0; i < 16; i++)
! 2194: {
! 2195: sprintf((*((struct_socket *) (*s_objet_argument_1)
! 2196: .objet)).adresse_distante,
! 2197: (i == 0) ? "%s%X" : "%s:%X",
! 2198: (*((struct_socket *) (*s_objet_argument_1)
! 2199: .objet)).adresse_distante,
! 2200: (*((struct sockaddr_in6 *)
! 2201: (*resolution_courante).ai_addr)).sin6_addr
! 2202: .s6_addr[i]);
! 2203: }
! 2204: }
! 2205: else
! 2206: {
! 2207: liberation(s_etat_processus, s_objet_argument_1);
! 2208: liberation(s_etat_processus, s_objet_argument_2);
! 2209:
! 2210: freeaddrinfo(resolution);
! 2211:
! 2212: (*s_etat_processus).erreur_execution =
! 2213: d_ex_erreur_parametre_fichier;
! 2214: return;
! 2215: }
! 2216:
! 2217: freeaddrinfo(resolution);
! 2218: }
! 2219: else
! 2220: {
! 2221: liberation(s_etat_processus, s_objet_argument_1);
! 2222: liberation(s_etat_processus, s_objet_argument_2);
! 2223:
! 2224: (*s_etat_processus).erreur_execution =
! 2225: d_ex_erreur_parametre_fichier;
! 2226: return;
! 2227: }
! 2228:
! 2229: l_element_courant = (*l_element_courant).suivant;
! 2230:
! 2231: if ((*(*l_element_courant).donnee).type == INT)
! 2232: {
! 2233: if (((*((integer8 *) (*(*l_element_courant).donnee).objet))
! 2234: >= 0) && ((*((integer8 *) (*(*l_element_courant)
! 2235: .donnee).objet)) <= 65535))
! 2236: {
! 2237: sprintf((*((struct_socket *) (*s_objet_argument_1)
! 2238: .objet)).adresse_distante, "%s(%u)",
! 2239: (*((struct_socket *) (*s_objet_argument_1)
! 2240: .objet)).adresse_distante, (unsigned int)
! 2241: (*((integer8 *) (*(*l_element_courant).donnee)
! 2242: .objet)));
! 2243: }
! 2244: else
! 2245: {
! 2246: liberation(s_etat_processus, s_objet_argument_1);
! 2247: liberation(s_etat_processus, s_objet_argument_2);
! 2248:
! 2249: (*s_etat_processus).erreur_execution =
! 2250: d_ex_erreur_parametre_fichier;
! 2251: return;
! 2252: }
! 2253: }
! 2254: else
! 2255: {
! 2256: liberation(s_etat_processus, s_objet_argument_1);
! 2257: liberation(s_etat_processus, s_objet_argument_2);
! 2258:
! 2259: (*s_etat_processus).erreur_execution =
! 2260: d_ex_erreur_parametre_fichier;
! 2261: return;
! 2262: }
! 2263: }
! 2264: else
! 2265: {
! 2266: liberation(s_etat_processus, s_objet_argument_1);
! 2267: liberation(s_etat_processus, s_objet_argument_2);
! 2268:
! 2269: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 2270: return;
! 2271: }
! 2272: }
! 2273: else
! 2274: {
! 2275: liberation(s_etat_processus, s_objet_argument_1);
! 2276: liberation(s_etat_processus, s_objet_argument_2);
! 2277:
! 2278: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 2279: return;
! 2280: }
! 2281:
! 2282: liberation(s_etat_processus, s_objet_argument_2);
! 2283:
! 2284: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 2285: s_objet_argument_1) == d_erreur)
! 2286: {
! 2287: return;
! 2288: }
! 2289:
! 2290: return;
! 2291: }
! 2292:
! 2293:
! 2294: /*
! 2295: ================================================================================
! 2296: Fonction 'tail'
! 2297: ================================================================================
! 2298: Entrées :
! 2299: --------------------------------------------------------------------------------
! 2300: Sorties :
! 2301: --------------------------------------------------------------------------------
! 2302: Effets de bord : néant
! 2303: ================================================================================
! 2304: */
! 2305:
! 2306: void
! 2307: instruction_tail(struct_processus *s_etat_processus)
! 2308: {
! 2309: integer8 longueur;
! 2310:
! 2311: struct_liste_chainee *l_element_courant;
! 2312:
! 2313: struct_objet *s_objet_argument;
! 2314: struct_objet *s_objet_resultat;
! 2315:
! 2316: (*s_etat_processus).erreur_execution = d_ex;
! 2317:
! 2318: if ((*s_etat_processus).affichage_arguments == 'Y')
! 2319: {
! 2320: printf("\n TAIL ");
! 2321:
! 2322: if ((*s_etat_processus).langue == 'F')
! 2323: {
! 2324: printf("(remplace une liste par tous ses éléments hormis "
! 2325: "son premier)\n\n");
! 2326: }
! 2327: else
! 2328: {
! 2329: printf("(replace a list by all but its first element)\n\n");
! 2330: }
! 2331:
! 2332: printf(" 1: %s\n", d_LST);
! 2333: printf("-> 1: %s\n", d_LST);
! 2334:
! 2335: return;
! 2336: }
! 2337: else if ((*s_etat_processus).test_instruction == 'Y')
! 2338: {
! 2339: (*s_etat_processus).nombre_arguments = -1;
! 2340: return;
! 2341: }
! 2342:
! 2343: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 2344: {
! 2345: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 2346: {
! 2347: return;
! 2348: }
! 2349: }
! 2350:
! 2351: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 2352: &s_objet_argument) == d_erreur)
! 2353: {
! 2354: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 2355: return;
! 2356: }
! 2357:
! 2358: if ((*s_objet_argument).type == LST)
! 2359: {
! 2360: l_element_courant = (*s_objet_argument).objet;
! 2361: longueur = 0;
! 2362:
! 2363: while(l_element_courant != NULL)
! 2364: {
! 2365: longueur++;
! 2366: l_element_courant = (*l_element_courant).suivant;
! 2367: }
! 2368:
! 2369: if (longueur == 0)
! 2370: {
! 2371: if ((s_objet_resultat = allocation(s_etat_processus, LST))
! 2372: == NULL)
! 2373: {
! 2374: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2375: return;
! 2376: }
! 2377:
! 2378: (*s_objet_resultat).objet = NULL;
! 2379: }
! 2380: else
! 2381: {
! 2382: if ((s_objet_resultat = copie_objet(s_etat_processus,
! 2383: s_objet_argument, 'N')) == NULL)
! 2384: {
! 2385: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2386: return;
! 2387: }
! 2388:
! 2389: l_element_courant = (*s_objet_resultat).objet;
! 2390:
! 2391: (*s_objet_resultat).objet = (*((struct_liste_chainee *)
! 2392: (*s_objet_resultat).objet)).suivant;
! 2393:
! 2394: liberation(s_etat_processus, (*l_element_courant).donnee);
! 2395: free(l_element_courant);
! 2396: }
! 2397: }
! 2398: else
! 2399: {
! 2400: liberation(s_etat_processus, s_objet_argument);
! 2401:
! 2402: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 2403: return;
! 2404: }
! 2405:
! 2406: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 2407: s_objet_resultat) == d_erreur)
! 2408: {
! 2409: return;
! 2410: }
! 2411:
! 2412: liberation(s_etat_processus, s_objet_argument);
! 2413:
! 2414: return;
! 2415: }
! 2416:
! 2417: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>