--- rpl/src/types.c 2010/01/26 15:22:44 1.1 +++ rpl/src/types.c 2011/04/11 12:10:13 1.28 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.0.prerelease.0 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -75,6 +75,7 @@ recherche_type(struct_processus *s_etat_ unsigned char registre_instruction_valide; unsigned char registre_interruption; unsigned char registre_mode_execution_programme; + unsigned char registre_recherche_type; unsigned char registre_test; unsigned char registre_test_bis; unsigned char *tampon; @@ -176,6 +177,9 @@ recherche_type(struct_processus *s_etat_ (*s_objet).type = FCT; (*s_objet).objet = element; + (*((struct_fonction *) (*s_objet).objet)).prediction_saut = NULL; + (*((struct_fonction *) (*s_objet).objet)).prediction_execution + = d_faux; if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet) == d_erreur) @@ -367,12 +371,18 @@ recherche_type(struct_processus *s_etat_ } } + registre_recherche_type = (*s_etat_processus).recherche_type; + (*s_etat_processus).recherche_type = 'Y'; + if (sequenceur(s_etat_processus) == d_erreur) { + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + (*s_etat_processus).recherche_type = registre_recherche_type; (*s_etat_processus).instruction_courante = tampon; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant; @@ -393,6 +403,7 @@ recherche_type(struct_processus *s_etat_ return; } + (*s_etat_processus).recherche_type = registre_recherche_type; (*s_etat_processus).instruction_courante = tampon; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; @@ -1073,7 +1084,7 @@ recherche_type(struct_processus *s_etat_ /* -- Sauvegarde des paramètres du processus pour analyser le vecteur ------------- --- Analyse récursive en appelant l'interpréteur sur le vecteur moins ----------- +-- Analyse récursive en appelant l'interprète sur le vecteur moins ------------- -- ses délimiteurs ------------------------------------------------------------- */ @@ -1158,8 +1169,15 @@ recherche_type(struct_processus *s_etat_ } } + registre_recherche_type = + (*s_etat_processus).recherche_type; + (*s_etat_processus).recherche_type = 'Y'; + if (sequenceur(s_etat_processus) == d_erreur) { + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + (*s_etat_processus).recherche_type = + registre_recherche_type; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; nombre_lignes_a_supprimer = @@ -1182,6 +1200,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).instruction_courante = tampon; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = @@ -1205,6 +1224,8 @@ recherche_type(struct_processus *s_etat_ return; } + (*s_etat_processus).recherche_type = + registre_recherche_type; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; @@ -1230,6 +1251,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).instruction_courante = tampon; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = @@ -1564,9 +1586,16 @@ recherche_type(struct_processus *s_etat_ return; } } + + registre_recherche_type = (*s_etat_processus) + .recherche_type; + (*s_etat_processus).recherche_type = 'Y'; if (sequenceur(s_etat_processus) == d_erreur) { + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + (*s_etat_processus).recherche_type = + registre_recherche_type; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; nombre_lignes_a_supprimer = @@ -1589,6 +1618,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).instruction_courante = tampon; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = @@ -1613,6 +1643,8 @@ recherche_type(struct_processus *s_etat_ return; } + (*s_etat_processus).recherche_type = + registre_recherche_type; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; @@ -1638,6 +1670,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).instruction_courante = tampon; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = @@ -2248,6 +2281,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).autorisation_evaluation_nom = autorisation_evaluation_nom; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant; @@ -2284,8 +2318,12 @@ recherche_type(struct_processus *s_etat_ } } + registre_recherche_type = (*s_etat_processus).recherche_type; + (*s_etat_processus).recherche_type = 'Y'; + if (sequenceur(s_etat_processus) == d_erreur) { + (*s_etat_processus).recherche_type = registre_recherche_type; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).erreur_execution = d_ex_syntaxe; @@ -2315,6 +2353,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).autorisation_evaluation_nom = autorisation_evaluation_nom; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant; @@ -2333,6 +2372,7 @@ recherche_type(struct_processus *s_etat_ return; } + (*s_etat_processus).recherche_type = registre_recherche_type; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; @@ -2363,6 +2403,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).autorisation_evaluation_nom = autorisation_evaluation_nom; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant; @@ -2731,7 +2772,7 @@ recherche_type(struct_processus *s_etat_ (*s_sous_objet).type = FCT; if (((*s_sous_objet).objet = (void *) - allocation(s_etat_processus, FCT)) + malloc(sizeof(struct_fonction))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -2811,62 +2852,11 @@ recherche_type(struct_processus *s_etat_ while((*ptr_lecture) != d_code_fin_chaine) { - if ((*ptr_lecture) == '\\') - { - if ((*(ptr_lecture + 1)) == '"') - { - if ((*(ptr_lecture + 2)) != d_code_fin_chaine) - { - ptr_lecture++; - } - } - else if ((*(ptr_lecture + 1)) == 'b') - { - if ((*(ptr_lecture + 2)) != d_code_fin_chaine) - { - ptr_lecture++; - (*ptr_lecture) = '\b'; - } - } - else if ((*(ptr_lecture + 1)) == 'n') - { - if ((*(ptr_lecture + 2)) != d_code_fin_chaine) - { - ptr_lecture++; - (*ptr_lecture) = '\n'; - } - } - else if ((*(ptr_lecture + 1)) == 't') - { - if ((*(ptr_lecture + 2)) != d_code_fin_chaine) - { - ptr_lecture++; - (*ptr_lecture) = '\t'; - } - } - else if ((*(ptr_lecture + 1)) == '\\') - { - if ((*(ptr_lecture + 2)) != d_code_fin_chaine) - { - ptr_lecture++; - } - } - } - *ptr_ecriture++ = *ptr_lecture++; } (*(--ptr_ecriture)) = d_code_fin_chaine; - if ((element = realloc(element, (strlen((unsigned char *) - element) + 1) * sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - (*s_etat_processus).traitement_interruptible = - registre_interruption; - return; - } - break; } @@ -2963,8 +2953,14 @@ recherche_type(struct_processus *s_etat_ } } + registre_recherche_type = (*s_etat_processus).recherche_type; + (*s_etat_processus).recherche_type = 'Y'; + if (sequenceur(s_etat_processus) == d_erreur) { + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + (*s_etat_processus).recherche_type = + registre_recherche_type; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; nombre_lignes_a_supprimer = @@ -2987,6 +2983,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).instruction_courante = tampon; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = @@ -3011,6 +3008,7 @@ recherche_type(struct_processus *s_etat_ return; } + (*s_etat_processus).recherche_type = registre_recherche_type; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; @@ -3036,6 +3034,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).instruction_courante = tampon; + effacement_pile_systeme(s_etat_processus); (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile; (*s_etat_processus).niveau_courant = @@ -3086,10 +3085,7 @@ recherche_type(struct_processus *s_etat_ nombre_lignes = profondeur_finale - profondeur_initiale; - element = (void *) ((struct_tableau *) malloc( - sizeof(struct_tableau))); - - if (element == NULL) + if ((element = malloc(sizeof(struct_tableau))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -3169,6 +3165,8 @@ recherche_type(struct_processus *s_etat_ d_es_allocation_memoire; } + free(s_objet); + (*s_etat_processus).traitement_interruptible = registre_interruption; return; @@ -3196,95 +3194,6 @@ recherche_type(struct_processus *s_etat_ /* -------------------------------------------------------------------------------- - Adresse --------------------------------------------------------------------------------- -*/ - - case '@' : - { - if ((*s_etat_processus).recherche_types_speciaux == 'Y') - { - if (strlen((*s_etat_processus).instruction_courante) > 2) - { - tampon = (*s_etat_processus).instruction_courante; - - if (((*s_etat_processus).instruction_courante = - malloc((strlen(tampon) + 2) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - (*s_etat_processus).traitement_interruptible = - registre_interruption; - return; - } - - strcpy((*s_etat_processus).instruction_courante, tampon); - (*s_etat_processus).instruction_courante[0] = '#'; - (*s_etat_processus).instruction_courante - [strlen((*s_etat_processus).instruction_courante) - + 1] = d_code_fin_chaine; - (*s_etat_processus).instruction_courante - [strlen((*s_etat_processus).instruction_courante)] - = 'h'; - - recherche_type(s_etat_processus); - - free((*s_etat_processus).instruction_courante); - (*s_etat_processus).instruction_courante = tampon; - - if (((*s_etat_processus).erreur_systeme == d_es) && - ((*s_etat_processus).erreur_execution == d_ex)) - { - if (depilement(s_etat_processus, - &((*s_etat_processus).l_base_pile), - &s_sous_objet) == d_absence_erreur) - { - if ((*s_sous_objet).type == BIN) - { - (*s_objet).type = ADR; - - if ((element = - malloc(sizeof(unsigned long))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - (*s_etat_processus) - .traitement_interruptible = - registre_interruption; - return; - } - - (*((unsigned long *) element)) = (*((logical8 *) - (*s_sous_objet).objet)); - } - else - { - (*s_etat_processus).erreur_execution = - d_ex_syntaxe; - } - - liberation(s_etat_processus, s_sous_objet); - } - else - { - (*s_etat_processus).traitement_interruptible = - registre_interruption; - return; - } - } - } - else - { - (*s_etat_processus).erreur_execution = d_ex_syntaxe; - } - - break; - } - } - -/* --------------------------------------------------------------------------------- Entier ou réel -------------------------------------------------------------------------------- */ @@ -3505,6 +3414,26 @@ recherche_type(struct_processus *s_etat_ if ((drapeau_valeur_reelle == d_faux) && (drapeau_valeur_entiere == d_faux)) { + ptr = (*s_etat_processus).instruction_courante; + + while((*ptr) != d_code_fin_chaine) + { + if ((isalnum((*ptr)) == 0) && + ((*ptr) != '_') && + ((*ptr) != '$')) + { + free(s_objet); + + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + (*s_etat_processus).traitement_interruptible = + registre_interruption; + + return; + } + + ptr++; + } + (*s_objet).type = NOM; element = malloc(sizeof(struct_nom)); @@ -3608,7 +3537,8 @@ recherche_type(struct_processus *s_etat_ &((*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; + (*s_etat_processus).traitement_interruptible = + registre_interruption; return; }