File:  [Repository ATC2] / ADD_ver_10 / Attic / Recuentos.c
Revision 1.1: download - view: text, annotated - select for diffs
Thu Jan 19 17:16:29 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)   */
/*                                                                  */
/*  This file is part of ADD version 5.10.                          */
/*                                                                  */
/*  ADD is free software; you can redistribute it and/or modify     */
/*  it under the terms of the GNU General Public License as         */
/*  published by the Free Software Foundation; either version 2 of  */
/*  the License, or (at your option) any later version.             */
/*                                                                  */
/*  ADD 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   */
/*  GNU General Public License for more details.                    */
/*                                                                  */
/*  You should have received a copy of the GNU General Public       */
/*  License along with ADD; if not, write to the Free Software      */
/*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA        */
/*  02111-1307  USA                                                 */
/*                                                                  */
/*  --------------------------- History --------------------------- */
/*                                                                  */
/*  Revision 1.2. 01/2006                                           */
/*  Added GPL License and JavaDoc style documentation               */
/*                                                                  */
/*  Revision 1.1. 09/2005                                           */
/*  Initial Revision                                                */
/*                                                                  */
/********************************************************************/


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