Annotation of rpl/src/instructions_e4.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 'exsub'
! 29: ================================================================================
! 30: Entrées :
! 31: --------------------------------------------------------------------------------
! 32: Sorties :
! 33: --------------------------------------------------------------------------------
! 34: Effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: void
! 39: instruction_exsub(struct_processus *s_etat_processus)
! 40: {
! 41: integer8 position;
! 42:
! 43: struct_liste_chainee *l_element_courant;
! 44: struct_liste_chainee *ptr_1;
! 45: struct_liste_chainee *ptr_2;
! 46: struct_liste_chainee *ptr_3;
! 47:
! 48: struct_objet *s_copie_argument_1;
! 49: struct_objet *s_copie_argument_4;
! 50: struct_objet *s_objet_argument_1;
! 51: struct_objet *s_objet_argument_2;
! 52: struct_objet *s_objet_argument_3;
! 53: struct_objet *s_objet_argument_4;
! 54:
! 55: unsigned char *registre_definitions_chainees;
! 56: unsigned char *registre_instruction_courante;
! 57:
! 58: unsigned long position_courante;
! 59:
! 60: (*s_etat_processus).erreur_execution = d_ex;
! 61:
! 62: if ((*s_etat_processus).affichage_arguments == 'Y')
! 63: {
! 64: printf("\n EXSUB ");
! 65:
! 66: if ((*s_etat_processus).langue == 'F')
! 67: {
! 68: printf("(substitution d'expression)\n\n");
! 69: }
! 70: else
! 71: {
! 72: printf("(expression substitution)\n\n");
! 73: }
! 74:
! 75: printf(" 4: %s\n", d_RPN);
! 76: printf(" 3: %s\n", d_INT);
! 77: printf(" 2: %s\n", d_INT);
! 78: printf(" 1: %s\n", d_LST);
! 79: printf("-> 1: %s\n", d_RPN);
! 80:
! 81: return;
! 82: }
! 83: else if ((*s_etat_processus).test_instruction == 'Y')
! 84: {
! 85: (*s_etat_processus).nombre_arguments = 4;
! 86: return;
! 87: }
! 88:
! 89: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 90: {
! 91: if (empilement_pile_last(s_etat_processus, 4) == d_erreur)
! 92: {
! 93: return;
! 94: }
! 95: }
! 96:
! 97: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 98: &s_objet_argument_1) == d_erreur)
! 99: {
! 100: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 101: return;
! 102: }
! 103:
! 104: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 105: &s_objet_argument_2) == d_erreur)
! 106: {
! 107: liberation(s_etat_processus, s_objet_argument_1);
! 108:
! 109: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 110: return;
! 111: }
! 112:
! 113: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 114: &s_objet_argument_3) == d_erreur)
! 115: {
! 116: liberation(s_etat_processus, s_objet_argument_1);
! 117: liberation(s_etat_processus, s_objet_argument_2);
! 118:
! 119: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 120: return;
! 121: }
! 122:
! 123: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 124: &s_objet_argument_4) == d_erreur)
! 125: {
! 126: liberation(s_etat_processus, s_objet_argument_1);
! 127: liberation(s_etat_processus, s_objet_argument_2);
! 128: liberation(s_etat_processus, s_objet_argument_3);
! 129:
! 130: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 131: return;
! 132: }
! 133:
! 134: if (((*s_objet_argument_1).type == LST) &&
! 135: ((*s_objet_argument_2).type == INT) &&
! 136: ((*s_objet_argument_3).type == INT) &&
! 137: ((*s_objet_argument_4).type == RPN))
! 138: {
! 139: if ((*((integer8 *) (*s_objet_argument_3).objet)) <= 0)
! 140: {
! 141: liberation(s_etat_processus, s_objet_argument_1);
! 142: liberation(s_etat_processus, s_objet_argument_2);
! 143: liberation(s_etat_processus, s_objet_argument_3);
! 144: liberation(s_etat_processus, s_objet_argument_4);
! 145:
! 146: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 147: return;
! 148: }
! 149:
! 150: if ((*((integer8 *) (*s_objet_argument_3).objet)) >
! 151: (*((integer8 *) (*s_objet_argument_2).objet)))
! 152: {
! 153: liberation(s_etat_processus, s_objet_argument_1);
! 154: liberation(s_etat_processus, s_objet_argument_2);
! 155: liberation(s_etat_processus, s_objet_argument_3);
! 156: liberation(s_etat_processus, s_objet_argument_4);
! 157:
! 158: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 159: return;
! 160: }
! 161:
! 162: if ((s_copie_argument_1 = copie_objet(s_etat_processus,
! 163: s_objet_argument_1, 'N')) == NULL)
! 164: {
! 165: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 166: return;
! 167: }
! 168:
! 169: liberation(s_etat_processus, s_objet_argument_1);
! 170: s_objet_argument_1 = s_copie_argument_1;
! 171:
! 172: if ((s_copie_argument_4 = copie_objet(s_etat_processus,
! 173: s_objet_argument_4, 'N')) == NULL)
! 174: {
! 175: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 176: return;
! 177: }
! 178:
! 179: liberation(s_etat_processus, s_objet_argument_4);
! 180: s_objet_argument_4 = s_copie_argument_4;
! 181:
! 182: l_element_courant = (*s_objet_argument_4).objet;
! 183: position = 1;
! 184:
! 185: /*
! 186: * ptr_1 : premier élément à substituer
! 187: * ptr_2 : dernier élément à substituer
! 188: */
! 189:
! 190: ptr_1 = NULL;
! 191: ptr_2 = NULL;
! 192:
! 193: while(l_element_courant != NULL)
! 194: {
! 195: if (position == (*((integer8 *) (*s_objet_argument_3).objet)))
! 196: {
! 197: ptr_1 = l_element_courant;
! 198: }
! 199:
! 200: if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
! 201: {
! 202: ptr_2 = (*l_element_courant).suivant;
! 203: (*l_element_courant).suivant = NULL;
! 204: break;
! 205: }
! 206:
! 207: position++;
! 208: l_element_courant = (*l_element_courant).suivant;
! 209: }
! 210:
! 211: if (l_element_courant != NULL)
! 212: {
! 213: /*
! 214: * Substitution
! 215: */
! 216:
! 217: /*
! 218: * ptr_3 : objet de substitution
! 219: * ptr_1 : contient maintenant l'objet allant être substitué
! 220: * et terminé par un NULL donc libérable par liberation().
! 221: */
! 222:
! 223: ptr_3 = (*s_objet_argument_1).objet;
! 224: (*s_objet_argument_1).objet = ptr_1;
! 225:
! 226: l_element_courant = (*s_objet_argument_4).objet;
! 227:
! 228: if (l_element_courant == NULL)
! 229: {
! 230: (*s_objet_argument_4).objet = ptr_3;
! 231:
! 232: if ((*s_objet_argument_4).objet == NULL)
! 233: {
! 234: (*s_objet_argument_4).objet = ptr_2;
! 235: }
! 236: else
! 237: {
! 238: l_element_courant = (*s_objet_argument_4).objet;
! 239:
! 240: while((*l_element_courant).suivant != NULL)
! 241: {
! 242: l_element_courant = (*l_element_courant).suivant;
! 243: }
! 244:
! 245: (*l_element_courant).suivant = ptr_2;
! 246: }
! 247: }
! 248: else
! 249: {
! 250: if ((*((integer8 *) (*s_objet_argument_3).objet)) == 1)
! 251: {
! 252: (*s_objet_argument_4).objet = ptr_3;
! 253: l_element_courant = (*s_objet_argument_4).objet;
! 254: }
! 255: else
! 256: {
! 257: position = 1;
! 258:
! 259: while((*l_element_courant).suivant != NULL)
! 260: {
! 261: position++;
! 262:
! 263: if (position == (*((integer8 *) (*s_objet_argument_3)
! 264: .objet)))
! 265: {
! 266: break;
! 267: }
! 268:
! 269: l_element_courant = (*l_element_courant).suivant;
! 270: }
! 271:
! 272: (*l_element_courant).suivant = ptr_3;
! 273: }
! 274:
! 275: if ((*l_element_courant).suivant == NULL)
! 276: {
! 277: (*l_element_courant).suivant = ptr_2;
! 278: }
! 279: else
! 280: {
! 281: while((*l_element_courant).suivant != NULL)
! 282: {
! 283: l_element_courant = (*l_element_courant).suivant;
! 284: }
! 285:
! 286: (*l_element_courant).suivant = ptr_2;
! 287: }
! 288: }
! 289:
! 290: /*
! 291: * Analyse de l'objet résultant de la substitution
! 292: */
! 293:
! 294: // Recherche de la présence d'un '<<' initial
! 295:
! 296: l_element_courant = (*s_objet_argument_4).objet;
! 297:
! 298: while(l_element_courant != NULL)
! 299: {
! 300: if ((*(*l_element_courant).donnee).type == FCT)
! 301: {
! 302: if (strcmp((*((struct_fonction *) (*(*l_element_courant)
! 303: .donnee).objet)).nom_fonction, "<<") == 0)
! 304: {
! 305: break;
! 306: }
! 307: }
! 308:
! 309: l_element_courant = (*l_element_courant).suivant;
! 310: }
! 311:
! 312: if (l_element_courant != (*s_objet_argument_4).objet)
! 313: {
! 314: liberation(s_etat_processus, s_objet_argument_1);
! 315: liberation(s_etat_processus, s_objet_argument_2);
! 316: liberation(s_etat_processus, s_objet_argument_3);
! 317: liberation(s_etat_processus, s_objet_argument_4);
! 318:
! 319: (*s_etat_processus).erreur_execution =
! 320: d_ex_argument_invalide;
! 321: return;
! 322: }
! 323:
! 324: // Analyse syntaxique
! 325:
! 326: position_courante = (*s_etat_processus).position_courante;
! 327: registre_definitions_chainees = (*s_etat_processus)
! 328: .definitions_chainees;
! 329: registre_instruction_courante = (*s_etat_processus)
! 330: .instruction_courante;
! 331:
! 332: if (((*s_etat_processus).definitions_chainees =
! 333: formateur(s_etat_processus, 0, s_objet_argument_4))
! 334: == NULL)
! 335: {
! 336: (*s_etat_processus).erreur_systeme =
! 337: d_es_allocation_memoire;
! 338: return;
! 339: }
! 340:
! 341: if (analyse_syntaxique(s_etat_processus) == d_erreur)
! 342: {
! 343: free((*s_etat_processus).definitions_chainees);
! 344:
! 345: (*s_etat_processus).definitions_chainees =
! 346: registre_definitions_chainees;
! 347: (*s_etat_processus).instruction_courante =
! 348: registre_instruction_courante;
! 349: (*s_etat_processus).position_courante =
! 350: position_courante;
! 351:
! 352: liberation(s_etat_processus, s_objet_argument_1);
! 353: liberation(s_etat_processus, s_objet_argument_2);
! 354: liberation(s_etat_processus, s_objet_argument_3);
! 355: liberation(s_etat_processus, s_objet_argument_4);
! 356:
! 357: (*s_etat_processus).erreur_execution =
! 358: d_ex_argument_invalide;
! 359: return;
! 360: }
! 361:
! 362: free((*s_etat_processus).definitions_chainees);
! 363:
! 364: (*s_etat_processus).definitions_chainees =
! 365: registre_definitions_chainees;
! 366: (*s_etat_processus).instruction_courante =
! 367: registre_instruction_courante;
! 368: (*s_etat_processus).position_courante =
! 369: position_courante;
! 370: }
! 371: else
! 372: {
! 373: liberation(s_etat_processus, s_objet_argument_1);
! 374: liberation(s_etat_processus, s_objet_argument_2);
! 375: liberation(s_etat_processus, s_objet_argument_3);
! 376: liberation(s_etat_processus, s_objet_argument_4);
! 377:
! 378: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 379: return;
! 380: }
! 381: }
! 382: else
! 383: {
! 384: liberation(s_etat_processus, s_objet_argument_1);
! 385: liberation(s_etat_processus, s_objet_argument_2);
! 386: liberation(s_etat_processus, s_objet_argument_3);
! 387: liberation(s_etat_processus, s_objet_argument_4);
! 388:
! 389: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 390: return;
! 391: }
! 392:
! 393: liberation(s_etat_processus, s_objet_argument_1);
! 394: liberation(s_etat_processus, s_objet_argument_2);
! 395: liberation(s_etat_processus, s_objet_argument_3);
! 396:
! 397: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 398: s_objet_argument_4) == d_erreur)
! 399: {
! 400: return;
! 401: }
! 402:
! 403: return;
! 404: }
! 405:
! 406:
! 407: /*
! 408: ================================================================================
! 409: Fonction 'exget'
! 410: ================================================================================
! 411: Entrées :
! 412: --------------------------------------------------------------------------------
! 413: Sorties :
! 414: --------------------------------------------------------------------------------
! 415: Effets de bord : néant
! 416: ================================================================================
! 417: */
! 418:
! 419: void
! 420: instruction_exget(struct_processus *s_etat_processus)
! 421: {
! 422: struct_liste_chainee *l_element_courant;
! 423: struct_liste_chainee *l_element_suivant;
! 424:
! 425: struct_objet *s_copie_argument_3;
! 426: struct_objet *s_objet_argument_1;
! 427: struct_objet *s_objet_argument_2;
! 428: struct_objet *s_objet_argument_3;
! 429:
! 430: signed long position;
! 431:
! 432: (*s_etat_processus).erreur_execution = d_ex;
! 433:
! 434: if ((*s_etat_processus).affichage_arguments == 'Y')
! 435: {
! 436: printf("\n EXGET ");
! 437:
! 438: if ((*s_etat_processus).langue == 'F')
! 439: {
! 440: printf("(extraction d'une expression)\n\n");
! 441: }
! 442: else
! 443: {
! 444: printf("(get expression)\n\n");
! 445: }
! 446:
! 447: printf(" 3: %s\n", d_RPN);
! 448: printf(" 2: %s\n", d_INT);
! 449: printf(" 1: %s\n", d_INT);
! 450: printf("-> 1: %s\n", d_LST);
! 451:
! 452: return;
! 453: }
! 454: else if ((*s_etat_processus).test_instruction == 'Y')
! 455: {
! 456: (*s_etat_processus).nombre_arguments = 3;
! 457: return;
! 458: }
! 459:
! 460: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 461: {
! 462: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
! 463: {
! 464: return;
! 465: }
! 466: }
! 467:
! 468: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 469: &s_objet_argument_1) == d_erreur)
! 470: {
! 471: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 472: return;
! 473: }
! 474:
! 475: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 476: &s_objet_argument_2) == d_erreur)
! 477: {
! 478: liberation(s_etat_processus, s_objet_argument_1);
! 479:
! 480: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 481: return;
! 482: }
! 483:
! 484: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 485: &s_objet_argument_3) == d_erreur)
! 486: {
! 487: liberation(s_etat_processus, s_objet_argument_1);
! 488: liberation(s_etat_processus, s_objet_argument_2);
! 489:
! 490: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 491: return;
! 492: }
! 493:
! 494: if (((*s_objet_argument_1).type == INT) &&
! 495: ((*s_objet_argument_2).type == INT) &&
! 496: ((*s_objet_argument_3).type == RPN))
! 497: {
! 498: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
! 499: s_objet_argument_3, 'N')) == NULL)
! 500: {
! 501: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 502: return;
! 503: }
! 504:
! 505: liberation(s_etat_processus, s_objet_argument_3);
! 506: s_objet_argument_3 = s_copie_argument_3;
! 507:
! 508: if ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0)
! 509: {
! 510: liberation(s_etat_processus, s_objet_argument_1);
! 511: liberation(s_etat_processus, s_objet_argument_2);
! 512: liberation(s_etat_processus, s_objet_argument_3);
! 513:
! 514: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 515: return;
! 516: }
! 517:
! 518: if ((*((integer8 *) (*s_objet_argument_2).objet)) >
! 519: (*((integer8 *) (*s_objet_argument_1).objet)))
! 520: {
! 521: liberation(s_etat_processus, s_objet_argument_1);
! 522: liberation(s_etat_processus, s_objet_argument_2);
! 523: liberation(s_etat_processus, s_objet_argument_3);
! 524:
! 525: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 526: return;
! 527: }
! 528:
! 529: (*s_objet_argument_3).type = LST;
! 530: l_element_courant = (*s_objet_argument_3).objet;
! 531: position = 1;
! 532:
! 533: while(l_element_courant != NULL)
! 534: {
! 535: if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
! 536: {
! 537: (*s_objet_argument_3).objet = l_element_courant;
! 538: break;
! 539: }
! 540:
! 541: l_element_suivant = (*l_element_courant).suivant;
! 542: liberation(s_etat_processus, (*l_element_courant).donnee);
! 543: free(l_element_courant);
! 544: l_element_courant = l_element_suivant;
! 545:
! 546: position++;
! 547: }
! 548:
! 549: if (position != (*((integer8 *) (*s_objet_argument_2).objet)))
! 550: {
! 551: liberation(s_etat_processus, s_objet_argument_1);
! 552: liberation(s_etat_processus, s_objet_argument_2);
! 553: liberation(s_etat_processus, s_objet_argument_3);
! 554:
! 555: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 556: return;
! 557: }
! 558:
! 559: while(l_element_courant != NULL)
! 560: {
! 561: l_element_suivant = (*l_element_courant).suivant;
! 562:
! 563: if (position == (*((integer8 *) (*s_objet_argument_1).objet)))
! 564: {
! 565: (*l_element_courant).suivant = NULL;
! 566: l_element_courant = l_element_suivant;
! 567:
! 568: while(l_element_courant != NULL)
! 569: {
! 570: l_element_suivant = (*l_element_courant).suivant;
! 571: liberation(s_etat_processus, (*l_element_courant).donnee);
! 572: free(l_element_courant);
! 573: l_element_courant = l_element_suivant;
! 574: }
! 575:
! 576: break;
! 577: }
! 578:
! 579: l_element_courant = l_element_suivant;
! 580: position++;
! 581: }
! 582:
! 583: if (position != (*((integer8 *) (*s_objet_argument_1).objet)))
! 584: {
! 585: liberation(s_etat_processus, s_objet_argument_1);
! 586: liberation(s_etat_processus, s_objet_argument_2);
! 587: liberation(s_etat_processus, s_objet_argument_3);
! 588:
! 589: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
! 590: return;
! 591: }
! 592:
! 593: /*
! 594: * Vérification de la cohérence de l'expression. Nous ne devons avoir
! 595: * ni '<<' ni '>>.
! 596: */
! 597:
! 598: l_element_courant = (*s_objet_argument_3).objet;
! 599:
! 600: while(l_element_courant != NULL)
! 601: {
! 602: if ((*(*l_element_courant).donnee).type == FCT)
! 603: {
! 604: if ((strcmp((*((struct_fonction *) (*(*l_element_courant)
! 605: .donnee).objet)).nom_fonction, "<<") == 0) ||
! 606: (strcmp((*((struct_fonction *) (*(*l_element_courant)
! 607: .donnee).objet)).nom_fonction, ">>") == 0))
! 608: {
! 609: liberation(s_etat_processus, s_objet_argument_1);
! 610: liberation(s_etat_processus, s_objet_argument_2);
! 611: liberation(s_etat_processus, s_objet_argument_3);
! 612:
! 613: (*s_etat_processus).erreur_execution =
! 614: d_ex_argument_invalide;
! 615: return;
! 616: }
! 617: }
! 618:
! 619: l_element_courant = (*l_element_courant).suivant;
! 620: }
! 621: }
! 622: else
! 623: {
! 624: liberation(s_etat_processus, s_objet_argument_1);
! 625: liberation(s_etat_processus, s_objet_argument_2);
! 626: liberation(s_etat_processus, s_objet_argument_3);
! 627:
! 628: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 629: return;
! 630: }
! 631:
! 632: liberation(s_etat_processus, s_objet_argument_1);
! 633: liberation(s_etat_processus, s_objet_argument_2);
! 634:
! 635: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 636: s_objet_argument_3) == d_erreur)
! 637: {
! 638: return;
! 639: }
! 640:
! 641: return;
! 642: }
! 643:
! 644: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>