--- rpl/src/compilation.c 2015/01/29 09:33:41 1.76 +++ rpl/src/compilation.c 2017/06/29 12:33:34 1.89 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.20 - Copyright (C) 1989-2015 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.27 + Copyright (C) 1989-2017 Dr. BERTRAND Joël This file is part of RPL/2. @@ -917,6 +917,11 @@ recherche_instruction_suivante_recursive int erreur_analyse; int erreur_format; + integer8 nombre_caracteres; + integer8 (*__type_parse)(struct_processus + *s_etat_processus); + + unsigned char base_binaire; unsigned char caractere_fin; unsigned char *pointeur_caractere_courant; @@ -926,10 +931,59 @@ 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; + /* + * 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; + + 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)) != 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).instruction_courante + + (*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; + } + + /* + * Gestion des types intrinsèques + */ + switch((*s_etat_processus).type_en_cours) { case RPN: @@ -1501,6 +1555,10 @@ recherche_instruction_suivante_recursive 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 '>' @@ -1651,7 +1709,7 @@ recherche_instruction_suivante_recursive } else if ((*pointeur_caractere_courant) == caractere_fin) { - // Condition pour traiter les cas 123} + // Condition pour traiter les cas "123}" break; } } @@ -1706,6 +1764,11 @@ recherche_instruction_suivante_recursive erreur = ((erreur_analyse == d_ex) && (erreur_format == d_ex)) ? d_absence_erreur : d_erreur; (*s_etat_processus).erreur_execution = erreur_analyse; + + if ((*s_etat_processus).erreur_execution == d_ex) + { + (*s_etat_processus).erreur_execution = erreur_format; + } } else {