File:  [Repository ATC2] / ADD_ver_10 / Source Code / Source Files / Recuentos.c
Revision 1.2: download - view: text, annotated - select for diffs
Tue Feb 28 14:54:21 2006 UTC (18 years, 8 months ago) by rico
Branches: MAIN
CVS tags: HEAD
*** empty log message ***

/********************************************************************/
/*  Recuentos.c                                                     */
/*                                                                  */
/*                                                                  */
/*  Copyright (c) 1997-2006 Rafael Rico      (rafael.rico@uah.es)   */
/*                                                                  */
/*  Este fichero forma parte de ADD                                 */
/*  (Analizador de Dependencias de Datos)                           */
/*  Version 5.10.                                                   */
/*                                                                  */
/*                                                                  */
/*  ADD es software libre. Puede redistribuirlo y/o modificarlo     */
/*  bajo los términos de la Licencia Pública General de GNU         */
/*  según es publicada por la Free Software Foundation, bien bajo   */
/*  la versión 2 de dicha Licencia o bien (según su elección)       */
/*  bajo cualquier versión posterior.                               */
/*                                                                  */
/*  ADD se distribuye con la esperanza de que sea útil,             */
/*  pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL    */
/*  implícita y sin garantizar la CONVENIENCIA PARA UN PROPÓSITO    */
/*  PARTICULAR. Véase la Licencia Pública General de GNU para       */
/*  más detalles.                                                   */
/*                                                                  */
/*  Debería haber recibido una copia de la Licencia Pública General */
/*  junto con ADD. Si no ha sido así, escriba a la Free Software    */
/*  Foundation, Inc., 51 Franklin St, Fifth Floor,                  */
/*  Boston, MA  02110-1301  EEUU.                                   */
/*                                                                  */
/*  -------------------------- Historia --------------------------- */
/*                                                                  */
/*  $Id: Recuentos.c,v 1.2 2006/02/28 14:54:21 rico Exp $                                                            */
/*                                                                  */
/*  Revisión 1.2. 01/2006                                           */
/*  Se añade la licencia GPL y documentación en estilo Javadoc      */
/*                                                                  */
/*  Revisión 1.1. 09/2005                                           */
/*  Versión inicial                                                 */
/*                                                                  */
/********************************************************************/

/******************************************************************************/
/* MÓDULO: Recuentos.c                                                        */
/*                                                                            */
/* Este módulo se encarga de contabilizar las operaciones y los diferentes    */
/* accesos a operandos.                                                       */
/******************************************************************************/
/* Fecha: 23 de septiembre de 2005                                            */
/******************************************************************************/

#include <stdio.h>
#include <string.h>
#include <malloc.h>

#include "defines.h"
#include "tipos.h"
#include "recuentos.h"


/* bases de datos */
extern unsigned int num_nemonicos;
extern operacion *nemonicos;
extern unsigned int num_simbolos;
extern operando *simbolos;
extern unsigned int num_tiempos;
extern tiempo *ciclos;

/* recuentos */
extern unsigned long int *contadornemonicos;
extern unsigned long int *contadorlecturas;
extern unsigned long int *contadorescrituras;


/* esta función hace una reserva de memoria para los contadores */
/* de recuentos de nemónicos y de accesos a operandos */

void CrearContadores()
{
    char mensaje[MAX_LINE];

    /* reservo memoria para los contadores de nemónicos */
    contadornemonicos = calloc(num_nemonicos, sizeof(unsigned long int));
    if (contadornemonicos == NULL)
    {
        sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
        Notificar(mensaje, ERROR_SALIR, ECO_NO);
        /* el programa finaliza si no hay memoria suficiente */
    }


    /* reservo memoria para los contadores de accesos a operandos */
    /* lecturas */
    contadorlecturas = calloc(num_simbolos, sizeof(unsigned long int));
    if (contadorlecturas == NULL)
    {
        sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
        Notificar(mensaje, ERROR_SALIR, ECO_NO);
        /* el programa finaliza si no hay memoria suficiente */
    }
    /* escrituras */
    contadorescrituras = calloc(num_simbolos, sizeof(unsigned long int));
    if (contadorlecturas == NULL)
    {
        sprintf(mensaje, "[CrearContadores] Memoria insuficiente");
        Notificar(mensaje, ERROR_SALIR, ECO_NO);
        /* el programa finaliza si no hay memoria suficiente */
    }
}


/* esta función actualiza los recuentos de operaciones y acceso a */
/* operandos explícitos; la contabilidad de los implícitos se puede */
/* obtener posteriormente a partir del recuento de nemónicos */

void ActualizarRecuentos(fichainstruccion *tarjetaoperandos)
{
    int id_nemo, id_simb;
    char mensaje[MAX_LINE], cadena[MAX_LINE];
    
    /* PREFIJO (si lo hay) */
    if(tarjetaoperandos->prefijo[0]!='\0')
    {
        id_nemo = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->prefijo);

        if(id_nemo == -1)
        {
            /* emito un error al fichero de log */ 
            sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->prefijo);
            Notificar(mensaje, ERROR_SALIR, ECO_NO);
        }

        /* incremento el contador para el nemónico en cuestión */
        contadornemonicos[id_nemo]++;
    }

    /* NEMÓNICO */
    id_nemo = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->nemonico);

    if(id_nemo == -1)
    {
        /* emito un error al fichero de log */ 
        sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico);
        Notificar(mensaje, ERROR_SALIR, ECO_NO);
    }

    /* incremento el contador para el nemónico en cuestión */
    contadornemonicos[id_nemo]++;


    /* OP2 (FUENTE) si lo hay */
    if(tarjetaoperandos->op2[0]!='\0')
    {
        strcpy(cadena, tarjetaoperandos->op2);
        NormalizarUbicacion(cadena);

        id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);

        if(id_simb == -1)
        {
            /* emito un error al fichero de log */ 
            sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena);
            Notificar(mensaje, ERROR_SALIR, ECO_NO);
        }

        /* incremento el contador para el símbolo en cuestión según el tipo de acceso */
        switch(nemonicos[id_nemo].modo_op2)
        {
            case LEIDOYESCRITO:        /* leido y escrito */
            contadorlecturas[id_simb]++;
            case ESCRITO:            /* escrito */
            contadorescrituras[id_simb]++;
            break;

            case LEIDO:                /* leido */
            contadorlecturas[id_simb]++;
            break;

            case NO_EXISTE:    /* no existe */
            /* emitir un error al fichero de log */
            sprintf(mensaje, "[ActualizarRecuentos] El operando no existe");
            Notificar(mensaje, ERROR_SALIR, ECO_NO);
            break;
        }
    }

    /* aquí se puede hacer una función ya que el código es igual al anterior */
    /* OP1 (DESTINO) si lo hay */
    if(tarjetaoperandos->op1[0]!='\0')
    {
        strcpy(cadena, tarjetaoperandos->op1);
        NormalizarUbicacion(cadena);

        id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena);

        if(id_simb == -1)
        {
            /* emito un error al fichero de log */ 
            sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena);
            Notificar(mensaje, ERROR_SALIR, ECO_NO);
        }

        /* incremento el contador para el símbolo en cuestión según el tipo de acceso */
        switch(nemonicos[id_nemo].modo_op1)
        {
            case LEIDOYESCRITO:        /* leido y escrito */
            contadorlecturas[id_simb]++;
            case ESCRITO:            /* escrito */
            contadorescrituras[id_simb]++;
            break;

            case LEIDO:                /* leido */
            contadorlecturas[id_simb]++;
            break;

            case NO_EXISTE:    /* no existe */
            /* emitir un error al fichero de log */
            sprintf(mensaje, "[ActualizarRecuentos] El operando no existe");
            Notificar(mensaje, ERROR_SALIR, ECO_NO);
            break;
        }
    }
    /* los accesos a memoria se pueden contabilizar también bajo el nombre 'MEM' */
}


/* esta función libera la memoria reservada para los contadores */

void LiberarMemoriaContadores()
{
    free(contadornemonicos);
    free(contadorlecturas);
    free(contadorescrituras);
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>