version 1.2, 2010/01/27 22:22:09
|
version 1.53, 2012/12/19 09:58:22
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.10 |
RPL/2 (R) version 4.1.12 |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
Copyright (C) 1989-2012 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 20
|
Line 20
|
*/ |
*/ |
|
|
|
|
#include "rpl.conv.h" |
#include "rpl-conv.h" |
|
|
|
|
/* |
/* |
Line 72 compilation(struct_processus *s_etat_pro
|
Line 72 compilation(struct_processus *s_etat_pro
|
|
|
(*s_etat_processus).position_courante = 0; |
(*s_etat_processus).position_courante = 0; |
|
|
|
|
/* |
/* |
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
Recheche des définitions |
Recheche des définitions |
Line 359 compilation(struct_processus *s_etat_pro
|
Line 358 compilation(struct_processus *s_etat_pro
|
================================================================================ |
================================================================================ |
*/ |
*/ |
|
|
logical1 |
enum t_condition { AN_IF = 1, AN_IFERR, AN_THEN, AN_ELSE, AN_ELSEIF, |
analyse_syntaxique(struct_processus *s_etat_processus) |
AN_END, AN_DO, AN_UNTIL, AN_WHILE, AN_REPEAT, AN_SELECT, |
{ |
AN_CASE, AN_DEFAULT, AN_UP, AN_DOWN, AN_FOR, AN_START, |
enum t_condition { AN_IF = 1, AN_IFERR, AN_THEN, AN_ELSE, AN_ELSEIF, |
AN_NEXT, AN_STEP, AN_CRITICAL, AN_FORALL }; |
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 }; |
|
|
|
unsigned char *instruction; |
|
unsigned char registre; |
|
|
|
typedef struct pile |
typedef struct pile |
{ |
{ |
enum t_condition condition; |
enum t_condition condition; |
struct pile *suivant; |
struct pile *suivant; |
} struct_pile_analyse; |
} struct_pile_analyse; |
|
|
struct_pile_analyse *l_base_pile; |
static inline struct_pile_analyse * |
struct_pile_analyse *l_nouvelle_base_pile; |
empilement_analyse(struct_pile_analyse *ancienne_base, |
|
enum t_condition condition) |
|
{ |
|
struct_pile_analyse *nouvelle_base; |
|
|
inline struct_pile_analyse * |
if ((nouvelle_base = malloc(sizeof(struct_pile_analyse))) == NULL) |
empilement_analyse(struct_pile_analyse *ancienne_base, |
|
enum t_condition condition) |
|
{ |
{ |
struct_pile_analyse *nouvelle_base; |
return(NULL); |
|
} |
|
|
if ((nouvelle_base = malloc(sizeof(struct_pile_analyse))) == NULL) |
(*nouvelle_base).suivant = ancienne_base; |
{ |
(*nouvelle_base).condition = condition; |
return(NULL); |
|
} |
|
|
|
(*nouvelle_base).suivant = ancienne_base; |
return(nouvelle_base); |
(*nouvelle_base).condition = condition; |
} |
|
|
return(nouvelle_base); |
static inline struct_pile_analyse * |
} |
depilement_analyse(struct_pile_analyse *ancienne_base) |
|
{ |
|
struct_pile_analyse *nouvelle_base; |
|
|
inline struct_pile_analyse * |
if (ancienne_base == NULL) |
depilement_analyse(struct_pile_analyse *ancienne_base) |
|
{ |
{ |
struct_pile_analyse *nouvelle_base; |
return(NULL); |
|
} |
|
|
if (ancienne_base == NULL) |
nouvelle_base = (*ancienne_base).suivant; |
{ |
free(ancienne_base); |
return(NULL); |
|
} |
|
|
|
nouvelle_base = (*ancienne_base).suivant; |
return(nouvelle_base); |
free(ancienne_base); |
} |
|
|
return(nouvelle_base); |
static inline logical1 |
|
test_analyse(struct_pile_analyse *l_base_pile, enum t_condition condition) |
|
{ |
|
if (l_base_pile == NULL) |
|
{ |
|
return(d_faux); |
} |
} |
|
|
inline logical1 |
return(((*l_base_pile).condition == condition) ? d_vrai : d_faux); |
test_analyse(struct_pile_analyse *l_base_pile, enum t_condition condition) |
} |
{ |
|
if (l_base_pile == NULL) |
|
{ |
|
return(d_faux); |
|
} |
|
|
|
return(((*l_base_pile).condition == condition) ? d_vrai : d_faux); |
static inline void |
} |
liberation_analyse(struct_pile_analyse *l_base_pile) |
|
{ |
|
struct_pile_analyse *l_nouvelle_base_pile; |
|
|
inline void |
while(l_base_pile != NULL) |
liberation_analyse(struct_pile_analyse *l_base_pile) |
|
{ |
{ |
struct_pile_analyse *l_nouvelle_base_pile; |
l_nouvelle_base_pile = (*l_base_pile).suivant; |
|
free(l_base_pile); |
|
l_base_pile = l_nouvelle_base_pile; |
|
} |
|
|
while(l_base_pile != NULL) |
return; |
{ |
} |
l_nouvelle_base_pile = (*l_base_pile).suivant; |
|
free(l_base_pile); |
|
l_base_pile = l_nouvelle_base_pile; |
|
} |
|
|
|
return; |
logical1 |
} |
analyse_syntaxique(struct_processus *s_etat_processus) |
|
{ |
|
unsigned char *instruction; |
|
unsigned char registre; |
|
|
|
struct_pile_analyse *l_base_pile; |
|
struct_pile_analyse *l_nouvelle_base_pile; |
|
|
l_base_pile = NULL; |
l_base_pile = NULL; |
l_nouvelle_base_pile = NULL; |
l_nouvelle_base_pile = NULL; |
Line 515 analyse_syntaxique(struct_processus *s_e
|
Line 514 analyse_syntaxique(struct_processus *s_e
|
|
|
l_base_pile = l_nouvelle_base_pile; |
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) |
else if (strcmp(instruction, "THEN") == 0) |
{ |
{ |
if ((test_analyse(l_base_pile, AN_IF) == d_faux) && |
if ((test_analyse(l_base_pile, AN_IF) == d_faux) && |
Line 573 analyse_syntaxique(struct_processus *s_e
|
Line 585 analyse_syntaxique(struct_processus *s_e
|
(test_analyse(l_base_pile, AN_DEFAULT) == d_faux) && |
(test_analyse(l_base_pile, AN_DEFAULT) == d_faux) && |
(test_analyse(l_base_pile, AN_SELECT) == 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_THEN) == d_faux) && |
|
(test_analyse(l_base_pile, AN_CRITICAL) == d_faux) && |
(test_analyse(l_base_pile, AN_ELSE) == d_faux)) |
(test_analyse(l_base_pile, AN_ELSE) == d_faux)) |
{ |
{ |
liberation_analyse(l_base_pile); |
liberation_analyse(l_base_pile); |
Line 754 analyse_syntaxique(struct_processus *s_e
|
Line 767 analyse_syntaxique(struct_processus *s_e
|
|
|
l_base_pile = l_nouvelle_base_pile; |
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) |
else if (strcmp(instruction, "NEXT") == 0) |
{ |
{ |
if ((test_analyse(l_base_pile, AN_FOR) == d_faux) && |
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)) |
(test_analyse(l_base_pile, AN_START) == d_faux)) |
{ |
{ |
liberation_analyse(l_base_pile); |
liberation_analyse(l_base_pile); |
Line 812 analyse_syntaxique(struct_processus *s_e
|
Line 839 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 |
Routine d'échange de deux variables |
================================================================================ |
================================================================================ |
Entrées : |
Entrées : |
Line 831 swap(void *variable_1, void *variable_2,
|
Line 986 swap(void *variable_1, void *variable_2,
|
register unsigned char *t_var_2; |
register unsigned char *t_var_2; |
register unsigned char variable_temporaire; |
register unsigned char variable_temporaire; |
|
|
register signed long i; |
register unsigned long i; |
|
|
t_var_1 = (unsigned char *) variable_1; |
t_var_1 = (unsigned char *) variable_1; |
t_var_2 = (unsigned char *) variable_2; |
t_var_2 = (unsigned char *) variable_2; |
|
|
i = taille; |
for(i = 0; i < taille; i++) |
|
|
for(i--; i >= 0; i--) |
|
{ |
{ |
variable_temporaire = t_var_1[i]; |
variable_temporaire = (*t_var_1); |
t_var_1[i] = t_var_2[i]; |
(*(t_var_1++)) = (*t_var_2); |
t_var_2[i] = variable_temporaire; |
(*(t_var_2++)) = variable_temporaire; |
} |
} |
|
|
|
return; |
} |
} |
|
|
|
|
Line 1687 conversion_majuscule(unsigned char *chai
|
Line 1842 conversion_majuscule(unsigned char *chai
|
return(chaine_convertie); |
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; |
|
} |
|
|
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Line 1721 initialisation_drapeaux(struct_processus
|
Line 1905 initialisation_drapeaux(struct_processus
|
|
|
cf(s_etat_processus, 32); /* Impression automatique */ |
cf(s_etat_processus, 32); /* Impression automatique */ |
cf(s_etat_processus, 33); /* CR automatique (disp) */ |
cf(s_etat_processus, 33); /* CR automatique (disp) */ |
cf(s_etat_processus, 34); /* Valeur principale (intervalle de déf.) */ |
sf(s_etat_processus, 34); /* Évaluation des caractères de contrôle */ |
sf(s_etat_processus, 35); /* Evaluation symbolique des constantes */ |
sf(s_etat_processus, 35); /* Évaluation symbolique des constantes */ |
sf(s_etat_processus, 36); /* Evaluation symbolique des fonctions */ |
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, 37); /* Taille de mot pour les entiers binaires */ |
sf(s_etat_processus, 38); /* 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 */ |
sf(s_etat_processus, 39); /* Taille de mot pour les entiers binaires */ |