version 1.75, 2015/01/28 21:47:26
|
version 1.105, 2025/04/15 10:17:50
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.1.20 |
RPL/2 (R) version 4.1.36 |
Copyright (C) 1989-2015 Dr. BERTRAND Joël |
Copyright (C) 1989-2025 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 917 recherche_instruction_suivante_recursive
|
Line 917 recherche_instruction_suivante_recursive
|
int erreur_analyse; |
int erreur_analyse; |
int erreur_format; |
int erreur_format; |
|
|
|
integer8 nombre_caracteres; |
|
integer8 (*__type_parse)(struct_processus *, void **); |
|
|
|
|
unsigned char base_binaire; |
unsigned char base_binaire; |
unsigned char caractere_fin; |
unsigned char caractere_fin; |
unsigned char *pointeur_caractere_courant; |
unsigned char *pointeur_caractere_courant; |
Line 926 recherche_instruction_suivante_recursive
|
Line 930 recherche_instruction_suivante_recursive
|
|
|
signed long niveau; |
signed long niveau; |
|
|
|
struct_liste_chainee *l_element_courant; |
|
|
erreur_analyse = d_ex; |
erreur_analyse = d_ex; |
erreur_format = d_ex; |
erreur_format = d_ex; |
erreur = d_absence_erreur; |
erreur = d_absence_erreur; |
Line 945 recherche_instruction_suivante_recursive
|
Line 951 recherche_instruction_suivante_recursive
|
} |
} |
|
|
case TBL: |
case TBL: |
|
case REC: |
{ |
{ |
caractere_fin = ']'; |
caractere_fin = ']'; |
break; |
break; |
Line 990 recherche_instruction_suivante_recursive
|
Line 997 recherche_instruction_suivante_recursive
|
return(erreur); |
return(erreur); |
} |
} |
|
|
|
/* |
|
* On regarde s'il existe des fonctions permettant de parser |
|
* les objets dans les bibliothèques externes. |
|
*/ |
|
|
|
l_element_courant = (*s_etat_processus).s_bibliotheques; |
|
(*s_etat_processus).position_courante = pointeur_caractere_courant |
|
- (*s_etat_processus).definitions_chainees; |
|
|
|
while(l_element_courant != NULL) |
|
{ |
|
if ((__type_parse = dlsym((*((struct_bibliotheque *) |
|
(*l_element_courant).donnee)).descripteur, "__type_parse")) |
|
!= NULL) |
|
{ |
|
// Une fonction declareTypeExtension(parse) se trouve dans la |
|
// bibliothèque. Si cette fonction renvoie une valeur non nulle, |
|
// elle a réussi à parser correctement un objet. |
|
|
|
if ((nombre_caracteres = __type_parse(s_etat_processus, NULL)) != 0) |
|
{ |
|
if (((*s_etat_processus).instruction_courante = |
|
malloc((((unsigned) nombre_caracteres) + 1) |
|
* sizeof(unsigned char))) == NULL) |
|
{ |
|
(*s_etat_processus).erreur_systeme = |
|
d_es_allocation_memoire; |
|
return(d_erreur); |
|
} |
|
|
|
strncpy((*s_etat_processus).instruction_courante, |
|
(*s_etat_processus).definitions_chainees + |
|
(*s_etat_processus).position_courante, |
|
(unsigned) nombre_caracteres); |
|
(*s_etat_processus).instruction_courante[nombre_caracteres] |
|
= d_code_fin_chaine; |
|
|
|
(*s_etat_processus).position_courante += nombre_caracteres; |
|
return(erreur); |
|
} |
|
} |
|
|
|
l_element_courant = (*l_element_courant).suivant; |
|
} |
|
|
pointeur_debut_instruction = pointeur_caractere_courant; |
pointeur_debut_instruction = pointeur_caractere_courant; |
|
|
while(((*pointeur_caractere_courant) != d_code_espace) && |
while(((*pointeur_caractere_courant) != d_code_espace) && |
Line 1493 recherche_instruction_suivante_recursive
|
Line 1545 recherche_instruction_suivante_recursive
|
((*(pointeur_caractere_courant - 1)) == |
((*(pointeur_caractere_courant - 1)) == |
d_code_espace)) |
d_code_espace)) |
{ |
{ |
|
pointeur_caractere_courant++; |
|
|
|
if ((*pointeur_caractere_courant) == '>') |
|
{ // Cas de '>>' |
|
drapeau_fin_objet = d_vrai; |
|
pointeur_caractere_courant++; |
|
break; |
|
} |
|
else if ((*pointeur_caractere_courant) == '=') |
|
{ // Cas de '>=' |
|
pointeur_caractere_courant++; |
|
} |
|
else if ((*pointeur_caractere_courant) != |
|
d_code_espace) |
|
{ // Tous les cas différents de '>' |
|
erreur_analyse = d_ex_syntaxe; |
|
break; |
|
} |
|
|
|
pointeur_caractere_courant--; |
|
} |
|
|
|
if ((erreur_format == d_absence_erreur) && |
|
(drapeau_fin_objet == d_faux)) |
|
{ |
|
(*s_etat_processus).position_courante = |
|
pointeur_caractere_courant |
|
- (*s_etat_processus).definitions_chainees; |
|
|
|
registre_type_en_cours = (*s_etat_processus) |
|
.type_en_cours; |
|
(*s_etat_processus).type_en_cours = RPN; |
|
|
|
if ((erreur = |
|
recherche_instruction_suivante_recursive( |
|
s_etat_processus, recursivite + 1)) |
|
!= d_absence_erreur) |
|
{ |
|
(*s_etat_processus).type_en_cours = |
|
registre_type_en_cours; |
|
|
|
if ((*s_etat_processus).instruction_courante |
|
!= NULL) |
|
{ |
|
free((*s_etat_processus) |
|
.instruction_courante); |
|
(*s_etat_processus).instruction_courante |
|
= NULL; |
|
} |
|
|
|
return(d_erreur); |
|
} |
|
|
|
(*s_etat_processus).type_en_cours = |
|
registre_type_en_cours; |
|
pointeur_caractere_courant = (*s_etat_processus) |
|
.definitions_chainees + (*s_etat_processus) |
|
.position_courante; |
|
|
|
free((*s_etat_processus).instruction_courante); |
|
} |
|
} |
|
|
|
if (drapeau_fin_objet == d_faux) |
|
{ |
|
erreur_analyse = d_ex_syntaxe; |
|
drapeau_fin_objet = d_vrai; |
|
} |
|
} |
|
else if ((*pointeur_caractere_courant) == '[') |
|
{ // Cas <[ ]> |
|
if (pointeur_debut_instruction != |
|
(pointeur_caractere_courant - 1)) |
|
{ |
|
erreur_format = d_ex_syntaxe; |
|
} |
|
|
|
pointeur_caractere_courant++; |
|
drapeau_fin_objet = d_faux; |
|
|
|
while(((*pointeur_caractere_courant) != d_code_fin_chaine) |
|
&& (erreur_format == d_absence_erreur)) |
|
{ |
|
while((*pointeur_caractere_courant) == d_code_espace) |
|
{ |
|
pointeur_caractere_courant++; |
|
} |
|
|
|
if ((*pointeur_caractere_courant) == ']') |
|
{ |
if ((*(++pointeur_caractere_courant)) == '>') |
if ((*(++pointeur_caractere_courant)) == '>') |
{ |
{ |
drapeau_fin_objet = d_vrai; |
drapeau_fin_objet = d_vrai; |
Line 1515 recherche_instruction_suivante_recursive
|
Line 1657 recherche_instruction_suivante_recursive
|
|
|
registre_type_en_cours = (*s_etat_processus) |
registre_type_en_cours = (*s_etat_processus) |
.type_en_cours; |
.type_en_cours; |
(*s_etat_processus).type_en_cours = RPN; |
(*s_etat_processus).type_en_cours = TBL; |
|
|
if ((erreur = |
if ((erreur = |
recherche_instruction_suivante_recursive( |
recherche_instruction_suivante_recursive( |
Line 1553 recherche_instruction_suivante_recursive
|
Line 1695 recherche_instruction_suivante_recursive
|
drapeau_fin_objet = d_vrai; |
drapeau_fin_objet = d_vrai; |
} |
} |
} |
} |
else if ((*pointeur_caractere_courant) == '[') |
|
{ // Cas <[ ]> |
break; |
|
} |
|
|
|
case '|' : |
|
{ |
|
if ((*pointeur_caractere_courant) == '[') |
|
{ // Cas |[ ]| |
if (pointeur_debut_instruction != |
if (pointeur_debut_instruction != |
(pointeur_caractere_courant - 1)) |
(pointeur_caractere_courant - 1)) |
{ |
{ |
Line 1574 recherche_instruction_suivante_recursive
|
Line 1722 recherche_instruction_suivante_recursive
|
|
|
if ((*pointeur_caractere_courant) == ']') |
if ((*pointeur_caractere_courant) == ']') |
{ |
{ |
if ((*(++pointeur_caractere_courant)) == '>') |
if ((*(++pointeur_caractere_courant)) == '|') |
{ |
{ |
drapeau_fin_objet = d_vrai; |
drapeau_fin_objet = d_vrai; |
} |
} |
Line 1596 recherche_instruction_suivante_recursive
|
Line 1744 recherche_instruction_suivante_recursive
|
|
|
registre_type_en_cours = (*s_etat_processus) |
registre_type_en_cours = (*s_etat_processus) |
.type_en_cours; |
.type_en_cours; |
(*s_etat_processus).type_en_cours = TBL; |
(*s_etat_processus).type_en_cours = REC; |
|
|
if ((erreur = |
if ((erreur = |
recherche_instruction_suivante_recursive( |
recherche_instruction_suivante_recursive( |
Line 1641 recherche_instruction_suivante_recursive
|
Line 1789 recherche_instruction_suivante_recursive
|
|
|
if ((*(pointeur_caractere_courant - 1)) == caractere_fin) |
if ((*(pointeur_caractere_courant - 1)) == caractere_fin) |
{ |
{ |
// Cas des objets composites (LST, RPN, TBL) |
// Cas des objets composites (LST, RPN, TBL, REC) |
break; |
break; |
} |
} |
else if ((*pointeur_caractere_courant) == caractere_fin) |
else if ((*pointeur_caractere_courant) == caractere_fin) |
{ |
{ |
// Condition pour traiter les cas 123} |
// Condition pour traiter les cas "123}" |
break; |
break; |
} |
} |
} |
} |
Line 1701 recherche_instruction_suivante_recursive
|
Line 1849 recherche_instruction_suivante_recursive
|
erreur = ((erreur_analyse == d_ex) && (erreur_format == d_ex)) |
erreur = ((erreur_analyse == d_ex) && (erreur_format == d_ex)) |
? d_absence_erreur : d_erreur; |
? d_absence_erreur : d_erreur; |
(*s_etat_processus).erreur_execution = erreur_analyse; |
(*s_etat_processus).erreur_execution = erreur_analyse; |
|
|
|
if ((*s_etat_processus).erreur_execution == d_ex) |
|
{ |
|
(*s_etat_processus).erreur_execution = erreur_format; |
|
} |
} |
} |
else |
else |
{ |
{ |