/* ================================================================================ RPL/2 (R) version 4.0.12 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. RPL/2 is free software; you can redistribute it and/or modify it under the terms of the CeCILL V2 License as published by the french CEA, CNRS and INRIA. RPL/2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License for more details. You should have received a copy of the CeCILL License along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ #include "rpl.conv.h" /* ================================================================================ Fonction renvoyant la taille d'un objet en octets (pondérée par le nombre d'occurrences de cet objet) ================================================================================ Entrée : pointeur sur l'objet -------------------------------------------------------------------------------- Sortie : taille -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ integer8 occupation_memoire(struct_objet *s_objet) { integer8 longueur; unsigned long i; struct_liste_chainee *l_element_courant; if (s_objet == NULL) { return(0); } switch((*s_objet).type) { case ADR : { longueur = sizeof(unsigned long); break; } case ALG : { l_element_courant = (struct_liste_chainee *) (*s_objet).objet; longueur = 0; while(l_element_courant != NULL) { longueur += occupation_memoire((*l_element_courant).donnee); l_element_courant = (*l_element_courant).suivant; } break; } case BIN : { longueur = sizeof(logical8); break; } case CHN : { longueur = strlen((unsigned char *) (*s_objet).objet) * sizeof(unsigned char); break; } case CPL : { longueur = sizeof(complex16); break; } case FCH : { longueur = sizeof(struct_fonction); longueur += strlen((*((struct_fichier *) (*s_objet).objet)) .nom) * sizeof(unsigned char); longueur += occupation_memoire((*((struct_fichier *) (*s_objet).objet)).format); break; } case FCT : { longueur = sizeof(struct_fonction); longueur += strlen((*((struct_fonction *) (*s_objet).objet)) .nom_fonction) * sizeof(unsigned char); break; } case INT : { longueur = sizeof(integer8); break; } case LST : { l_element_courant = (struct_liste_chainee *) (*s_objet).objet; longueur = 0; while(l_element_courant != NULL) { longueur += occupation_memoire((*l_element_courant).donnee); l_element_courant = (*l_element_courant).suivant; } break; } case MCX : { longueur = sizeof(struct_matrice); longueur += (*((struct_matrice *) (*s_objet).objet)).nombre_lignes * (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes * sizeof(complex16); break; } case MIN : { longueur = sizeof(struct_matrice); longueur += (*((struct_matrice *) (*s_objet).objet)).nombre_lignes * (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes * sizeof(integer8); break; } case MRL : { longueur = sizeof(struct_matrice); longueur += (*((struct_matrice *) (*s_objet).objet)).nombre_lignes * (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes * sizeof(real8); break; } case MTX : { longueur = sizeof(struct_mutex); break; } case NOM : { longueur = strlen((*((struct_nom *) (*s_objet).objet)).nom) * sizeof(unsigned char); break; } case NON : { longueur = 0; break; } case PRC : { longueur = sizeof(struct_processus_fils); break; } case REL : { longueur = sizeof(real8); break; } case RPN : { l_element_courant = (struct_liste_chainee *) (*s_objet).objet; longueur = 0; while(l_element_courant != NULL) { longueur += occupation_memoire((*l_element_courant).donnee); l_element_courant = (*l_element_courant).suivant; } break; } case SCK : { longueur = strlen((*((struct_socket *) (*s_objet).objet)) .adresse) * sizeof(unsigned char); longueur += strlen((*((struct_socket *) (*s_objet).objet)) .adresse_distante) * sizeof(unsigned char); longueur += occupation_memoire((*((struct_fichier *) (*s_objet).objet)).format); break; } case SLB : { longueur = sizeof(struct_bibliotheque); longueur += strlen((*((struct_bibliotheque *) (*s_objet).objet)) .nom) * sizeof(unsigned char); break; } case SPH : { longueur = sizeof(struct_semaphore); longueur += strlen((*((struct_semaphore *) (*s_objet).objet)) .nom) * sizeof(unsigned char); break; } case SQL : { longueur = sizeof(struct_connecteur_sql); longueur += strlen((*((struct_connecteur_sql *) (*s_objet).objet)) .type) * sizeof(unsigned char); longueur += strlen((*((struct_connecteur_sql *) (*s_objet).objet)) .locale) * sizeof(unsigned char); break; } case TBL : { longueur = sizeof(struct_tableau); for(i = 0; i < (*((struct_tableau *) (*s_objet).objet)) .nombre_elements; i++) { longueur += occupation_memoire((*((struct_tableau *) (*s_objet).objet)).elements[i]); } break; } case VCX : { longueur = sizeof(struct_vecteur); longueur += (*((struct_vecteur *) (*s_objet).objet)) .taille * sizeof(complex16); break; } case VIN : { longueur = sizeof(struct_vecteur); longueur += (*((struct_vecteur *) (*s_objet).objet)) .taille * sizeof(integer8); break; } case VRL : { longueur = sizeof(struct_vecteur); longueur += (*((struct_vecteur *) (*s_objet).objet)) .taille * sizeof(real8); break; } default : { longueur = 0; break; } } return(longueur / (*s_objet).nombre_occurrences); } // vim: ts=4