--- rpl/src/compilation.c 2017/06/28 09:20:30 1.88 +++ rpl/src/compilation.c 2017/06/29 12:33:34 1.89 @@ -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: @@ -1655,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; } }