--- rpl/src/compilation.c 2017/06/29 12:33:34 1.89 +++ rpl/src/compilation.c 2017/06/29 14:54:42 1.90 @@ -919,7 +919,7 @@ recherche_instruction_suivante_recursive integer8 nombre_caracteres; integer8 (*__type_parse)(struct_processus - *s_etat_processus); + *s_etat_processus, void **arg); unsigned char base_binaire; @@ -937,53 +937,6 @@ recherche_instruction_suivante_recursive 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: @@ -1044,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) &&