--- rpl/src/compilation.c 2012/01/25 16:38:30 1.39 +++ rpl/src/compilation.c 2012/01/30 09:25:13 1.40 @@ -822,42 +822,119 @@ analyse_syntaxique(struct_processus *s_e ================================================================================ */ +static char *ligne = NULL; +static unsigned int niveau = 0; + int readline_analyse_syntaxique(int count, int key) { - struct_processus s_etat_processus; + char prompt[] = "+ %03d> "; + char prompt2[8]; + char *registre; - s_etat_processus.definitions_chainees = rl_line_buffer; - s_etat_processus.debug = d_faux; + struct_processus s_etat_processus; if ((*rl_line_buffer) == d_code_fin_chaine) { - rl_done = 1; + 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) + 1) * 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 { - rl_done = 0; - rl_mark = rl_end; - rl_crlf(); - rl_expand_prompt(" > "); - rl_on_new_line(); + 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("annulation\n"); + rl_expand_prompt("RPL/2> "); + rl_on_new_line(); + return(0); +} /* ================================================================================