version 1.1, 2006/01/19 17:16:29
|
version 1.2, 2006/02/15 13:00:30
|
Line 1
|
Line 1
|
/********************************************************************/ |
|
/* 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 */ |
/* MÓDULO: Recuentos.c */ |
/* */ |
/* */ |
Line 68 extern unsigned long int *contadorescrit
|
Line 35 extern unsigned long int *contadorescrit
|
|
|
void CrearContadores() |
void CrearContadores() |
{ |
{ |
char mensaje[MAX_LINE]; |
char mensaje[MAX_LINE]; |
|
|
/* reservo memoria para los contadores de nemónicos */ |
/* reservo memoria para los contadores de nemónicos */ |
contadornemonicos = calloc(num_nemonicos, sizeof(unsigned long int)); |
contadornemonicos = calloc(num_nemonicos, sizeof(unsigned long int)); |
if (contadornemonicos == NULL) |
if (contadornemonicos == NULL) |
{ |
{ |
sprintf(mensaje, "[CrearContadores] Memoria insuficiente"); |
sprintf(mensaje, "[CrearContadores] Memoria insuficiente"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
/* el programa finaliza si no hay memoria suficiente */ |
/* el programa finaliza si no hay memoria suficiente */ |
} |
} |
|
|
|
|
/* reservo memoria para los contadores de accesos a operandos */ |
/* reservo memoria para los contadores de accesos a operandos */ |
/* lecturas */ |
/* lecturas */ |
contadorlecturas = calloc(num_simbolos, sizeof(unsigned long int)); |
contadorlecturas = calloc(num_simbolos, sizeof(unsigned long int)); |
if (contadorlecturas == NULL) |
if (contadorlecturas == NULL) |
{ |
{ |
sprintf(mensaje, "[CrearContadores] Memoria insuficiente"); |
sprintf(mensaje, "[CrearContadores] Memoria insuficiente"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
/* el programa finaliza si no hay memoria suficiente */ |
/* el programa finaliza si no hay memoria suficiente */ |
} |
} |
/* escrituras */ |
/* escrituras */ |
contadorescrituras = calloc(num_simbolos, sizeof(unsigned long int)); |
contadorescrituras = calloc(num_simbolos, sizeof(unsigned long int)); |
if (contadorlecturas == NULL) |
if (contadorlecturas == NULL) |
{ |
{ |
sprintf(mensaje, "[CrearContadores] Memoria insuficiente"); |
sprintf(mensaje, "[CrearContadores] Memoria insuficiente"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
/* el programa finaliza si no hay memoria suficiente */ |
/* el programa finaliza si no hay memoria suficiente */ |
} |
} |
} |
} |
|
|
Line 107 void CrearContadores()
|
Line 74 void CrearContadores()
|
void ActualizarRecuentos(fichainstruccion *tarjetaoperandos) |
void ActualizarRecuentos(fichainstruccion *tarjetaoperandos) |
{ |
{ |
int id_nemo, id_simb; |
int id_nemo, id_simb; |
char mensaje[MAX_LINE], cadena[MAX_LINE]; |
char mensaje[MAX_LINE], cadena[MAX_LINE]; |
|
|
/* PREFIJO (si lo hay) */ |
/* PREFIJO (si lo hay) */ |
if(tarjetaoperandos->prefijo[0]!='\0') |
if(tarjetaoperandos->prefijo[0]!='\0') |
{ |
{ |
id_nemo = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->prefijo); |
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 */ |
if(id_nemo == -1) |
id_nemo = BDBuscarCadena(TABLA_NEMONICOS, CAMPO_NEMONICO, tarjetaoperandos->nemonico); |
{ |
|
/* 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) |
if(id_nemo == -1) |
{ |
{ |
/* emito un error al fichero de log */ |
/* emito un error al fichero de log */ |
sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico); |
sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Nemónicos", tarjetaoperandos->nemonico); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
} |
} |
|
|
/* incremento el contador para el nemónico en cuestión */ |
/* incremento el contador para el nemónico en cuestión */ |
contadornemonicos[id_nemo]++; |
contadornemonicos[id_nemo]++; |
|
|
|
|
/* OP2 (FUENTE) si lo hay */ |
/* OP2 (FUENTE) si lo hay */ |
if(tarjetaoperandos->op2[0]!='\0') |
if(tarjetaoperandos->op2[0]!='\0') |
{ |
{ |
strcpy(cadena, tarjetaoperandos->op2); |
strcpy(cadena, tarjetaoperandos->op2); |
NormalizarUbicacion(cadena); |
NormalizarUbicacion(cadena); |
|
|
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
|
|
if(id_simb == -1) |
if(id_simb == -1) |
{ |
{ |
/* emito un error al fichero de log */ |
/* emito un error al fichero de log */ |
sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
} |
} |
|
|
/* incremento el contador para el símbolo en cuestión según el tipo de acceso */ |
/* incremento el contador para el símbolo en cuestión según el tipo de acceso */ |
switch(nemonicos[id_nemo].modo_op2) |
switch(nemonicos[id_nemo].modo_op2) |
{ |
{ |
case LEIDOYESCRITO: /* leido y escrito */ |
case LEIDOYESCRITO: /* leido y escrito */ |
contadorlecturas[id_simb]++; |
contadorlecturas[id_simb]++; |
case ESCRITO: /* escrito */ |
case ESCRITO: /* escrito */ |
contadorescrituras[id_simb]++; |
contadorescrituras[id_simb]++; |
break; |
break; |
|
|
case LEIDO: /* leido */ |
case LEIDO: /* leido */ |
contadorlecturas[id_simb]++; |
contadorlecturas[id_simb]++; |
break; |
break; |
|
|
case NO_EXISTE: /* no existe */ |
case NO_EXISTE: /* no existe */ |
/* emitir un error al fichero de log */ |
/* emitir un error al fichero de log */ |
sprintf(mensaje, "[ActualizarRecuentos] El operando no existe"); |
sprintf(mensaje, "[ActualizarRecuentos] El operando no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
} |
} |
|
|
/* aquí se puede hacer una función ya que el código es igual al anterior */ |
/* aquí se puede hacer una función ya que el código es igual al anterior */ |
/* OP1 (DESTINO) si lo hay */ |
/* OP1 (DESTINO) si lo hay */ |
if(tarjetaoperandos->op1[0]!='\0') |
if(tarjetaoperandos->op1[0]!='\0') |
{ |
{ |
strcpy(cadena, tarjetaoperandos->op1); |
strcpy(cadena, tarjetaoperandos->op1); |
NormalizarUbicacion(cadena); |
NormalizarUbicacion(cadena); |
|
|
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
|
|
if(id_simb == -1) |
if(id_simb == -1) |
{ |
{ |
/* emito un error al fichero de log */ |
/* emito un error al fichero de log */ |
sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
sprintf(mensaje, "[ActualizarRecuentos] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
} |
} |
|
|
/* incremento el contador para el símbolo en cuestión según el tipo de acceso */ |
/* incremento el contador para el símbolo en cuestión según el tipo de acceso */ |
switch(nemonicos[id_nemo].modo_op1) |
switch(nemonicos[id_nemo].modo_op1) |
{ |
{ |
case LEIDOYESCRITO: /* leido y escrito */ |
case LEIDOYESCRITO: /* leido y escrito */ |
contadorlecturas[id_simb]++; |
contadorlecturas[id_simb]++; |
case ESCRITO: /* escrito */ |
case ESCRITO: /* escrito */ |
contadorescrituras[id_simb]++; |
contadorescrituras[id_simb]++; |
break; |
break; |
|
|
case LEIDO: /* leido */ |
case LEIDO: /* leido */ |
contadorlecturas[id_simb]++; |
contadorlecturas[id_simb]++; |
break; |
break; |
|
|
case NO_EXISTE: /* no existe */ |
case NO_EXISTE: /* no existe */ |
/* emitir un error al fichero de log */ |
/* emitir un error al fichero de log */ |
sprintf(mensaje, "[ActualizarRecuentos] El operando no existe"); |
sprintf(mensaje, "[ActualizarRecuentos] El operando no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
} |
} |
/* los accesos a memoria se pueden contabilizar también bajo el nombre 'MEM' */ |
/* los accesos a memoria se pueden contabilizar también bajo el nombre 'MEM' */ |
} |
} |
|
|
|
|
Line 219 void ActualizarRecuentos(fichainstruccio
|
Line 186 void ActualizarRecuentos(fichainstruccio
|
|
|
void LiberarMemoriaContadores() |
void LiberarMemoriaContadores() |
{ |
{ |
free(contadornemonicos); |
|
free(contadorlecturas); |
|
free(contadorescrituras); |
|
} |
|
|
|
|
free(contadornemonicos); |
|
free(contadorlecturas); |
|
free(contadorescrituras); |
|
} |