File:  [Repository ATC2] / ADD_ver_10 / Attic / Recuentos.c
Revision 1.2: download - view: text, annotated - select for diffs
Wed Feb 15 13:00:30 2006 UTC (18 years, 7 months ago) by rico
Branches: MAIN
CVS tags: Version_10, HEAD
*** empty log message ***

/******************************************************************************/
/* 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>