Annotation of rpl/src/gestion_variables_statiques.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: 
        !            26: /*
        !            27: ================================================================================
        !            28:   Routine de création d'une nouvelle variable statique
        !            29: ================================================================================
        !            30:   Entrée :
        !            31: --------------------------------------------------------------------------------
        !            32:   Sortie :
        !            33: --------------------------------------------------------------------------------
        !            34:   Effets de bords : néant
        !            35: ================================================================================
        !            36: */
        !            37: 
        !            38: logical1
        !            39: creation_variable_statique(struct_processus *s_etat_processus,
        !            40:        struct_variable_statique *s_variable)
        !            41: {
        !            42:    struct_variable_statique            *s_nouvelle_base;
        !            43: 
        !            44:    long                                i;
        !            45: 
        !            46:    (*s_etat_processus).nombre_variables_statiques++;
        !            47: 
        !            48:    if ((*s_etat_processus).nombre_variables_statiques > (*s_etat_processus)
        !            49:            .nombre_variables_statiques_allouees)
        !            50:    {
        !            51:        // La nouvelle variable statique ne tient pas dans la table courante.
        !            52:        // Il convient donc d'en augmenter la taille.
        !            53: 
        !            54:        if ((*s_etat_processus).nombre_variables_statiques_allouees == 0)
        !            55:        {
        !            56:            (*s_etat_processus).nombre_variables_statiques_allouees =
        !            57:                    (*s_etat_processus).nombre_variables_statiques;
        !            58:        }
        !            59:        else
        !            60:        {
        !            61:            while((*s_etat_processus).nombre_variables_statiques >
        !            62:                    (*s_etat_processus).nombre_variables_statiques_allouees)
        !            63:            {
        !            64:                (*s_etat_processus).nombre_variables_statiques_allouees *= 2;
        !            65:            }
        !            66:        }
        !            67: 
        !            68:        if ((s_nouvelle_base = realloc((*s_etat_processus)
        !            69:                .s_liste_variables_statiques, (*s_etat_processus)
        !            70:                .nombre_variables_statiques_allouees *
        !            71:                sizeof(struct_variable_statique))) == NULL)
        !            72:        {
        !            73:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !            74:            (*s_etat_processus).nombre_variables_statiques--;
        !            75:            return(d_erreur);
        !            76:        }
        !            77: 
        !            78:        (*s_etat_processus).s_liste_variables_statiques = s_nouvelle_base;
        !            79:    }
        !            80: 
        !            81:    /*
        !            82:     * Positionnement de la variable statique au bon endroit
        !            83:     */
        !            84: 
        !            85:    // Nous avons (*s_etat_processus).nombre_variables_statiques - 1 variables
        !            86:    // dans la table qui sera balayée de la fin vers le début.
        !            87: 
        !            88:    if ((*s_etat_processus).nombre_variables_statiques == 1)
        !            89:    {
        !            90:        (*s_etat_processus).s_liste_variables_statiques[0] = (*s_variable);
        !            91:    }
        !            92:    else
        !            93:    {
        !            94:        for(i = (*s_etat_processus).nombre_variables_statiques - 2; i >= 0; i--)
        !            95:        {
        !            96:            if (strcmp((*s_variable).nom,
        !            97:                    (*s_etat_processus).s_liste_variables_statiques[i].nom) < 0)
        !            98:            {
        !            99:                (*s_etat_processus).s_liste_variables_statiques[i + 1] =
        !           100:                        (*s_etat_processus).s_liste_variables_statiques[i];
        !           101:            }
        !           102:            else
        !           103:            {
        !           104:                break;
        !           105:            }
        !           106:        }
        !           107: 
        !           108:        (*s_etat_processus).s_liste_variables_statiques[i + 1] = (*s_variable);
        !           109:    }
        !           110: 
        !           111:    return d_absence_erreur;
        !           112: }
        !           113: 
        !           114: 
        !           115: /*
        !           116: ================================================================================
        !           117:   Procédure de retrait d'une variable statique de la base
        !           118: ================================================================================
        !           119:   Entrée :
        !           120: --------------------------------------------------------------------------------
        !           121:   Sortie :
        !           122: --------------------------------------------------------------------------------
        !           123:   Effets de bord : néant
        !           124: ================================================================================
        !           125: */
        !           126: 
        !           127: logical1
        !           128: retrait_variable_statique(struct_processus *s_etat_processus,
        !           129:        unsigned char *nom_variable, union_position_variable position)
        !           130: {
        !           131:    struct_variable_statique        *s_nouvelle_base;
        !           132: 
        !           133:    logical1                        erreur;
        !           134: 
        !           135:    unsigned long                   position_courante;
        !           136:    unsigned long                   position_supprimee;
        !           137: 
        !           138:    if (recherche_variable_statique(s_etat_processus, nom_variable,
        !           139:            position, ((*s_etat_processus).mode_execution_programme == 'Y')
        !           140:            ? 'P' : 'E') == d_vrai)
        !           141:    {
        !           142:        if ((*s_etat_processus).nombre_variables_statiques <
        !           143:                ((*s_etat_processus).nombre_variables_statiques_allouees / 2))
        !           144:        {
        !           145:            (*s_etat_processus).nombre_variables_statiques_allouees /= 2;
        !           146: 
        !           147:            if ((s_nouvelle_base =
        !           148:                    realloc((*s_etat_processus).s_liste_variables_statiques,
        !           149:                    (*s_etat_processus).nombre_variables_statiques_allouees *
        !           150:                    sizeof(struct_variable_statique))) == NULL)
        !           151:            {
        !           152:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           153:                return(d_erreur);
        !           154:            }
        !           155: 
        !           156:            (*s_etat_processus).s_liste_variables_statiques = s_nouvelle_base;
        !           157:        }
        !           158: 
        !           159:        position_supprimee = (*s_etat_processus)
        !           160:                .position_variable_statique_courante;
        !           161: 
        !           162:        liberation(s_etat_processus, (*s_etat_processus)
        !           163:                .s_liste_variables_statiques[position_supprimee].objet);
        !           164:        free((*s_etat_processus).s_liste_variables_statiques
        !           165:                [position_supprimee].nom);
        !           166: 
        !           167:        (*s_etat_processus).nombre_variables_statiques--;
        !           168: 
        !           169:        for(position_courante = position_supprimee; position_courante <
        !           170:                (*s_etat_processus).nombre_variables_statiques;
        !           171:                position_courante++)
        !           172:        {
        !           173:            (*s_etat_processus).s_liste_variables_statiques[position_courante]
        !           174:                    = (*s_etat_processus).s_liste_variables_statiques
        !           175:                    [position_courante + 1];
        !           176:        }
        !           177: 
        !           178:        erreur = d_absence_erreur;
        !           179:    }
        !           180:    else
        !           181:    {
        !           182:        erreur = d_erreur;
        !           183:        (*s_etat_processus).erreur_systeme = d_es_variable_introuvable;
        !           184:    }
        !           185: 
        !           186:    return erreur;
        !           187: }
        !           188: 
        !           189: 
        !           190: /*
        !           191: ================================================================================
        !           192:   Procédure de recherche d'une variable statique par son nom dans la base
        !           193: ================================================================================
        !           194:   Entrée :
        !           195: --------------------------------------------------------------------------------
        !           196:   Sortie :
        !           197: --------------------------------------------------------------------------------
        !           198:   Effets de bord : néant
        !           199: ================================================================================
        !           200: */
        !           201: 
        !           202: logical1
        !           203: recherche_variable_statique(struct_processus *s_etat_processus,
        !           204:        unsigned char *nom_variable, union_position_variable position,
        !           205:        unsigned char origine)
        !           206: {
        !           207:    logical1                    existence_variable;
        !           208: 
        !           209:    long                        difference;
        !           210:    long                        difference_inferieure;
        !           211:    long                        difference_superieure;
        !           212: 
        !           213:    unsigned long               borne_inferieure;
        !           214:    unsigned long               borne_superieure;
        !           215:    unsigned long               moyenne;
        !           216:    unsigned long               nombre_iterations_maximal;
        !           217:    unsigned long               ordre_iteration;
        !           218: 
        !           219:    if ((*s_etat_processus).nombre_variables_statiques == 0)
        !           220:    {
        !           221:        (*s_etat_processus).erreur_systeme = d_es_variable_introuvable;
        !           222:        return d_faux;
        !           223:    }
        !           224: 
        !           225:    ordre_iteration = 0;
        !           226:    nombre_iterations_maximal = ((unsigned long)
        !           227:            (log((*s_etat_processus).nombre_variables_statiques) / log(2))) + 2;
        !           228: 
        !           229:    borne_inferieure = 0;
        !           230:    borne_superieure = (*s_etat_processus).nombre_variables_statiques - 1;
        !           231: 
        !           232:    do
        !           233:    {
        !           234:        moyenne = (borne_inferieure + borne_superieure) / 2;
        !           235:        ordre_iteration++;
        !           236: 
        !           237:        if ((2 * ((unsigned long) ((borne_inferieure + borne_superieure) / 2)))
        !           238:                == (borne_inferieure + borne_superieure))
        !           239:        {
        !           240:            difference = strcmp(nom_variable,
        !           241:                    ((*s_etat_processus).s_liste_variables_statiques)
        !           242:                    [moyenne].nom);
        !           243: 
        !           244:            if (difference != 0)
        !           245:            {
        !           246:                if (difference > 0)
        !           247:                {
        !           248:                    borne_inferieure = moyenne;
        !           249:                }
        !           250:                else
        !           251:                {
        !           252:                    borne_superieure = moyenne;
        !           253:                }
        !           254:            }
        !           255:        }
        !           256:        else
        !           257:        {
        !           258:            difference_inferieure = strcmp(nom_variable,
        !           259:                    ((*s_etat_processus).s_liste_variables_statiques)
        !           260:                    [moyenne].nom);
        !           261:            difference_superieure = strcmp(nom_variable,
        !           262:                    ((*s_etat_processus).s_liste_variables_statiques)
        !           263:                    [moyenne + 1].nom);
        !           264: 
        !           265:            if (difference_inferieure == 0)
        !           266:            {
        !           267:                difference = 0;
        !           268:            }
        !           269:            else if (difference_superieure == 0)
        !           270:            {
        !           271:                difference = 0;
        !           272:                moyenne++;
        !           273:            }
        !           274:            else
        !           275:            {
        !           276:                difference = difference_inferieure;
        !           277: 
        !           278:                if (difference > 0)
        !           279:                {
        !           280:                    borne_inferieure = moyenne;
        !           281:                }
        !           282:                else
        !           283:                {
        !           284:                    borne_superieure = moyenne;
        !           285:                }
        !           286:            }
        !           287:        }
        !           288:    } while((difference != 0) &&
        !           289:            (ordre_iteration <= nombre_iterations_maximal));
        !           290: 
        !           291:    if (ordre_iteration > nombre_iterations_maximal)
        !           292:    {
        !           293:        existence_variable = d_faux;
        !           294:        (*s_etat_processus).erreur_systeme = d_es_variable_introuvable;
        !           295:    }
        !           296:    else
        !           297:    {
        !           298:        // Reste à rechercher la variable déclarée à la position 'position'...
        !           299: 
        !           300:        if (((*s_etat_processus).s_liste_variables_statiques)[moyenne]
        !           301:                .origine == 'P')
        !           302:        {
        !           303:            if ((((*s_etat_processus).s_liste_variables_statiques)[moyenne]
        !           304:                    .variable_statique.adresse == position.adresse) &&
        !           305:                    (((*s_etat_processus).s_liste_variables_statiques)[moyenne]
        !           306:                    .origine == origine))
        !           307:            {
        !           308:                existence_variable = d_vrai;
        !           309:            }
        !           310:            else
        !           311:            {
        !           312:                existence_variable = d_faux;
        !           313:            }
        !           314:        }
        !           315:        else
        !           316:        {
        !           317:            if ((((*s_etat_processus).s_liste_variables_statiques)[moyenne]
        !           318:                    .variable_statique.pointeur == position.pointeur) &&
        !           319:                    (((*s_etat_processus).s_liste_variables_statiques)[moyenne]
        !           320:                    .origine == origine))
        !           321:            {
        !           322:                existence_variable = d_vrai;
        !           323:            }
        !           324:            else
        !           325:            {
        !           326:                existence_variable = d_faux;
        !           327:            }
        !           328:        }
        !           329: 
        !           330:        if (existence_variable == d_faux)
        !           331:        {
        !           332:            // On rembobine.
        !           333: 
        !           334:            if (moyenne > 0)
        !           335:            {
        !           336:                while(strcmp(nom_variable, ((*s_etat_processus)
        !           337:                        .s_liste_variables_statiques)[moyenne - 1].nom) == 0)
        !           338:                {
        !           339:                    moyenne--;
        !           340: 
        !           341:                    if (moyenne == 0)
        !           342:                    {
        !           343:                        break;
        !           344:                    }
        !           345:                }
        !           346:            }
        !           347: 
        !           348:            // Un petit test pour voir si le premier élément du tableau
        !           349:            // peut correspondre au critère de recherche.
        !           350: 
        !           351:            existence_variable = d_faux;
        !           352: 
        !           353:            if (strcmp(((*s_etat_processus).s_liste_variables_statiques)
        !           354:                    [moyenne].nom, nom_variable) == 0)
        !           355:            {
        !           356:                if (((*s_etat_processus).s_liste_variables_statiques)
        !           357:                        [moyenne].origine == 'P')
        !           358:                {
        !           359:                    if ((((*s_etat_processus).s_liste_variables_statiques)
        !           360:                            [moyenne].variable_statique.adresse
        !           361:                            == position.adresse) &&
        !           362:                            (((*s_etat_processus).s_liste_variables_statiques)
        !           363:                            [moyenne].origine == origine))
        !           364:                    {
        !           365:                        existence_variable = d_vrai;
        !           366:                    }
        !           367:                }
        !           368:                else
        !           369:                {
        !           370:                    if ((((*s_etat_processus).s_liste_variables_statiques)
        !           371:                            [moyenne].variable_statique.pointeur
        !           372:                            == position.pointeur) &&
        !           373:                            (((*s_etat_processus).s_liste_variables_statiques)
        !           374:                            [moyenne].origine == origine))
        !           375:                    {
        !           376:                        existence_variable = d_vrai;
        !           377:                    }
        !           378:                }
        !           379:            }
        !           380: 
        !           381:            // Puis on balaye dans le sens croissant.
        !           382: 
        !           383:            if (((moyenne + 1) < (*s_etat_processus)
        !           384:                    .nombre_variables_statiques) &&
        !           385:                    (existence_variable == d_faux))
        !           386:            {
        !           387:                while(strcmp(((*s_etat_processus)
        !           388:                        .s_liste_variables_statiques)[moyenne + 1].nom,
        !           389:                        nom_variable) == 0)
        !           390:                {
        !           391:                    moyenne++;
        !           392: 
        !           393:                    if (((*s_etat_processus).s_liste_variables_statiques)
        !           394:                            [moyenne].origine == 'P')
        !           395:                    {
        !           396:                        if ((((*s_etat_processus).s_liste_variables_statiques)
        !           397:                                [moyenne].variable_statique.adresse ==
        !           398:                                position.adresse) && (((*s_etat_processus)
        !           399:                                .s_liste_variables_statiques)
        !           400:                                [moyenne].origine == origine))
        !           401:                        {
        !           402:                            existence_variable = d_vrai;
        !           403:                            break;
        !           404:                        }
        !           405:                    }
        !           406:                    else
        !           407:                    {
        !           408:                        if ((((*s_etat_processus).s_liste_variables_statiques)
        !           409:                                [moyenne].variable_statique.pointeur ==
        !           410:                                position.pointeur) && (((*s_etat_processus)
        !           411:                                .s_liste_variables_statiques)
        !           412:                                [moyenne].origine == origine))
        !           413:                        {
        !           414:                            existence_variable = d_vrai;
        !           415:                            break;
        !           416:                        }
        !           417:                    }
        !           418: 
        !           419:                    if ((moyenne + 1) >= (*s_etat_processus)
        !           420:                            .nombre_variables_statiques)
        !           421:                    {
        !           422:                        break;
        !           423:                    }
        !           424:                }
        !           425:            }
        !           426:        }
        !           427: 
        !           428:        (*s_etat_processus).position_variable_statique_courante = moyenne;
        !           429:    }
        !           430: 
        !           431:    return existence_variable;
        !           432: }
        !           433: 
        !           434: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>