|
|
| 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); | |
| } |