--- rpl/src/compilation.c 2015/07/09 21:19:03 1.81 +++ rpl/src/compilation.c 2018/12/24 15:55:00 1.95 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.22 - Copyright (C) 1989-2015 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.30 + Copyright (C) 1989-2018 Dr. BERTRAND Joël This file is part of RPL/2. @@ -917,6 +917,10 @@ recherche_instruction_suivante_recursive int erreur_analyse; int erreur_format; + integer8 nombre_caracteres; + integer8 (*__type_parse)(struct_processus *, void **); + + unsigned char base_binaire; unsigned char caractere_fin; unsigned char *pointeur_caractere_courant; @@ -926,6 +930,8 @@ recherche_instruction_suivante_recursive signed long niveau; + struct_liste_chainee *l_element_courant; + erreur_analyse = d_ex; erreur_format = d_ex; erreur = d_absence_erreur; @@ -945,6 +951,7 @@ recherche_instruction_suivante_recursive } case TBL: + case REC: { caractere_fin = ']'; break; @@ -990,6 +997,51 @@ recherche_instruction_suivante_recursive 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; while(((*pointeur_caractere_courant) != d_code_espace) && @@ -1503,9 +1555,7 @@ recherche_instruction_suivante_recursive } else if ((*pointeur_caractere_courant) == '=') { // Cas de '>=' - drapeau_fin_objet = d_vrai; pointeur_caractere_courant++; - break; } else if ((*pointeur_caractere_courant) != d_code_espace) @@ -1648,16 +1698,103 @@ recherche_instruction_suivante_recursive break; } + + case '|' : + { + 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)) == '|') + { + drapeau_fin_objet = d_vrai; + } + else + { + erreur_analyse = d_ex_syntaxe; + } + + pointeur_caractere_courant++; + break; + } + + 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 = REC; + + 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; + } + } + + break; + } } if ((*(pointeur_caractere_courant - 1)) == caractere_fin) { - // Cas des objets composites (LST, RPN, TBL) + // Cas des objets composites (LST, RPN, TBL, REC) break; } else if ((*pointeur_caractere_courant) == caractere_fin) { - // Condition pour traiter les cas 123} + // Condition pour traiter les cas "123}" break; } }