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