Annotation of rpl/src/bibliotheques_externes.c, revision 1.1

1.1     ! bertrand    1: /*
        !             2: ================================================================================
        !             3:   RPL/2 (R) version 4.0.9
        !             4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
        !             5: 
        !             6:   This file is part of RPL/2.
        !             7: 
        !             8:   RPL/2 is free software; you can redistribute it and/or modify it
        !             9:   under the terms of the CeCILL V2 License as published by the french
        !            10:   CEA, CNRS and INRIA.
        !            11:  
        !            12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
        !            13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
        !            14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
        !            15:   for more details.
        !            16:  
        !            17:   You should have received a copy of the CeCILL License
        !            18:   along with RPL/2. If not, write to info@cecill.info.
        !            19: ================================================================================
        !            20: */
        !            21: 
        !            22: 
        !            23: #include "rpl.conv.h"
        !            24: 
        !            25: static pthread_mutex_t         mutex = PTHREAD_MUTEX_INITIALIZER;
        !            26: 
        !            27: 
        !            28: /*
        !            29: ================================================================================
        !            30:   Procédure de chargement d'une bibliothèque dynamique
        !            31: ================================================================================
        !            32:   Entrée :
        !            33: --------------------------------------------------------------------------------
        !            34:   Sortie :
        !            35: --------------------------------------------------------------------------------
        !            36:   Effets de bord : néant
        !            37: ================================================================================
        !            38: */
        !            39: 
        !            40: void *
        !            41: chargement_bibliotheque(struct_processus *s_etat_processus,
        !            42:        unsigned char *bibliotheque)
        !            43: {
        !            44:    char                    **(*fonction)(unsigned long *);
        !            45:    char                    *message;
        !            46: 
        !            47:    struct_rpl_arguments    rpl_arguments;
        !            48: 
        !            49:    struct_liste_chainee    *l_element_courant;
        !            50:    struct_liste_chainee    *l_nouvel_element;
        !            51: 
        !            52:    unsigned char           **tableau;
        !            53:    unsigned char           *tampon;
        !            54: 
        !            55:    unsigned long           nombre_symboles;
        !            56:    unsigned long           i;
        !            57: 
        !            58:    void                    *descripteur_bibliotheque;
        !            59:    void                    (*onloading)(struct_rpl_arguments *);
        !            60: 
        !            61:    /*
        !            62:     * On vérifie que la bibliothèque n'est pas déjà chargée.
        !            63:     */
        !            64: 
        !            65:    l_element_courant = (*s_etat_processus).s_bibliotheques;
        !            66: 
        !            67:    while(l_element_courant != NULL)
        !            68:    {
        !            69:        if (strcmp((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom,
        !            70:                bibliotheque) == 0)
        !            71:        {
        !            72:            (*s_etat_processus).erreur_execution = d_ex_bibliotheque_chargee;
        !            73:            return(NULL);
        !            74:        }
        !            75: 
        !            76:        l_element_courant = (*l_element_courant).suivant;
        !            77:    }
        !            78: 
        !            79:    /*
        !            80:     * Ouverture de la bibliothèque
        !            81:     */
        !            82: 
        !            83:    if ((descripteur_bibliotheque = dlopen(bibliotheque,
        !            84:            RTLD_NOW | RTLD_LOCAL)) == NULL)
        !            85:    {
        !            86:        if (pthread_mutex_lock(&mutex) != 0)
        !            87:        {
        !            88:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !            89:            return(NULL);
        !            90:        }
        !            91: 
        !            92:        printf("%s\n", dlerror());
        !            93: 
        !            94:        if (pthread_mutex_unlock(&mutex) != 0)
        !            95:        {
        !            96:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !            97:            return(NULL);
        !            98:        }
        !            99: 
        !           100:        (*s_etat_processus).erreur_execution = d_ex_erreur_bibliotheque;
        !           101:        return(NULL);
        !           102:    }
        !           103: 
        !           104:    if (pthread_mutex_lock(&mutex) != 0)
        !           105:    {
        !           106:        (*s_etat_processus).erreur_systeme = d_es_processus;
        !           107:        return(NULL);
        !           108:    }
        !           109: 
        !           110:    dlerror();
        !           111:    onloading = dlsym(descripteur_bibliotheque, "__runOnLoading");
        !           112: 
        !           113:    if (((message = dlerror()) == NULL) && (onloading != NULL))
        !           114:    {
        !           115:        if (pthread_mutex_unlock(&mutex) != 0)
        !           116:        {
        !           117:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !           118:            return(NULL);
        !           119:        }
        !           120: 
        !           121:        rpl_arguments.l_base_pile = (*s_etat_processus).l_base_pile;
        !           122:        rpl_arguments.l_base_pile_last = (*s_etat_processus).l_base_pile_last;
        !           123: 
        !           124:        for(i = 0; i < 8; i++)
        !           125:        {
        !           126:            rpl_arguments.drapeaux_etat[i] =
        !           127:                    (*s_etat_processus).drapeaux_etat[i];
        !           128:        }
        !           129: 
        !           130:        rpl_arguments.message_erreur = NULL;
        !           131:        rpl_arguments.type_erreur = 'E';
        !           132:        rpl_arguments.erreur = 0;
        !           133:        rpl_arguments.aide = ((*s_etat_processus).affichage_arguments
        !           134:                == 'N') ? d_faux : d_vrai;
        !           135:        rpl_arguments.affichage_arguments = (*s_etat_processus)
        !           136:                .affichage_arguments;
        !           137:        rpl_arguments.test_instruction = (*s_etat_processus).test_instruction;
        !           138:        rpl_arguments.constante_symbolique = (*s_etat_processus)
        !           139:                .constante_symbolique;
        !           140:        rpl_arguments.instruction_valide = 'N';
        !           141:        rpl_arguments.s_etat_processus = s_etat_processus;
        !           142: 
        !           143:        (*s_etat_processus).erreur_execution = d_ex;
        !           144: 
        !           145:        if ((*s_etat_processus).profilage == d_vrai)
        !           146:        {
        !           147:            if ((tampon = malloc((strlen(bibliotheque) + 14) *
        !           148:                    sizeof(unsigned char))) == NULL)
        !           149:            {
        !           150:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           151:                return(NULL);
        !           152:            }
        !           153: 
        !           154:            sprintf(tampon, "%s$runOnLoading", bibliotheque);
        !           155:            profilage(s_etat_processus, tampon);
        !           156:            free(tampon);
        !           157: 
        !           158:            if ((*s_etat_processus).erreur_systeme != d_es)
        !           159:            {
        !           160:                return(NULL);
        !           161:            }
        !           162:        }
        !           163: 
        !           164:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
        !           165:        {
        !           166:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !           167:            return(NULL);
        !           168:        }
        !           169: 
        !           170:        (*onloading)(&rpl_arguments);
        !           171: 
        !           172:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
        !           173:        {
        !           174:            if (errno != EINTR)
        !           175:            {
        !           176:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           177:                return(NULL);
        !           178:            }
        !           179:        }
        !           180: 
        !           181:        if ((*s_etat_processus).profilage == d_vrai)
        !           182:        {
        !           183:            profilage(s_etat_processus, NULL);
        !           184:        }
        !           185: 
        !           186:        (*s_etat_processus).nombre_arguments = rpl_arguments.nombre_arguments;
        !           187:        (*s_etat_processus).constante_symbolique = rpl_arguments
        !           188:                .constante_symbolique;
        !           189:        (*s_etat_processus).instruction_valide = rpl_arguments
        !           190:                .instruction_valide;
        !           191: 
        !           192:        if ((*s_etat_processus).test_instruction == 'Y')
        !           193:        {
        !           194:            if ((*s_etat_processus).nombre_arguments == 0)
        !           195:            {
        !           196:                (*s_etat_processus).nombre_arguments = -1;
        !           197:            }
        !           198:        }
        !           199: 
        !           200:        if (rpl_arguments.erreur != 0)
        !           201:        {
        !           202:            if (((*s_etat_processus).arret_si_exception == d_vrai) ||
        !           203:                    (rpl_arguments.type_erreur == 'S'))
        !           204:            {
        !           205:                if (test_cfsf(s_etat_processus, 51) == d_faux)
        !           206:                {
        !           207:                    printf("%s", ds_beep);
        !           208:                }
        !           209: 
        !           210:                if (rpl_arguments.type_erreur == 'S')
        !           211:                {
        !           212:                    (*s_etat_processus).derniere_erreur_execution = -1;
        !           213: 
        !           214:                    if ((*s_etat_processus).langue == 'F')
        !           215:                    {
        !           216:                        printf("+++Système : Fonction dynamique %s "
        !           217:                                "(ligne %lld)\n",
        !           218:                                "onLoading", rpl_arguments.erreur);
        !           219:                    }
        !           220:                    else
        !           221:                    {
        !           222:                        printf("+++System : %s dynamic function (line %lld)\n",
        !           223:                                "onLoading", rpl_arguments.erreur);
        !           224:                    }
        !           225:                }
        !           226:                else
        !           227:                {
        !           228:                    (*s_etat_processus).derniere_erreur_systeme = -1;
        !           229: 
        !           230:                    if ((*s_etat_processus).langue == 'F')
        !           231:                    {
        !           232:                        printf("+++Erreur : Fonction dynamique %s "
        !           233:                                "(ligne %lld)\n",
        !           234:                                "onLoading" , rpl_arguments.erreur);
        !           235:                    }
        !           236:                    else
        !           237:                    {
        !           238:                        printf("+++Error : %s dynamic function (line %lld)\n",
        !           239:                                "onLoading", rpl_arguments.erreur);
        !           240:                    }
        !           241:                }
        !           242: 
        !           243:                if (rpl_arguments.message_erreur != NULL)
        !           244:                {
        !           245:                    printf("%s\n", rpl_arguments.message_erreur);
        !           246:                }
        !           247: 
        !           248:                fflush(stdout);
        !           249:            }
        !           250: 
        !           251:            if (rpl_arguments.type_erreur == 'S')
        !           252:            {
        !           253:                (*s_etat_processus).erreur_systeme =
        !           254:                        d_es_execution_bibliotheque;
        !           255:            }
        !           256:            else
        !           257:            {
        !           258:                (*s_etat_processus).erreur_execution =
        !           259:                        d_ex_execution_bibliotheque;
        !           260:            }
        !           261:        }
        !           262: 
        !           263:        (*s_etat_processus).l_base_pile = rpl_arguments.l_base_pile;
        !           264:        (*s_etat_processus).l_base_pile_last = rpl_arguments.l_base_pile_last;
        !           265: 
        !           266:        for(i = 0; i < 8; i++)
        !           267:        {
        !           268:            (*s_etat_processus).drapeaux_etat[i] =
        !           269:                    rpl_arguments.drapeaux_etat[i];
        !           270:        }
        !           271: 
        !           272:        l_element_courant = (*s_etat_processus).l_base_pile;
        !           273:        (*s_etat_processus).hauteur_pile_operationnelle = 0;
        !           274: 
        !           275:        while(l_element_courant != NULL)
        !           276:        {
        !           277:            (*s_etat_processus).hauteur_pile_operationnelle++;
        !           278:            l_element_courant = (*l_element_courant).suivant;
        !           279:        }
        !           280:    }
        !           281:    else
        !           282:    {
        !           283:        printf("%s\n", message);
        !           284: 
        !           285:        if (pthread_mutex_unlock(&mutex) != 0)
        !           286:        {
        !           287:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !           288:            return(NULL);
        !           289:        }
        !           290:    }
        !           291: 
        !           292:    if (pthread_mutex_lock(&mutex) != 0)
        !           293:    {
        !           294:        (*s_etat_processus).erreur_systeme = d_es_processus;
        !           295:        return(NULL);
        !           296:    }
        !           297: 
        !           298:    dlerror();
        !           299:    fonction = dlsym(descripteur_bibliotheque, "__external_symbols");
        !           300: 
        !           301:    if (fonction == NULL)
        !           302:    {
        !           303:        if ((message = dlerror()) != NULL)
        !           304:        {
        !           305:            printf("%s\n", message);
        !           306: 
        !           307:            if (pthread_mutex_unlock(&mutex) != 0)
        !           308:            {
        !           309:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           310:                return(NULL);
        !           311:            }
        !           312: 
        !           313:            (*s_etat_processus).erreur_execution = d_ex_erreur_bibliotheque;
        !           314:            return(NULL);
        !           315:        }
        !           316:    }
        !           317:  
        !           318:    if (pthread_mutex_unlock(&mutex) != 0)
        !           319:    {
        !           320:        (*s_etat_processus).erreur_systeme = d_es_processus;
        !           321:        return(NULL);
        !           322:    }
        !           323: 
        !           324:    /*
        !           325:     * Ajout des symboles externes
        !           326:     */
        !           327: 
        !           328:    if ((tableau = (unsigned char **) (*fonction)(&nombre_symboles)) == NULL)
        !           329:    {
        !           330:        if (nombre_symboles == 0)
        !           331:        {
        !           332:            (*s_etat_processus).erreur_execution = d_ex_aucun_symbole;
        !           333:        }
        !           334:        else
        !           335:        {
        !           336:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           337:        }
        !           338: 
        !           339:        return(NULL);
        !           340:    }
        !           341: 
        !           342:    if (((*s_etat_processus).s_instructions_externes = realloc(
        !           343:            (*s_etat_processus).s_instructions_externes,
        !           344:            ((*s_etat_processus).nombre_instructions_externes + nombre_symboles)
        !           345:            * sizeof(struct_instruction_externe))) == NULL)
        !           346:    {
        !           347:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           348:        return(NULL);
        !           349:    }
        !           350: 
        !           351:    for(i = 0; i < nombre_symboles; i++)
        !           352:    {
        !           353:        (*s_etat_processus).s_instructions_externes[(*s_etat_processus)
        !           354:                .nombre_instructions_externes].descripteur_bibliotheque =
        !           355:                descripteur_bibliotheque;
        !           356: 
        !           357:        if (((*s_etat_processus).s_instructions_externes[(*s_etat_processus)
        !           358:                .nombre_instructions_externes].nom =
        !           359:                malloc((strlen(index(tableau[i], '$') + 1) + 1) *
        !           360:                sizeof(unsigned char))) == NULL)
        !           361:        {
        !           362:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           363:            return(NULL);
        !           364:        }
        !           365: 
        !           366:        strcpy((*s_etat_processus).s_instructions_externes[(*s_etat_processus)
        !           367:                .nombre_instructions_externes].nom,
        !           368:                index(tableau[i], '$') + 1);
        !           369: 
        !           370:        *(index(tableau[i], '$')) = d_code_fin_chaine;
        !           371: 
        !           372:        if (((*s_etat_processus).s_instructions_externes[(*s_etat_processus)
        !           373:                .nombre_instructions_externes].nom_bibliotheque = malloc(
        !           374:                (strlen(tableau[i]) + 1) * sizeof(unsigned char))) == NULL)
        !           375:        {
        !           376:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           377:            return(NULL);
        !           378:        }
        !           379: 
        !           380:        strcpy((*s_etat_processus).s_instructions_externes[(*s_etat_processus)
        !           381:                .nombre_instructions_externes].nom_bibliotheque, tableau[i]);
        !           382:        (*s_etat_processus).nombre_instructions_externes++;
        !           383:        free(tableau[i]);
        !           384:    }
        !           385: 
        !           386:    /*
        !           387:     * Ajout de la nouvelle bibliothèque
        !           388:     */
        !           389: 
        !           390:    if ((l_nouvel_element = (struct_liste_chainee *)
        !           391:            malloc(sizeof(struct_liste_chainee))) == NULL)
        !           392:    {
        !           393:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           394:        return(NULL);
        !           395:    }
        !           396: 
        !           397:    if (((*l_nouvel_element).donnee = malloc(sizeof(struct_bibliotheque)))
        !           398:            == NULL)
        !           399:    {
        !           400:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           401:        return(NULL);
        !           402:    }
        !           403: 
        !           404:    (*((struct_bibliotheque *) (*l_nouvel_element).donnee)).descripteur =
        !           405:            descripteur_bibliotheque;
        !           406:    (*((struct_bibliotheque *) (*l_nouvel_element).donnee)).pid =
        !           407:            getpid();
        !           408:    (*((struct_bibliotheque *) (*l_nouvel_element).donnee)).tid =
        !           409:            pthread_self();
        !           410: 
        !           411:    if (((*((struct_bibliotheque *) (*l_nouvel_element).donnee)).nom =
        !           412:            malloc((strlen((*s_etat_processus).s_instructions_externes
        !           413:            [(*s_etat_processus).nombre_instructions_externes - 1]
        !           414:            .nom_bibliotheque) + 1) * sizeof(unsigned char))) == NULL)
        !           415:    {
        !           416:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           417:        return(NULL);
        !           418:    }
        !           419: 
        !           420:    strcpy((*((struct_bibliotheque *) (*l_nouvel_element).donnee)).nom,
        !           421:            (*s_etat_processus).s_instructions_externes
        !           422:            [(*s_etat_processus).nombre_instructions_externes - 1]
        !           423:            .nom_bibliotheque);
        !           424: 
        !           425:    (*l_nouvel_element).suivant = (*s_etat_processus).s_bibliotheques;
        !           426:    (*s_etat_processus).s_bibliotheques = l_nouvel_element;
        !           427: 
        !           428:    tri_base_symboles_externes(s_etat_processus);
        !           429: 
        !           430:    free(tableau);
        !           431: 
        !           432:    return(descripteur_bibliotheque);
        !           433: }
        !           434: 
        !           435: 
        !           436: /*
        !           437: ================================================================================
        !           438:   Procédure de retrait d'une bibliothèque dynamique
        !           439: ================================================================================
        !           440:   Entrée :
        !           441: --------------------------------------------------------------------------------
        !           442:   Sortie :
        !           443: --------------------------------------------------------------------------------
        !           444:   Effets de bord : néant
        !           445: ================================================================================
        !           446: */
        !           447: 
        !           448: logical1
        !           449: retrait_bibliotheque(struct_processus *s_etat_processus,
        !           450:        struct_bibliotheque *descripteur)
        !           451: {
        !           452:    char                        *message;
        !           453: 
        !           454:    logical1                    presence_bibliotheque;
        !           455: 
        !           456:    struct_instruction_externe  *registre;
        !           457: 
        !           458:    struct_liste_chainee        *l_element_courant;
        !           459:    struct_liste_chainee        *l_element_precedent;
        !           460: 
        !           461:    struct_rpl_arguments        rpl_arguments;
        !           462: 
        !           463:    unsigned char               *tampon;
        !           464: 
        !           465:    unsigned long               i;
        !           466:    unsigned long               j;
        !           467:    unsigned long               nombre_symboles_residuels;
        !           468: 
        !           469:    void                        (*onclosing)(struct_rpl_arguments *);
        !           470: 
        !           471:    l_element_courant = (*s_etat_processus).s_bibliotheques;
        !           472:    presence_bibliotheque = d_faux;
        !           473:    l_element_precedent = NULL;
        !           474: 
        !           475:    /*
        !           476:     * Recherche de la bibliothèque à supprimer
        !           477:     */
        !           478: 
        !           479:    while(l_element_courant != NULL)
        !           480:    {
        !           481:        if (((*((struct_bibliotheque *) (*l_element_courant).donnee))
        !           482:                .descripteur == (*descripteur).descripteur) &&
        !           483:                ((*((struct_bibliotheque *) (*l_element_courant).donnee)).pid
        !           484:                == getpid()) && (pthread_equal((*((struct_bibliotheque *)
        !           485:                (*l_element_courant).donnee)).tid, pthread_self()) != 0))
        !           486:        {
        !           487:            presence_bibliotheque = d_vrai;
        !           488:            break;
        !           489:        }
        !           490: 
        !           491:        l_element_precedent = l_element_courant;
        !           492:        l_element_courant = (*l_element_courant).suivant;
        !           493:    }
        !           494: 
        !           495:    if (presence_bibliotheque == d_vrai)
        !           496:    {
        !           497:        if (pthread_mutex_lock(&mutex) != 0)
        !           498:        {
        !           499:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !           500:            return(d_erreur);
        !           501:        }
        !           502: 
        !           503:        dlerror();
        !           504:        onclosing = dlsym((*descripteur).descripteur, "__runOnClosing");
        !           505: 
        !           506:        if (((message = dlerror()) == NULL) && (onclosing != NULL))
        !           507:        {
        !           508:            if (pthread_mutex_unlock(&mutex) != 0)
        !           509:            {
        !           510:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           511:                return(d_erreur);
        !           512:            }
        !           513: 
        !           514:            rpl_arguments.l_base_pile = (*s_etat_processus).l_base_pile;
        !           515:            rpl_arguments.l_base_pile_last =
        !           516:                    (*s_etat_processus).l_base_pile_last;
        !           517: 
        !           518:            for(i = 0; i < 8; i++)
        !           519:            {
        !           520:                rpl_arguments.drapeaux_etat[i] =
        !           521:                        (*s_etat_processus).drapeaux_etat[i];
        !           522:            }
        !           523: 
        !           524:            rpl_arguments.message_erreur = NULL;
        !           525:            rpl_arguments.type_erreur = 'E';
        !           526:            rpl_arguments.erreur = 0;
        !           527:            rpl_arguments.aide = ((*s_etat_processus).affichage_arguments
        !           528:                    == 'N') ? d_faux : d_vrai;
        !           529:            rpl_arguments.affichage_arguments = (*s_etat_processus)
        !           530:                    .affichage_arguments;
        !           531:            rpl_arguments.test_instruction =
        !           532:                    (*s_etat_processus).test_instruction;
        !           533:            rpl_arguments.constante_symbolique = (*s_etat_processus)
        !           534:                    .constante_symbolique;
        !           535:            rpl_arguments.instruction_valide = 'N';
        !           536:            rpl_arguments.s_etat_processus = s_etat_processus;
        !           537: 
        !           538:            (*s_etat_processus).erreur_execution = d_ex;
        !           539: 
        !           540:            if ((*s_etat_processus).profilage == d_vrai)
        !           541:            {
        !           542:                if ((tampon = malloc((strlen((*descripteur).nom) + 14) *
        !           543:                        sizeof(unsigned char))) == NULL)
        !           544:                {
        !           545:                    (*s_etat_processus).erreur_systeme =
        !           546:                            d_es_allocation_memoire;
        !           547:                    return(d_erreur);
        !           548:                }
        !           549: 
        !           550:                sprintf(tampon, "%s$runOnClosing", (*descripteur).nom);
        !           551:                profilage(s_etat_processus, tampon);
        !           552:                free(tampon);
        !           553: 
        !           554:                if ((*s_etat_processus).erreur_systeme != d_es)
        !           555:                {
        !           556:                    return(d_erreur);
        !           557:                }
        !           558:            }
        !           559: 
        !           560:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
        !           561:            {
        !           562:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           563:                return(d_erreur);
        !           564:            }
        !           565: 
        !           566:            (*onclosing)(&rpl_arguments);
        !           567: 
        !           568:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
        !           569:            {
        !           570:                if (errno != EINTR)
        !           571:                {
        !           572:                    (*s_etat_processus).erreur_systeme = d_es_processus;
        !           573:                    return(d_erreur);
        !           574:                }
        !           575:            }
        !           576: 
        !           577:            if ((*s_etat_processus).profilage == d_vrai)
        !           578:            {
        !           579:                profilage(s_etat_processus, NULL);
        !           580:            }
        !           581: 
        !           582:            (*s_etat_processus).nombre_arguments =
        !           583:                    rpl_arguments.nombre_arguments;
        !           584:            (*s_etat_processus).constante_symbolique = rpl_arguments
        !           585:                    .constante_symbolique;
        !           586:            (*s_etat_processus).instruction_valide = rpl_arguments
        !           587:                    .instruction_valide;
        !           588: 
        !           589:            if ((*s_etat_processus).test_instruction == 'Y')
        !           590:            {
        !           591:                if ((*s_etat_processus).nombre_arguments == 0)
        !           592:                {
        !           593:                    (*s_etat_processus).nombre_arguments = -1;
        !           594:                }
        !           595:            }
        !           596: 
        !           597:            if (rpl_arguments.erreur != 0)
        !           598:            {
        !           599:                if (((*s_etat_processus).arret_si_exception == d_vrai) ||
        !           600:                        (rpl_arguments.type_erreur == 'S'))
        !           601:                {
        !           602:                    if (test_cfsf(s_etat_processus, 51) == d_faux)
        !           603:                    {
        !           604:                        printf("%s", ds_beep);
        !           605:                    }
        !           606: 
        !           607:                    if (rpl_arguments.type_erreur == 'S')
        !           608:                    {
        !           609:                        (*s_etat_processus).derniere_erreur_execution = -1;
        !           610: 
        !           611:                        if ((*s_etat_processus).langue == 'F')
        !           612:                        {
        !           613:                            printf("+++Système : Fonction dynamique "
        !           614:                                    "%s (ligne %lld)\n",
        !           615:                                    "onClosing" , rpl_arguments.erreur);
        !           616:                        }
        !           617:                        else
        !           618:                        {
        !           619:                            printf("+++System : %s dynamic function "
        !           620:                                    "(line %lld)\n",
        !           621:                                    "onClosing", rpl_arguments.erreur);
        !           622:                        }
        !           623:                    }
        !           624:                    else
        !           625:                    {
        !           626:                        (*s_etat_processus).derniere_erreur_systeme = -1;
        !           627: 
        !           628:                        if ((*s_etat_processus).langue == 'F')
        !           629:                        {
        !           630:                            printf("+++Erreur : Fonction dynamique %s "
        !           631:                                    "(ligne %lld)\n",
        !           632:                                    "onClosing", rpl_arguments.erreur);
        !           633:                        }
        !           634:                        else
        !           635:                        {
        !           636:                            printf("+++Error : %s dynamic function "
        !           637:                                    "(line %lld)\n",
        !           638:                                    "onClosing", rpl_arguments.erreur);
        !           639:                        }
        !           640:                    }
        !           641: 
        !           642:                    if (rpl_arguments.message_erreur != NULL)
        !           643:                    {
        !           644:                        printf("%s\n", rpl_arguments.message_erreur);
        !           645:                    }
        !           646: 
        !           647:                    fflush(stdout);
        !           648:                }
        !           649: 
        !           650:                if (rpl_arguments.type_erreur == 'S')
        !           651:                {
        !           652:                    (*s_etat_processus).erreur_systeme =
        !           653:                            d_es_execution_bibliotheque;
        !           654:                }
        !           655:                else
        !           656:                {
        !           657:                    (*s_etat_processus).erreur_execution =
        !           658:                            d_ex_execution_bibliotheque;
        !           659:                }
        !           660:            }
        !           661: 
        !           662:            (*s_etat_processus).l_base_pile = rpl_arguments.l_base_pile;
        !           663:            (*s_etat_processus).l_base_pile_last =
        !           664:                    rpl_arguments.l_base_pile_last;
        !           665: 
        !           666:            for(i = 0; i < 8; i++)
        !           667:            {
        !           668:                (*s_etat_processus).drapeaux_etat[i] =
        !           669:                        rpl_arguments.drapeaux_etat[i];
        !           670:            }
        !           671: 
        !           672:            l_element_courant = (*s_etat_processus).l_base_pile;
        !           673:            (*s_etat_processus).hauteur_pile_operationnelle = 0;
        !           674: 
        !           675:            while(l_element_courant != NULL)
        !           676:            {
        !           677:                (*s_etat_processus).hauteur_pile_operationnelle++;
        !           678:                l_element_courant = (*l_element_courant).suivant;
        !           679:            }
        !           680:        }
        !           681:        else
        !           682:        {
        !           683:            printf("%s\n", message);
        !           684: 
        !           685:            if (pthread_mutex_unlock(&mutex) != 0)
        !           686:            {
        !           687:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !           688:                return(d_erreur);
        !           689:            }
        !           690:        }
        !           691: 
        !           692:        /*
        !           693:         * Retrait de la bibliothèque de la pile
        !           694:         */
        !           695: 
        !           696:        dlclose((*descripteur).descripteur);
        !           697: 
        !           698:        l_element_courant = (*s_etat_processus).s_bibliotheques;
        !           699: 
        !           700:        while(l_element_courant != NULL)
        !           701:        {
        !           702:            if ((*((struct_bibliotheque *) (*l_element_courant).donnee))
        !           703:                    .descripteur == (*descripteur).descripteur)
        !           704:            {
        !           705:                break;
        !           706:            }
        !           707: 
        !           708:            l_element_precedent = l_element_courant;
        !           709:            l_element_courant = (*l_element_courant).suivant;
        !           710:        }
        !           711: 
        !           712:        if (l_element_precedent == NULL)
        !           713:        {
        !           714:            (*s_etat_processus).s_bibliotheques = (*l_element_courant).suivant;
        !           715:        }
        !           716:        else
        !           717:        {
        !           718:            (*l_element_precedent).suivant = (*l_element_courant).suivant;
        !           719:        }
        !           720: 
        !           721:        free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
        !           722:        free((*l_element_courant).donnee);
        !           723:        free(l_element_courant);
        !           724: 
        !           725:        /*
        !           726:         * Retrait des symboles associés à la bibliothèque
        !           727:         */
        !           728: 
        !           729:        nombre_symboles_residuels = 0;
        !           730: 
        !           731:        for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
        !           732:        {
        !           733:            if ((*s_etat_processus).s_instructions_externes[i]
        !           734:                    .descripteur_bibliotheque != (*descripteur).descripteur)
        !           735:            {
        !           736:                nombre_symboles_residuels++;
        !           737:            }
        !           738:        }
        !           739: 
        !           740:        if (nombre_symboles_residuels == 0)
        !           741:        {
        !           742:            for(i = 0; i < (*s_etat_processus).nombre_instructions_externes;
        !           743:                    i++)
        !           744:            {
        !           745:                free((*s_etat_processus).s_instructions_externes[i].nom);
        !           746:                free((*s_etat_processus).s_instructions_externes[i]
        !           747:                        .nom_bibliotheque);
        !           748:            }
        !           749: 
        !           750:            free((*s_etat_processus).s_instructions_externes);
        !           751:            (*s_etat_processus).s_instructions_externes = NULL;
        !           752:        }
        !           753:        else
        !           754:        {
        !           755:            registre = (*s_etat_processus).s_instructions_externes;
        !           756: 
        !           757:            if (((*s_etat_processus).s_instructions_externes =
        !           758:                    malloc(nombre_symboles_residuels *
        !           759:                    sizeof(struct_instruction_externe))) == NULL)
        !           760:            {
        !           761:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           762: 
        !           763:                return(d_erreur);
        !           764:            }
        !           765: 
        !           766:            for(i = j = 0; i < (*s_etat_processus).nombre_instructions_externes;
        !           767:                    i++)
        !           768:            {
        !           769:                if (registre[i].descripteur_bibliotheque !=
        !           770:                        (*descripteur).descripteur)
        !           771:                {
        !           772:                    (*s_etat_processus).s_instructions_externes[j].nom =
        !           773:                            registre[i].nom;
        !           774:                    (*s_etat_processus).s_instructions_externes[j]
        !           775:                            .nom_bibliotheque = registre[i].nom_bibliotheque;
        !           776:                    (*s_etat_processus).s_instructions_externes[j]
        !           777:                            .descripteur_bibliotheque = registre[i]
        !           778:                            .descripteur_bibliotheque;
        !           779:                    j++;
        !           780:                }
        !           781:                else
        !           782:                {
        !           783:                    free(registre[i].nom);
        !           784:                    free(registre[i].nom_bibliotheque);
        !           785:                }
        !           786:            }
        !           787: 
        !           788:            free(registre);
        !           789:        }
        !           790: 
        !           791:        (*s_etat_processus).nombre_instructions_externes =
        !           792:                nombre_symboles_residuels;
        !           793: 
        !           794:        return(d_absence_erreur);
        !           795:    }
        !           796:    else
        !           797:    {
        !           798:        (*s_etat_processus).erreur_execution = d_ex_erreur_bibliotheque;
        !           799: 
        !           800:        return(d_erreur);
        !           801:    }
        !           802: }
        !           803: 
        !           804: 
        !           805: /*
        !           806: ================================================================================
        !           807:   Procédure d'exécution d'une fonction d'une bibliothèque
        !           808: ================================================================================
        !           809:   Entrée :
        !           810: --------------------------------------------------------------------------------
        !           811:   Sortie :
        !           812: --------------------------------------------------------------------------------
        !           813:   Effets de bord : néant
        !           814: ================================================================================
        !           815: */
        !           816: 
        !           817: logical1
        !           818: execution_fonction_de_bibliotheque(struct_processus *s_etat_processus,
        !           819:        unsigned char *nom_fonction, unsigned char *bibliotheque)
        !           820: {
        !           821:    logical1                        presence_bibliotheque;
        !           822:    logical1                        unicite_symbole;
        !           823: 
        !           824:    long                            difference;
        !           825:    long                            difference_inferieure;
        !           826:    long                            difference_superieure;
        !           827:    long                            i;
        !           828: 
        !           829:    struct_liste_chainee            *l_element_courant;
        !           830: 
        !           831:    struct_rpl_arguments            rpl_arguments;
        !           832: 
        !           833:    unsigned char                   *nom_fonction_externe;
        !           834:    unsigned char                   *tampon;
        !           835: 
        !           836:    unsigned long                   borne_inferieure;
        !           837:    unsigned long                   borne_superieure;
        !           838:    unsigned long                   moyenne;
        !           839:    unsigned long                   nombre_iterations_maximal;
        !           840:    unsigned long                   ordre_iteration;
        !           841: 
        !           842:    void                            (*fonction)(struct_rpl_arguments *);
        !           843: 
        !           844:    /*
        !           845:     * Recherche dichotomique de la définition externe
        !           846:     */
        !           847: 
        !           848:    if ((*s_etat_processus).nombre_instructions_externes == 0)
        !           849:    {
        !           850:        return(d_faux);
        !           851:    }
        !           852: 
        !           853:    if (bibliotheque != NULL)
        !           854:    {
        !           855:        presence_bibliotheque = d_faux;
        !           856:        l_element_courant = (*s_etat_processus).s_bibliotheques;
        !           857: 
        !           858:        while(l_element_courant != NULL)
        !           859:        {
        !           860:            if (strcmp((*((struct_bibliotheque *) (*l_element_courant).donnee))
        !           861:                    .nom, bibliotheque) == 0)
        !           862:            {
        !           863:                presence_bibliotheque = d_vrai;
        !           864:                break;
        !           865:            }
        !           866: 
        !           867:            l_element_courant = (*l_element_courant).suivant;
        !           868:        }
        !           869: 
        !           870:        if (presence_bibliotheque == d_faux)
        !           871:        {
        !           872:            return(d_faux);
        !           873:        }
        !           874:    }
        !           875: 
        !           876:    ordre_iteration = 0;
        !           877:    nombre_iterations_maximal = ((unsigned long)
        !           878:            (log((*s_etat_processus).nombre_instructions_externes) / log(2)))
        !           879:            + 2;
        !           880: 
        !           881:    borne_inferieure = 0;
        !           882:    borne_superieure = (*s_etat_processus).nombre_instructions_externes - 1;
        !           883: 
        !           884:    do
        !           885:    {
        !           886:        moyenne = (borne_inferieure + borne_superieure) / 2;
        !           887:        ordre_iteration++;
        !           888: 
        !           889:        if ((2 * ((unsigned long) ((borne_inferieure + borne_superieure) / 2)))
        !           890:                == (borne_inferieure + borne_superieure))
        !           891:        {
        !           892:            difference = strcmp(nom_fonction, (*s_etat_processus)
        !           893:                    .s_instructions_externes[moyenne].nom);
        !           894: 
        !           895:            if (difference != 0)
        !           896:            {
        !           897:                if (difference > 0)
        !           898:                {
        !           899:                    borne_inferieure = moyenne;
        !           900:                }
        !           901:                else
        !           902:                {
        !           903:                    borne_superieure = moyenne;
        !           904:                }
        !           905:            }
        !           906:        }
        !           907:        else
        !           908:        {
        !           909:            difference_inferieure = strcmp(nom_fonction,
        !           910:                    (*s_etat_processus).s_instructions_externes[moyenne].nom);
        !           911:            difference_superieure = strcmp(nom_fonction,
        !           912:                    (*s_etat_processus).s_instructions_externes[moyenne + 1]
        !           913:                    .nom);
        !           914: 
        !           915:            if (difference_inferieure == 0)
        !           916:            {
        !           917:                difference = 0;
        !           918:            }
        !           919:            else if (difference_superieure == 0)
        !           920:            {
        !           921:                difference = 0;
        !           922:                moyenne++;
        !           923:            }
        !           924:            else
        !           925:            {
        !           926:                difference = difference_inferieure;
        !           927: 
        !           928:                if (difference > 0)
        !           929:                {
        !           930:                    borne_inferieure = moyenne;
        !           931:                }
        !           932:                else
        !           933:                {
        !           934:                    borne_superieure = moyenne;
        !           935:                }
        !           936:            }
        !           937:        }
        !           938:    } while((difference != 0) &&
        !           939:            (ordre_iteration <= nombre_iterations_maximal));
        !           940: 
        !           941:    if (ordre_iteration > nombre_iterations_maximal)
        !           942:    {
        !           943:        return(d_faux);
        !           944:    }
        !           945: 
        !           946:    if (bibliotheque != NULL)
        !           947:    { // Nom de la bibliothèque spécifié
        !           948:        if (strcmp((*s_etat_processus).s_instructions_externes[moyenne]
        !           949:                .nom_bibliotheque, bibliotheque) > 0)
        !           950:        {
        !           951:            i = moyenne;
        !           952: 
        !           953:            while(i >= 0)
        !           954:            {
        !           955:                if (strcmp((*s_etat_processus).s_instructions_externes[i]
        !           956:                        .nom, nom_fonction) != 0)
        !           957:                {
        !           958:                    break;
        !           959:                }
        !           960:                else if (strcmp((*s_etat_processus).s_instructions_externes[i]
        !           961:                        .nom_bibliotheque, bibliotheque) == 0)
        !           962:                {
        !           963:                    break;
        !           964:                }
        !           965: 
        !           966:                i--;
        !           967:            }
        !           968: 
        !           969:            moyenne = i;
        !           970:        }
        !           971:        else if (strcmp((*s_etat_processus).s_instructions_externes[moyenne]
        !           972:                .nom_bibliotheque, bibliotheque) < 0)
        !           973:        {
        !           974:            i = moyenne;
        !           975: 
        !           976:            while((unsigned long) i <
        !           977:                    (*s_etat_processus).nombre_instructions_externes)
        !           978:            {
        !           979:                if (strcmp((*s_etat_processus).s_instructions_externes[i]
        !           980:                        .nom, nom_fonction) != 0)
        !           981:                {
        !           982:                    break;
        !           983:                }
        !           984:                else if (strcmp((*s_etat_processus).s_instructions_externes[i]
        !           985:                        .nom_bibliotheque, bibliotheque) == 0)
        !           986:                {
        !           987:                    break;
        !           988:                }
        !           989: 
        !           990:                i++;
        !           991:            }
        !           992: 
        !           993:            moyenne = i;
        !           994:        }
        !           995:    }
        !           996:    else
        !           997:    { // Nom de la bibliothèque non spécifié
        !           998: 
        !           999:        /*
        !          1000:         * Vérification de l'unicité du symbole
        !          1001:         */
        !          1002: 
        !          1003:        unicite_symbole = d_vrai;
        !          1004: 
        !          1005:        if (moyenne > 0)
        !          1006:        {
        !          1007:            if (strcmp((*s_etat_processus).s_instructions_externes
        !          1008:                    [moyenne - 1].nom, nom_fonction) == 0)
        !          1009:            {
        !          1010:                unicite_symbole = d_faux;
        !          1011:            }
        !          1012:        }
        !          1013: 
        !          1014:        if ((moyenne + 1) < (*s_etat_processus)
        !          1015:                .nombre_instructions_externes)
        !          1016:        {
        !          1017:            if (strcmp((*s_etat_processus).s_instructions_externes
        !          1018:                    [moyenne + 1].nom, nom_fonction) == 0)
        !          1019:            {
        !          1020:                unicite_symbole = d_faux;
        !          1021:            }
        !          1022:        }
        !          1023: 
        !          1024:        if (unicite_symbole == d_faux)
        !          1025:        {
        !          1026:            (*s_etat_processus).erreur_execution = d_ex_definition_ambigue;
        !          1027:            return(d_faux);
        !          1028:        }
        !          1029:    }
        !          1030: 
        !          1031:    if ((nom_fonction_externe = malloc((strlen(nom_fonction) + 12)
        !          1032:            * sizeof(unsigned char))) == NULL)
        !          1033:    {
        !          1034:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1035:        return(d_faux);
        !          1036:    }
        !          1037: 
        !          1038:    sprintf(nom_fonction_externe, "__external_%s", nom_fonction);
        !          1039: 
        !          1040:    if (pthread_mutex_lock(&mutex) != 0)
        !          1041:    {
        !          1042:        (*s_etat_processus).erreur_systeme = d_es_processus;
        !          1043:        return(d_faux);
        !          1044:    }
        !          1045: 
        !          1046:    dlerror();
        !          1047:    fonction = dlsym((*s_etat_processus).s_instructions_externes
        !          1048:            [moyenne].descripteur_bibliotheque, nom_fonction_externe);
        !          1049: 
        !          1050:    free(nom_fonction_externe);
        !          1051: 
        !          1052:    /*
        !          1053:     * Vérification de la présence du symbole
        !          1054:     */
        !          1055: 
        !          1056:    if (fonction == NULL)
        !          1057:    {
        !          1058:        if (dlerror() != NULL)
        !          1059:        {
        !          1060:            if (pthread_mutex_unlock(&mutex) != 0)
        !          1061:            {
        !          1062:                (*s_etat_processus).erreur_systeme = d_es_processus;
        !          1063:                return(d_faux);
        !          1064:            }
        !          1065: 
        !          1066:            return(d_faux);
        !          1067:        }
        !          1068:    }
        !          1069: 
        !          1070:    if (pthread_mutex_unlock(&mutex) != 0)
        !          1071:    {
        !          1072:        (*s_etat_processus).erreur_systeme = d_es_processus;
        !          1073:        return(d_faux);
        !          1074:    }
        !          1075: 
        !          1076:    /*
        !          1077:     * Exécution de la fonction externe
        !          1078:     */
        !          1079: 
        !          1080:    rpl_arguments.l_base_pile = (*s_etat_processus).l_base_pile;
        !          1081:    rpl_arguments.l_base_pile_last = (*s_etat_processus).l_base_pile_last;
        !          1082: 
        !          1083:    for(i = 0; i < 8; i++)
        !          1084:    {
        !          1085:        rpl_arguments.drapeaux_etat[i] =
        !          1086:                (*s_etat_processus).drapeaux_etat[i];
        !          1087:    }
        !          1088: 
        !          1089:    rpl_arguments.message_erreur = NULL;
        !          1090:    rpl_arguments.type_erreur = 'E';
        !          1091:    rpl_arguments.erreur = 0;
        !          1092:    rpl_arguments.aide = ((*s_etat_processus).affichage_arguments
        !          1093:            == 'N') ? d_faux : d_vrai;
        !          1094:    rpl_arguments.affichage_arguments = (*s_etat_processus)
        !          1095:            .affichage_arguments;
        !          1096:    rpl_arguments.test_instruction = (*s_etat_processus).test_instruction;
        !          1097:    rpl_arguments.constante_symbolique = (*s_etat_processus)
        !          1098:            .constante_symbolique;
        !          1099:    rpl_arguments.instruction_valide = 'N';
        !          1100:    rpl_arguments.s_etat_processus = s_etat_processus;
        !          1101: 
        !          1102:    (*s_etat_processus).erreur_execution = d_ex;
        !          1103: 
        !          1104:    if ((*s_etat_processus).profilage == d_vrai)
        !          1105:    {
        !          1106:        if ((tampon = malloc(strlen((*s_etat_processus)
        !          1107:                .s_instructions_externes[moyenne].nom_bibliotheque)
        !          1108:                + strlen(nom_fonction) + 2)) == NULL)
        !          1109:        {
        !          1110:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1111:            return(d_faux);
        !          1112:        }
        !          1113: 
        !          1114:        sprintf(tampon, "%s$%s", (*s_etat_processus).s_instructions_externes
        !          1115:                [moyenne].nom_bibliotheque, nom_fonction);
        !          1116:        profilage(s_etat_processus, tampon);
        !          1117:        free(tampon);
        !          1118: 
        !          1119:        if ((*s_etat_processus).erreur_systeme != d_es)
        !          1120:        {
        !          1121:            return(d_faux);
        !          1122:        }
        !          1123:    }
        !          1124: 
        !          1125:    if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
        !          1126:    {
        !          1127:        (*s_etat_processus).erreur_systeme = d_es_processus;
        !          1128:        return(d_faux);
        !          1129:    }
        !          1130: 
        !          1131:    (*fonction)(&rpl_arguments);
        !          1132: 
        !          1133:    while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
        !          1134:    {
        !          1135:        if (errno != EINTR)
        !          1136:        {
        !          1137:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !          1138:            return(d_faux);
        !          1139:        }
        !          1140:    }
        !          1141: 
        !          1142:    if ((*s_etat_processus).profilage == d_vrai)
        !          1143:    {
        !          1144:        profilage(s_etat_processus, NULL);
        !          1145:    }
        !          1146: 
        !          1147:    (*s_etat_processus).nombre_arguments = rpl_arguments.nombre_arguments;
        !          1148:    (*s_etat_processus).constante_symbolique = rpl_arguments
        !          1149:            .constante_symbolique;
        !          1150:    (*s_etat_processus).instruction_valide = rpl_arguments
        !          1151:            .instruction_valide;
        !          1152: 
        !          1153:    if ((*s_etat_processus).test_instruction == 'Y')
        !          1154:    {
        !          1155:        if ((*s_etat_processus).nombre_arguments == 0)
        !          1156:        {
        !          1157:            (*s_etat_processus).nombre_arguments = -1;
        !          1158:        }
        !          1159:    }
        !          1160: 
        !          1161:    if (rpl_arguments.erreur != 0)
        !          1162:    {
        !          1163:        if (((*s_etat_processus).arret_si_exception == d_vrai) ||
        !          1164:                (rpl_arguments.type_erreur == 'S'))
        !          1165:        {
        !          1166:            if (test_cfsf(s_etat_processus, 51) == d_faux)
        !          1167:            {
        !          1168:                printf("%s", ds_beep);
        !          1169:            }
        !          1170: 
        !          1171:            if (rpl_arguments.type_erreur == 'S')
        !          1172:            {
        !          1173:                (*s_etat_processus).derniere_erreur_execution = -1;
        !          1174: 
        !          1175:                if ((*s_etat_processus).langue == 'F')
        !          1176:                {
        !          1177:                    printf("+++Système : Fonction dynamique %s (ligne %lld)\n",
        !          1178:                            nom_fonction, rpl_arguments.erreur);
        !          1179:                }
        !          1180:                else
        !          1181:                {
        !          1182:                    printf("+++System : %s dynamic function (line %lld)\n",
        !          1183:                            nom_fonction, rpl_arguments.erreur);
        !          1184:                }
        !          1185:            }
        !          1186:            else
        !          1187:            {
        !          1188:                (*s_etat_processus).derniere_erreur_systeme = -1;
        !          1189: 
        !          1190:                if ((*s_etat_processus).langue == 'F')
        !          1191:                {
        !          1192:                    printf("+++Erreur : Fonction dynamique %s (ligne %lld)\n",
        !          1193:                            nom_fonction, rpl_arguments.erreur);
        !          1194:                }
        !          1195:                else
        !          1196:                {
        !          1197:                    printf("+++Error : %s dynamic function (line %lld)\n",
        !          1198:                            nom_fonction, rpl_arguments.erreur);
        !          1199:                }
        !          1200:            }
        !          1201: 
        !          1202:            if (rpl_arguments.message_erreur != NULL)
        !          1203:            {
        !          1204:                printf("%s\n", rpl_arguments.message_erreur);
        !          1205:            }
        !          1206: 
        !          1207:            fflush(stdout);
        !          1208:        }
        !          1209: 
        !          1210:        if (rpl_arguments.type_erreur == 'S')
        !          1211:        {
        !          1212:            (*s_etat_processus).erreur_systeme =
        !          1213:                    d_es_execution_bibliotheque;
        !          1214:        }
        !          1215:        else
        !          1216:        {
        !          1217:            (*s_etat_processus).erreur_execution =
        !          1218:                    d_ex_execution_bibliotheque;
        !          1219:        }
        !          1220:    }
        !          1221: 
        !          1222:    (*s_etat_processus).l_base_pile = rpl_arguments.l_base_pile;
        !          1223:    (*s_etat_processus).l_base_pile_last = rpl_arguments.l_base_pile_last;
        !          1224: 
        !          1225:    for(i = 0; i < 8; i++)
        !          1226:    {
        !          1227:        (*s_etat_processus).drapeaux_etat[i] =
        !          1228:                rpl_arguments.drapeaux_etat[i];
        !          1229:    }
        !          1230: 
        !          1231:    l_element_courant = (*s_etat_processus).l_base_pile;
        !          1232:    (*s_etat_processus).hauteur_pile_operationnelle = 0;
        !          1233: 
        !          1234:    while(l_element_courant != NULL)
        !          1235:    {
        !          1236:        (*s_etat_processus).hauteur_pile_operationnelle++;
        !          1237:        l_element_courant = (*l_element_courant).suivant;
        !          1238:    }
        !          1239: 
        !          1240: #undef return
        !          1241:    return(d_vrai);
        !          1242: }
        !          1243: 
        !          1244: 
        !          1245: /*
        !          1246: ================================================================================
        !          1247:   Wrapper vers une fonction intrinsèque
        !          1248: ================================================================================
        !          1249:   Entrée :
        !          1250: --------------------------------------------------------------------------------
        !          1251:   Sortie :
        !          1252: --------------------------------------------------------------------------------
        !          1253:   Effets de bord : néant
        !          1254: ================================================================================
        !          1255: */
        !          1256: 
        !          1257: int
        !          1258: wrapper_instruction_intrinseque(void (*fonction)(),
        !          1259:        struct_rpl_arguments *rpl_arguments)
        !          1260: {
        !          1261:    int                     i;
        !          1262: 
        !          1263:    logical1                registre31;
        !          1264: 
        !          1265:    struct_liste_chainee    *l_element_courant;
        !          1266: 
        !          1267:    struct_processus        *s_etat_processus;
        !          1268: 
        !          1269:    s_etat_processus = (*rpl_arguments).s_etat_processus;
        !          1270: 
        !          1271:    (*s_etat_processus).nombre_arguments = (*rpl_arguments).nombre_arguments;
        !          1272:    (*s_etat_processus).constante_symbolique = (*rpl_arguments)
        !          1273:            .constante_symbolique;
        !          1274:    (*s_etat_processus).instruction_valide = (*rpl_arguments)
        !          1275:            .instruction_valide;
        !          1276:    (*s_etat_processus).l_base_pile = (*rpl_arguments).l_base_pile;
        !          1277:    (*s_etat_processus).l_base_pile_last = (*rpl_arguments).l_base_pile_last;
        !          1278: 
        !          1279:    for(i = 0; i < 8; i++)
        !          1280:    {
        !          1281:        (*s_etat_processus).drapeaux_etat[i] =
        !          1282:                (*rpl_arguments).drapeaux_etat[i];
        !          1283:    }
        !          1284: 
        !          1285:    l_element_courant = (*s_etat_processus).l_base_pile;
        !          1286:    (*s_etat_processus).hauteur_pile_operationnelle = 0;
        !          1287: 
        !          1288:    while(l_element_courant != NULL)
        !          1289:    {
        !          1290:        (*s_etat_processus).hauteur_pile_operationnelle++;
        !          1291:        l_element_courant = (*l_element_courant).suivant;
        !          1292:    }
        !          1293: 
        !          1294:    registre31 = test_cfsf(s_etat_processus, 31);
        !          1295:    cf(s_etat_processus, 31);
        !          1296: 
        !          1297:    (*fonction)(s_etat_processus);
        !          1298: 
        !          1299:    if (registre31 == d_vrai)
        !          1300:    {
        !          1301:        sf(s_etat_processus, 31);
        !          1302:    }
        !          1303:    else
        !          1304:    {
        !          1305:        cf(s_etat_processus, 31);
        !          1306:    }
        !          1307: 
        !          1308:    (*rpl_arguments).l_base_pile = (*s_etat_processus).l_base_pile;
        !          1309:    (*rpl_arguments).l_base_pile_last = (*s_etat_processus).l_base_pile_last;
        !          1310: 
        !          1311:    for(i = 0; i < 8; i++)
        !          1312:    {
        !          1313:        (*rpl_arguments).drapeaux_etat[i] =
        !          1314:                (*s_etat_processus).drapeaux_etat[i];
        !          1315:    }
        !          1316: 
        !          1317:    (*rpl_arguments).message_erreur = NULL;
        !          1318:    (*rpl_arguments).type_erreur = 'E';
        !          1319:    (*rpl_arguments).erreur = 0;
        !          1320:    (*rpl_arguments).aide = ((*s_etat_processus).affichage_arguments
        !          1321:            == 'N') ? d_faux : d_vrai;
        !          1322:    (*rpl_arguments).affichage_arguments = (*s_etat_processus)
        !          1323:            .affichage_arguments;
        !          1324:    (*rpl_arguments).test_instruction = (*s_etat_processus).test_instruction;
        !          1325:    (*rpl_arguments).constante_symbolique = (*s_etat_processus)
        !          1326:            .constante_symbolique;
        !          1327:    (*rpl_arguments).instruction_valide = 'Y';
        !          1328:    (*rpl_arguments).s_etat_processus = s_etat_processus;
        !          1329: 
        !          1330:    if (((*s_etat_processus).erreur_execution != d_ex) ||
        !          1331:            ((*s_etat_processus).exception != d_ep))
        !          1332:    {
        !          1333:        return(1);
        !          1334:    }
        !          1335: 
        !          1336:    if ((*s_etat_processus).erreur_systeme != d_es)
        !          1337:    {
        !          1338:        return(2);
        !          1339:    }
        !          1340: 
        !          1341:    (*s_etat_processus).erreur_execution = d_ex;
        !          1342:    (*s_etat_processus).erreur_systeme = d_es;
        !          1343:    (*s_etat_processus).exception = d_ep;
        !          1344: 
        !          1345:    return(0);
        !          1346: }
        !          1347: 
        !          1348: 
        !          1349: /*
        !          1350: ================================================================================
        !          1351:   Procédure d'empilement d'un nouvel élément
        !          1352: ================================================================================
        !          1353:   Entrée :
        !          1354: --------------------------------------------------------------------------------
        !          1355:   Sortie :
        !          1356: --------------------------------------------------------------------------------
        !          1357:   Effets de bord : néant
        !          1358: ================================================================================
        !          1359: */
        !          1360: 
        !          1361: struct_liste_chainee *
        !          1362: empilement_pile_operationnelle(struct_rpl_arguments *s_rpl_arguments,
        !          1363:        struct_objet *s_objet)
        !          1364: {
        !          1365:    struct_liste_chainee        *l_ancienne_base_liste;
        !          1366:    struct_liste_chainee        *l_nouvelle_base_liste;
        !          1367: 
        !          1368:    l_ancienne_base_liste = (*s_rpl_arguments).l_base_pile;
        !          1369: 
        !          1370:    l_nouvelle_base_liste = (struct_liste_chainee *) malloc(
        !          1371:            sizeof(struct_liste_chainee));
        !          1372: 
        !          1373:    if (l_nouvelle_base_liste != NULL)
        !          1374:    {
        !          1375:        (*l_nouvelle_base_liste).donnee = s_objet;
        !          1376:        (*l_nouvelle_base_liste).suivant = l_ancienne_base_liste;
        !          1377:    }
        !          1378: 
        !          1379:    (*s_rpl_arguments).l_base_pile = l_nouvelle_base_liste;
        !          1380: 
        !          1381:    return l_nouvelle_base_liste;
        !          1382: }
        !          1383: 
        !          1384: 
        !          1385: /*
        !          1386: ================================================================================
        !          1387:   Procédure de dépilement d'un élément. L'emplacement est libéré dans la pile.
        !          1388: ================================================================================
        !          1389:   Entrée :
        !          1390: --------------------------------------------------------------------------------
        !          1391:   Sortie :
        !          1392: --------------------------------------------------------------------------------
        !          1393:   Effets de bord : néant
        !          1394: ================================================================================
        !          1395: */
        !          1396: 
        !          1397: struct_liste_chainee *
        !          1398: depilement_pile_operationnelle(struct_rpl_arguments *s_rpl_arguments,
        !          1399:        struct_objet **s_objet)
        !          1400: {
        !          1401:    struct_liste_chainee        *l_ancienne_base_liste;
        !          1402:    struct_liste_chainee        *l_nouvelle_base_liste;
        !          1403: 
        !          1404:    if ((*s_rpl_arguments).l_base_pile == NULL)
        !          1405:    {
        !          1406:        *s_objet = NULL;
        !          1407:        return(NULL);
        !          1408:    }
        !          1409:    else
        !          1410:    {
        !          1411:        l_ancienne_base_liste = (*s_rpl_arguments).l_base_pile;
        !          1412:        l_nouvelle_base_liste = (*l_ancienne_base_liste).suivant;
        !          1413: 
        !          1414:        *s_objet = (*l_ancienne_base_liste).donnee;
        !          1415:        free(l_ancienne_base_liste);
        !          1416: 
        !          1417:        (*s_rpl_arguments).l_base_pile = l_nouvelle_base_liste;
        !          1418: 
        !          1419:        return(l_nouvelle_base_liste);
        !          1420:    }
        !          1421: }
        !          1422: 
        !          1423: 
        !          1424: /*
        !          1425: ================================================================================
        !          1426:   Procédure de sauvegarde des arguments dans la pile last
        !          1427: ================================================================================
        !          1428:   Entrée : structure processus et nombre d'aguments à empiler
        !          1429: --------------------------------------------------------------------------------
        !          1430:   Sortie : drapeau d'erreur de la structure rpl_arguments
        !          1431: --------------------------------------------------------------------------------
        !          1432:   Effets de bord : efface le précédent contenu de la pile LAST
        !          1433: ================================================================================
        !          1434: */
        !          1435: 
        !          1436: struct_liste_chainee *
        !          1437: sauvegarde_arguments(struct_rpl_arguments *s_rpl_arguments,
        !          1438:        unsigned long nombre_arguments)
        !          1439: {
        !          1440:    struct_liste_chainee            *l_ancienne_base_liste;
        !          1441:    struct_liste_chainee            *l_element_courant;
        !          1442:    struct_liste_chainee            *l_element_suivant;
        !          1443:    struct_liste_chainee            *l_nouvelle_base_liste;
        !          1444: 
        !          1445:    struct_objet                    *s_objet;
        !          1446: 
        !          1447:    logical1                        erreur;
        !          1448: 
        !          1449:    t_8_bits                        masque;
        !          1450: 
        !          1451:    unsigned char                   indice_bit;
        !          1452:    unsigned char                   indice_bloc;
        !          1453:    unsigned char                   indice_drapeau;
        !          1454:    unsigned char                   taille_bloc;
        !          1455: 
        !          1456:    unsigned long                   i;
        !          1457: 
        !          1458:    struct_processus                *s_etat_processus;
        !          1459: 
        !          1460:    (*s_rpl_arguments).erreur = 0;
        !          1461:    s_etat_processus = (*s_rpl_arguments).s_etat_processus;
        !          1462: 
        !          1463:    indice_drapeau = 31;
        !          1464:    indice_drapeau--;
        !          1465:    taille_bloc = sizeof(t_8_bits) * 8;
        !          1466:    indice_bloc = indice_drapeau / taille_bloc;
        !          1467:    indice_bit = indice_drapeau % taille_bloc;
        !          1468: 
        !          1469:    masque = ((t_8_bits) 1) << (taille_bloc - indice_bit - 1);
        !          1470: 
        !          1471:    if (((*s_rpl_arguments).drapeaux_etat[indice_bloc] & masque) == 0)
        !          1472:    {
        !          1473:        return (*s_rpl_arguments).l_base_pile_last;
        !          1474:    }
        !          1475:    
        !          1476:    erreur = d_absence_erreur;
        !          1477: 
        !          1478:    l_element_courant = (*s_rpl_arguments).l_base_pile_last;
        !          1479:    while(l_element_courant != NULL)
        !          1480:    {
        !          1481:        liberation(s_etat_processus, (*l_element_courant).donnee);
        !          1482:        l_element_suivant = (*l_element_courant).suivant;
        !          1483:        free(l_element_courant);
        !          1484:        l_element_courant = l_element_suivant;
        !          1485:    }
        !          1486: 
        !          1487:    (*s_rpl_arguments).l_base_pile_last = NULL;
        !          1488:    l_element_courant = (*s_rpl_arguments).l_base_pile;
        !          1489:    l_nouvelle_base_liste = (*s_rpl_arguments).l_base_pile_last;
        !          1490: 
        !          1491:    for(i = 0; ((i < nombre_arguments) && (erreur == d_absence_erreur)
        !          1492:            && (l_element_courant != NULL)); i++)
        !          1493:    {
        !          1494:        s_objet = copie_objet(s_etat_processus,
        !          1495:                (*l_element_courant).donnee, 'P');
        !          1496: 
        !          1497:        if (s_objet != NULL)
        !          1498:        {
        !          1499:            l_ancienne_base_liste = l_nouvelle_base_liste;
        !          1500:            l_nouvelle_base_liste = (struct_liste_chainee *) malloc(
        !          1501:                    sizeof(struct_liste_chainee));
        !          1502: 
        !          1503:            if (l_nouvelle_base_liste != NULL)
        !          1504:            {
        !          1505:                (*l_nouvelle_base_liste).donnee = s_objet;
        !          1506:                (*l_nouvelle_base_liste).suivant = l_ancienne_base_liste;
        !          1507:                
        !          1508:            }
        !          1509:            else
        !          1510:            {
        !          1511:                erreur = d_erreur;
        !          1512:            }
        !          1513: 
        !          1514:            l_element_courant = (*l_element_courant).suivant;
        !          1515:        }
        !          1516:        else
        !          1517:        {
        !          1518:            erreur = d_erreur;
        !          1519:        }
        !          1520:    }
        !          1521: 
        !          1522:    if (i != nombre_arguments)
        !          1523:    {
        !          1524:        /*
        !          1525:         * Erreur système : la pile est vidée et la routine renvoie NULL.
        !          1526:         */
        !          1527: 
        !          1528:        l_element_courant = l_nouvelle_base_liste;
        !          1529:        while(l_element_courant != NULL)
        !          1530:        {
        !          1531:            liberation(s_etat_processus, (*l_element_courant).donnee);
        !          1532:            l_element_suivant = (*l_element_courant).suivant;
        !          1533:            free(l_element_courant);
        !          1534:            l_element_courant = l_element_suivant;
        !          1535:        }
        !          1536: 
        !          1537:        l_nouvelle_base_liste = NULL;
        !          1538:        (*s_rpl_arguments).erreur = i;
        !          1539:    }
        !          1540: 
        !          1541:    return(l_nouvelle_base_liste);
        !          1542: }
        !          1543: 
        !          1544: 
        !          1545: /*
        !          1546: ================================================================================
        !          1547:   Procédure de tri des symboles externes
        !          1548: 
        !          1549:   Principe du tri dit de Shell-Metzner
        !          1550: ================================================================================
        !          1551:   Entrée :
        !          1552: --------------------------------------------------------------------------------
        !          1553:   Sortie :
        !          1554: --------------------------------------------------------------------------------
        !          1555:   Effets de bord : néant
        !          1556: ================================================================================
        !          1557: */
        !          1558: 
        !          1559: void
        !          1560: tri_base_symboles_externes(struct_processus *s_etat_processus)
        !          1561: {
        !          1562:    logical1            terminaison_boucle;
        !          1563:    logical1            terminaison_boucle_1;
        !          1564:    logical1            terminaison_boucle_2;
        !          1565:    logical1            terminaison_boucle_3;
        !          1566: 
        !          1567:    signed long         indice_i;
        !          1568:    signed long         indice_j;
        !          1569:    signed long         indice_k;
        !          1570:    signed long         indice_l;
        !          1571: 
        !          1572:    unsigned long       borne_inferieure;
        !          1573:    unsigned long       borne_superieure;
        !          1574:    unsigned long       ecartement;
        !          1575:    unsigned long       indice;
        !          1576: 
        !          1577:    ecartement = (*s_etat_processus).nombre_instructions_externes;
        !          1578: 
        !          1579:    terminaison_boucle_1 = d_faux;
        !          1580: 
        !          1581:    do
        !          1582:    {
        !          1583:        ecartement = ecartement / 2;
        !          1584: 
        !          1585:        if (ecartement >= 1)
        !          1586:        {
        !          1587:            indice_j = 0;
        !          1588:            indice_k = (*s_etat_processus).nombre_instructions_externes
        !          1589:                    - ecartement;
        !          1590: 
        !          1591:            terminaison_boucle_2 = d_faux;
        !          1592: 
        !          1593:            do
        !          1594:            {
        !          1595:                indice_i = indice_j;
        !          1596: 
        !          1597:                terminaison_boucle_3 = d_faux;
        !          1598: 
        !          1599:                do
        !          1600:                {
        !          1601:                    indice_l = indice_i + ecartement;
        !          1602: 
        !          1603:                    if ((indice_i > 0) && (indice_l > 0))
        !          1604:                    {
        !          1605:                        if (strcmp(((*s_etat_processus).s_instructions_externes
        !          1606:                                [indice_i - 1]).nom, ((*s_etat_processus)
        !          1607:                                .s_instructions_externes[indice_l - 1]).nom)
        !          1608:                                > 0)
        !          1609:                        {
        !          1610:                            swap((void *) &((*s_etat_processus)
        !          1611:                                    .s_instructions_externes
        !          1612:                                    [indice_i - 1]), (void *) 
        !          1613:                                    &((*s_etat_processus)
        !          1614:                                    .s_instructions_externes[indice_l - 1]),
        !          1615:                                    sizeof(struct_instruction_externe));
        !          1616: 
        !          1617:                            indice_i -= ecartement;
        !          1618: 
        !          1619:                            if (indice_i < 1)
        !          1620:                            {
        !          1621:                                terminaison_boucle_3 = d_vrai;
        !          1622:                            }
        !          1623:                        }
        !          1624:                        else
        !          1625:                        {
        !          1626:                            terminaison_boucle_3 = d_vrai;
        !          1627:                        }
        !          1628:                    }
        !          1629:                    else
        !          1630:                    {
        !          1631:                        terminaison_boucle_3 = d_vrai;
        !          1632:                    }
        !          1633:                } while(terminaison_boucle_3 == d_faux);
        !          1634: 
        !          1635:                indice_j++;
        !          1636: 
        !          1637:                if (indice_j > indice_k)
        !          1638:                {
        !          1639:                    terminaison_boucle_2 = d_vrai;
        !          1640:                }
        !          1641:            } while(terminaison_boucle_2 == d_faux);
        !          1642:        }
        !          1643:        else
        !          1644:        {
        !          1645:            terminaison_boucle_1 = d_vrai;
        !          1646:        }
        !          1647:    } while(terminaison_boucle_1 == d_faux);
        !          1648: 
        !          1649:    indice_i = 0;
        !          1650: 
        !          1651:    do
        !          1652:    {
        !          1653:        indice_j = indice_i;
        !          1654: 
        !          1655:        while(((unsigned long) (indice_i + 1) < (*s_etat_processus)
        !          1656:                .nombre_instructions_externes) && (strcmp(((*s_etat_processus)
        !          1657:                .s_instructions_externes[indice_i]).nom, ((*s_etat_processus)
        !          1658:                .s_instructions_externes[indice_i + 1]).nom) == 0))
        !          1659:        {
        !          1660:            indice_i++;
        !          1661:        }
        !          1662: 
        !          1663:        borne_inferieure = indice_j;
        !          1664:        borne_superieure = indice_i;
        !          1665: 
        !          1666:        do
        !          1667:        {
        !          1668:            terminaison_boucle = d_vrai;
        !          1669: 
        !          1670:            for(indice = borne_inferieure + 1; indice <= borne_superieure;
        !          1671:                    indice++)
        !          1672:            {
        !          1673:                if (strcmp((*s_etat_processus).s_instructions_externes[indice]
        !          1674:                        .nom_bibliotheque, (*s_etat_processus)
        !          1675:                        .s_instructions_externes[indice - 1].nom_bibliotheque)
        !          1676:                        < 0)
        !          1677:                {
        !          1678:                    swap((void *) &((*s_etat_processus).s_instructions_externes
        !          1679:                            [indice - 1]), (void *) &((*s_etat_processus)
        !          1680:                            .s_instructions_externes[indice]),
        !          1681:                            sizeof(struct_instruction_externe));
        !          1682: 
        !          1683:                    terminaison_boucle = d_faux;
        !          1684:                }
        !          1685:            }
        !          1686:        } while(terminaison_boucle == d_faux);
        !          1687: 
        !          1688:        indice_i++;
        !          1689:    } while((unsigned long) (indice_i + 1) <
        !          1690:            (*s_etat_processus).nombre_variables);
        !          1691: 
        !          1692:    return;
        !          1693: }
        !          1694: 
        !          1695: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>