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