File:  [local] / rpl / src / compilation.c
Revision 1.67: download - view: text, annotated - select for diffs - revision graph
Thu Jul 17 08:07:16 2014 UTC (9 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route pour la 4.1.19.

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

CVSweb interface <joel.bertrand@systella.fr>