/********************************************************************/
/* Configuracion.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: Configuracion.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: Configuracion.c */
/* */
/* Este módulo contiene las funciones relacionadas con la configuración. */
/******************************************************************************/
/* Fecha: 28 de septiembre de 2005 */
/******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "defines.h"
#include "tipos.h"
#include "ayuda.h"
#include "configuracion.h"
/* configuración */
extern struct argumentos configuracion;
/* función que realiza la validación de los parámetros de configuración */
/* introducidos por cualquiera de los medios previstos */
void ValidarConfiguracion()
{
char mensaje[MAX_LINE];
/* si necesito fichero de configuración y no lo tengo */
/* capturo el nombre del fichero de configuración */
if(strcmp(configuracion.captura, "Por fichero") == 0 && strcmp(configuracion.ficheroconfig, "") == 0)
{
printf("Introduzca el nombre del fichero de configuración\n\n->\t");
scanf("%s", configuracion.ficheroconfig);
sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de configuración");
Notificar(mensaje, NO_ERROR, ECO_NO);
}
/* si no tengo fichero de nemónicos */
if(strcmp(configuracion.ficheronemos, "") == 0)
{
printf("Introduzca el nombre del fichero de operaciones\n\n->\t");
scanf("%s", configuracion.ficheronemos);
sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de operaciones");
Notificar(mensaje, NO_ERROR, ECO_NO);
}
/* si no tengo fichero de operandos */
if(strcmp(configuracion.ficheroubis, "") == 0)
{
printf("Introduzca el nombre del fichero de operandos\n\n->\t");
scanf("%s", configuracion.ficheroubis);
sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de operandos");
Notificar(mensaje, NO_ERROR, ECO_NO);
}
/* si necesito el fichero de ciclos del procesador */
/* y no lo tengo */
if(configuracion.cpi == SI && strcmp(configuracion.ficherociclos, "") == 0)
{
printf("Introduzca el nombre del fichero de procesador\n\n->\t");
scanf("%s", configuracion.ficherociclos);
sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de procesador");
Notificar(mensaje, NO_ERROR, ECO_NO);
}
/* si no tengo fichero de datos */
if(configuracion.origen != CADENAHEX && strcmp(configuracion.ficherodatos, "") == 0)
{
printf("Introduzca el nombre del fichero de datos\n\n->\t");
scanf("%s", configuracion.ficherodatos);
sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de datos");
Notificar(mensaje, NO_ERROR, ECO_NO);
}
/* si el origen de datos es una única instrucción */
/* anulo el análisis de dependencias de datos */
if(configuracion.origen == CADENAHEX) configuracion.dependencias = NO;
/* validación del rango */
if(configuracion.rango > 100.00) configuracion.rango = 100.00;
else if(configuracion.rango < 1.00) configuracion.rango = 1.00;
/* validación del comienzo */
if(configuracion.comienzo > 100.00) configuracion.comienzo = 100.00;
/* el porcentaje de comienzo puede ser 0 */
/* si doy instrucción final se supone que tengo una inicial */
if(configuracion.ultima != 0)
{
if(configuracion.primera == 0) configuracion.primera = 1;
/* la cuenta de instrucciones comienza en '1' */
}
/* si el tamaño de ventana de instrucciones es nulo pido un valor */
if(configuracion.ventana == 0)
{
/* capturo el tamaño de la ventana de instrucciones */
printf("Introduzca el tamaño de la ventana de instrucciones[1 - %d]\n\n->\t", MAX_VENTANA);
scanf("%d", &configuracion.ventana);
}
/* si la ventana es mayor que el máximo permitido pongo el máximo */
if(configuracion.ventana > MAX_VENTANA) configuracion.ventana = MAX_VENTANA;
/* si la ventana es de 1 instrucción anulo el análisis de dependencias de datos */
if(configuracion.ventana == 1) configuracion.dependencias = NO;
/* si la ventana es mayor de 32 instrucciones no construyo ficheros */
/* para volcar información de las ventanas ya que no caben */
if(configuracion.ventana > 32) strcpy(configuracion.volcarventana, "");
/* si no considero ningún tipo no hago análisis de dependencias */
if(configuracion.verdaderas == NO &&
configuracion.antidependencias == NO &&
configuracion.verdaderas == NO) configuracion.dependencias = NO;
if(configuracion.explicitos == NO &&
configuracion.implicitos == NO) configuracion.dependencias = NO;
if(configuracion.datos == NO &&
configuracion.direcciones == NO &&
configuracion.pila == NO &&
configuracion.cc == NO) configuracion.dependencias = NO;
/* los desacoplos y sus matrices llevan un orden */
/* mapa de posibles matrices */
/* tipo origen fuente */
/* SI SI SI */
/* SI SI NO */
/* SI NO NO */
/* NO NO NO */ /* -> por defecto no se desacopla nada */
if(configuracion.desacoplarorigen == SI)
{
configuracion.desacoplartipos = SI;
}
if(configuracion.desacoplarfuentes == SI)
{
configuracion.desacoplarorigen = SI;
configuracion.desacoplartipos = SI;
}
/* calcular CPI medio implica asignar CPI a cada instrucción */
if(configuracion.CPImedio == SI) configuracion.cpi = SI;
/* calcular tiempo de ejecución implica asignar CPI a cada */
/* y calcular las dependencias de datos entre instrucción */
if(configuracion.tiempo == SI)
{
configuracion.cpi = SI;
configuracion.dependencias = SI;
}
/* calculos relativos al análisis de dependencias */
if(configuracion.ordenparcial == SI) configuracion.dependencias = SI;
if(configuracion.matrizcaminos == SI) configuracion.dependencias = SI;
if(configuracion.pasoscomputacion == SI) configuracion.dependencias = SI;
if(configuracion.gradoparalelismo == SI)
{
configuracion.pasoscomputacion = SI;
configuracion.dependencias = SI;
}
if(configuracion.acoplamiento == SI) configuracion.dependencias = SI;
if(configuracion.distribucionpasos == SI)
{
configuracion.pasoscomputacion = SI;
configuracion.dependencias = SI;
}
/* si no quiero calcular nada anulo el análisis de dependencias */
if(configuracion.tiempo == NO &&
configuracion.ordenparcial == NO &&
configuracion.matrizcaminos == NO &&
configuracion.pasoscomputacion == NO &&
configuracion.gradoparalelismo == NO &&
configuracion.acoplamiento == NO &&
configuracion.distribucionpasos == NO) configuracion.dependencias = NO;
/* si he de crear un fichero de configuración nuevo */
/* y no tengo nombre solicito uno nuevo */
if(configuracion.crearficheroconfig == SI && strcmp(configuracion.nuevoficheroconfig, "") == 0)
{
printf("Introduzca el nombre del nuevo fichero de configuración\n\n->\t");
scanf("%s", configuracion.nuevoficheroconfig);
sprintf(mensaje, "[ValidarConfiguracion] Se solicita nuevo fichero de configuración");
Notificar(mensaje, NO_ERROR, ECO_NO);
}
}
/* función que carga la configuración por defecto de la aplicación */
void CargarConfiguracionInicial()
{
/* OBSERVACIONES (tipo de captura de configuración) */
strcpy(configuracion.captura, "Por defecto");
/* FICHERO DE CONFIGURACIÓN POR DEFECTO */
/* ruta del fichero de configuración (si se usa sin indicar ruta) */
strcpy(configuracion.ficheroconfig, "configuracion.cfg");
/* FICHEROS DE BASE DE DATOS */
/* ARQUITECTURA: fichero de operaciones */
strcpy(configuracion.ficheronemos, "IA16-nemos.isa");
/* ARQUITECTURA: fichero de símbolos */
strcpy(configuracion.ficheroubis, "IA16-ubis.isa");
/* PROCESADOR: fichero de ciclos */
strcpy(configuracion.ficherociclos, "uP-8086-01.pro");
/* ORIGEN DE DATOS */
/* código de origen de datos */
/* 0: TRAZA; 1: SECUENCIA; 2: CADENAHEX */
/* si es CADENAHEX no se hace análisis de dependencias) */
configuracion.origen = TRAZA;
/* fichero de origen de datos -si existe- */
strcpy(configuracion.ficherodatos, "comp.trz");
/* instrucción en hexadecimal */
strcpy(configuracion.cadenahex, "");
/* porcentaje a analizar -sólo TRAZA- */
configuracion.rango = 100.00;
/* comienzo en porcentaje -sólo TRAZA- */
configuracion.comienzo = 0.00;
/* instrucción de comienzo */
configuracion.primera = 0;
/* instrucción de final */
configuracion.ultima = 0;
/* EVALUAR */
/* ¿hacer recuentos? */
configuracion.recuentos = NO;
/* ¿asignar ciclos a cada instrucción? */
configuracion.cpi = NO;
/* ¿hacer análisis de dependencias de datos? */
configuracion.dependencias = SI;
/* PARÁMETROS DE ANÁLISIS DE DEPENDENCIAS DE DATOS */
/* tamaño de la ventana de instrucciones (si es 1 no se hace análisis de dependencias) */
configuracion.ventana = 32;
/* tipos de ubicaciones a incluir en la pizarra de dependencias */
strcpy(configuracion.listaubis, "0:1:2:3");
/* ¿desacoplar tipos de dependencias? */
configuracion.desacoplartipos = NO;
/* ¿considerar dependencias verdaderas? */
configuracion.verdaderas = SI;
/* ¿considerar antidependencias? */
configuracion.antidependencias = SI;
/* ¿considerar dependencias de salida? */
configuracion.salida = SI;
/* ¿desacoplar implìcitas-explícitas? */
configuracion.desacoplarorigen = NO;
/* ¿considerar explícitas? */
configuracion.explicitos = SI;
/* ¿considerar implícitas? */
configuracion.implicitos = SI;
/* ¿desacoplar fuentes de dependencias? */
configuracion.desacoplarfuentes = NO;
/* ¿origen de dependencias de datos? */
configuracion.datos = SI;
/* ¿origen de dependencias de direcciones? */
configuracion.direcciones = SI;
/* ¿origen de dependencias de pila? */
configuracion.pila = SI;
/* ¿origen de dependencias de códigos de condición? */
configuracion.cc = SI;
/* CALCULAR */
/* ¿calcular CPI medio? (requiere asignación de CPI) */
configuracion.CPImedio = NO;
/* ¿calcular tiempo de ejecución? (requiere asignación de CPI) */
configuracion.tiempo = NO;
/* ¿obtener orden parcial? (requiere evaluación de dependencias) */
configuracion.ordenparcial = NO;
/* ¿calcular la matriz de caminos? (requiere evaluación de dependencias) */
/*(tarea gran consumidora de tiempo) */
configuracion.matrizcaminos = NO;
/* ¿determinar pasos de computación? (requiere evaluación de dependencias) */
configuracion.pasoscomputacion = SI;
/* ¿determinar grado de paralelismo? (requiere evaluación de dependencias y pasos de computación) */
configuracion.gradoparalelismo = NO;
/* ¿determinar acoplamiento? (requiere evaluación de dependencias) */
configuracion.acoplamiento = NO;
/* ¿salvar el histograma de pasos de computación para la matriz D? */
configuracion.distribucionpasos = NO;
/* CONFIGURACIÓN DEL INFORME */
/* salvar bases de datos en ficheros EXCEL */
configuracion.volcarBD = NO;
/* volcar configuracion en un fichero nuevo */
configuracion.crearficheroconfig = NO;
/* nombre del nuevo fichero de configuración */
strcpy(configuracion.nuevoficheroconfig, "nuevoconfig");
/* salvar listado de ventanas en formato EXCEL */
strcpy(configuracion.volcarventana, "");
/* fichero de resultados en formato EXCEL */
strcpy(configuracion.ficheroresultados, "resultados");
/* nivel de gravedad de los mensajes volcados en el log */
configuracion.nivelnotificaciones = ALL;
/* (el nivel inicial es el de mayor notificación) */
/* INTERFASE GRÁFICA */
/* ver instrucción en pantalla */
configuracion.verinstruccion = NO;
/* ver ventana en pantalla */
configuracion.verventana = NO;
ValidarConfiguracion();
}
/* función que carga la configuración desde un fichero */
/* el fichero de configuración no tiene que tener todas las claves */
void CargarConfiguracionFichero()
{
FILE *handle;
char fichero[MAX_LINE];
char linea[MAX_LINE];
char mensaje[MAX_LINE];
char *campo;
int i;
char encontrado;
char *inicio, *final;
/* nombre del fichero de configuración */
strcpy(fichero, configuracion.ficheroconfig);
/* abro el fichero de configuración*/
if((handle = fopen(fichero, "r")) != NULL)
{
sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' se ha abierto con éxito", fichero);
Notificar(mensaje, NO_ERROR, ECO_NO);
while(!feof(handle))
{
fgets (linea, MAX_LINE, handle);
/* quito el caracter '\n' (0x0a) final de la línea */
/* OJO: si abro en modo binario me encuentro "\r\n" (0x0d 0x0a) */
*(linea+strlen(linea)-1)='\0';
/* si no es ni comentario ni línea en blanco */
if(linea[0]!='[' && linea[0]!='\0')
{
campo = strtok(linea, "=");
/* limpio de espacios en blanco por delante y por detrás */
inicio = campo; while(*inicio++==' '); campo = inicio - 1;
final = campo + strlen(campo); while(*--final==' '); *(final+1)='\0';
i = 0;
encontrado = NO;
while(i<NUM_CLAVES && encontrado == NO)
{
/* solución si 'campo' tiene espacios en blanco */
/* if (strncmp(campo, claves[i], strlen(claves[i]))) i++; */
/* solución si 'campo' no tiene espacios en blanco */
if (strcmp(campo, claves[i])) i++; /* no encontrado */
else encontrado = SI; /* encontrado */
}
if(encontrado == NO)
{
sprintf(mensaje, "No se ha encontrado la clave del fichero de configuración");
Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
}
else
{
campo = strtok(NULL, "=");
/* limpio de espacios en blanco por delante y por detrás */
inicio = campo; while(*inicio++==' '); campo = inicio - 1;
final = campo + strlen(campo); while(*--final==' '); *(final+1)='\0';
/* limpio las comillas simples si están */
inicio = strchr(campo, '\'');
if(inicio!=NULL) {campo = inicio + 1; final = strrchr(campo, '\''); if(final!=NULL) *final = '\0';}
switch(i)
{
case 0: /* CAPTURA DE CONFIGURACIÓN */
strcpy(configuracion.captura, campo);
break;
case 1: /* FICHERO DE CONFIGURACIÓN */
strcpy(configuracion.ficheroconfig, campo);
break;
case 2: /* FICHERO DE OPERACIONES */
strcpy(configuracion.ficheronemos, campo);
break;
case 3: /* FICHERO DE SÍMBOLOS */
strcpy(configuracion.ficheroubis, campo);
break;
case 4: /* FICHERO DE CICLOS */
strcpy(configuracion.ficherociclos, campo);
break;
case 5: /* ORIGEN DE DATOS */
/* if(strcmp(campo, "TRAZA")==0) */
/* opción por defecto */
configuracion.origen = TRAZA;
if(strcmp(campo, "SECUENCIA")==0) configuracion.origen = SECUENCIA;
else if(strcmp(campo, "CADENAHEX")==0) configuracion.origen = CADENAHEX;
break;
case 6: /* FICHERO DE DATOS */
strcpy(configuracion.ficherodatos, campo);
break;
case 7: /* SECUENCIA DE INSTRUCCIÓN */
strcpy(configuracion.cadenahex, campo);
break;
case 8: /* RANGO */
/* quito el signo '%' si está */
*(campo+strlen(campo)-1)='\0';
configuracion.rango = atof(campo);
break;
case 9: /* COMIENZO */
/* quito el signo '%' si está */
*(campo+strlen(campo)-1)='\0';
configuracion.comienzo = atof(campo);
break;
case 10: /* PRIMERA */
configuracion.primera = atoi(campo);
break;
case 11: /* ULTIMA */
configuracion.ultima = atoi(campo);
break;
case 12: /* RECUENTOS */
configuracion.recuentos = SI;
if(strcmp(campo, "NO")==0) configuracion.recuentos = NO;
break;
case 13: /* ASIGNAR CPI */
configuracion.cpi = SI;
if(strcmp(campo, "NO")==0) configuracion.cpi = NO;
break;
case 14: /* ANALIZAR DEPENDENCIAS */
configuracion.dependencias = SI;
if(strcmp(campo, "NO")==0) configuracion.dependencias = NO;
break;
case 15: /* TAMAÑO VENTANA INSTRUCCIONES */
configuracion.ventana = atoi(campo);
break;
case 16: /* LISTADO DE UBICACIONES */
strcpy(configuracion.listaubis, campo);
break;
case 17: /* DESACOPLAR TIPOS DE DEPENDENCIAS */
configuracion.desacoplartipos = SI;
if(strcmp(campo, "NO")==0) configuracion.desacoplartipos = NO;
break;
case 18: /* DEPENDENCIAS VERDADERAS */
configuracion.verdaderas = SI;
if(strcmp(campo, "NO")==0) configuracion.verdaderas = NO;
break;
case 19: /* ANTIDEPENDENCIAS */
configuracion.antidependencias = SI;
if(strcmp(campo, "NO")==0) configuracion.antidependencias = NO;
break;
case 20: /* DEPENDENCIAS DE SALIDA */
configuracion.salida = SI;
if(strcmp(campo, "NO")==0) configuracion.salida = NO;
break;
case 21: /* DESACOPLAR ORIGEN */
configuracion.desacoplarorigen = SI;
if(strcmp(campo, "NO")==0) configuracion.desacoplarorigen = NO;
break;
case 22: /* OPERANDOS EXPLÍCITOS */
configuracion.explicitos = SI;
if(strcmp(campo, "NO")==0) configuracion.explicitos = NO;
break;
case 23: /* OPERANDOS IMPLÍCITOS */
configuracion.implicitos = SI;
if(strcmp(campo, "NO")==0) configuracion.implicitos = NO;
break;
case 24: /* DESACOPLAR FUENTES DE DEPENDENCIAS */
configuracion.desacoplarfuentes = SI;
if(strcmp(campo, "NO")==0) configuracion.desacoplarfuentes = NO;
break;
case 25: /* DEPENDENCIAS DE DATOS */
configuracion.datos = SI;
if(strcmp(campo, "NO")==0) configuracion.datos = NO;
break;
case 26: /* DEPENDENCIAS DE DIRECCIONES */
configuracion.direcciones = SI;
if(strcmp(campo, "NO")==0) configuracion.direcciones = NO;
break;
case 27: /* DEPENDENCIAS DE PILA */
configuracion.pila = SI;
if(strcmp(campo, "NO")==0) configuracion.pila = NO;
break;
case 28: /* DEPENDENCIAS DE CÓDIGOS DE CONDICIÓN */
configuracion.cc = SI;
if(strcmp(campo, "NO")==0) configuracion.cc = NO;
break;
case 29: /* CALCULAR CPI PROMEDIO */
configuracion.CPImedio = SI;
if(strcmp(campo, "NO")==0) configuracion.CPImedio = NO;
break;
case 30: /* TIEMPO DE EJECUCIÓN */
configuracion.tiempo = SI;
if(strcmp(campo, "NO")==0) configuracion.tiempo = NO;
break;
case 31: /* GENERAR LISTADO ORDEN PARCIAL */
configuracion.ordenparcial = SI;
if(strcmp(campo, "NO")==0) configuracion.ordenparcial = NO;
break;
case 32: /* GENERAR MATRIZ DE CAMINOS */
configuracion.matrizcaminos = SI;
if(strcmp(campo, "NO")==0) configuracion.matrizcaminos = NO;
break;
case 33: /* PASOS DE COMPUTACIÓN */
configuracion.pasoscomputacion = SI;
if(strcmp(campo, "NO")==0) configuracion.pasoscomputacion = NO;
break;
case 34: /* GRADO DE PARALELISMO */
configuracion.gradoparalelismo = SI;
if(strcmp(campo, "NO")==0) configuracion.gradoparalelismo = NO;
break;
case 35: /* ACOPLAMIENTO */
configuracion.acoplamiento = SI;
if(strcmp(campo, "NO")==0) configuracion.acoplamiento = NO;
break;
case 36: /* HISTOGRAMA PASOS DE COMPUTACIÓN */
configuracion.distribucionpasos = SI;
if(strcmp(campo, "NO")==0) configuracion.distribucionpasos = NO;
break;
case 37: /* VOLCAR BD EN FICHEROS */
configuracion.volcarBD = SI;
if(strcmp(campo, "NO")==0) configuracion.volcarBD = NO;
break;
case 38: /* CREAR FICHERO DE CONFIGURACIÓN */
configuracion.crearficheroconfig = SI;
if(strcmp(campo, "NO")==0) configuracion.crearficheroconfig = NO;
break;
case 39: /* NOMBRE DEL NUEVO FICHERO DE CONFIGURACIÓN */
strcpy(configuracion.nuevoficheroconfig, campo);
break;
case 40: /* LISTADO DE VENTANAS A SALVAR */
strcpy(configuracion.volcarventana, campo);
break;
case 41: /* FICHERO DE RESULTADOS */
strcpy(configuracion.ficheroresultados, campo);
break;
case 42: /* NIVEL DE NOTIFICACIÓN EN EL LOG */
/* opción por defecto */
configuracion.nivelnotificaciones = ALL;
if(strcmp(campo, "EX_CFG")==0) configuracion.nivelnotificaciones = EX_CFG;
else if(strcmp(campo, "ERRORS")==0) configuracion.nivelnotificaciones = ERRORS;
break;
case 43: /* VER INSTRUCCIÓN EN CURSO EN LA PANTALLA */
configuracion.verinstruccion = SI;
if(strcmp(campo, "NO")==0) configuracion.verinstruccion = NO;
break;
case 44: /* VER VENTANA EN CURSO EN LA PANTALLA */
configuracion.verventana = SI;
if(strcmp(campo, "NO")==0) configuracion.verventana = NO;
break;
}
}
}
}
/* hago validación de datos de entrada */
ValidarConfiguracion();
if(fclose(handle))
{
sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' no se ha podido cerrar", fichero);
Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
}
else
{
sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' ha sido cerrado con éxito", fichero);
Notificar(mensaje, NO_ERROR, ECO_NO);
}
}
else
{
sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' no se ha podido abrir", fichero);
Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
}
}
/* función que carga la configuración desde los argumentos del 'main' */
/* también realiza una pequeña validación de las entradas */
/* si se requiere asignación de CPI lo fuerza */
/* si se anula el análisis de dependencias de datos lo fuerza */
/* si se requiere un cálculo previo lo fuerza */
void CapturarArgumentos(int argc, char *argv[])
{
char mensaje[MAX_LINE];
char cadena[10];
char arg_leido = NO;
/*
int i;
printf("%d\n", argc);
for(i=0; i<argc; i++)
{
printf("%s\n", argv[i]);
}
_getch();
*/
while(--argc > 0 && (*++argv)[0]=='-')
{
switch((*argv)[1])
{
case 'h': /* mostrar texto de ayuda */
printf("%s", *textoayuda);
exit(1);
break;
case 'f': /* cargar la configuración desde fichero */
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.ficheroconfig, argv[0]);
/* cargo la configuración desde fichero (el indicado por defecto o el nuevo) */
/* haciendo caso omiso del resto de argumentos (capturados o por capturar) */
strcpy(configuracion.captura, "Por fichero");
/* el fichero de configuración no lleva la clave del tipo de captura ni el */
/* nombre del fichero de configuración */
CargarConfiguracionFichero();
argc = 0; /* dejo de leer el resto de argumentos */
break;
case 'n': /* fichero de arquitectura del repertorio (nemónicos) */
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
strcpy(configuracion.ficheronemos, argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -n no especifica ruta y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'u': /* fichero de arquitectura del repertorio (ubicaciones) */
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
strcpy(configuracion.ficheroubis, argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -u no especifica ruta y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'O': /* origen de datos */
/* el siguiente caracter indica situaciones excluyentes */
switch((*argv)[2])
{
case 't':
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
configuracion.origen = TRAZA;
strcpy(configuracion.ficherodatos, argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -Ot no especifica ruta y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 's':
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
configuracion.origen = SECUENCIA;
strcpy(configuracion.ficherodatos, argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -Os no especifica ruta y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'i':
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
configuracion.origen = CADENAHEX;
strcpy(configuracion.cadenahex, argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -Oi no especifica instrucción y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -O%c no se reconoce", (*argv)[2]);
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
break;
case 'p': /* porcentaje de datos a analizar (sólo para trazas) */
/* estos argumentos se cargan en los parámetros de configuración */
/* pero si se procesa una traza no se tienen en cuenta */
switch((*argv)[2])
{
case 'r': /* rango total en porcentaje */
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
strcpy(cadena, argv[0]);
cadena[strlen(cadena)-1]='\0'; /* quito el caracter '%' */
configuracion.rango = atof(argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -pr no especifica valor y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'c': /* comienzo en porcentaje */
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
strcpy(cadena, argv[0]);
cadena[strlen(cadena)-1]='\0'; /* quito el caracter '%' */
configuracion.comienzo = atof(argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -pc no especifica valor y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -p%c no se reconoce", (*argv)[2]);
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
break;
case 'i': /* primera y última instrucción del análisis (sólo para trazas) */
/* estos argumentos se cargan en los parámetros de configuración */
/* pero si se procesa una traza no se tienen en cuenta */
switch((*argv)[2])
{
case 'p':
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
configuracion.primera = atoi(argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -ip no especifica valor y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'u':
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
configuracion.ultima = atoi(argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -iu no especifica valor y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -i%c no se reconoce", (*argv)[2]);
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
break;
case 'r': /* hacer recuentos */
configuracion.recuentos = SI;
arg_leido = SI;
break;
case 'c': /* asignar CPI a cada instrucción */
configuracion.cpi = SI;
arg_leido = SI;
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.ficherociclos , argv[0]);
else {++argc; *--argv;} /* recupero la situación */
break;
case 'D': /* analizar dependencias de datos */
configuracion.dependencias = NO;
arg_leido = SI;
break;
case 'v': /* tamaño de la ventana de instrucciones */
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
configuracion.ventana = atoi(argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -v no especifica tamaño y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'L': /* listado de ubicaciones de la pizarra de análisis de dependencias */
/* si queda al menos un argumento y es una lista y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
strcpy(configuracion.listaubis, argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -L no especifica lista y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'k': /* desacoplar tipos de dependencias */
configuracion.desacoplartipos = SI;
arg_leido = SI;
break;
case 'd': /* no considerar tipos de dependencias */
switch((*argv)[2])
{
case 'v': /* evitar las dependencias verdaderas */
configuracion.verdaderas = NO;
arg_leido = SI;
break;
case 'a': /* evitar las antidependencias */
configuracion.antidependencias = NO;
arg_leido = SI;
break;
case 's': /* evitar las dependencias de salida */
configuracion.salida = NO;
arg_leido = SI;
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -d%c no se reconoce", (*argv)[2]);
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
break;
case 'o': /* desacoplar origen de dependencias */
configuracion.desacoplarorigen = SI;
arg_leido = SI;
break;
case 't': /* no considerar origen de dependencias */
switch((*argv)[2])
{
case 'e': /* evitar los operandos explícitos */
configuracion.explicitos = NO;
arg_leido = SI;
break;
case 'i': /* evitar los operandos implicitos */
configuracion.implicitos = NO;
arg_leido = SI;
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -t%c no se reconoce", (*argv)[2]);
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
break;
case 's': /* desacoplar fuentes de dependencias */
configuracion.desacoplarfuentes = SI;
arg_leido = SI;
break;
case 'q': /* no considerar fuentes de dependencias */
switch((*argv)[2])
{
case 'd': /* evitar las dependencias debidas a datos */
configuracion.datos = NO;
arg_leido = SI;
break;
case 'a': /* evitar las dependencias debidas a cómputo de direcciones */
configuracion.direcciones = NO;
arg_leido = SI;
break;
case 's': /* evitar las dependencias debidas a tráfico con la pila */
configuracion.pila = NO;
arg_leido = SI;
break;
case 'c': /* evitar las dependencias debidas a códigos de condición */
configuracion.cc = NO;
arg_leido = SI;
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -q%c no se reconoce", (*argv)[2]);
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
break;
case 'C': /* cálculos a realizar */
/* detrás de la 'C' podemos colocar seguidos todos los argumentos del grupo */
*++(*argv); /* avanzo hasta el primer caracter después de la 'C' */
while((char)*++(*argv)) /* barro todos los caracteres hasta el final de la cadena */
{
switch((char)*(*argv))
{
case 'm': /* calcular el CPI promedio */
configuracion.CPImedio = SI;
arg_leido = SI;
break;
case 't': /* calcular tiempo de ejecución */
configuracion.tiempo = SI;
arg_leido = SI;
break;
case 'o': /* obtener lista de orden parcial */
configuracion.ordenparcial = SI;
arg_leido = SI;
break;
case 'c': /* generar matriz de caminos */
configuracion.matrizcaminos = SI;
arg_leido = SI;
break;
case 'p': /* calcular pasos de computación */
configuracion.pasoscomputacion = NO;
arg_leido = SI;
break;
case 'g': /* calcular grado de paralelismo */
configuracion.gradoparalelismo = SI;
arg_leido = SI;
break;
case 'a': /* calcular acoplamiento */
configuracion.acoplamiento = SI;
arg_leido = SI;
break;
case 'h': /* construir histograma */
configuracion.distribucionpasos = SI;
arg_leido = SI;
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -C%c no se reconoce", (char)*(*argv));
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
}
break;
case 'V': /* informes: volcar datos en ficheros */
switch((*argv)[2])
{
case 'd': /* volcar bases de datos */
configuracion.volcarBD = NO;
arg_leido = SI;
break;
case 'c': /* crear nuevo fichero de configuración */
configuracion.crearficheroconfig = SI;
arg_leido = SI;
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.nuevoficheroconfig, argv[0]);
else {++argc; *--argv;} /* recupero la situación */
break;
case 'v': /* listado de ventanas a salvar */
/* si queda al menos un argumento y es una lista y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
strcpy(configuracion.volcarventana, argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -Vv no especifica lista y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -V%c no se reconoce", (*argv)[2]);
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
break;
case 'R': /* fichero de resultados */
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
strcpy(configuracion.ficheroresultados, argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -R no especifica ruta y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'N': /* nivel de notificaciones en el fichero de log */
/* si queda al menos un argumento y es una ruta y no otra opción */
if(--argc!=0 && (*++argv)[0]!='-')
{
configuracion.nivelnotificaciones = atoi(argv[0]);
arg_leido = SI;
}
else
{
sprintf(mensaje, "[CapturarArgumentos] La opción -N no especifica nivel y no se tendrá en cuenta");
Notificar(mensaje, NO_ERROR, ECO_NO);
++argc; *--argv; /* recupero la situación */
}
break;
case 'M': /* mostrar en pantalla */
/* detrás de la 'M' podemos colocar seguidos todos los argumentos del grupo */
*++(*argv); /* avanzo hasta el primer caracter después de la 'M' */
while((char)*++(*argv)) /* barro todos los caracteres hasta el final de la cadena */
{
switch((char)*(*argv))
{
case 'i': /* mostrar instrucción en curso en la pantalla */
configuracion.verinstruccion = SI;
arg_leido = SI;
break;
#if 0 /* no se ha incluido el parámetro aún */
case 'e': /* mostrar estado */
configuracion.XXXXXX = SI;
arg_leido = SI;
break;
#endif
case 'v': /* mostrar ventana */
configuracion.verventana = SI;
arg_leido = SI;
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -M%c no se reconoce", (char)*(*argv));
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
}
break;
default:
sprintf(mensaje, "[CapturarArgumentos] La opción -%c no se reconoce", (*argv)[1]);
Notificar(mensaje, NO_ERROR, ECO_NO);
break;
}
}
if(arg_leido == SI) strcpy(configuracion.captura, "Paso de argumentos");
ValidarConfiguracion();
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>