![]() ![]() | ![]() |
Passage de la branche 4.1 en branche stable.
1: /* 2: ================================================================================ 3: RPL/2 (R) version 4.1.0 4: Copyright (C) 1989-2011 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