--- rpl/src/compilation.c 2010/01/26 15:22:44 1.1.1.1 +++ rpl/src/compilation.c 2012/09/29 17:53:02 1.49 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.10 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -72,7 +72,6 @@ compilation(struct_processus *s_etat_pro (*s_etat_processus).position_courante = 0; - /* -------------------------------------------------------------------------------- Recheche des définitions @@ -365,7 +364,7 @@ analyse_syntaxique(struct_processus *s_e enum t_condition { AN_IF = 1, AN_IFERR, AN_THEN, AN_ELSE, AN_ELSEIF, AN_END, AN_DO, AN_UNTIL, AN_WHILE, AN_REPEAT, AN_SELECT, AN_CASE, AN_DEFAULT, AN_UP, AN_DOWN, AN_FOR, AN_START, - AN_NEXT, AN_STEP }; + AN_NEXT, AN_STEP, AN_CRITICAL, AN_FORALL }; unsigned char *instruction; unsigned char registre; @@ -515,6 +514,19 @@ analyse_syntaxique(struct_processus *s_e l_base_pile = l_nouvelle_base_pile; } + else if (strcmp(instruction, "CRITICAL") == 0) + { + if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, + AN_CRITICAL)) == NULL) + { + liberation_analyse(l_base_pile); + + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + l_base_pile = l_nouvelle_base_pile; + } else if (strcmp(instruction, "THEN") == 0) { if ((test_analyse(l_base_pile, AN_IF) == d_faux) && @@ -573,6 +585,7 @@ analyse_syntaxique(struct_processus *s_e (test_analyse(l_base_pile, AN_DEFAULT) == d_faux) && (test_analyse(l_base_pile, AN_SELECT) == d_faux) && (test_analyse(l_base_pile, AN_THEN) == d_faux) && + (test_analyse(l_base_pile, AN_CRITICAL) == d_faux) && (test_analyse(l_base_pile, AN_ELSE) == d_faux)) { liberation_analyse(l_base_pile); @@ -754,9 +767,23 @@ analyse_syntaxique(struct_processus *s_e l_base_pile = l_nouvelle_base_pile; } + else if (strcmp(instruction, "FORALL") == 0) + { + if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, + AN_FORALL)) == NULL) + { + liberation_analyse(l_base_pile); + + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + l_base_pile = l_nouvelle_base_pile; + } else if (strcmp(instruction, "NEXT") == 0) { if ((test_analyse(l_base_pile, AN_FOR) == d_faux) && + (test_analyse(l_base_pile, AN_FORALL) == d_faux) && (test_analyse(l_base_pile, AN_START) == d_faux)) { liberation_analyse(l_base_pile); @@ -812,6 +839,134 @@ analyse_syntaxique(struct_processus *s_e /* ================================================================================ + Procédure de d'analyse syntaxique du source pour readline +================================================================================ + Entrées : +-------------------------------------------------------------------------------- + Sorties : + - rl_done à 0 ou à 1. +-------------------------------------------------------------------------------- + Effets de bord : +================================================================================ +*/ + +static char *ligne = NULL; +static unsigned int niveau = 0; + +int +readline_analyse_syntaxique(int count, int key) +{ + char prompt[] = "+ %03d> "; + char prompt2[8]; + char *registre; + + struct_processus s_etat_processus; + + if ((*rl_line_buffer) == d_code_fin_chaine) + { + if (ligne == NULL) + { + rl_done = 1; + } + else + { + rl_done = 0; + } + } + else + { + if (ligne == NULL) + { + if ((ligne = malloc((strlen(rl_line_buffer) + 1) + * sizeof(char))) == NULL) + { + rl_done = 1; + return(0); + } + + strcpy(ligne, rl_line_buffer); + } + else + { + registre = ligne; + + if ((ligne = malloc((strlen(registre) + + strlen(rl_line_buffer) + 2) * sizeof(char))) == NULL) + { + rl_done = 1; + return(0); + } + + sprintf(ligne, "%s %s", registre, rl_line_buffer); + } + + rl_replace_line("", 1); + + s_etat_processus.definitions_chainees = ligne; + s_etat_processus.debug = d_faux; + s_etat_processus.erreur_systeme = d_es; + s_etat_processus.erreur_execution = d_ex; + + if (analyse_syntaxique(&s_etat_processus) == d_absence_erreur) + { + rl_done = 1; + } + else + { + if (s_etat_processus.erreur_systeme != d_es) + { + rl_done = 1; + } + else + { + rl_done = 0; + rl_crlf(); + + sprintf(prompt2, prompt, ++niveau); + + rl_expand_prompt(prompt2); + rl_on_new_line(); + } + } + } + + if (rl_done != 0) + { + uprintf("\n"); + + if (ligne != NULL) + { + rl_replace_line(ligne, 1); + + free(ligne); + ligne = NULL; + } + + niveau = 0; + } + + return(0); +} + +int +readline_effacement(int count, int key) +{ + rl_done = 0; + rl_replace_line("", 1); + + free(ligne); + ligne = NULL; + niveau = 0; + + uprintf("^G\n"); + rl_expand_prompt("RPL/2> "); + rl_on_new_line(); + return(0); +} + + +/* +================================================================================ Routine d'échange de deux variables ================================================================================ Entrées : @@ -831,19 +986,19 @@ swap(void *variable_1, void *variable_2, register unsigned char *t_var_2; register unsigned char variable_temporaire; - register signed long i; + register unsigned long i; t_var_1 = (unsigned char *) variable_1; t_var_2 = (unsigned char *) variable_2; - i = taille; - - for(i--; i >= 0; i--) + for(i = 0; i < taille; i++) { - variable_temporaire = t_var_1[i]; - t_var_1[i] = t_var_2[i]; - t_var_2[i] = variable_temporaire; + variable_temporaire = (*t_var_1); + (*(t_var_1++)) = (*t_var_2); + (*(t_var_2++)) = variable_temporaire; } + + return; } @@ -1687,6 +1842,35 @@ conversion_majuscule(unsigned char *chai return(chaine_convertie); } +void +conversion_majuscule_limitee(unsigned char *chaine_entree, + unsigned char *chaine_sortie, unsigned long longueur) +{ + unsigned long i; + + for(i = 0; i < longueur; i++) + { + if (isalpha((*chaine_entree))) + { + (*chaine_sortie) = (unsigned char) toupper((*chaine_entree)); + } + else + { + (*chaine_sortie) = (*chaine_entree); + } + + if ((*chaine_entree) == d_code_fin_chaine) + { + break; + } + + chaine_entree++; + chaine_sortie++; + } + + return; +} + /* ================================================================================ @@ -1721,9 +1905,9 @@ initialisation_drapeaux(struct_processus cf(s_etat_processus, 32); /* Impression automatique */ cf(s_etat_processus, 33); /* CR automatique (disp) */ - cf(s_etat_processus, 34); /* Valeur principale (intervalle de déf.) */ - sf(s_etat_processus, 35); /* Evaluation symbolique des constantes */ - sf(s_etat_processus, 36); /* Evaluation symbolique des fonctions */ + sf(s_etat_processus, 34); /* Évaluation des caractères de contrôle */ + sf(s_etat_processus, 35); /* Évaluation symbolique des constantes */ + sf(s_etat_processus, 36); /* Évaluation symbolique des fonctions */ sf(s_etat_processus, 37); /* Taille de mot pour les entiers binaires */ sf(s_etat_processus, 38); /* Taille de mot pour les entiers binaires */ sf(s_etat_processus, 39); /* Taille de mot pour les entiers binaires */