--- rpl/src/compilation.c 2011/05/09 13:52:09 1.23.2.3 +++ rpl/src/compilation.c 2012/03/01 10:14:03 1.44 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.24 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.7 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -809,6 +809,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