Annotation of rpl/src/gestion_pile_last.c, revision 1.9

1.1       bertrand    1: /*
                      2: ================================================================================
1.9     ! bertrand    3:   RPL/2 (R) version 4.0.17
1.1       bertrand    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:   Procédure d'empilement des arguments d'une commande dans la pile LAST
                     29: ================================================================================
                     30:   Entrée : structure processus et nombre d'aguments à empiler
                     31: --------------------------------------------------------------------------------
                     32:   Sortie : drapeau d'erreur
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : efface le précédent contenu de la pile LAST
                     35: ================================================================================
                     36: */
                     37: 
                     38: logical1
                     39: empilement_pile_last(struct_processus *s_etat_processus,
                     40:        unsigned long nombre_arguments)
                     41: {
                     42:    struct_liste_chainee            *l_element_courant;
                     43:    struct_liste_chainee            *l_element_suivant;
                     44: 
                     45:    struct_objet                    *s_objet;
                     46: 
                     47:    logical1                        erreur;
                     48: 
                     49:    unsigned long                   i;
                     50: 
                     51:    erreur = d_absence_erreur;
                     52: 
                     53:    l_element_courant = (*s_etat_processus).l_base_pile_last;
                     54:    while(l_element_courant != NULL)
                     55:    {
                     56:        liberation(s_etat_processus, (*l_element_courant).donnee);
                     57:        l_element_suivant = (*l_element_courant).suivant;
                     58: 
                     59:        // On ne libère pas le maillon de la chaîne. On le sauvegarde
                     60:        // arbitrairement dans le tampon.
                     61: 
                     62:        (*l_element_courant).donnee = NULL;
                     63:        (*l_element_courant).suivant = (*s_etat_processus).pile_tampon;
                     64:        (*s_etat_processus).pile_tampon = l_element_courant;
                     65:        (*s_etat_processus).taille_pile_tampon++;
                     66: 
                     67:        l_element_courant = l_element_suivant;
                     68:    }
                     69: 
                     70:    (*s_etat_processus).l_base_pile_last = NULL;
                     71:    l_element_courant = (*s_etat_processus).l_base_pile;
                     72: 
                     73:    for(i = 0; ((i < nombre_arguments) && (erreur == d_absence_erreur)
                     74:            && (l_element_courant != NULL)); i++)
                     75:    {
                     76:        s_objet = copie_objet(s_etat_processus,
                     77:                (*l_element_courant).donnee, 'P');
                     78: 
                     79:        if (s_objet != NULL)
                     80:        {
                     81:            erreur = empilement(s_etat_processus,
                     82:                    &((*s_etat_processus).l_base_pile_last), s_objet);
                     83:            l_element_courant = (*l_element_courant).suivant;
                     84:        }
                     85:        else
                     86:        {
                     87:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                     88:            break;
                     89:        }
                     90:    }
                     91: 
                     92:    if (i != nombre_arguments)
                     93:    {
                     94:        /*
                     95:         * Ne renvoie pas d'erreur si le nombre d'argument ne correspond pas
                     96:         * à celui attendu pour pouvoir traiter correctement les fuites
                     97:         * mémoire dans le traitement de la fonction IFERR. Le traitement
                     98:         * du nombre d'arguments est fait au niveau de la fonction appelant
                     99:         * "empilement_pile_last".
                    100:         */
                    101: 
                    102:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    103:    }
                    104: 
                    105:    return(erreur);
                    106: }
                    107: 
                    108: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>