--- rpl/src/types.c 2014/07/24 14:38:44 1.67 +++ rpl/src/types.c 2017/07/30 21:59:41 1.89 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.19 - Copyright (C) 1989-2014 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. @@ -38,8 +38,6 @@ void recherche_type(struct_processus *s_etat_processus) { - enum t_type registre_type; - integer8 i; integer8 j; integer8 niveau; @@ -58,6 +56,7 @@ recherche_type(struct_processus *s_etat_ integer8 profondeur_initiale; integer8 sauvegarde_niveau_courant; integer8 sauvegarde_longueur_definitions_chainees; + integer8 (*__type_new)(struct_processus *, void **); struct_liste_chainee *l_base_liste_fonctions; struct_liste_chainee *l_base_liste_decomposition; @@ -145,8 +144,8 @@ recherche_type(struct_processus *s_etat_ */ if (((*((struct_fonction *) element)).nom_fonction = - conversion_majuscule((*s_etat_processus) - .instruction_courante)) == NULL) + conversion_majuscule(s_etat_processus, + (*s_etat_processus).instruction_courante)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -193,7 +192,7 @@ recherche_type(struct_processus *s_etat_ } else { - if ((instruction_majuscule = conversion_majuscule( + if ((instruction_majuscule = conversion_majuscule(s_etat_processus, (*s_etat_processus).instruction_courante)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -262,6 +261,57 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).instruction_valide = registre_instruction_valide; +/* +-------------------------------------------------------------------------------- + Types externes +-------------------------------------------------------------------------------- +*/ + + l_element_courant = (*s_etat_processus).s_bibliotheques; + + while(l_element_courant != NULL) + { + if ((__type_new = dlsym((*((struct_bibliotheque *) + (*l_element_courant).donnee)).descripteur, "__type_new")) + != NULL) + { + if (((*s_objet).extension_type = __type_new(s_etat_processus, + &element)) != 0) + { + // Le type peut être converti. + + (*s_objet).objet = element; + (*s_objet).type = EXT; + (*s_objet).descripteur_bibliotheque = + (*((struct_bibliotheque *) + (*l_element_courant).donnee)).descripteur; + + if (empilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), s_objet) + == d_erreur) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).traitement_interruptible = + registre_interruption; + return; + } + + (*s_etat_processus).traitement_interruptible = + registre_interruption; + return; + } + } + + l_element_courant = (*l_element_courant).suivant; + } + +/* +-------------------------------------------------------------------------------- + Types internes +-------------------------------------------------------------------------------- +*/ + switch(*((*s_etat_processus).instruction_courante)) { @@ -276,6 +326,7 @@ recherche_type(struct_processus *s_etat_ element = (void *) ((struct_complexe16 *) malloc( sizeof(struct_complexe16))); + if (element == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).traitement_interruptible = @@ -1084,21 +1135,6 @@ recherche_type(struct_processus *s_etat_ case d_faux : { - registre_type = (*s_etat_processus).type_en_cours; - - if (drapeau_complexe == d_vrai) - { - (*s_etat_processus).type_en_cours = VCX; - } - else if (drapeau_reel == d_vrai) - { - (*s_etat_processus).type_en_cours = VRL; - } - else - { - (*s_etat_processus).type_en_cours = VIN; - } - /* -- Sauvegarde des paramètres du processus pour analyser le vecteur ------------- @@ -1507,7 +1543,6 @@ recherche_type(struct_processus *s_etat_ (*s_objet).type = VIN; } - (*s_etat_processus).type_en_cours = registre_type; break; } @@ -1519,21 +1554,6 @@ recherche_type(struct_processus *s_etat_ case d_vrai : { - registre_type = (*s_etat_processus).type_en_cours; - - if (drapeau_complexe == d_vrai) - { - (*s_etat_processus).type_en_cours = MCX; - } - else if (drapeau_reel == d_vrai) - { - (*s_etat_processus).type_en_cours = MRL; - } - else - { - (*s_etat_processus).type_en_cours = MIN; - } - nombre_lignes--; sauvegarde_longueur_definitions_chainees = @@ -2153,7 +2173,6 @@ recherche_type(struct_processus *s_etat_ fflush(stdout); } - (*s_etat_processus).type_en_cours = registre_type; break; } } @@ -2169,9 +2188,6 @@ recherche_type(struct_processus *s_etat_ case '{' : { - registre_type = (*s_etat_processus).type_en_cours; - (*s_etat_processus).type_en_cours = LST; - sauvegarde_longueur_definitions_chainees = (*s_etat_processus).longueur_definitions_chainees; @@ -2553,7 +2569,6 @@ recherche_type(struct_processus *s_etat_ (*s_objet).type = LST; element = (void *) l_element_courant; - (*s_etat_processus).type_en_cours = registre_type; break; } @@ -2703,7 +2718,8 @@ recherche_type(struct_processus *s_etat_ * elle est convertie en majuscules. */ - tampon = conversion_majuscule((*((struct_fonction *) + tampon = conversion_majuscule(s_etat_processus, + (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction); @@ -2741,6 +2757,7 @@ recherche_type(struct_processus *s_etat_ { if ((fonction_majuscule = conversion_majuscule( + s_etat_processus, (*((struct_fonction *) ((*l_element_courant_fonctions) .donnee))).nom_fonction)) == NULL) @@ -2892,6 +2909,7 @@ recherche_type(struct_processus *s_etat_ free(l_element_courant_fonctions); } + (*s_etat_processus).autorisation_empilement_programme = 'Y'; break; } @@ -2948,8 +2966,6 @@ recherche_type(struct_processus *s_etat_ case '<' : { - registre_type = (*s_etat_processus).type_en_cours; - if ((*s_etat_processus).instruction_courante[1] == '[') { // Tableau @@ -3016,14 +3032,21 @@ recherche_type(struct_processus *s_etat_ (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; + (*(*s_etat_processus).l_base_pile_systeme) + .origine_routine_evaluation = 'N'; (*s_etat_processus).niveau_courant = 0; (*s_etat_processus).autorisation_empilement_programme = 'N'; + + tampon = (*s_etat_processus).instruction_courante; + autorisation_evaluation_nom = (*s_etat_processus) + .autorisation_evaluation_nom; + (*s_etat_processus).autorisation_evaluation_nom = 'N'; + registre_mode_execution_programme = (*s_etat_processus).mode_execution_programme; (*s_etat_processus).mode_execution_programme = 'Y'; (*s_etat_processus).erreur_scrutation = d_faux; - tampon = (*s_etat_processus).instruction_courante; nombre_lignes_a_supprimer = (*s_etat_processus).hauteur_pile_operationnelle; @@ -3072,6 +3095,8 @@ recherche_type(struct_processus *s_etat_ } (*s_etat_processus).instruction_courante = tampon; + (*s_etat_processus).autorisation_evaluation_nom = + autorisation_evaluation_nom; effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = @@ -3125,6 +3150,8 @@ recherche_type(struct_processus *s_etat_ } (*s_etat_processus).instruction_courante = tampon; + (*s_etat_processus).autorisation_evaluation_nom = + autorisation_evaluation_nom; effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = @@ -3152,6 +3179,8 @@ recherche_type(struct_processus *s_etat_ } (*s_etat_processus).instruction_courante = tampon; + (*s_etat_processus).autorisation_evaluation_nom = + autorisation_evaluation_nom; (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = @@ -3284,7 +3313,6 @@ recherche_type(struct_processus *s_etat_ } } - (*s_etat_processus).type_en_cours = registre_type; break; } @@ -3514,20 +3542,23 @@ recherche_type(struct_processus *s_etat_ while((*ptr) != d_code_fin_chaine) { - if ((isalnum((*ptr)) == 0) && - ((*ptr) != '_') && - ((*ptr) != '$')) + if (isalnum(*ptr) != 0) + { + ptr++; + } + else if (((*ptr) == '_') || ((*ptr == '$'))) + { + ptr++; + } + else { liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_execution = d_ex_syntaxe; (*s_etat_processus).traitement_interruptible = registre_interruption; - return; } - - ptr++; } (*s_objet).type = NOM;