|
|
| version 1.1, 2006/01/19 17:16:29 | version 1.2, 2006/02/15 13:00:30 |
|---|---|
| Line 22 | Line 22 |
| /* */ | /* */ |
| /* --------------------------- History --------------------------- */ | /* --------------------------- History --------------------------- */ |
| /* */ | /* */ |
| /* Revision 1.3. 02/2006 */ | |
| /* Fix overflow error in expresion evaluating 'cantidad' */ | |
| /* */ | |
| /* Revision 1.2. 01/2006 */ | /* Revision 1.2. 01/2006 */ |
| /* Added GPL License and JavaDoc style documentation */ | /* Added GPL License and JavaDoc style documentation */ |
| /* */ | /* */ |
| Line 29 | Line 32 |
| /* Initial Revision */ | /* Initial Revision */ |
| /* */ | /* */ |
| /********************************************************************/ | /********************************************************************/ |
| /******************************************************************************/ | /******************************************************************************/ |
| /* MÓDULO: Auxiliares.c */ | /* MÓDULO: Auxiliares.c */ |
| /* */ | /* */ |
| Line 74 int BDBuscarCadena(int idtabla, int idca | Line 75 int BDBuscarCadena(int idtabla, int idca |
| { | { |
| unsigned int i = 0; /* los registros de las bases de datos comienzan en el índice 0 */ | unsigned int i = 0; /* los registros de las bases de datos comienzan en el índice 0 */ |
| int encontrado = NO; | int encontrado = NO; |
| char mensaje[MAX_LINE]; | char mensaje[MAX_LINE]; |
| switch (idtabla) | switch (idtabla) |
| { | { |
| Line 91 int BDBuscarCadena(int idtabla, int idca | Line 92 int BDBuscarCadena(int idtabla, int idca |
| default: | default: |
| /* emitir un error al fichero de log */ | /* emitir un error al fichero de log */ |
| sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Nemónicos"); | sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Nemónicos"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| break; | break; |
| } | } |
| break; | break; |
| Line 110 int BDBuscarCadena(int idtabla, int idca | Line 111 int BDBuscarCadena(int idtabla, int idca |
| default: | default: |
| /* emitir un error al fichero de log */ | /* emitir un error al fichero de log */ |
| sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Símbolos"); | sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Símbolos"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| break; | break; |
| } | } |
| break; | break; |
| Line 129 int BDBuscarCadena(int idtabla, int idca | Line 130 int BDBuscarCadena(int idtabla, int idca |
| default: | default: |
| /* emitir un error al fichero de log */ | /* emitir un error al fichero de log */ |
| sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Ciclos"); | sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Ciclos"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| break; | break; |
| } | } |
| break; | break; |
| Line 148 int BDBuscarCadena(int idtabla, int idca | Line 149 int BDBuscarCadena(int idtabla, int idca |
| default: | default: |
| /* emitir un error al fichero de log */ | /* emitir un error al fichero de log */ |
| sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Ubicaciones"); | sprintf(mensaje, "[BDBuscarCadena] El campo no existe en la Tabla Ubicaciones"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| break; | break; |
| } | } |
| break; | break; |
| default: | default: |
| /* emitir un error al fichero de log */ | /* emitir un error al fichero de log */ |
| sprintf(mensaje, "[BDBuscarCadena] La tabla especificada no existe"); | sprintf(mensaje, "[BDBuscarCadena] La tabla especificada no existe"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| break; | break; |
| } | } |
| if(encontrado == NO) return(-1); | if(encontrado == NO) return(-1); |
| else return(i); | else return(i); |
| Line 180 void AgregarElementoLista(char *lista, c | Line 181 void AgregarElementoLista(char *lista, c |
| unsigned int BuscarElementoLista(char *lista, char *cadena) | unsigned int BuscarElementoLista(char *lista, char *cadena) |
| { | { |
| char copialista[MAX_LISTA]; | char copialista[MAX_LISTA]; |
| char *elemento; /* es un puntero a char para la función strtok */ | char *elemento; /* es un puntero a char para la función strtok */ |
| unsigned int indice = 1; | unsigned int indice = 1; |
| strcpy(copialista, lista); | strcpy(copialista, lista); |
| elemento = strtok(copialista, ":"); /* el separador de elementos de la lista es ':' */ | elemento = strtok(copialista, ":"); /* el separador de elementos de la lista es ':' */ |
| while(elemento != NULL) | while(elemento != NULL) |
| { | { |
| if(strcmp(elemento, cadena) == 0) return indice; | if(strcmp(elemento, cadena) == 0) return indice; |
| else indice++; | else indice++; |
| /* capturo el siguiente campo */ | /* capturo el siguiente campo */ |
| elemento = strtok(NULL, ":"); | elemento = strtok(NULL, ":"); |
| } | } |
| return 0; | return 0; |
| /* esta función se puede implementar también usando 'strstr' */ | /* esta función se puede implementar también usando 'strstr' */ |
| } | } |
| Line 205 unsigned int BuscarElementoLista(char *l | Line 206 unsigned int BuscarElementoLista(char *l |
| void EliminarElementoLista(char *lista, char *cadena) | void EliminarElementoLista(char *lista, char *cadena) |
| { | { |
| char *puntero; | char *puntero; |
| unsigned int indice1; | unsigned int indice1; |
| unsigned int indice2 = 1; | unsigned int indice2 = 1; |
| puntero = lista; | puntero = lista; |
| indice1 = BuscarElementoLista(lista, cadena); | indice1 = BuscarElementoLista(lista, cadena); |
| if(indice1 == 0) return; | if(indice1 == 0) return; |
| while(indice2 != indice1) | while(indice2 != indice1) |
| { | { |
| if(*puntero == ':') indice2++; | if(*puntero == ':') indice2++; |
| puntero++; | puntero++; |
| } | } |
| if(puntero != lista) /* el elemento no es el primero */ | if(puntero != lista) /* el elemento no es el primero */ |
| { | { |
| *(puntero - 1) = '\0'; /* corto la cadena en el separador antes del elemento */ | *(puntero - 1) = '\0'; /* corto la cadena en el separador antes del elemento */ |
| if(*(puntero + strlen(cadena)) == ':') /* el elemento no es el último */ | if(*(puntero + strlen(cadena)) == ':') /* el elemento no es el último */ |
| { | { |
| strcat(lista, (puntero + strlen(cadena))); | strcat(lista, (puntero + strlen(cadena))); |
| } | } |
| } | } |
| else strcpy(lista, (puntero + strlen(cadena) + 1)); | else strcpy(lista, (puntero + strlen(cadena) + 1)); |
| } | } |
| Line 237 void EliminarElementoLista(char *lista, | Line 238 void EliminarElementoLista(char *lista, |
| void IniciarTarjeta(fichainstruccion *tarjetaoperandos) | void IniciarTarjeta(fichainstruccion *tarjetaoperandos) |
| { | { |
| strcpy(tarjetaoperandos->nemonico, ""); | strcpy(tarjetaoperandos->nemonico, ""); |
| strcpy(tarjetaoperandos->op1, ""); | strcpy(tarjetaoperandos->op1, ""); |
| strcpy(tarjetaoperandos->op2, ""); | strcpy(tarjetaoperandos->op2, ""); |
| strcpy(tarjetaoperandos->hexadecimal, ""); | strcpy(tarjetaoperandos->hexadecimal, ""); |
| Line 270 void IniciarTarjeta(fichainstruccion *ta | Line 271 void IniciarTarjeta(fichainstruccion *ta |
| unsigned long TamanoFichero(char *fichero) | unsigned long TamanoFichero(char *fichero) |
| { | { |
| FILE *handle; | FILE *handle; |
| unsigned long tamano = 0; | unsigned long tamano = 0; |
| char mensaje[MAX_LINE]; | char mensaje[MAX_LINE]; |
| if((handle = fopen(fichero, "rb")) != NULL) | if((handle = fopen(fichero, "rb")) != NULL) |
| { | { |
| /* | /* |
| sprintf(mensaje, "[TamañoFichero] El fichero '%s' se ha abierto con éxito", fichero); | sprintf(mensaje, "[TamañoFichero] El fichero '%s' se ha abierto con éxito", fichero); |
| Notificar(mensaje, NO_ERROR, ECO_NO); | Notificar(mensaje, NO_ERROR, ECO_NO); |
| */ | */ |
| fseek(handle, 0L, SEEK_END); | fseek(handle, 0L, SEEK_END); |
| tamano = ftell(handle); | tamano = ftell(handle); |
| /* cierro el fichero */ | /* cierro el fichero */ |
| if(fclose(handle)) | if(fclose(handle)) |
| { | { |
| sprintf(mensaje, "[TamañoFichero] El fichero '%s' no se ha podido cerrar", fichero); | sprintf(mensaje, "[TamañoFichero] El fichero '%s' no se ha podido cerrar", fichero); |
| Notificar(mensaje, ERROR_SEGUIR, ECO_NO); | Notificar(mensaje, ERROR_SEGUIR, ECO_NO); |
| } | } |
| } | } |
| else | else |
| { | { |
| sprintf(mensaje, "[TamañoFichero] El fichero '%s' no se ha podido abrir", fichero); | sprintf(mensaje, "[TamañoFichero] El fichero '%s' no se ha podido abrir", fichero); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| return tamano; | return tamano; |
| } | } |
| void DeterminarRango() | void DeterminarRango() |
| { | { |
| unsigned long total_instrucciones; /* total en la traza */ | unsigned long total_instrucciones; /* total en la traza */ |
| unsigned long cantidad; /* cantidad a analizar */ | unsigned long cantidad; /* cantidad a analizar */ |
| char mensaje[MAX_LINE]; | char mensaje[MAX_LINE]; |
| /* calculo la cantidad de instrucciones en la traza a partir del tamaño del fichero */ | /* calculo la cantidad de instrucciones en la traza a partir del tamaño del fichero */ |
| total_instrucciones = TamanoFichero(configuracion.ficherodatos)/BYTES_POR_INSTRUCCION; | total_instrucciones = TamanoFichero(configuracion.ficherodatos)/BYTES_POR_INSTRUCCION; |
| /* | /* |
| printf("Total instrucciones en '%s' = %lu\n", configuracion.ficherodatos, total_instrucciones); | printf("Total instrucciones en '%s' = %lu\n", configuracion.ficherodatos, total_instrucciones); |
| _getch(); | _getch(); |
| */ | */ |
| if(configuracion.ultima == 0) /* significa que manda el rango */ | if(configuracion.ultima == 0) /* significa que manda el rango */ |
| { | { |
| cantidad = (unsigned long)(configuracion.rango * total_instrucciones)/100.00; | /* cantidad = (unsigned long)(configuracion.rango * total_instrucciones)/100.00; */ |
| if(configuracion.primera == 0) /* significa que manda el porcentaje de comienzo */ | cantidad = (unsigned long)((configuracion.rango/100.00) * total_instrucciones); |
| configuracion.primera = (unsigned long) 1 + (configuracion.comienzo * total_instrucciones)/100.00; | |
| /* la cuenta de instrucciones comienza en '1' */ | |
| if(configuracion.primera == 0) /* significa que manda el porcentaje de comienzo */ | |
| else if(configuracion.primera > total_instrucciones) | |
| { | /* configuracion.primera = (unsigned long) 1 + (configuracion.comienzo * total_instrucciones)/100.00; */ |
| sprintf(mensaje, "[DeterminarRango] La primera instrucción está fuera del fichero de datos"); | |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | configuracion.primera = (unsigned long) 1 + (configuracion.comienzo/100.00) * total_instrucciones; |
| } | /* la cuenta de instrucciones comienza en '1' */ |
| configuracion.ultima = configuracion.primera + cantidad; | |
| if(configuracion.ultima > total_instrucciones) configuracion.ultima = total_instrucciones; | else if(configuracion.primera > total_instrucciones) |
| } | { |
| sprintf(mensaje, "[DeterminarRango] La primera instrucción está fuera del fichero de datos"); | |
| cantidad = configuracion.ultima - configuracion.primera + 1; | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | |
| if(cantidad < configuracion.ventana) | configuracion.ultima = configuracion.primera + cantidad; |
| { | if(configuracion.ultima > total_instrucciones) configuracion.ultima = total_instrucciones; |
| sprintf(mensaje, "[DeterminarRango] El rango de análisis es demasiado pequeño"); | } |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | |
| } | cantidad = configuracion.ultima - configuracion.primera + 1; |
| if(cantidad < configuracion.ventana) | |
| { | |
| sprintf(mensaje, "[DeterminarRango] El rango de análisis es demasiado pequeño"); | |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | |
| } | |
| } | } |
| Line 353 void DeterminarRango() | Line 360 void DeterminarRango() |
| double CalcularNuevoPromedio (double promedioanterior, double valoractual, unsigned long n) | double CalcularNuevoPromedio (double promedioanterior, double valoractual, unsigned long n) |
| { | { |
| double nuevopromedio; | double nuevopromedio; |
| /* nuevopromedio = ((n - 1) * promedioanterior + valoractual) / n; */ | |
| nuevopromedio = ((n - 1) * promedioanterior + valoractual) / n; | nuevopromedio = promedioanterior + (double)((valoractual - promedioanterior) / n); |
| return nuevopromedio; | return nuevopromedio; |
| } | } |
| Line 365 double CalcularNuevoPromedio (double pro | Line 374 double CalcularNuevoPromedio (double pro |
| double InversoNormalizado (unsigned int dimension, double valor) | double InversoNormalizado (unsigned int dimension, double valor) |
| { | { |
| double inverso; | double inverso; |
| char mensaje[MAX_LINE]; | char mensaje[MAX_LINE]; |
| if(valor == 0.0) | if(valor == 0.0) |
| { | { |
| sprintf(mensaje, "[InversoNormalizado] El valor del denominador es nulo"); | sprintf(mensaje, "[InversoNormalizado] El valor del denominador es nulo"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| if(dimension == 0) | if(dimension == 0) |
| { | { |
| sprintf(mensaje, "[InversoNormalizado] La dimensión de la normalización es nula"); | sprintf(mensaje, "[InversoNormalizado] La dimensión de la normalización es nula"); |
| Notificar(mensaje, ERROR_SEGUIR, ECO_NO); | Notificar(mensaje, ERROR_SEGUIR, ECO_NO); |
| } | } |
| inverso = dimension / valor; | inverso = dimension / valor; |
| return inverso; | return inverso; |
| } | } |
| Line 395 double InversoNormalizado (unsigned int | Line 404 double InversoNormalizado (unsigned int |
| void CadenaEnsamblador(char *prefijo, char *nemonico, char *operando1, char *operando2, unsigned char notacion, char *cadena) | void CadenaEnsamblador(char *prefijo, char *nemonico, char *operando1, char *operando2, unsigned char notacion, char *cadena) |
| { | { |
| char auxiliar[2*MAX_NEMO + 2*MAX_OPE]; | char auxiliar[2*MAX_NEMO + 2*MAX_OPE]; |
| switch(notacion) | switch(notacion) |
| { | { |
| case 0: /* notación de INTEL */ | case 0: /* notación de INTEL */ |
| sprintf(cadena, "%s%s", prefijo, prefijo[0]!='\0' ? " ":""); | sprintf(cadena, "%s%s", prefijo, prefijo[0]!='\0' ? " ":""); |
| sprintf(auxiliar, "%s", nemonico); | sprintf(auxiliar, "%s", nemonico); |
| strcat(cadena, auxiliar); | strcat(cadena, auxiliar); |
| sprintf(auxiliar, "%s%s", operando1[0]!='\0' ? " ":"", operando1); | sprintf(auxiliar, "%s%s", operando1[0]!='\0' ? " ":"", operando1); |
| strcat(cadena, auxiliar); | strcat(cadena, auxiliar); |
| sprintf(auxiliar, "%s%s%s", (operando1[0]!='\0' && operando2[0]!='\0') ? ",":"", operando2[0]!='\0' ? " ":"", operando2); | sprintf(auxiliar, "%s%s%s", (operando1[0]!='\0' && operando2[0]!='\0') ? ",":"", operando2[0]!='\0' ? " ":"", operando2); |
| strcat(cadena, auxiliar); | strcat(cadena, auxiliar); |
| /* más elegante usar el índice que devuelve sprintf y sumarlo al puntero cadena */ | /* más elegante usar el índice que devuelve sprintf y sumarlo al puntero cadena */ |
| /* sprintf(cadena + i, ""... */ | /* sprintf(cadena + i, ""... */ |
| break; | break; |
| case 1: /* notación ATT */ | case 1: /* notación ATT */ |
| break; | break; |
| } | } |
| } | } |
| Line 426 void CadenaEnsamblador(char *prefijo, ch | Line 435 void CadenaEnsamblador(char *prefijo, ch |
| void ConvertirHex2Bin(char *cadenahex, unsigned char *secuencia, unsigned char maxformato) | void ConvertirHex2Bin(char *cadenahex, unsigned char *secuencia, unsigned char maxformato) |
| { | { |
| int i; | int i; |
| char bytehex[3]; | char bytehex[3]; |
| char mensaje[MAX_LINE]; | char mensaje[MAX_LINE]; |
| /* control de errores */ | /* control de errores */ |
| if(strlen(cadenahex)==0) | if(strlen(cadenahex)==0) |
| { | { |
| sprintf(mensaje, "[ConvertirHex2Bin] La cadena hexadecimal está vacía"); | sprintf(mensaje, "[ConvertirHex2Bin] La cadena hexadecimal está vacía"); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| else if(strlen(cadenahex)%2!=0) | else if(strlen(cadenahex)%2!=0) |
| { | { |
| sprintf(mensaje, "[ConvertirHex2Bin] La cadena hexadecimal '%s' no contiene un número entero de bytes", cadenahex); | sprintf(mensaje, "[ConvertirHex2Bin] La cadena hexadecimal '%s' no contiene un número entero de bytes", cadenahex); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| /* relleno la secuencia de 2 instrucciones en binario con 0s */ | /* relleno la secuencia de 2 instrucciones en binario con 0s */ |
| /* (2 instrucciones de tamaño máximo 'maxformato') */ | /* (2 instrucciones de tamaño máximo 'maxformato') */ |
| for(i=0; i<2*maxformato; i++) *(secuencia+i) = 0; | for(i=0; i<2*maxformato; i++) *(secuencia+i) = 0; |
| do | do |
| { | { |
| for(i=0; i<2; i++) | for(i=0; i<2; i++) |
| { | { |
| bytehex[i]=*(cadenahex+i); | bytehex[i]=*(cadenahex+i); |
| if(isxdigit(bytehex[i])==0) /* error -> dígito no hexadecimal */ | if(isxdigit(bytehex[i])==0) /* error -> dígito no hexadecimal */ |
| { | { |
| sprintf(mensaje, "[ConvertirHex2Bin] El byte '%s' contiene un dígito no hexadecimal", cadenahex); | sprintf(mensaje, "[ConvertirHex2Bin] El byte '%s' contiene un dígito no hexadecimal", cadenahex); |
| Notificar(mensaje, ERROR_SALIR, ECO_NO); | Notificar(mensaje, ERROR_SALIR, ECO_NO); |
| } | } |
| } | } |
| bytehex[3]='\0'; | bytehex[3]='\0'; |
| sscanf(bytehex, "%2X", secuencia); | sscanf(bytehex, "%2X", secuencia); |
| secuencia++; | secuencia++; |
| } | } |
| while(*(cadenahex+=2)!='\0'); | while(*(cadenahex+=2)!='\0'); |
| } | } |
| /* NOTA: otra posibilidad para esta función consiste en copiar la cadena hexadecimal */ | /* NOTA: otra posibilidad para esta función consiste en copiar la cadena hexadecimal */ |