Annotation of rpl/src/compilation.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: Procédure de vérification syntaxique du source et de précompilation
! 29: ================================================================================
! 30: Entrées :
! 31: --------------------------------------------------------------------------------
! 32: Sorties :
! 33: - renvoi : erreur
! 34: --------------------------------------------------------------------------------
! 35: Effets de bord :
! 36: ================================================================================
! 37: */
! 38:
! 39: logical1
! 40: compilation(struct_processus *s_etat_processus)
! 41: {
! 42: struct_objet *s_objet;
! 43:
! 44: struct_variable *s_variable;
! 45:
! 46: unsigned char apostrophe_ouverte;
! 47: unsigned char apostrophe_ouverte_registre;
! 48: unsigned char caractere_courant;
! 49: unsigned char caractere_precedent;
! 50: unsigned char caractere_suivant;
! 51: unsigned char *definition;
! 52: unsigned char fermeture_definition;
! 53: unsigned char guillemet_ouvert;
! 54: unsigned char ouverture_definition;
! 55: unsigned char position_debut_nom_definition_valide;
! 56:
! 57: unsigned long *adresse;
! 58: unsigned long i;
! 59: unsigned long niveau_definition;
! 60: unsigned long niveau_definition_registre;
! 61: unsigned long position_courante;
! 62: unsigned long position_debut_nom_definition;
! 63: unsigned long position_fin_nom_definition;
! 64: unsigned long validation;
! 65: unsigned long validation_registre;
! 66:
! 67: (*s_etat_processus).erreur_compilation = d_ec;
! 68: (*s_etat_processus).erreur_systeme = d_es;
! 69: (*s_etat_processus).erreur_execution = d_ex;
! 70: (*s_etat_processus).exception = d_ep;
! 71: (*s_etat_processus).arret_si_exception = d_vrai;
! 72:
! 73: (*s_etat_processus).position_courante = 0;
! 74:
! 75:
! 76: /*
! 77: --------------------------------------------------------------------------------
! 78: Recheche des définitions
! 79: --------------------------------------------------------------------------------
! 80: */
! 81:
! 82: niveau_definition = 0;
! 83: niveau_definition_registre = 0;
! 84: position_courante = 0;
! 85: position_debut_nom_definition = 0;
! 86: validation = 0;
! 87:
! 88: apostrophe_ouverte = d_faux;
! 89: apostrophe_ouverte_registre = d_faux;
! 90: guillemet_ouvert = d_faux;
! 91: position_debut_nom_definition_valide = d_faux;
! 92:
! 93: if ((*s_etat_processus).debug == d_vrai)
! 94: if (((*s_etat_processus).type_debug & d_debug_analyse) != 0)
! 95: {
! 96: printf("\n");
! 97: printf("[%d] Compilation\n", (int) getpid());
! 98: fflush(stdout);
! 99: }
! 100:
! 101: while((*s_etat_processus).definitions_chainees[position_courante] !=
! 102: d_code_fin_chaine)
! 103: {
! 104: caractere_courant = (*s_etat_processus)
! 105: .definitions_chainees[position_courante];
! 106:
! 107: fermeture_definition = d_faux;
! 108: ouverture_definition = d_faux;
! 109:
! 110: if (position_courante >= 1)
! 111: {
! 112: if (position_courante >= 2)
! 113: {
! 114: if (((*s_etat_processus).definitions_chainees
! 115: [position_courante - 2] == '\\') &&
! 116: ((*s_etat_processus).definitions_chainees
! 117: [position_courante - 1] == '\\'))
! 118: {
! 119: caractere_precedent = '*';
! 120: }
! 121: else
! 122: {
! 123: caractere_precedent = (*s_etat_processus)
! 124: .definitions_chainees[position_courante - 1];
! 125: }
! 126: }
! 127: else
! 128: {
! 129: caractere_precedent = (*s_etat_processus)
! 130: .definitions_chainees[position_courante - 1];
! 131: }
! 132: }
! 133: else
! 134: {
! 135: caractere_precedent = ' ';
! 136: }
! 137:
! 138: caractere_suivant = (*s_etat_processus)
! 139: .definitions_chainees[position_courante + 1];
! 140:
! 141: if (caractere_suivant == d_code_fin_chaine)
! 142: {
! 143: caractere_suivant = ' ';
! 144: }
! 145:
! 146: if ((caractere_courant == '[') || (caractere_courant == '{'))
! 147: {
! 148: validation++;
! 149: }
! 150: else if ((caractere_courant == ']') || (caractere_courant == '}'))
! 151: {
! 152: validation--;
! 153: }
! 154: else if (caractere_courant == '\'')
! 155: {
! 156: if (apostrophe_ouverte == d_faux)
! 157: {
! 158: validation++;
! 159: apostrophe_ouverte = d_vrai;
! 160: }
! 161: else
! 162: {
! 163: validation--;
! 164: apostrophe_ouverte = d_faux;
! 165: }
! 166: }
! 167: else if (caractere_courant == '"')
! 168: {
! 169: if (caractere_precedent != '\\')
! 170: {
! 171: swap((void *) &validation, (void *) &validation_registre,
! 172: sizeof(validation));
! 173: swap((void *) &apostrophe_ouverte,
! 174: (void *) &apostrophe_ouverte_registre,
! 175: sizeof(apostrophe_ouverte));
! 176: swap((void *) &niveau_definition,
! 177: (void *) &niveau_definition_registre,
! 178: sizeof(niveau_definition));
! 179:
! 180: guillemet_ouvert = (guillemet_ouvert == d_faux)
! 181: ? d_vrai : d_faux;
! 182: }
! 183: }
! 184: else if ((caractere_courant == '<') &&
! 185: (caractere_precedent == ' ') &&
! 186: (caractere_suivant == '<'))
! 187: {
! 188: if ((*s_etat_processus)
! 189: .definitions_chainees[position_courante + 2] == ' ')
! 190: {
! 191: niveau_definition++;
! 192: ouverture_definition = d_vrai;
! 193: }
! 194: }
! 195: else if ((caractere_courant == '>') &&
! 196: (caractere_precedent == ' ') &&
! 197: (caractere_suivant == '>'))
! 198: {
! 199: if (((*s_etat_processus)
! 200: .definitions_chainees[position_courante + 2] == ' ') ||
! 201: ((*s_etat_processus).definitions_chainees
! 202: [position_courante + 2] == d_code_fin_chaine))
! 203: {
! 204: if (niveau_definition == 0)
! 205: {
! 206: (*s_etat_processus).erreur_compilation =
! 207: d_ec_niveau_definition_negatif;
! 208: return(d_erreur);
! 209: }
! 210: else
! 211: {
! 212: niveau_definition--;
! 213: fermeture_definition = d_vrai;
! 214: position_courante++;
! 215: }
! 216: }
! 217: }
! 218:
! 219: if ((niveau_definition == 0) && (guillemet_ouvert == d_faux) &&
! 220: (caractere_courant != ' ') && (fermeture_definition == d_faux))
! 221: {
! 222: if (position_debut_nom_definition_valide == d_faux)
! 223: {
! 224: position_debut_nom_definition_valide = d_vrai;
! 225: position_debut_nom_definition = position_courante;
! 226: }
! 227: }
! 228:
! 229: if (((niveau_definition == 1) && (ouverture_definition == d_vrai)) &&
! 230: (position_debut_nom_definition_valide == d_vrai))
! 231: {
! 232: position_fin_nom_definition = position_courante - 1;
! 233: position_debut_nom_definition_valide = d_faux;
! 234:
! 235: while((*s_etat_processus).definitions_chainees
! 236: [position_fin_nom_definition] == ' ')
! 237: {
! 238: position_fin_nom_definition--;
! 239: }
! 240:
! 241: i = position_debut_nom_definition;
! 242:
! 243: while(i <= position_fin_nom_definition)
! 244: {
! 245: if ((*s_etat_processus).definitions_chainees[i] == ' ')
! 246: {
! 247: (*s_etat_processus).erreur_compilation =
! 248: d_ec_nom_definition_invalide;
! 249: return(d_erreur);
! 250: }
! 251: else
! 252: {
! 253: i++;
! 254: }
! 255: }
! 256:
! 257: s_objet = allocation(s_etat_processus, ADR);
! 258: s_variable = (struct_variable *)
! 259: malloc(sizeof(struct_variable));
! 260: adresse = (*s_objet).objet;
! 261: definition = (unsigned char *) malloc(
! 262: (position_fin_nom_definition -
! 263: position_debut_nom_definition + 2) *
! 264: sizeof(unsigned char));
! 265:
! 266: if ((s_objet == NULL) || (s_variable == NULL) ||
! 267: (adresse == NULL) || definition == NULL)
! 268: {
! 269: (*s_etat_processus).erreur_systeme =
! 270: d_es_allocation_memoire;
! 271: return(d_erreur);
! 272: }
! 273: else
! 274: {
! 275: (*adresse) = position_fin_nom_definition + 1;
! 276:
! 277: (*s_variable).nom = definition;
! 278: (*s_variable).niveau = (*s_etat_processus).niveau_courant;
! 279: (*s_variable).objet = s_objet;
! 280:
! 281: i = position_debut_nom_definition;
! 282:
! 283: while(i <= position_fin_nom_definition)
! 284: {
! 285: *(definition++) = (*s_etat_processus)
! 286: .definitions_chainees[i++];
! 287: }
! 288:
! 289: *definition = d_code_fin_chaine;
! 290:
! 291: if (recherche_variable(s_etat_processus, (*s_variable).nom)
! 292: == d_vrai)
! 293: {
! 294: if ((*s_etat_processus).langue == 'F')
! 295: {
! 296: printf("+++Attention : Plusieurs définitions de"
! 297: " même nom\n");
! 298: }
! 299: else
! 300: {
! 301: printf("+++Warning : Same name for several"
! 302: " definitions\n");
! 303: }
! 304:
! 305: fflush(stdout);
! 306: return(d_erreur);
! 307: }
! 308:
! 309: (*s_etat_processus).erreur_systeme = d_es;
! 310: creation_variable(s_etat_processus, s_variable, 'V', 'P');
! 311:
! 312: if ((*s_etat_processus).erreur_systeme != d_es)
! 313: {
! 314: free(s_variable);
! 315:
! 316: return(d_erreur);
! 317: }
! 318:
! 319: if ((*s_etat_processus).debug == d_vrai)
! 320: if (((*s_etat_processus).type_debug & d_debug_analyse) != 0)
! 321: {
! 322: if ((*s_etat_processus).langue == 'F')
! 323: {
! 324: printf("[%d] Compilation : Définition %s ($ %016lX) "
! 325: "\n", (int) getpid(), (*s_variable).nom,
! 326: (*adresse));
! 327: }
! 328: else
! 329: {
! 330: printf("[%d] Compilation : %s definition ($ %016lX) "
! 331: "\n", (int) getpid(), (*s_variable).nom,
! 332: (*adresse));
! 333: }
! 334:
! 335: fflush(stdout);
! 336: }
! 337: }
! 338:
! 339: free(s_variable);
! 340: }
! 341:
! 342: position_courante++;
! 343: }
! 344:
! 345: return(analyse_syntaxique(s_etat_processus));
! 346: }
! 347:
! 348:
! 349: /*
! 350: ================================================================================
! 351: Procédure de d'analyse syntaxique du source
! 352: ================================================================================
! 353: Entrées :
! 354: --------------------------------------------------------------------------------
! 355: Sorties :
! 356: - renvoi : erreur
! 357: --------------------------------------------------------------------------------
! 358: Effets de bord :
! 359: ================================================================================
! 360: */
! 361:
! 362: logical1
! 363: analyse_syntaxique(struct_processus *s_etat_processus)
! 364: {
! 365: enum t_condition { AN_IF = 1, AN_IFERR, AN_THEN, AN_ELSE, AN_ELSEIF,
! 366: AN_END, AN_DO, AN_UNTIL, AN_WHILE, AN_REPEAT, AN_SELECT,
! 367: AN_CASE, AN_DEFAULT, AN_UP, AN_DOWN, AN_FOR, AN_START,
! 368: AN_NEXT, AN_STEP };
! 369:
! 370: unsigned char *instruction;
! 371: unsigned char registre;
! 372:
! 373: typedef struct pile
! 374: {
! 375: enum t_condition condition;
! 376: struct pile *suivant;
! 377: } struct_pile_analyse;
! 378:
! 379: struct_pile_analyse *l_base_pile;
! 380: struct_pile_analyse *l_nouvelle_base_pile;
! 381:
! 382: inline struct_pile_analyse *
! 383: empilement_analyse(struct_pile_analyse *ancienne_base,
! 384: enum t_condition condition)
! 385: {
! 386: struct_pile_analyse *nouvelle_base;
! 387:
! 388: if ((nouvelle_base = malloc(sizeof(struct_pile_analyse))) == NULL)
! 389: {
! 390: return(NULL);
! 391: }
! 392:
! 393: (*nouvelle_base).suivant = ancienne_base;
! 394: (*nouvelle_base).condition = condition;
! 395:
! 396: return(nouvelle_base);
! 397: }
! 398:
! 399: inline struct_pile_analyse *
! 400: depilement_analyse(struct_pile_analyse *ancienne_base)
! 401: {
! 402: struct_pile_analyse *nouvelle_base;
! 403:
! 404: if (ancienne_base == NULL)
! 405: {
! 406: return(NULL);
! 407: }
! 408:
! 409: nouvelle_base = (*ancienne_base).suivant;
! 410: free(ancienne_base);
! 411:
! 412: return(nouvelle_base);
! 413: }
! 414:
! 415: inline logical1
! 416: test_analyse(struct_pile_analyse *l_base_pile, enum t_condition condition)
! 417: {
! 418: if (l_base_pile == NULL)
! 419: {
! 420: return(d_faux);
! 421: }
! 422:
! 423: return(((*l_base_pile).condition == condition) ? d_vrai : d_faux);
! 424: }
! 425:
! 426: inline void
! 427: liberation_analyse(struct_pile_analyse *l_base_pile)
! 428: {
! 429: struct_pile_analyse *l_nouvelle_base_pile;
! 430:
! 431: while(l_base_pile != NULL)
! 432: {
! 433: l_nouvelle_base_pile = (*l_base_pile).suivant;
! 434: free(l_base_pile);
! 435: l_base_pile = l_nouvelle_base_pile;
! 436: }
! 437:
! 438: return;
! 439: }
! 440:
! 441: l_base_pile = NULL;
! 442: l_nouvelle_base_pile = NULL;
! 443:
! 444: if ((*s_etat_processus).debug == d_vrai)
! 445: if (((*s_etat_processus).type_debug & d_debug_analyse) != 0)
! 446: {
! 447: if ((*s_etat_processus).langue == 'F')
! 448: {
! 449: printf("[%d] Analyse\n", (int) getpid());
! 450: }
! 451: else
! 452: {
! 453: printf("[%d] Analysis\n", (int) getpid());
! 454: }
! 455:
! 456: fflush(stdout);
! 457: }
! 458:
! 459: (*s_etat_processus).position_courante = 0;
! 460: registre = (*s_etat_processus).autorisation_empilement_programme;
! 461: (*s_etat_processus).autorisation_empilement_programme = 'N';
! 462:
! 463: /*
! 464: --------------------------------------------------------------------------------
! 465: Analyse structurelle
! 466: --------------------------------------------------------------------------------
! 467: */
! 468:
! 469: while((*s_etat_processus).definitions_chainees
! 470: [(*s_etat_processus).position_courante] != d_code_fin_chaine)
! 471: {
! 472: if (recherche_instruction_suivante(s_etat_processus) !=
! 473: d_absence_erreur)
! 474: {
! 475: liberation_analyse(l_base_pile);
! 476:
! 477: (*s_etat_processus).autorisation_empilement_programme = registre;
! 478: return(d_erreur);
! 479: }
! 480:
! 481: if ((instruction = conversion_majuscule(
! 482: (*s_etat_processus).instruction_courante)) == NULL)
! 483: {
! 484: liberation_analyse(l_base_pile);
! 485:
! 486: (*s_etat_processus).autorisation_empilement_programme = registre;
! 487: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 488: return(d_erreur);
! 489: }
! 490:
! 491: if (strcmp(instruction, "IF") == 0)
! 492: {
! 493: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, AN_IF))
! 494: == NULL)
! 495: {
! 496: liberation_analyse(l_base_pile);
! 497:
! 498: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 499: return(d_erreur);
! 500: }
! 501:
! 502: l_base_pile = l_nouvelle_base_pile;
! 503: (*l_base_pile).condition = AN_IF;
! 504: }
! 505: else if (strcmp(instruction, "IFERR") == 0)
! 506: {
! 507: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile,
! 508: AN_IFERR)) == NULL)
! 509: {
! 510: liberation_analyse(l_base_pile);
! 511:
! 512: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 513: return(d_erreur);
! 514: }
! 515:
! 516: l_base_pile = l_nouvelle_base_pile;
! 517: }
! 518: else if (strcmp(instruction, "THEN") == 0)
! 519: {
! 520: if ((test_analyse(l_base_pile, AN_IF) == d_faux) &&
! 521: (test_analyse(l_base_pile, AN_ELSEIF) == d_faux) &&
! 522: (test_analyse(l_base_pile, AN_CASE) == d_faux) &&
! 523: (test_analyse(l_base_pile, AN_IFERR) == d_faux))
! 524: {
! 525: liberation_analyse(l_base_pile);
! 526:
! 527: (*s_etat_processus).autorisation_empilement_programme =
! 528: registre;
! 529:
! 530: (*s_etat_processus).erreur_compilation =
! 531: d_ec_erreur_instruction_then;
! 532: return(d_erreur);
! 533: }
! 534:
! 535: (*l_base_pile).condition = AN_THEN;
! 536: }
! 537: else if (strcmp(instruction, "ELSE") == 0)
! 538: {
! 539: if (test_analyse(l_base_pile, AN_THEN) == d_faux)
! 540: {
! 541: liberation_analyse(l_base_pile);
! 542:
! 543: (*s_etat_processus).autorisation_empilement_programme =
! 544: registre;
! 545:
! 546: (*s_etat_processus).erreur_compilation =
! 547: d_ec_erreur_instruction_else;
! 548: return(d_erreur);
! 549: }
! 550:
! 551: (*l_base_pile).condition = AN_ELSE;
! 552: }
! 553: else if (strcmp(instruction, "ELSEIF") == 0)
! 554: {
! 555: if (test_analyse(l_base_pile, AN_THEN) == d_faux)
! 556: {
! 557: liberation_analyse(l_base_pile);
! 558:
! 559: (*s_etat_processus).autorisation_empilement_programme =
! 560: registre;
! 561:
! 562: (*s_etat_processus).erreur_compilation =
! 563: d_ec_erreur_instruction_elseif;
! 564: return(d_erreur);
! 565: }
! 566:
! 567: (*l_base_pile).condition = AN_ELSEIF;
! 568: }
! 569: else if (strcmp(instruction, "END") == 0)
! 570: {
! 571: if ((test_analyse(l_base_pile, AN_UNTIL) == d_faux) &&
! 572: (test_analyse(l_base_pile, AN_REPEAT) == d_faux) &&
! 573: (test_analyse(l_base_pile, AN_DEFAULT) == d_faux) &&
! 574: (test_analyse(l_base_pile, AN_SELECT) == d_faux) &&
! 575: (test_analyse(l_base_pile, AN_THEN) == d_faux) &&
! 576: (test_analyse(l_base_pile, AN_ELSE) == d_faux))
! 577: {
! 578: liberation_analyse(l_base_pile);
! 579:
! 580: (*s_etat_processus).autorisation_empilement_programme =
! 581: registre;
! 582:
! 583: (*s_etat_processus).erreur_compilation =
! 584: d_ec_erreur_instruction_end;
! 585: return(d_erreur);
! 586: }
! 587:
! 588: l_base_pile = depilement_analyse(l_base_pile);
! 589: }
! 590: else if (strcmp(instruction, "DO") == 0)
! 591: {
! 592: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, AN_DO))
! 593: == NULL)
! 594: {
! 595: liberation_analyse(l_base_pile);
! 596:
! 597: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 598: return(d_erreur);
! 599: }
! 600:
! 601: l_base_pile = l_nouvelle_base_pile;
! 602: }
! 603: else if (strcmp(instruction, "UNTIL") == 0)
! 604: {
! 605: if (test_analyse(l_base_pile, AN_DO) == d_faux)
! 606: {
! 607: liberation_analyse(l_base_pile);
! 608:
! 609: (*s_etat_processus).autorisation_empilement_programme =
! 610: registre;
! 611:
! 612: (*s_etat_processus).erreur_compilation =
! 613: d_ec_erreur_instruction_until;
! 614: return(d_erreur);
! 615: }
! 616:
! 617: (*l_base_pile).condition = AN_UNTIL;
! 618: }
! 619: else if (strcmp(instruction, "WHILE") == 0)
! 620: {
! 621: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile,
! 622: AN_WHILE)) == NULL)
! 623: {
! 624: liberation_analyse(l_base_pile);
! 625:
! 626: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 627: return(d_erreur);
! 628: }
! 629:
! 630: l_base_pile = l_nouvelle_base_pile;
! 631: }
! 632: else if (strcmp(instruction, "REPEAT") == 0)
! 633: {
! 634: if (test_analyse(l_base_pile, AN_WHILE) == d_faux)
! 635: {
! 636: liberation_analyse(l_base_pile);
! 637:
! 638: (*s_etat_processus).autorisation_empilement_programme =
! 639: registre;
! 640:
! 641: (*s_etat_processus).erreur_compilation =
! 642: d_ec_erreur_instruction_while;
! 643: return(d_erreur);
! 644: }
! 645:
! 646: (*l_base_pile).condition = AN_REPEAT;
! 647: }
! 648: else if (strcmp(instruction, "SELECT") == 0)
! 649: {
! 650: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile,
! 651: AN_SELECT)) == NULL)
! 652: {
! 653: liberation_analyse(l_base_pile);
! 654:
! 655: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 656: return(d_erreur);
! 657: }
! 658:
! 659: l_base_pile = l_nouvelle_base_pile;
! 660: }
! 661: else if (strcmp(instruction, "CASE") == 0)
! 662: {
! 663: if (test_analyse(l_base_pile, AN_SELECT) == d_faux)
! 664: {
! 665: liberation_analyse(l_base_pile);
! 666:
! 667: (*s_etat_processus).autorisation_empilement_programme =
! 668: registre;
! 669:
! 670: (*s_etat_processus).erreur_compilation =
! 671: d_ec_erreur_instruction_case;
! 672: return(d_erreur);
! 673: }
! 674:
! 675: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile,
! 676: AN_CASE)) == NULL)
! 677: {
! 678: liberation_analyse(l_base_pile);
! 679:
! 680: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 681: return(d_erreur);
! 682: }
! 683:
! 684: l_base_pile = l_nouvelle_base_pile;
! 685: }
! 686: else if (strcmp(instruction, "DEFAULT") == 0)
! 687: {
! 688: if (test_analyse(l_base_pile, AN_SELECT) == d_faux)
! 689: {
! 690: liberation_analyse(l_base_pile);
! 691:
! 692: (*s_etat_processus).autorisation_empilement_programme =
! 693: registre;
! 694:
! 695: (*s_etat_processus).erreur_compilation =
! 696: d_ec_erreur_instruction_select;
! 697: return(d_erreur);
! 698: }
! 699:
! 700: (*l_base_pile).condition = AN_DEFAULT;
! 701: }
! 702: else if (strcmp(instruction, "<<") == 0)
! 703: {
! 704: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, AN_UP))
! 705: == NULL)
! 706: {
! 707: liberation_analyse(l_base_pile);
! 708:
! 709: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 710: return(d_erreur);
! 711: }
! 712:
! 713: l_base_pile = l_nouvelle_base_pile;
! 714: }
! 715: else if (strcmp(instruction, ">>") == 0)
! 716: {
! 717: if (test_analyse(l_base_pile, AN_UP) == d_faux)
! 718: {
! 719: liberation_analyse(l_base_pile);
! 720:
! 721: (*s_etat_processus).autorisation_empilement_programme =
! 722: registre;
! 723:
! 724: (*s_etat_processus).erreur_compilation =
! 725: d_ec_source_incoherent;
! 726: return(d_erreur);
! 727: }
! 728:
! 729: l_base_pile = depilement_analyse(l_base_pile);
! 730: }
! 731: else if (strcmp(instruction, "FOR") == 0)
! 732: {
! 733: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, AN_FOR))
! 734: == NULL)
! 735: {
! 736: liberation_analyse(l_base_pile);
! 737:
! 738: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 739: return(d_erreur);
! 740: }
! 741:
! 742: l_base_pile = l_nouvelle_base_pile;
! 743: }
! 744: else if (strcmp(instruction, "START") == 0)
! 745: {
! 746: if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile,
! 747: AN_START)) == NULL)
! 748: {
! 749: liberation_analyse(l_base_pile);
! 750:
! 751: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 752: return(d_erreur);
! 753: }
! 754:
! 755: l_base_pile = l_nouvelle_base_pile;
! 756: }
! 757: else if (strcmp(instruction, "NEXT") == 0)
! 758: {
! 759: if ((test_analyse(l_base_pile, AN_FOR) == d_faux) &&
! 760: (test_analyse(l_base_pile, AN_START) == d_faux))
! 761: {
! 762: liberation_analyse(l_base_pile);
! 763:
! 764: (*s_etat_processus).autorisation_empilement_programme =
! 765: registre;
! 766:
! 767: (*s_etat_processus).erreur_compilation =
! 768: d_ec_erreur_boucle_definie;
! 769: return(d_erreur);
! 770: }
! 771:
! 772: l_base_pile = depilement_analyse(l_base_pile);
! 773: }
! 774: else if (strcmp(instruction, "STEP") == 0)
! 775: {
! 776: if ((test_analyse(l_base_pile, AN_FOR) == d_faux) &&
! 777: (test_analyse(l_base_pile, AN_START) == d_faux))
! 778: {
! 779: liberation_analyse(l_base_pile);
! 780:
! 781: (*s_etat_processus).autorisation_empilement_programme =
! 782: registre;
! 783:
! 784: (*s_etat_processus).erreur_compilation =
! 785: d_ec_erreur_boucle_definie;
! 786: return(d_erreur);
! 787: }
! 788:
! 789: l_base_pile = depilement_analyse(l_base_pile);
! 790: }
! 791:
! 792: // Invalidation de l'instruction courante dans le fichier rpl-core
! 793: free((*s_etat_processus).instruction_courante);
! 794: (*s_etat_processus).instruction_courante = NULL;
! 795: free(instruction);
! 796: }
! 797:
! 798: (*s_etat_processus).autorisation_empilement_programme = registre;
! 799:
! 800: if (l_base_pile != NULL)
! 801: {
! 802: liberation_analyse(l_base_pile);
! 803:
! 804: (*s_etat_processus).autorisation_empilement_programme = registre;
! 805: (*s_etat_processus).erreur_compilation = d_ec_source_incoherent;
! 806: return(d_erreur);
! 807: }
! 808:
! 809: return(d_absence_erreur);
! 810: }
! 811:
! 812:
! 813: /*
! 814: ================================================================================
! 815: Routine d'échange de deux variables
! 816: ================================================================================
! 817: Entrées :
! 818: - pointeurs génériques sur les deux variables,
! 819: - longueur en octet des objets à permuter.
! 820: --------------------------------------------------------------------------------
! 821: Sorties : idem.
! 822: --------------------------------------------------------------------------------
! 823: Effets de bord : néant.
! 824: ================================================================================
! 825: */
! 826:
! 827: void
! 828: swap(void *variable_1, void *variable_2, unsigned long taille)
! 829: {
! 830: register unsigned char *t_var_1;
! 831: register unsigned char *t_var_2;
! 832: register unsigned char variable_temporaire;
! 833:
! 834: register signed long i;
! 835:
! 836: t_var_1 = (unsigned char *) variable_1;
! 837: t_var_2 = (unsigned char *) variable_2;
! 838:
! 839: i = taille;
! 840:
! 841: for(i--; i >= 0; i--)
! 842: {
! 843: variable_temporaire = t_var_1[i];
! 844: t_var_1[i] = t_var_2[i];
! 845: t_var_2[i] = variable_temporaire;
! 846: }
! 847: }
! 848:
! 849:
! 850: /*
! 851: ================================================================================
! 852: Routine recherchant l'instruction suivante dans le programme compilé
! 853: ================================================================================
! 854: Entrée :
! 855: --------------------------------------------------------------------------------
! 856: Sortie :
! 857: --------------------------------------------------------------------------------
! 858: Effets de bord : néant.
! 859: ================================================================================
! 860: */
! 861:
! 862: logical1
! 863: recherche_instruction_suivante(struct_processus *s_etat_processus)
! 864: {
! 865: logical1 drapeau_fin_objet;
! 866: logical1 erreur;
! 867: logical1 erreur_analyse;
! 868: logical1 erreur_format;
! 869:
! 870: unsigned char base_binaire;
! 871: unsigned char *pointeur_caractere_courant;
! 872: unsigned char *pointeur_caractere_destination;
! 873: unsigned char *pointeur_debut_instruction;
! 874: unsigned char *pointeur_fin_instruction;
! 875:
! 876: signed long niveau;
! 877: signed long niveau_annexe;
! 878:
! 879: erreur_analyse = d_ex;
! 880: erreur_format = d_ex;
! 881: erreur = d_absence_erreur;
! 882:
! 883: drapeau_fin_objet = d_faux;
! 884: niveau = 0;
! 885:
! 886: pointeur_caractere_courant = (*s_etat_processus).definitions_chainees +
! 887: (*s_etat_processus).position_courante;
! 888:
! 889: while(((*pointeur_caractere_courant) == d_code_espace) &&
! 890: ((*pointeur_caractere_courant) != d_code_fin_chaine))
! 891: {
! 892: pointeur_caractere_courant++;
! 893: }
! 894:
! 895: if ((*pointeur_caractere_courant) == d_code_fin_chaine)
! 896: {
! 897: (*s_etat_processus).instruction_courante = (unsigned char *)
! 898: malloc(sizeof(unsigned char));
! 899:
! 900: if ((*s_etat_processus).instruction_courante == NULL)
! 901: {
! 902: erreur = d_erreur;
! 903: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 904: }
! 905: else
! 906: {
! 907: erreur = d_absence_erreur;
! 908: (*(*s_etat_processus).instruction_courante) = d_code_fin_chaine;
! 909: (*s_etat_processus).position_courante = pointeur_caractere_courant
! 910: - (*s_etat_processus).definitions_chainees;
! 911: }
! 912:
! 913: return(erreur);
! 914: }
! 915:
! 916: pointeur_debut_instruction = pointeur_caractere_courant;
! 917:
! 918: while(((*pointeur_caractere_courant) != d_code_espace) &&
! 919: ((*pointeur_caractere_courant) != d_code_fin_chaine) &&
! 920: (drapeau_fin_objet == d_faux) &&
! 921: (erreur_analyse == d_ex) &&
! 922: (erreur_format == d_ex))
! 923: {
! 924: switch(*pointeur_caractere_courant++)
! 925: {
! 926: case ']' :
! 927: case '}' :
! 928: case ')' :
! 929: {
! 930: erreur_format = d_ex_syntaxe;
! 931: break;
! 932: }
! 933:
! 934: case '"' :
! 935: {
! 936: if (pointeur_debut_instruction !=
! 937: (pointeur_caractere_courant - 1))
! 938: {
! 939: erreur_format = d_ex_syntaxe;
! 940: }
! 941:
! 942: while((*pointeur_caractere_courant != '"') &&
! 943: ((*pointeur_caractere_courant) != d_code_fin_chaine))
! 944: {
! 945: if (*pointeur_caractere_courant == '\\')
! 946: {
! 947: pointeur_caractere_courant++;
! 948:
! 949: switch(*pointeur_caractere_courant)
! 950: {
! 951: case '\\' :
! 952: case '"' :
! 953: {
! 954: pointeur_caractere_courant++;
! 955: break;
! 956: }
! 957: }
! 958: }
! 959: else
! 960: {
! 961: pointeur_caractere_courant++;
! 962: }
! 963: }
! 964:
! 965: if ((*pointeur_caractere_courant) != '"')
! 966: {
! 967: erreur_analyse = d_ex_syntaxe;
! 968: }
! 969:
! 970: if (erreur_analyse == d_ex)
! 971: {
! 972: pointeur_caractere_courant++;
! 973: }
! 974:
! 975: drapeau_fin_objet = d_vrai;
! 976: break;
! 977: }
! 978:
! 979: case '\'' :
! 980: {
! 981: if (pointeur_debut_instruction !=
! 982: (pointeur_caractere_courant - 1))
! 983: {
! 984: erreur_format = d_ex_syntaxe;
! 985: }
! 986:
! 987: while(((*pointeur_caractere_courant) != '\'') &&
! 988: ((*pointeur_caractere_courant) != d_code_fin_chaine))
! 989: {
! 990: if ((*pointeur_caractere_courant) == '(')
! 991: {
! 992: niveau++;
! 993: }
! 994: else if ((*pointeur_caractere_courant) == ')')
! 995: {
! 996: niveau--;
! 997: }
! 998:
! 999: pointeur_caractere_courant++;
! 1000: }
! 1001:
! 1002: if ((*pointeur_caractere_courant) != '\'')
! 1003: {
! 1004: erreur_analyse = d_ex_syntaxe;
! 1005: }
! 1006: else if (niveau != 0)
! 1007: {
! 1008: erreur_analyse = d_ex_syntaxe;
! 1009: }
! 1010:
! 1011: if (erreur_analyse == d_ex)
! 1012: {
! 1013: pointeur_caractere_courant++;
! 1014: }
! 1015:
! 1016: drapeau_fin_objet = d_vrai;
! 1017: break;
! 1018: }
! 1019:
! 1020: case '(' :
! 1021: {
! 1022: if (pointeur_debut_instruction !=
! 1023: (pointeur_caractere_courant - 1))
! 1024: {
! 1025: erreur_format = d_ex_syntaxe;
! 1026: }
! 1027:
! 1028: while(((*pointeur_caractere_courant) != ')') &&
! 1029: ((*pointeur_caractere_courant) != d_code_fin_chaine)
! 1030: && (erreur_analyse == d_ex))
! 1031: {
! 1032: switch(*pointeur_caractere_courant)
! 1033: {
! 1034: case '0' :
! 1035: case '1' :
! 1036: case '2' :
! 1037: case '3' :
! 1038: case '4' :
! 1039: case '5' :
! 1040: case '6' :
! 1041: case '7' :
! 1042: case '8' :
! 1043: case '9' :
! 1044: case 'e' :
! 1045: case 'E' :
! 1046: case ',' :
! 1047: case '.' :
! 1048: case ' ' :
! 1049: case '-' :
! 1050: case '+' :
! 1051: case ')' :
! 1052: {
! 1053: break;
! 1054: }
! 1055:
! 1056: default :
! 1057: {
! 1058: erreur_analyse = d_ex_syntaxe;
! 1059: break;
! 1060: }
! 1061: }
! 1062:
! 1063: pointeur_caractere_courant++;
! 1064: }
! 1065:
! 1066: if ((*pointeur_caractere_courant) != ')')
! 1067: {
! 1068: erreur_analyse = d_ex_syntaxe;
! 1069: }
! 1070:
! 1071: if (erreur_analyse == d_ex)
! 1072: {
! 1073: pointeur_caractere_courant++;
! 1074: }
! 1075:
! 1076: drapeau_fin_objet = d_vrai;
! 1077: break;
! 1078: }
! 1079:
! 1080: case '#' :
! 1081: {
! 1082: if (pointeur_debut_instruction !=
! 1083: (pointeur_caractere_courant - 1))
! 1084: {
! 1085: erreur_format = d_ex_syntaxe;
! 1086: }
! 1087:
! 1088: while(((*pointeur_caractere_courant) != 'b') &&
! 1089: ((*pointeur_caractere_courant) != 'o') &&
! 1090: ((*pointeur_caractere_courant) != 'd') &&
! 1091: ((*pointeur_caractere_courant) != 'h') &&
! 1092: ((*pointeur_caractere_courant) !=
! 1093: d_code_fin_chaine) &&
! 1094: (erreur_analyse == d_ex))
! 1095: {
! 1096: switch(*pointeur_caractere_courant)
! 1097: {
! 1098: case ' ' :
! 1099: case '0' :
! 1100: case '1' :
! 1101: case '2' :
! 1102: case '3' :
! 1103: case '4' :
! 1104: case '5' :
! 1105: case '6' :
! 1106: case '7' :
! 1107: case '8' :
! 1108: case '9' :
! 1109: case 'A' :
! 1110: case 'B' :
! 1111: case 'C' :
! 1112: case 'D' :
! 1113: case 'E' :
! 1114: case 'F' :
! 1115: case 'b' :
! 1116: case 'o' :
! 1117: case 'd' :
! 1118: case 'h' :
! 1119: {
! 1120: break;
! 1121: }
! 1122:
! 1123: default :
! 1124: {
! 1125: erreur_analyse = d_ex_syntaxe;
! 1126: break;
! 1127: }
! 1128: }
! 1129:
! 1130: pointeur_caractere_courant++;
! 1131: }
! 1132:
! 1133: base_binaire = (*pointeur_caractere_courant);
! 1134: pointeur_caractere_courant++;
! 1135:
! 1136: if (((*pointeur_caractere_courant) != d_code_fin_chaine) &&
! 1137: ((*pointeur_caractere_courant) != ' '))
! 1138: {
! 1139: erreur_analyse = d_ex_syntaxe;
! 1140: }
! 1141: else
! 1142: {
! 1143: pointeur_caractere_courant = pointeur_debut_instruction + 1;
! 1144:
! 1145: switch(base_binaire)
! 1146: {
! 1147: case 'b' :
! 1148: case 'o' :
! 1149: case 'd' :
! 1150: case 'h' :
! 1151: {
! 1152: break;
! 1153: }
! 1154:
! 1155: default :
! 1156: {
! 1157: erreur_analyse = d_ex_syntaxe;
! 1158: break;
! 1159: }
! 1160: }
! 1161: }
! 1162:
! 1163: while(((*pointeur_caractere_courant) != base_binaire) &&
! 1164: ((*pointeur_caractere_courant) != d_code_fin_chaine) &&
! 1165: (erreur_analyse == d_ex))
! 1166: {
! 1167: if (base_binaire == 'b')
! 1168: {
! 1169: switch(*pointeur_caractere_courant)
! 1170: {
! 1171: case ' ' :
! 1172: case '0' :
! 1173: case '1' :
! 1174: {
! 1175: break;
! 1176: }
! 1177:
! 1178: default :
! 1179: {
! 1180: erreur_analyse = d_ex_syntaxe;
! 1181: break;
! 1182: }
! 1183: }
! 1184: }
! 1185: else if (base_binaire == 'o')
! 1186: {
! 1187: switch(*pointeur_caractere_courant)
! 1188: {
! 1189: case ' ' :
! 1190: case '0' :
! 1191: case '1' :
! 1192: case '2' :
! 1193: case '3' :
! 1194: case '4' :
! 1195: case '5' :
! 1196: case '6' :
! 1197: case '7' :
! 1198: {
! 1199: break;
! 1200: }
! 1201:
! 1202: default :
! 1203: {
! 1204: erreur_analyse = d_ex_syntaxe;
! 1205: break;
! 1206: }
! 1207: }
! 1208: }
! 1209: else if (base_binaire == 'd')
! 1210: {
! 1211: switch(*pointeur_caractere_courant)
! 1212: {
! 1213: case ' ' :
! 1214: case '0' :
! 1215: case '1' :
! 1216: case '2' :
! 1217: case '3' :
! 1218: case '4' :
! 1219: case '5' :
! 1220: case '6' :
! 1221: case '7' :
! 1222: case '8' :
! 1223: case '9' :
! 1224: {
! 1225: break;
! 1226: }
! 1227:
! 1228: default :
! 1229: {
! 1230: erreur_analyse = d_ex_syntaxe;
! 1231: break;
! 1232: }
! 1233: }
! 1234: }
! 1235: else if (base_binaire != 'h')
! 1236: {
! 1237: erreur_analyse = d_ex_syntaxe;
! 1238: }
! 1239:
! 1240: pointeur_caractere_courant++;
! 1241: }
! 1242:
! 1243: if (erreur_analyse == d_ex)
! 1244: {
! 1245: pointeur_caractere_courant++;
! 1246: }
! 1247:
! 1248: drapeau_fin_objet = d_vrai;
! 1249: break;
! 1250: }
! 1251:
! 1252: case '{' :
! 1253: {
! 1254: if (pointeur_debut_instruction !=
! 1255: (pointeur_caractere_courant - 1))
! 1256: {
! 1257: erreur_format = d_ex_syntaxe;
! 1258: }
! 1259:
! 1260: niveau = 1;
! 1261: niveau_annexe = 0;
! 1262:
! 1263: while((niveau != 0) && ((*pointeur_caractere_courant) !=
! 1264: d_code_fin_chaine))
! 1265: {
! 1266: switch(*pointeur_caractere_courant)
! 1267: {
! 1268: case '{' :
! 1269: {
! 1270: if (niveau_annexe == 0)
! 1271: {
! 1272: niveau++;
! 1273: }
! 1274: else
! 1275: {
! 1276: erreur_analyse = d_ex_syntaxe;
! 1277: }
! 1278:
! 1279: break;
! 1280: }
! 1281:
! 1282: case '}' :
! 1283: {
! 1284: if (niveau_annexe == 0)
! 1285: {
! 1286: niveau--;
! 1287: }
! 1288: else
! 1289: {
! 1290: erreur_analyse = d_ex_syntaxe;
! 1291: }
! 1292:
! 1293: break;
! 1294: }
! 1295:
! 1296: case '[' :
! 1297: {
! 1298: niveau_annexe++;
! 1299:
! 1300: if (niveau_annexe > 2)
! 1301: {
! 1302: erreur_analyse = d_ex_syntaxe;
! 1303: }
! 1304:
! 1305: break;
! 1306: }
! 1307:
! 1308: case ']' :
! 1309: {
! 1310: niveau_annexe--;
! 1311:
! 1312: if (niveau_annexe < 0)
! 1313: {
! 1314: erreur_analyse = d_ex_syntaxe;
! 1315: }
! 1316:
! 1317: break;
! 1318: }
! 1319:
! 1320: case '"' :
! 1321: {
! 1322: if (niveau_annexe == 0)
! 1323: {
! 1324: pointeur_caractere_courant++;
! 1325:
! 1326: while((*pointeur_caractere_courant != '"') &&
! 1327: ((*pointeur_caractere_courant) !=
! 1328: d_code_fin_chaine))
! 1329: {
! 1330: if (*pointeur_caractere_courant == '\\')
! 1331: {
! 1332: pointeur_caractere_courant++;
! 1333:
! 1334: switch(*pointeur_caractere_courant)
! 1335: {
! 1336: case '\\' :
! 1337: case '"' :
! 1338: {
! 1339: pointeur_caractere_courant++;
! 1340: break;
! 1341: }
! 1342: }
! 1343: }
! 1344: else
! 1345: {
! 1346: pointeur_caractere_courant++;
! 1347: }
! 1348: }
! 1349: }
! 1350: else
! 1351: {
! 1352: erreur_analyse = d_ex_syntaxe;
! 1353: }
! 1354:
! 1355: break;
! 1356: }
! 1357: }
! 1358:
! 1359: pointeur_caractere_courant++;
! 1360: }
! 1361:
! 1362: if ((niveau != 0) || (niveau_annexe != 0))
! 1363: {
! 1364: erreur_analyse = d_ex_syntaxe;
! 1365: }
! 1366:
! 1367: drapeau_fin_objet = d_vrai;
! 1368: break;
! 1369: }
! 1370:
! 1371: case '[' :
! 1372: {
! 1373: if (pointeur_debut_instruction !=
! 1374: (pointeur_caractere_courant - 1))
! 1375: {
! 1376: erreur_format = d_ex_syntaxe;
! 1377: }
! 1378:
! 1379: niveau = 1;
! 1380:
! 1381: while((niveau > 0) && ((*pointeur_caractere_courant) !=
! 1382: d_code_fin_chaine) && (erreur_analyse == d_ex))
! 1383: {
! 1384: switch(*pointeur_caractere_courant)
! 1385: {
! 1386: case '[' :
! 1387: {
! 1388: niveau++;
! 1389: break;
! 1390: }
! 1391:
! 1392: case ']' :
! 1393: {
! 1394: niveau--;
! 1395: break;
! 1396: }
! 1397:
! 1398: case '0' :
! 1399: case '1' :
! 1400: case '2' :
! 1401: case '3' :
! 1402: case '4' :
! 1403: case '5' :
! 1404: case '6' :
! 1405: case '7' :
! 1406: case '8' :
! 1407: case '9' :
! 1408: case '+' :
! 1409: case '-' :
! 1410: case 'e' :
! 1411: case 'E' :
! 1412: case '.' :
! 1413: case ',' :
! 1414: case '(' :
! 1415: case ')' :
! 1416: case ' ' :
! 1417: {
! 1418: break;
! 1419: }
! 1420:
! 1421: default :
! 1422: {
! 1423: erreur_analyse = d_ex_syntaxe;
! 1424: break;
! 1425: }
! 1426: }
! 1427:
! 1428: if (niveau < 0)
! 1429: {
! 1430: erreur_analyse = d_ex_syntaxe;
! 1431: }
! 1432: else if (niveau > 2)
! 1433: {
! 1434: erreur_format = d_ex_syntaxe;
! 1435: }
! 1436:
! 1437: pointeur_caractere_courant++;
! 1438: }
! 1439:
! 1440: if (niveau != 0)
! 1441: {
! 1442: erreur_analyse = d_ex_syntaxe;
! 1443: }
! 1444:
! 1445: drapeau_fin_objet = d_vrai;
! 1446: break;
! 1447: }
! 1448:
! 1449: case '<' :
! 1450: {
! 1451: if (((*s_etat_processus).autorisation_empilement_programme
! 1452: == 'Y') && ((*pointeur_caractere_courant) == '<'))
! 1453: {
! 1454: if (pointeur_debut_instruction !=
! 1455: (pointeur_caractere_courant - 1))
! 1456: {
! 1457: erreur_format = d_ex_syntaxe;
! 1458: }
! 1459:
! 1460: niveau = 1;
! 1461:
! 1462: while((niveau != 0) && ((*pointeur_caractere_courant) !=
! 1463: d_code_fin_chaine))
! 1464: {
! 1465: if (((*pointeur_caractere_courant) == '<') &&
! 1466: ((*(pointeur_caractere_courant + 1)) == '<'))
! 1467: {
! 1468: niveau++;
! 1469: pointeur_caractere_courant++;
! 1470: }
! 1471: else if (((*pointeur_caractere_courant) == '>') &&
! 1472: ((*(pointeur_caractere_courant + 1)) == '>'))
! 1473: {
! 1474: niveau--;
! 1475: pointeur_caractere_courant++;
! 1476: }
! 1477: else if ((*pointeur_caractere_courant) == '"')
! 1478: {
! 1479: pointeur_caractere_courant++;
! 1480:
! 1481: while((*pointeur_caractere_courant != '"') &&
! 1482: ((*pointeur_caractere_courant) !=
! 1483: d_code_fin_chaine))
! 1484: {
! 1485: if (*pointeur_caractere_courant == '\\')
! 1486: {
! 1487: pointeur_caractere_courant++;
! 1488:
! 1489: switch(*pointeur_caractere_courant)
! 1490: {
! 1491: case '\\' :
! 1492: case '"' :
! 1493: {
! 1494: pointeur_caractere_courant++;
! 1495: break;
! 1496: }
! 1497: }
! 1498: }
! 1499: else
! 1500: {
! 1501: pointeur_caractere_courant++;
! 1502: }
! 1503: }
! 1504: }
! 1505:
! 1506: pointeur_caractere_courant++;
! 1507: }
! 1508:
! 1509: if (niveau != 0)
! 1510: {
! 1511: erreur_analyse = d_ex_syntaxe;
! 1512: }
! 1513:
! 1514: drapeau_fin_objet = d_vrai;
! 1515: }
! 1516: else if ((*pointeur_caractere_courant) == '[')
! 1517: {
! 1518: if (pointeur_debut_instruction !=
! 1519: (pointeur_caractere_courant - 1))
! 1520: {
! 1521: erreur_format = d_ex_syntaxe;
! 1522: }
! 1523:
! 1524: pointeur_caractere_courant++;
! 1525: drapeau_fin_objet = d_faux;
! 1526:
! 1527: while(((*pointeur_caractere_courant) != d_code_fin_chaine)
! 1528: && (erreur_format == d_absence_erreur))
! 1529: {
! 1530: while((*pointeur_caractere_courant) == d_code_espace)
! 1531: {
! 1532: pointeur_caractere_courant++;
! 1533: }
! 1534:
! 1535: if ((*pointeur_caractere_courant) == ']')
! 1536: {
! 1537: if ((*(++pointeur_caractere_courant)) == '>')
! 1538: {
! 1539: drapeau_fin_objet = d_vrai;
! 1540: }
! 1541: else
! 1542: {
! 1543: erreur_analyse = d_ex_syntaxe;
! 1544: }
! 1545:
! 1546: pointeur_caractere_courant++;
! 1547: break;
! 1548: }
! 1549:
! 1550: if ((erreur_format == d_absence_erreur) &&
! 1551: (drapeau_fin_objet == d_faux))
! 1552: {
! 1553: (*s_etat_processus).position_courante =
! 1554: pointeur_caractere_courant
! 1555: - (*s_etat_processus).definitions_chainees;
! 1556:
! 1557: if ((erreur = recherche_instruction_suivante(
! 1558: s_etat_processus)) != d_absence_erreur)
! 1559: {
! 1560: if ((*s_etat_processus).instruction_courante
! 1561: != NULL)
! 1562: {
! 1563: free((*s_etat_processus)
! 1564: .instruction_courante);
! 1565: }
! 1566:
! 1567: return(d_erreur);
! 1568: }
! 1569:
! 1570: pointeur_caractere_courant = (*s_etat_processus)
! 1571: .definitions_chainees + (*s_etat_processus)
! 1572: .position_courante;
! 1573:
! 1574: free((*s_etat_processus).instruction_courante);
! 1575: }
! 1576: }
! 1577:
! 1578: if (drapeau_fin_objet == d_faux)
! 1579: {
! 1580: erreur_analyse = d_ex_syntaxe;
! 1581: drapeau_fin_objet = d_vrai;
! 1582: }
! 1583: }
! 1584:
! 1585: break;
! 1586: }
! 1587: }
! 1588: }
! 1589:
! 1590: pointeur_fin_instruction = pointeur_caractere_courant;
! 1591:
! 1592: (*s_etat_processus).instruction_courante = (unsigned char *)
! 1593: malloc(((pointeur_fin_instruction - pointeur_debut_instruction)
! 1594: + 1) * sizeof(unsigned char));
! 1595:
! 1596: if ((*s_etat_processus).instruction_courante == NULL)
! 1597: {
! 1598: erreur = d_erreur;
! 1599: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1600: }
! 1601: else if (pointeur_fin_instruction != pointeur_debut_instruction)
! 1602: {
! 1603: pointeur_caractere_courant = pointeur_debut_instruction;
! 1604: pointeur_caractere_destination =
! 1605: (*s_etat_processus).instruction_courante;
! 1606:
! 1607: do
! 1608: {
! 1609: *pointeur_caractere_destination++ = *pointeur_caractere_courant++;
! 1610: } while(pointeur_caractere_courant < pointeur_fin_instruction);
! 1611:
! 1612: (*pointeur_caractere_destination) = d_code_fin_chaine;
! 1613:
! 1614: erreur = ((erreur_analyse == d_ex) && (erreur_format == d_ex))
! 1615: ? d_absence_erreur : d_erreur;
! 1616: (*s_etat_processus).erreur_execution = erreur_analyse;
! 1617: }
! 1618: else
! 1619: {
! 1620: (*(*s_etat_processus).instruction_courante) = d_code_fin_chaine;
! 1621: }
! 1622:
! 1623: (*s_etat_processus).position_courante = pointeur_fin_instruction
! 1624: - (*s_etat_processus).definitions_chainees;
! 1625:
! 1626: return(erreur);
! 1627: }
! 1628:
! 1629:
! 1630: /*
! 1631: ================================================================================
! 1632: Routine mettant la chaine d'entrée en majuscule
! 1633: ================================================================================
! 1634: Entrée : pointeur sur une chaine en minuscules.
! 1635: --------------------------------------------------------------------------------
! 1636: Sortie : pointeur sur la chaine en majuscules. Si le pointeur retourné
! 1637: est nul, il s'est produit une erreur. L'allocation est faite dans la
! 1638: routine.
! 1639: --------------------------------------------------------------------------------
! 1640: Effets de bord : néant.
! 1641: ================================================================================
! 1642: */
! 1643:
! 1644: unsigned char *
! 1645: conversion_majuscule(unsigned char *chaine)
! 1646: {
! 1647: register unsigned char *caractere_courant;
! 1648: register unsigned char *caractere_courant_converti;
! 1649: register unsigned char *chaine_convertie;
! 1650:
! 1651: unsigned long longueur_chaine_plus_terminaison;
! 1652:
! 1653: longueur_chaine_plus_terminaison = 0;
! 1654: caractere_courant = chaine;
! 1655:
! 1656: while((*caractere_courant) != d_code_fin_chaine)
! 1657: {
! 1658: caractere_courant++;
! 1659: longueur_chaine_plus_terminaison++;
! 1660: }
! 1661:
! 1662: caractere_courant = chaine;
! 1663: caractere_courant_converti = chaine_convertie = (unsigned char *) malloc(
! 1664: (longueur_chaine_plus_terminaison + 1) * sizeof(unsigned char));
! 1665:
! 1666: if (chaine_convertie != NULL)
! 1667: {
! 1668: while((*caractere_courant) != d_code_fin_chaine)
! 1669: {
! 1670: if (isalpha((*caractere_courant)))
! 1671: {
! 1672: (*caractere_courant_converti) = (unsigned char)
! 1673: toupper((*caractere_courant));
! 1674: }
! 1675: else
! 1676: {
! 1677: (*caractere_courant_converti) = (*caractere_courant);
! 1678: }
! 1679:
! 1680: caractere_courant++;
! 1681: caractere_courant_converti++;
! 1682: }
! 1683:
! 1684: (*caractere_courant_converti) = d_code_fin_chaine;
! 1685: }
! 1686:
! 1687: return(chaine_convertie);
! 1688: }
! 1689:
! 1690:
! 1691: /*
! 1692: ================================================================================
! 1693: Initialisation de l'état du calculateur
! 1694: Configuration par défaut d'un calculateur HP-28S
! 1695: ================================================================================
! 1696: Entrée : pointeur sur la structure struct_processus
! 1697: --------------------------------------------------------------------------------
! 1698: Sortie : néant
! 1699: --------------------------------------------------------------------------------
! 1700: Effets de bord : néant
! 1701: ================================================================================
! 1702: */
! 1703:
! 1704: void
! 1705: initialisation_drapeaux(struct_processus *s_etat_processus)
! 1706: {
! 1707: unsigned long i;
! 1708:
! 1709: for(i = 0; i < 31; cf(s_etat_processus, i++));
! 1710:
! 1711: if ((*s_etat_processus).lancement_interactif == d_vrai)
! 1712: {
! 1713: sf(s_etat_processus, 31);
! 1714: /* LAST autorisé */
! 1715: }
! 1716: else
! 1717: {
! 1718: cf(s_etat_processus, 31);
! 1719: /* LAST invalidé */
! 1720: }
! 1721:
! 1722: cf(s_etat_processus, 32); /* Impression automatique */
! 1723: cf(s_etat_processus, 33); /* CR automatique (disp) */
! 1724: cf(s_etat_processus, 34); /* Valeur principale (intervalle de déf.) */
! 1725: sf(s_etat_processus, 35); /* Evaluation symbolique des constantes */
! 1726: sf(s_etat_processus, 36); /* Evaluation symbolique des fonctions */
! 1727: sf(s_etat_processus, 37); /* Taille de mot pour les entiers binaires */
! 1728: sf(s_etat_processus, 38); /* Taille de mot pour les entiers binaires */
! 1729: sf(s_etat_processus, 39); /* Taille de mot pour les entiers binaires */
! 1730: sf(s_etat_processus, 40); /* Taille de mot pour les entiers binaires */
! 1731: sf(s_etat_processus, 41); /* Taille de mot pour les entiers binaires */
! 1732: sf(s_etat_processus, 42); /* Taille de mot pour les entiers binaires */
! 1733: /*
! 1734: 37 : bit de poids faible
! 1735: 42 : bit de poids fort
! 1736: Les six drapeaux peuvent être nuls. Dans ce cas, la longueur des mots
! 1737: binaires reste de un bit.
! 1738: */
! 1739: cf(s_etat_processus, 43); /* Base de numération binaire */
! 1740: cf(s_etat_processus, 44); /* Base de numération binaire */
! 1741: /*
! 1742: 43 44 = 00 => décimal
! 1743: 43 44 = 01 => binaire
! 1744: 43 44 = 10 => octal
! 1745: 43 44 = 11 => hexadécimal
! 1746: */
! 1747: sf(s_etat_processus, 45); /* Affichage multiligne du niveau 1 */
! 1748: cf(s_etat_processus, 46); /* Réservé */
! 1749: cf(s_etat_processus, 47); /* Réservé */
! 1750: /*
! 1751: 46 et 47 réservés sur le calculateur HP28S
! 1752: 46 47 = 00 => système rectangulaire
! 1753: 46 47 = 01 => système cylindrique
! 1754: 46 47 = 10 => système sphérique
! 1755: */
! 1756: cf(s_etat_processus, 48); /* Séparateur décimal */
! 1757: cf(s_etat_processus, 49); /* Format des nombres réels */
! 1758: cf(s_etat_processus, 50); /* Format des nombres réels */
! 1759: /*
! 1760: 49 50 = 00 => standard
! 1761: 49 50 = 01 => scientifique
! 1762: 49 50 = 10 => virgule fixe
! 1763: 49 50 = 11 => ingénieur
! 1764: */
! 1765: cf(s_etat_processus, 51); /* Tonalité */
! 1766: cf(s_etat_processus, 52); /* REDRAW automatique */
! 1767: cf(s_etat_processus, 53); /* Nombre de chiffres décimaux */
! 1768: cf(s_etat_processus, 54); /* Nombre de chiffres décimaux */
! 1769: cf(s_etat_processus, 55); /* Nombre de chiffres décimaux */
! 1770: cf(s_etat_processus, 56); /* Nombre de chiffres décimaux */
! 1771: /*
! 1772: 53 : bit de poids faible
! 1773: 56 : bit de poids fort
! 1774: */
! 1775: cf(s_etat_processus, 57); /* Underflow traité normalement */
! 1776: cf(s_etat_processus, 58); /* Overflow traité normalement */
! 1777: sf(s_etat_processus, 59); /* Infinite result traité normalement */
! 1778: sf(s_etat_processus, 60); /* Angles */
! 1779: /*
! 1780: 60 = 0 => degrés
! 1781: 60 = 1 => radians
! 1782: */
! 1783: cf(s_etat_processus, 61); /* Underflow- traité en exception */
! 1784: cf(s_etat_processus, 62); /* Underflow+ traité en exception */
! 1785: cf(s_etat_processus, 63); /* Overflow traité en exception */
! 1786: cf(s_etat_processus, 64); /* Infinite result traité en exception */
! 1787: }
! 1788:
! 1789: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>