Annotation of ADD_ver_10/Source Code/Source Files/Configuracion.c, revision 1.2

1.2     ! rico        1: /********************************************************************/
        !             2: /*  Configuracion.c                                                 */
        !             3: /*                                                                  */
        !             4: /*                                                                  */
        !             5: /*  Copyright (c) 1997-2006 Rafael Rico      (rafael.rico@uah.es)   */
        !             6: /*                                                                  */
        !             7: /*  Este fichero forma parte de ADD                                 */
        !             8: /*  (Analizador de Dependencias de Datos)                           */
        !             9: /*  Version 5.10.                                                   */
        !            10: /*                                                                  */
        !            11: /*                                                                  */
        !            12: /*  ADD es software libre. Puede redistribuirlo y/o modificarlo     */
        !            13: /*  bajo los términos de la Licencia Pública General de GNU         */
        !            14: /*  según es publicada por la Free Software Foundation, bien bajo   */
        !            15: /*  la versión 2 de dicha Licencia o bien (según su elección)       */
        !            16: /*  bajo cualquier versión posterior.                               */
        !            17: /*                                                                  */
        !            18: /*  ADD se distribuye con la esperanza de que sea útil,             */
        !            19: /*  pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL    */
        !            20: /*  implícita y sin garantizar la CONVENIENCIA PARA UN PROPÓSITO    */
        !            21: /*  PARTICULAR. Véase la Licencia Pública General de GNU para       */
        !            22: /*  más detalles.                                                   */
        !            23: /*                                                                  */
        !            24: /*  Debería haber recibido una copia de la Licencia Pública General */
        !            25: /*  junto con ADD. Si no ha sido así, escriba a la Free Software    */
        !            26: /*  Foundation, Inc., 51 Franklin St, Fifth Floor,                  */
        !            27: /*  Boston, MA  02110-1301  EEUU.                                   */
        !            28: /*                                                                  */
        !            29: /*  -------------------------- Historia --------------------------- */
        !            30: /*                                                                  */
        !            31: /*  $Id$                                                            */
        !            32: /*                                                                  */
        !            33: /*  Revisión 1.2. 01/2006                                           */
        !            34: /*  Se añade la licencia GPL y documentación en estilo Javadoc      */
        !            35: /*                                                                  */
        !            36: /*  Revisión 1.1. 09/2005                                           */
        !            37: /*  Versión inicial                                                 */
        !            38: /*                                                                  */
        !            39: /********************************************************************/
        !            40: 
1.1       rico       41: /******************************************************************************/
                     42: /* MÓDULO: Configuracion.c                                                    */
                     43: /*                                                                            */
                     44: /* Este módulo contiene las funciones relacionadas con la configuración.      */
                     45: /******************************************************************************/
                     46: /* Fecha: 28 de septiembre de 2005                                            */
                     47: /******************************************************************************/
                     48: 
                     49: #include <stdio.h>
                     50: #include <stdlib.h>
                     51: #include <string.h>
                     52: 
                     53: #include "defines.h"
                     54: #include "tipos.h"
                     55: #include "ayuda.h"
                     56: #include "configuracion.h"
                     57: 
                     58: /* configuración */
                     59: extern struct argumentos configuracion;
                     60: 
                     61: 
                     62: 
                     63: /* función que realiza la validación de los parámetros de configuración */
                     64: /* introducidos por cualquiera de los medios previstos */
                     65:  
                     66: void ValidarConfiguracion()
                     67: {
                     68:     char mensaje[MAX_LINE];
                     69: 
                     70:     /* si necesito fichero de configuración y no lo tengo */
                     71:     /* capturo el nombre del fichero de configuración */
                     72:     if(strcmp(configuracion.captura, "Por fichero") == 0 && strcmp(configuracion.ficheroconfig, "") == 0)
                     73:     {
                     74:         printf("Introduzca el nombre del fichero de configuración\n\n->\t");
                     75:         scanf("%s", configuracion.ficheroconfig);
                     76: 
                     77:         sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de configuración");
                     78:         Notificar(mensaje, NO_ERROR, ECO_NO);
                     79:     }
                     80: 
                     81:     /* si no tengo fichero de nemónicos */
                     82:     if(strcmp(configuracion.ficheronemos, "") == 0)
                     83:     {
                     84:         printf("Introduzca el nombre del fichero de operaciones\n\n->\t");
                     85:         scanf("%s", configuracion.ficheronemos);
                     86: 
                     87:         sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de operaciones");
                     88:         Notificar(mensaje, NO_ERROR, ECO_NO);
                     89:     }
                     90: 
                     91:     /* si no tengo fichero de operandos */
                     92:     if(strcmp(configuracion.ficheroubis, "") == 0)
                     93:     {
                     94:         printf("Introduzca el nombre del fichero de operandos\n\n->\t");
                     95:         scanf("%s", configuracion.ficheroubis);
                     96: 
                     97:         sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de operandos");
                     98:         Notificar(mensaje, NO_ERROR, ECO_NO);
                     99:     }
                    100: 
                    101:     /* si necesito el fichero de ciclos del procesador */
                    102:     /* y no lo tengo */
                    103:     if(configuracion.cpi == SI && strcmp(configuracion.ficherociclos, "") == 0)
                    104:     {
                    105:         printf("Introduzca el nombre del fichero de procesador\n\n->\t");
                    106:         scanf("%s", configuracion.ficherociclos);
                    107: 
                    108:         sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de procesador");
                    109:         Notificar(mensaje, NO_ERROR, ECO_NO);
                    110:     }
                    111: 
                    112:     /* si no tengo fichero de datos */
                    113:     if(configuracion.origen != CADENAHEX && strcmp(configuracion.ficherodatos, "") == 0)
                    114:     {
                    115:         printf("Introduzca el nombre del fichero de datos\n\n->\t");
                    116:         scanf("%s", configuracion.ficherodatos);
                    117: 
                    118:         sprintf(mensaje, "[ValidarConfiguracion] Se solicita fichero de datos");
                    119:         Notificar(mensaje, NO_ERROR, ECO_NO);
                    120:     }
                    121: 
                    122:     /* si el origen de datos es una única instrucción */
                    123:     /* anulo el análisis de dependencias de datos */
                    124:     if(configuracion.origen == CADENAHEX) configuracion.dependencias = NO;
                    125: 
                    126:     /* validación del rango */
                    127:     if(configuracion.rango > 100.00) configuracion.rango = 100.00;
                    128:     else if(configuracion.rango < 1.00) configuracion.rango = 1.00;
                    129: 
                    130:     /* validación del comienzo */
                    131:     if(configuracion.comienzo > 100.00) configuracion.comienzo = 100.00;
                    132:     /* el porcentaje de comienzo puede ser 0 */
                    133: 
                    134:     /* si doy instrucción final se supone que tengo una inicial */
                    135:     if(configuracion.ultima != 0)
                    136:     {
                    137:         if(configuracion.primera == 0) configuracion.primera = 1;
                    138:         /* la cuenta de instrucciones comienza en '1' */
                    139:     }
                    140: 
                    141:     /* si el tamaño de ventana de instrucciones es nulo pido un valor */
                    142:     if(configuracion.ventana == 0)
                    143:     {
                    144:         /* capturo el tamaño de la ventana de instrucciones */
                    145:         printf("Introduzca el tamaño de la ventana de instrucciones[1 - %d]\n\n->\t", MAX_VENTANA);
                    146:         scanf("%d", &configuracion.ventana);
                    147:     }
                    148: 
                    149:     /* si la ventana es mayor que el máximo permitido pongo el máximo */
                    150:     if(configuracion.ventana > MAX_VENTANA) configuracion.ventana = MAX_VENTANA;
                    151:     /* si la ventana es de 1 instrucción anulo el análisis de dependencias de datos */
                    152:     if(configuracion.ventana == 1) configuracion.dependencias = NO;
                    153:     /* si la ventana es mayor de 32 instrucciones no construyo ficheros */
                    154:     /* para volcar información de las ventanas ya que no caben */
                    155:     if(configuracion.ventana > 32) strcpy(configuracion.volcarventana, "");
                    156: 
                    157:     /* si no considero ningún tipo no hago análisis de dependencias */
                    158:     if(configuracion.verdaderas == NO && 
                    159:         configuracion.antidependencias == NO && 
                    160:         configuracion.verdaderas == NO)    configuracion.dependencias = NO;
                    161: 
                    162:     if(configuracion.explicitos == NO && 
                    163:         configuracion.implicitos == NO) configuracion.dependencias = NO; 
                    164: 
                    165:     if(configuracion.datos == NO &&
                    166:         configuracion.direcciones == NO &&
                    167:         configuracion.pila == NO &&
                    168:         configuracion.cc == NO) configuracion.dependencias = NO;
                    169: 
                    170:     /* los desacoplos y sus matrices llevan un orden */
                    171:     /* mapa de posibles matrices */
                    172:     /* tipo        origen    fuente */
                    173:     /*   SI          SI     SI     */
                    174:     /*   SI          SI     NO     */
                    175:     /*   SI          NO     NO     */
                    176:     /*   NO          NO     NO     */    /* -> por defecto no se desacopla nada */
                    177: 
                    178:     if(configuracion.desacoplarorigen == SI)
                    179:     {
                    180:         configuracion.desacoplartipos = SI;
                    181:     }
                    182:     if(configuracion.desacoplarfuentes == SI)
                    183:     {
                    184:         configuracion.desacoplarorigen = SI;
                    185:         configuracion.desacoplartipos = SI;
                    186:     }
                    187: 
                    188:     /* calcular CPI medio implica asignar CPI a cada instrucción */
                    189:     if(configuracion.CPImedio == SI) configuracion.cpi = SI;
                    190:     /* calcular tiempo de ejecución implica asignar CPI a cada */
                    191:     /* y calcular las dependencias de datos entre instrucción */
                    192:     if(configuracion.tiempo == SI) 
                    193:     {
                    194:         configuracion.cpi = SI;
                    195:         configuracion.dependencias = SI;
                    196:     }
                    197:     /* calculos relativos al análisis de dependencias */
                    198:     if(configuracion.ordenparcial == SI) configuracion.dependencias = SI;
                    199:     if(configuracion.matrizcaminos == SI) configuracion.dependencias = SI;
                    200:     if(configuracion.pasoscomputacion == SI) configuracion.dependencias = SI;
                    201:     if(configuracion.gradoparalelismo == SI)
                    202:     {
                    203:         configuracion.pasoscomputacion = SI;
                    204:         configuracion.dependencias = SI;
                    205:     }
                    206:     if(configuracion.acoplamiento == SI) configuracion.dependencias = SI;
                    207:     if(configuracion.distribucionpasos == SI)
                    208:     {
                    209:         configuracion.pasoscomputacion = SI;
                    210:         configuracion.dependencias = SI;
                    211:     }
                    212:     
                    213:     /* si no quiero calcular nada anulo el análisis de dependencias */
                    214:     if(configuracion.tiempo == NO &&
                    215:         configuracion.ordenparcial == NO &&
                    216:         configuracion.matrizcaminos == NO &&
                    217:         configuracion.pasoscomputacion == NO &&
                    218:         configuracion.gradoparalelismo == NO &&
                    219:         configuracion.acoplamiento == NO &&
                    220:         configuracion.distribucionpasos == NO) configuracion.dependencias = NO;
                    221: 
                    222:     /* si he de crear un fichero de configuración nuevo */
                    223:     /* y no tengo nombre solicito uno nuevo */
                    224:     if(configuracion.crearficheroconfig == SI && strcmp(configuracion.nuevoficheroconfig, "") == 0)
                    225:     {
                    226:         printf("Introduzca el nombre del nuevo fichero de configuración\n\n->\t");
                    227:         scanf("%s", configuracion.nuevoficheroconfig);
                    228: 
                    229:         sprintf(mensaje, "[ValidarConfiguracion] Se solicita nuevo fichero de configuración");
                    230:         Notificar(mensaje, NO_ERROR, ECO_NO);
                    231:     }
                    232: }
                    233: 
                    234: 
                    235: 
                    236: /* función que carga la configuración por defecto de la aplicación */
                    237: 
                    238: void CargarConfiguracionInicial()
                    239: {
                    240:     /* OBSERVACIONES (tipo de captura de configuración) */
                    241:     strcpy(configuracion.captura, "Por defecto");
                    242: 
                    243:     /* FICHERO DE CONFIGURACIÓN POR DEFECTO */
                    244:     /* ruta del fichero de configuración (si se usa sin indicar ruta) */
                    245:     strcpy(configuracion.ficheroconfig, "configuracion.cfg");    
                    246: 
                    247:     /* FICHEROS DE BASE DE DATOS */
                    248:     /* ARQUITECTURA: fichero de operaciones */
                    249:     strcpy(configuracion.ficheronemos, "IA16-nemos.isa");
                    250:     /* ARQUITECTURA: fichero de símbolos */
                    251:     strcpy(configuracion.ficheroubis, "IA16-ubis.isa");            
                    252:     /* PROCESADOR: fichero de ciclos */
                    253:     strcpy(configuracion.ficherociclos, "uP-8086-01.pro");        
                    254: 
                    255:     /* ORIGEN DE DATOS */
                    256:     /* código de origen de datos */
                    257:     /* 0: TRAZA; 1: SECUENCIA; 2: CADENAHEX */
                    258:     /* si es CADENAHEX no se hace análisis de dependencias) */
                    259:     configuracion.origen = TRAZA;
                    260:     /* fichero de origen de datos -si existe- */
                    261:     strcpy(configuracion.ficherodatos, "comp.trz");
                    262:     /* instrucción en hexadecimal */
                    263:     strcpy(configuracion.cadenahex, "");
                    264:     /* porcentaje a analizar -sólo TRAZA- */
                    265:     configuracion.rango = 100.00;
                    266:     /* comienzo en porcentaje -sólo TRAZA- */
                    267:     configuracion.comienzo = 0.00;
                    268:     /* instrucción de comienzo */
                    269:     configuracion.primera = 0;                
                    270:     /* instrucción de final */
                    271:     configuracion.ultima  = 0;                    
                    272:     
                    273:     /* EVALUAR */
                    274:     /* ¿hacer recuentos? */
                    275:     configuracion.recuentos = NO;                        
                    276:     /* ¿asignar ciclos a cada instrucción? */
                    277:     configuracion.cpi = NO;    
                    278:     /* ¿hacer análisis de dependencias de datos? */
                    279:     configuracion.dependencias = SI;
                    280:     
                    281:     /* PARÁMETROS DE ANÁLISIS DE DEPENDENCIAS DE DATOS */
                    282:     /* tamaño de la ventana de instrucciones (si es 1 no se hace análisis de dependencias) */
                    283:     configuracion.ventana = 32;
                    284:     /* tipos de ubicaciones a incluir en la pizarra de dependencias */
                    285:     strcpy(configuracion.listaubis, "0:1:2:3");
                    286:     /* ¿desacoplar tipos de dependencias? */
                    287:     configuracion.desacoplartipos = NO;
                    288:     /* ¿considerar dependencias verdaderas? */
                    289:     configuracion.verdaderas = SI;                    
                    290:     /* ¿considerar antidependencias? */
                    291:     configuracion.antidependencias = SI;                
                    292:     /* ¿considerar dependencias de salida? */
                    293:     configuracion.salida = SI;
                    294:     /* ¿desacoplar implìcitas-explícitas? */
                    295:     configuracion.desacoplarorigen = NO;                
                    296:     /* ¿considerar explícitas? */
                    297:     configuracion.explicitos = SI;                    
                    298:     /* ¿considerar implícitas? */
                    299:     configuracion.implicitos = SI; 
                    300:     /* ¿desacoplar fuentes de dependencias? */
                    301:     configuracion.desacoplarfuentes = NO;                
                    302:     /* ¿origen de dependencias de datos? */
                    303:     configuracion.datos = SI;                            
                    304:     /* ¿origen de dependencias de direcciones? */
                    305:     configuracion.direcciones = SI;                    
                    306:     /* ¿origen de dependencias de pila? */
                    307:     configuracion.pila = SI;                            
                    308:     /* ¿origen de dependencias de códigos de condición? */
                    309:     configuracion.cc = SI;
                    310:     
                    311:     /* CALCULAR */
                    312:     /* ¿calcular CPI medio? (requiere asignación de CPI) */
                    313:     configuracion.CPImedio = NO;                        
                    314:     /* ¿calcular tiempo de ejecución? (requiere asignación de CPI) */
                    315:     configuracion.tiempo = NO;                        
                    316:     /* ¿obtener orden parcial? (requiere evaluación de dependencias) */
                    317:     configuracion.ordenparcial = NO;
                    318:     /* ¿calcular la matriz de caminos? (requiere evaluación de dependencias) */
                    319:     /*(tarea gran consumidora de tiempo) */
                    320:     configuracion.matrizcaminos = NO;
                    321:     /* ¿determinar pasos de computación? (requiere evaluación de dependencias) */
                    322:     configuracion.pasoscomputacion = SI;                
                    323:     /* ¿determinar grado de paralelismo? (requiere evaluación de dependencias y pasos de computación) */
                    324:     configuracion.gradoparalelismo = NO;                
                    325:     /* ¿determinar acoplamiento? (requiere evaluación de dependencias) */
                    326:     configuracion.acoplamiento = NO;
                    327:     /* ¿salvar el histograma de pasos de computación para la matriz D? */
                    328:     configuracion.distribucionpasos = NO;
                    329: 
                    330:     /* CONFIGURACIÓN DEL INFORME */
                    331:     /* salvar bases de datos en ficheros EXCEL */
                    332:     configuracion.volcarBD = NO;
                    333:     /* volcar configuracion en un fichero nuevo */
                    334:     configuracion.crearficheroconfig = NO;
                    335:     /* nombre del nuevo fichero de configuración */
                    336:     strcpy(configuracion.nuevoficheroconfig, "nuevoconfig");            
                    337:     /* salvar listado de ventanas en formato EXCEL */
                    338:     strcpy(configuracion.volcarventana, "");
                    339:     /* fichero de resultados en formato EXCEL */
                    340:     strcpy(configuracion.ficheroresultados, "resultados");
                    341:     /* nivel de gravedad de los mensajes volcados en el log */
                    342:     configuracion.nivelnotificaciones = ALL;
                    343:     /* (el nivel inicial es el de mayor notificación) */
                    344: 
                    345:     /* INTERFASE GRÁFICA */
                    346:     /* ver instrucción en pantalla */
                    347:     configuracion.verinstruccion = NO;
                    348:     /* ver ventana en pantalla */
                    349:     configuracion.verventana = NO;
                    350: 
                    351:     ValidarConfiguracion();
                    352: }
                    353: 
                    354: 
                    355: /* función que carga la configuración desde un fichero */
                    356: /* el fichero de configuración no tiene que tener todas las claves */
                    357: 
                    358: void CargarConfiguracionFichero()
                    359: {
                    360:     FILE *handle;
                    361:     char fichero[MAX_LINE];
                    362:     char linea[MAX_LINE];
                    363:     char mensaje[MAX_LINE];
                    364:     char *campo;
                    365:     int i;
                    366:     char encontrado;
                    367:     char *inicio, *final;
                    368: 
                    369:     /* nombre del fichero de configuración */
                    370:     strcpy(fichero, configuracion.ficheroconfig);
                    371: 
                    372:     /* abro el fichero de configuración*/
                    373:     if((handle  = fopen(fichero, "r")) != NULL)
                    374:     {
                    375:         sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' se ha abierto con éxito", fichero);
                    376:         Notificar(mensaje, NO_ERROR, ECO_NO);
                    377: 
                    378:         while(!feof(handle))
                    379:         {
                    380:             fgets (linea, MAX_LINE, handle);
                    381:             /* quito el caracter '\n' (0x0a) final de la línea */
                    382:             /* OJO: si abro en modo binario me encuentro "\r\n" (0x0d 0x0a) */
                    383:             *(linea+strlen(linea)-1)='\0';
                    384:             /* si no es ni comentario ni línea en blanco */
                    385:             if(linea[0]!='[' && linea[0]!='\0')
                    386:             {
                    387:                 campo = strtok(linea, "=");
                    388:                 /* limpio de espacios en blanco por delante y por detrás */
                    389:                 inicio = campo; while(*inicio++==' '); campo = inicio - 1;
                    390:                 final = campo + strlen(campo); while(*--final==' '); *(final+1)='\0';
                    391: 
                    392:                 i = 0;
                    393:                 encontrado = NO;
                    394:                 while(i<NUM_CLAVES && encontrado == NO)
                    395:                 {
                    396:                     /* solución si 'campo' tiene espacios en blanco */
                    397:                     /* if (strncmp(campo, claves[i], strlen(claves[i]))) i++; */ 
                    398:                     /* solución si 'campo' no tiene espacios en blanco */
                    399:                     if (strcmp(campo, claves[i])) i++;    /* no encontrado */
                    400:                     else encontrado = SI;   /* encontrado */
                    401:                 }
                    402:                 if(encontrado == NO)
                    403:                 {
                    404:                     sprintf(mensaje, "No se ha encontrado la clave del fichero de configuración");
                    405:                     Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
                    406:                 }
                    407:                 else
                    408:                 {
                    409:                     campo = strtok(NULL, "=");
                    410:                     /* limpio de espacios en blanco por delante y por detrás */
                    411:                     inicio = campo; while(*inicio++==' '); campo = inicio - 1;
                    412:                     final = campo + strlen(campo); while(*--final==' '); *(final+1)='\0';
                    413:                     /* limpio las comillas simples si están */
                    414:                     inicio = strchr(campo, '\'');
                    415:                     if(inicio!=NULL) {campo = inicio + 1; final = strrchr(campo, '\''); if(final!=NULL) *final = '\0';}
                    416: 
                    417:                     switch(i)
                    418:                     {
                    419:                         case 0:        /* CAPTURA DE CONFIGURACIÓN */
                    420:                         strcpy(configuracion.captura, campo);
                    421:                         break;
                    422: 
                    423:                         case 1:        /* FICHERO DE CONFIGURACIÓN */
                    424:                         strcpy(configuracion.ficheroconfig, campo);
                    425:                         break;
                    426: 
                    427:                         case 2:        /* FICHERO DE OPERACIONES */
                    428:                         strcpy(configuracion.ficheronemos, campo);
                    429:                         break;
                    430: 
                    431:                         case 3:        /* FICHERO DE SÍMBOLOS */
                    432:                         strcpy(configuracion.ficheroubis, campo);
                    433:                         break;
                    434: 
                    435:                         case 4:        /* FICHERO DE CICLOS */
                    436:                         strcpy(configuracion.ficherociclos, campo);
                    437:                         break;
                    438: 
                    439:                         case 5:        /* ORIGEN DE DATOS */
                    440:                         /* if(strcmp(campo, "TRAZA")==0) */
                    441:                         /* opción por defecto */
                    442:                         configuracion.origen = TRAZA;
                    443:                         if(strcmp(campo, "SECUENCIA")==0) configuracion.origen = SECUENCIA;
                    444:                         else if(strcmp(campo, "CADENAHEX")==0) configuracion.origen = CADENAHEX;
                    445:                         break;
                    446: 
                    447:                         case 6:        /* FICHERO DE DATOS */
                    448:                         strcpy(configuracion.ficherodatos, campo);
                    449:                         break;
                    450: 
                    451:                         case 7:        /* SECUENCIA DE INSTRUCCIÓN */
                    452:                         strcpy(configuracion.cadenahex, campo);
                    453:                         break;
                    454: 
                    455:                         case 8:        /* RANGO */
                    456:                         /* quito el signo '%' si está */
                    457:                         *(campo+strlen(campo)-1)='\0';
                    458:                         configuracion.rango = atof(campo);
                    459:                         break;
                    460: 
                    461:                         case 9:        /* COMIENZO */
                    462:                         /* quito el signo '%' si está */
                    463:                         *(campo+strlen(campo)-1)='\0';
                    464:                         configuracion.comienzo = atof(campo);
                    465:                         break;
                    466: 
                    467:                         case 10:    /* PRIMERA */
                    468:                         configuracion.primera = atoi(campo);
                    469:                         break;
                    470: 
                    471:                         case 11:    /* ULTIMA */
                    472:                         configuracion.ultima = atoi(campo);
                    473:                         break;
                    474: 
                    475:                         case 12:    /* RECUENTOS */
                    476:                         configuracion.recuentos = SI;
                    477:                         if(strcmp(campo, "NO")==0) configuracion.recuentos = NO;
                    478:                         break;
                    479: 
                    480:                         case 13:    /* ASIGNAR CPI */
                    481:                         configuracion.cpi = SI;
                    482:                         if(strcmp(campo, "NO")==0) configuracion.cpi = NO;
                    483:                         break;
                    484: 
                    485:                         case 14:    /* ANALIZAR DEPENDENCIAS */
                    486:                         configuracion.dependencias = SI;
                    487:                         if(strcmp(campo, "NO")==0) configuracion.dependencias = NO;
                    488:                         break;
                    489: 
                    490:                         case 15:    /* TAMAÑO VENTANA INSTRUCCIONES */
                    491:                         configuracion.ventana = atoi(campo);
                    492:                         break;
                    493: 
                    494:                         case 16:    /* LISTADO DE UBICACIONES */
                    495:                         strcpy(configuracion.listaubis, campo);
                    496:                         break;
                    497: 
                    498:                         case 17:    /* DESACOPLAR TIPOS DE DEPENDENCIAS */
                    499:                         configuracion.desacoplartipos = SI;
                    500:                         if(strcmp(campo, "NO")==0) configuracion.desacoplartipos = NO;
                    501:                         break;
                    502: 
                    503:                         case 18:    /* DEPENDENCIAS VERDADERAS */
                    504:                         configuracion.verdaderas = SI;
                    505:                         if(strcmp(campo, "NO")==0) configuracion.verdaderas = NO;
                    506:                         break;
                    507: 
                    508:                         case 19:    /* ANTIDEPENDENCIAS */
                    509:                         configuracion.antidependencias = SI;
                    510:                         if(strcmp(campo, "NO")==0) configuracion.antidependencias = NO;
                    511:                         break;
                    512: 
                    513:                         case 20:    /* DEPENDENCIAS DE SALIDA */
                    514:                         configuracion.salida = SI;
                    515:                         if(strcmp(campo, "NO")==0) configuracion.salida = NO;
                    516:                         break;
                    517: 
                    518:                         case 21:    /* DESACOPLAR ORIGEN */
                    519:                         configuracion.desacoplarorigen = SI;
                    520:                         if(strcmp(campo, "NO")==0) configuracion.desacoplarorigen = NO;
                    521:                         break;
                    522:                         
                    523:                         case 22:    /* OPERANDOS EXPLÍCITOS */
                    524:                         configuracion.explicitos = SI;
                    525:                         if(strcmp(campo, "NO")==0) configuracion.explicitos = NO;
                    526:                         break;
                    527:                         
                    528:                         case 23:    /* OPERANDOS IMPLÍCITOS */
                    529:                         configuracion.implicitos = SI;
                    530:                         if(strcmp(campo, "NO")==0) configuracion.implicitos = NO;
                    531:                         break;
                    532: 
                    533:                         case 24:    /* DESACOPLAR FUENTES DE DEPENDENCIAS */
                    534:                         configuracion.desacoplarfuentes = SI;
                    535:                         if(strcmp(campo, "NO")==0) configuracion.desacoplarfuentes = NO;
                    536:                         break;
                    537: 
                    538:                         case 25:    /* DEPENDENCIAS DE DATOS */
                    539:                         configuracion.datos = SI;
                    540:                         if(strcmp(campo, "NO")==0) configuracion.datos = NO;
                    541:                         break;
                    542: 
                    543:                         case 26:    /* DEPENDENCIAS DE DIRECCIONES */
                    544:                         configuracion.direcciones = SI;
                    545:                         if(strcmp(campo, "NO")==0) configuracion.direcciones = NO;
                    546:                         break;
                    547: 
                    548:                         case 27:    /* DEPENDENCIAS DE PILA */
                    549:                         configuracion.pila = SI;
                    550:                         if(strcmp(campo, "NO")==0) configuracion.pila = NO;
                    551:                         break;
                    552: 
                    553:                         case 28:    /* DEPENDENCIAS DE CÓDIGOS DE CONDICIÓN */
                    554:                         configuracion.cc = SI;
                    555:                         if(strcmp(campo, "NO")==0) configuracion.cc = NO;
                    556:                         break;
                    557: 
                    558:                         case 29:    /* CALCULAR CPI PROMEDIO */
                    559:                         configuracion.CPImedio = SI;
                    560:                         if(strcmp(campo, "NO")==0) configuracion.CPImedio = NO;
                    561:                         break;
                    562: 
                    563:                         case 30:    /* TIEMPO DE EJECUCIÓN */
                    564:                         configuracion.tiempo = SI;
                    565:                         if(strcmp(campo, "NO")==0) configuracion.tiempo = NO;
                    566:                         break;
                    567: 
                    568:                         case 31:    /* GENERAR LISTADO ORDEN PARCIAL */
                    569:                         configuracion.ordenparcial = SI;
                    570:                         if(strcmp(campo, "NO")==0) configuracion.ordenparcial = NO;
                    571:                         break;
                    572: 
                    573:                         case 32:    /* GENERAR MATRIZ DE CAMINOS */
                    574:                         configuracion.matrizcaminos = SI;
                    575:                         if(strcmp(campo, "NO")==0) configuracion.matrizcaminos = NO;
                    576:                         break;
                    577: 
                    578:                         case 33:    /* PASOS DE COMPUTACIÓN */
                    579:                         configuracion.pasoscomputacion = SI;
                    580:                         if(strcmp(campo, "NO")==0) configuracion.pasoscomputacion = NO;
                    581:                         break;
                    582: 
                    583:                         case 34:    /* GRADO DE PARALELISMO */
                    584:                         configuracion.gradoparalelismo = SI;
                    585:                         if(strcmp(campo, "NO")==0) configuracion.gradoparalelismo = NO;
                    586:                         break;
                    587: 
                    588:                         case 35:    /* ACOPLAMIENTO */
                    589:                         configuracion.acoplamiento = SI;
                    590:                         if(strcmp(campo, "NO")==0) configuracion.acoplamiento = NO;
                    591:                         break;
                    592: 
                    593:                         case 36:    /* HISTOGRAMA PASOS DE COMPUTACIÓN */
                    594:                         configuracion.distribucionpasos = SI;
                    595:                         if(strcmp(campo, "NO")==0) configuracion.distribucionpasos = NO;
                    596:                         break;
                    597: 
                    598:                         case 37:    /* VOLCAR BD EN FICHEROS */
                    599:                         configuracion.volcarBD = SI;
                    600:                         if(strcmp(campo, "NO")==0) configuracion.volcarBD = NO;
                    601:                         break;
                    602: 
                    603:                         case 38:    /* CREAR FICHERO DE CONFIGURACIÓN */
                    604:                         configuracion.crearficheroconfig = SI;
                    605:                         if(strcmp(campo, "NO")==0) configuracion.crearficheroconfig = NO;
                    606:                         break;
                    607: 
                    608:                         case 39:    /* NOMBRE DEL NUEVO FICHERO DE CONFIGURACIÓN */
                    609:                         strcpy(configuracion.nuevoficheroconfig, campo);
                    610:                         break;
                    611: 
                    612:                         case 40:    /* LISTADO DE VENTANAS A SALVAR */
                    613:                         strcpy(configuracion.volcarventana, campo);
                    614:                         break;
                    615: 
                    616:                         case 41:    /* FICHERO DE RESULTADOS */
                    617:                         strcpy(configuracion.ficheroresultados, campo);
                    618:                         break;
                    619: 
                    620:                         case 42:    /* NIVEL DE NOTIFICACIÓN EN EL LOG */
                    621:                         /* opción por defecto */
                    622:                         configuracion.nivelnotificaciones = ALL;
                    623:                         if(strcmp(campo, "EX_CFG")==0) configuracion.nivelnotificaciones = EX_CFG;
                    624:                         else if(strcmp(campo, "ERRORS")==0) configuracion.nivelnotificaciones = ERRORS;
                    625:                         break;
                    626: 
                    627:                         case 43:    /* VER INSTRUCCIÓN EN CURSO EN LA PANTALLA */
                    628:                         configuracion.verinstruccion = SI;
                    629:                         if(strcmp(campo, "NO")==0) configuracion.verinstruccion = NO;
                    630:                         break;
                    631: 
                    632:                         case 44:    /* VER VENTANA EN CURSO EN LA PANTALLA */
                    633:                         configuracion.verventana = SI;
                    634:                         if(strcmp(campo, "NO")==0) configuracion.verventana = NO;
                    635:                         break;
                    636:                     }
                    637:                 }
                    638:             }
                    639:         }
                    640: 
                    641:         /* hago validación de datos de entrada */
                    642:         ValidarConfiguracion();
                    643: 
                    644:         
                    645:         if(fclose(handle))
                    646:         {
                    647:             sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' no se ha podido cerrar", fichero);
                    648:             Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
                    649:         }
                    650:         else
                    651:         {
                    652:             sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' ha sido cerrado con éxito", fichero);
                    653:             Notificar(mensaje, NO_ERROR, ECO_NO);
                    654:         }
                    655:     }
                    656:     else
                    657:     {
                    658:         sprintf(mensaje, "[CargarConfiguracionFichero] El fichero '%s' no se ha podido abrir", fichero);
                    659:         Notificar(mensaje, ERROR_SEGUIR, ECO_NO);
                    660:     }
                    661: }
                    662: 
                    663: 
                    664: /* función que carga la configuración desde los argumentos del 'main' */
                    665: 
                    666: /* también realiza una pequeña validación de las entradas */
                    667: /* si se requiere asignación de CPI lo fuerza */
                    668: /* si se anula el análisis de dependencias de datos lo fuerza */
                    669: /* si se requiere un cálculo previo lo fuerza */
                    670: 
                    671: void CapturarArgumentos(int argc, char *argv[])
                    672: {
                    673:     char mensaje[MAX_LINE];
                    674:     char cadena[10];
                    675:     char arg_leido = NO;
                    676: 
                    677:     /*
                    678:     int i;
                    679: 
                    680:     printf("%d\n", argc);
                    681:     for(i=0; i<argc; i++)
                    682:     {
                    683:         printf("%s\n", argv[i]);
                    684:     }
                    685: 
                    686:     _getch();
                    687:     */
                    688: 
                    689:     while(--argc > 0 && (*++argv)[0]=='-')
                    690:     {
                    691:         switch((*argv)[1])
                    692:         {
                    693:             case 'h':        /* mostrar texto de ayuda */
                    694:             printf("%s", *textoayuda);
                    695:             exit(1);
                    696:             break;
                    697: 
                    698:             case 'f':        /* cargar la configuración desde fichero */
                    699:             /* si queda al menos un argumento y es una ruta y no otra opción */
                    700:             if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.ficheroconfig, argv[0]);
                    701:             /* cargo la configuración desde fichero (el indicado por defecto o el nuevo) */
                    702:             /* haciendo caso omiso del resto de argumentos (capturados o por capturar) */
                    703:             strcpy(configuracion.captura, "Por fichero"); 
                    704:             /* el fichero de configuración no lleva la clave del tipo de captura ni el */
                    705:             /* nombre del fichero de configuración */
                    706:             CargarConfiguracionFichero();
                    707:             argc = 0;        /* dejo de leer el resto de argumentos */
                    708:             break;
                    709: 
                    710:             case 'n':        /* fichero de arquitectura del repertorio (nemónicos) */
                    711:             /* si queda al menos un argumento y es una ruta y no otra opción */
                    712:             if(--argc!=0 && (*++argv)[0]!='-')    
                    713:             {                
                    714:                 strcpy(configuracion.ficheronemos, argv[0]);
                    715:                 arg_leido = SI;
                    716:             }
                    717:             else
                    718:             {
                    719:                 sprintf(mensaje, "[CapturarArgumentos] La opción -n no especifica ruta y no se tendrá en cuenta");
                    720:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    721:                 ++argc;    *--argv;    /* recupero la situación */
                    722:             }
                    723:             break;
                    724: 
                    725:             case 'u':        /* fichero de arquitectura del repertorio (ubicaciones) */
                    726:             /* si queda al menos un argumento y es una ruta y no otra opción */
                    727:             if(--argc!=0 && (*++argv)[0]!='-')    
                    728:             {                
                    729:                 strcpy(configuracion.ficheroubis, argv[0]);
                    730:                 arg_leido = SI;
                    731:             }
                    732:             else
                    733:             {
                    734:                 sprintf(mensaje, "[CapturarArgumentos] La opción -u no especifica ruta y no se tendrá en cuenta");
                    735:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    736:                 ++argc;    *--argv;    /* recupero la situación */
                    737:             }
                    738:             break;
                    739: 
                    740:             case 'O':        /* origen de datos */
                    741:             /* el siguiente caracter indica situaciones excluyentes */
                    742:             switch((*argv)[2])
                    743:             {
                    744:                 case 't':
                    745:                 /* si queda al menos un argumento y es una ruta y no otra opción */
                    746:                 if(--argc!=0 && (*++argv)[0]!='-')    
                    747:                 {                
                    748:                     configuracion.origen = TRAZA;
                    749:                     strcpy(configuracion.ficherodatos, argv[0]);
                    750:                     arg_leido = SI;
                    751:                 }
                    752:                 else
                    753:                 {
                    754:                     sprintf(mensaje, "[CapturarArgumentos] La opción -Ot no especifica ruta y no se tendrá en cuenta");
                    755:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                    756:                     ++argc;    *--argv;    /* recupero la situación */
                    757:                 }
                    758:                 break;
                    759: 
                    760:                 case 's':
                    761:                 /* si queda al menos un argumento y es una ruta y no otra opción */
                    762:                 if(--argc!=0 && (*++argv)[0]!='-')    
                    763:                 {                
                    764:                     configuracion.origen = SECUENCIA;
                    765:                     strcpy(configuracion.ficherodatos, argv[0]);
                    766:                     arg_leido = SI;
                    767:                 }
                    768:                 else
                    769:                 {
                    770:                     sprintf(mensaje, "[CapturarArgumentos] La opción -Os no especifica ruta y no se tendrá en cuenta");
                    771:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                    772:                     ++argc;    *--argv;    /* recupero la situación */
                    773:                 }
                    774:                 break;
                    775: 
                    776:                 case 'i':
                    777:                 /* si queda al menos un argumento y es una ruta y no otra opción */
                    778:                 if(--argc!=0 && (*++argv)[0]!='-')    
                    779:                 {                
                    780:                     configuracion.origen = CADENAHEX;
                    781:                     strcpy(configuracion.cadenahex, argv[0]);
                    782:                     arg_leido = SI;
                    783:                 }
                    784:                 else
                    785:                 {
                    786:                     sprintf(mensaje, "[CapturarArgumentos] La opción -Oi no especifica instrucción y no se tendrá en cuenta");
                    787:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                    788:                     ++argc;    *--argv;    /* recupero la situación */
                    789:                 }
                    790:                 break;
                    791: 
                    792:                 default:
                    793:                 sprintf(mensaje, "[CapturarArgumentos] La opción -O%c no se reconoce", (*argv)[2]);
                    794:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    795:                 break;
                    796:             }
                    797:             break;
                    798: 
                    799:             case 'p':        /* porcentaje de datos a analizar (sólo para trazas) */
                    800:             /* estos argumentos se cargan en los parámetros de configuración */
                    801:             /* pero si se procesa una traza no se tienen en cuenta */
                    802:             switch((*argv)[2])
                    803:             {
                    804:                 case 'r':    /* rango total en porcentaje */
                    805:                 /* si queda al menos un argumento y es una ruta y no otra opción */
                    806:                 if(--argc!=0 && (*++argv)[0]!='-')    
                    807:                 {                
                    808:                     strcpy(cadena, argv[0]);
                    809:                     cadena[strlen(cadena)-1]='\0';        /* quito el caracter '%' */
                    810:                     configuracion.rango = atof(argv[0]);
                    811:                     arg_leido = SI;
                    812:                 }
                    813:                 else
                    814:                 {
                    815:                     sprintf(mensaje, "[CapturarArgumentos] La opción -pr no especifica valor y no se tendrá en cuenta");
                    816:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                    817:                     ++argc;    *--argv;    /* recupero la situación */
                    818:                 }
                    819:                 break;
                    820: 
                    821:                 case 'c':    /* comienzo en porcentaje */
                    822:                 /* si queda al menos un argumento y es una ruta y no otra opción */
                    823:                 if(--argc!=0 && (*++argv)[0]!='-')    
                    824:                 {                
                    825:                     strcpy(cadena, argv[0]);
                    826:                     cadena[strlen(cadena)-1]='\0';        /* quito el caracter '%' */
                    827:                     configuracion.comienzo = atof(argv[0]);
                    828:                     arg_leido = SI;
                    829:                 }
                    830:                 else
                    831:                 {
                    832:                     sprintf(mensaje, "[CapturarArgumentos] La opción -pc no especifica valor y no se tendrá en cuenta");
                    833:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                    834:                     ++argc;    *--argv;    /* recupero la situación */
                    835:                 }
                    836:                 break;
                    837: 
                    838:                 default:
                    839:                 sprintf(mensaje, "[CapturarArgumentos] La opción -p%c no se reconoce", (*argv)[2]);
                    840:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    841:                 break;
                    842:             }
                    843:             break;
                    844: 
                    845:             case 'i':        /* primera y última instrucción del análisis (sólo para trazas) */
                    846:             /* estos argumentos se cargan en los parámetros de configuración */
                    847:             /* pero si se procesa una traza no se tienen en cuenta */
                    848:             switch((*argv)[2])
                    849:             {
                    850:                 case 'p':
                    851:                 /* si queda al menos un argumento y es una ruta y no otra opción */
                    852:                 if(--argc!=0 && (*++argv)[0]!='-')    
                    853:                 {                
                    854:                     configuracion.primera = atoi(argv[0]);
                    855:                     arg_leido = SI;
                    856:                 }
                    857:                 else
                    858:                 {
                    859:                     sprintf(mensaje, "[CapturarArgumentos] La opción -ip no especifica valor y no se tendrá en cuenta");
                    860:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                    861:                     ++argc;    *--argv;    /* recupero la situación */
                    862:                 }
                    863:                 break;
                    864:             
                    865:                 case 'u':
                    866:                 /* si queda al menos un argumento y es una ruta y no otra opción */
                    867:                 if(--argc!=0 && (*++argv)[0]!='-')    
                    868:                 {                
                    869:                     configuracion.ultima = atoi(argv[0]);
                    870:                     arg_leido = SI;
                    871:                 }
                    872:                 else
                    873:                 {
                    874:                     sprintf(mensaje, "[CapturarArgumentos] La opción -iu no especifica valor y no se tendrá en cuenta");
                    875:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                    876:                     ++argc;    *--argv;    /* recupero la situación */
                    877:                 }
                    878:                 break;
                    879: 
                    880:                 default:
                    881:                 sprintf(mensaje, "[CapturarArgumentos] La opción -i%c no se reconoce", (*argv)[2]);
                    882:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    883:                 break;
                    884:             }
                    885:             break;
                    886: 
                    887:             case 'r':        /* hacer recuentos */
                    888:             configuracion.recuentos = SI;
                    889:             arg_leido = SI;
                    890:             break;
                    891: 
                    892:             case 'c':        /* asignar CPI a cada instrucción */
                    893:             configuracion.cpi = SI;
                    894:             arg_leido = SI;
                    895:             /* si queda al menos un argumento y es una ruta y no otra opción */
                    896:             if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.ficherociclos , argv[0]);
                    897:             else {++argc;    *--argv;}    /* recupero la situación */
                    898:             break;
                    899: 
                    900:             case 'D':        /* analizar dependencias de datos */
                    901:             configuracion.dependencias = NO;
                    902:             arg_leido = SI;
                    903:             break;
                    904: 
                    905:             case 'v':        /* tamaño de la ventana de instrucciones */
                    906:             /* si queda al menos un argumento y es una ruta y no otra opción */
                    907:             if(--argc!=0 && (*++argv)[0]!='-')    
                    908:             {                
                    909:                 configuracion.ventana = atoi(argv[0]);
                    910:                 arg_leido = SI;
                    911:             }
                    912:             else
                    913:             {
                    914:                 sprintf(mensaje, "[CapturarArgumentos] La opción -v no especifica tamaño y no se tendrá en cuenta");
                    915:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    916:                 ++argc;    *--argv;    /* recupero la situación */
                    917:             }
                    918:             break;
                    919: 
                    920:             case 'L':    /* listado de ubicaciones de la pizarra de análisis de dependencias */
                    921:             /* si queda al menos un argumento y es una lista y no otra opción */
                    922:             if(--argc!=0 && (*++argv)[0]!='-')    
                    923:             {                
                    924:                 strcpy(configuracion.listaubis, argv[0]);
                    925:                 arg_leido = SI;
                    926:             }
                    927:             else
                    928:             {
                    929:                 sprintf(mensaje, "[CapturarArgumentos] La opción -L no especifica lista y no se tendrá en cuenta");
                    930:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    931:                 ++argc;    *--argv;    /* recupero la situación */
                    932:             }
                    933:             break;
                    934: 
                    935:             case 'k':        /* desacoplar tipos de dependencias */
                    936:             configuracion.desacoplartipos = SI;
                    937:             arg_leido = SI;
                    938:             break;
                    939: 
                    940:             case 'd':        /* no considerar tipos de dependencias */
                    941:             switch((*argv)[2])
                    942:             {
                    943:                 case 'v':    /* evitar las dependencias verdaderas */
                    944:                 configuracion.verdaderas = NO;
                    945:                 arg_leido = SI;
                    946:                 break;
                    947: 
                    948:                 case 'a':    /* evitar las antidependencias */
                    949:                 configuracion.antidependencias = NO;
                    950:                 arg_leido = SI;
                    951:                 break;
                    952: 
                    953:                 case 's':    /* evitar las dependencias de salida */
                    954:                 configuracion.salida = NO;
                    955:                 arg_leido = SI;
                    956:                 break;
                    957: 
                    958:                 default:
                    959:                 sprintf(mensaje, "[CapturarArgumentos] La opción -d%c no se reconoce", (*argv)[2]);
                    960:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    961:                 break;
                    962:             }
                    963:             break;
                    964: 
                    965:             case 'o':        /* desacoplar origen de dependencias */
                    966:             configuracion.desacoplarorigen = SI;
                    967:             arg_leido = SI;
                    968:             break;
                    969: 
                    970:             case 't':        /* no considerar origen de dependencias */
                    971:             switch((*argv)[2])
                    972:             {
                    973:                 case 'e':    /* evitar los operandos explícitos */
                    974:                 configuracion.explicitos = NO;
                    975:                 arg_leido = SI;
                    976:                 break;
                    977: 
                    978:                 case 'i':    /* evitar los operandos implicitos */
                    979:                 configuracion.implicitos = NO;
                    980:                 arg_leido = SI;
                    981:                 break;
                    982: 
                    983:                 default:
                    984:                 sprintf(mensaje, "[CapturarArgumentos] La opción -t%c no se reconoce", (*argv)[2]);
                    985:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                    986:                 break;
                    987:             }
                    988:             break;
                    989: 
                    990:             case 's':        /* desacoplar fuentes de dependencias */
                    991:             configuracion.desacoplarfuentes = SI;
                    992:             arg_leido = SI;
                    993:             break;
                    994: 
                    995:             case 'q':        /* no considerar fuentes de dependencias */
                    996:             switch((*argv)[2])
                    997:             {
                    998:                 case 'd':    /* evitar las dependencias debidas a datos */
                    999:                 configuracion.datos = NO;
                   1000:                 arg_leido = SI;
                   1001:                 break;
                   1002: 
                   1003:                 case 'a':    /* evitar las dependencias debidas a cómputo de direcciones */
                   1004:                 configuracion.direcciones = NO;
                   1005:                 arg_leido = SI;
                   1006:                 break;
                   1007: 
                   1008:                 case 's':    /* evitar las dependencias debidas a tráfico con la pila */
                   1009:                 configuracion.pila = NO;
                   1010:                 arg_leido = SI;
                   1011:                 break;
                   1012:                 
                   1013:                 case 'c':    /* evitar las dependencias debidas a códigos de condición */
                   1014:                 configuracion.cc = NO;
                   1015:                 arg_leido = SI;
                   1016:                 break;
                   1017: 
                   1018:                 default:
                   1019:                 sprintf(mensaje, "[CapturarArgumentos] La opción -q%c no se reconoce", (*argv)[2]);
                   1020:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                   1021:                 break;
                   1022:             }
                   1023:             break;
                   1024: 
                   1025:             case 'C':        /* cálculos a realizar */
                   1026:             /* detrás de la 'C' podemos colocar seguidos todos los argumentos del grupo */
                   1027:             *++(*argv);        /* avanzo hasta el primer caracter después de la 'C' */
                   1028:             while((char)*++(*argv))        /* barro todos los caracteres hasta el final de la cadena */
                   1029:             {
                   1030:                 switch((char)*(*argv))
                   1031:                 {
                   1032:                     case 'm':    /* calcular el CPI promedio */
                   1033:                     configuracion.CPImedio = SI;
                   1034:                     arg_leido = SI;
                   1035:                     break;
                   1036: 
                   1037:                     case 't':    /* calcular tiempo de ejecución */
                   1038:                     configuracion.tiempo = SI;
                   1039:                     arg_leido = SI;
                   1040:                     break;
                   1041: 
                   1042:                     case 'o':    /* obtener lista de orden parcial */
                   1043:                     configuracion.ordenparcial = SI;
                   1044:                     arg_leido = SI;
                   1045:                     break;
                   1046:                 
                   1047:                     case 'c':    /* generar matriz de caminos */
                   1048:                     configuracion.matrizcaminos = SI;
                   1049:                     arg_leido = SI;
                   1050:                     break;
                   1051: 
                   1052:                     case 'p':    /* calcular pasos de computación */
                   1053:                     configuracion.pasoscomputacion = NO;
                   1054:                     arg_leido = SI;
                   1055:                     break;
                   1056: 
                   1057:                     case 'g':    /* calcular grado de paralelismo */
                   1058:                     configuracion.gradoparalelismo = SI;
                   1059:                     arg_leido = SI;
                   1060:                     break;
                   1061: 
                   1062:                     case 'a':    /* calcular acoplamiento */
                   1063:                     configuracion.acoplamiento = SI;
                   1064:                     arg_leido = SI;
                   1065:                     break;
                   1066: 
                   1067:                     case 'h':    /* construir histograma */
                   1068:                     configuracion.distribucionpasos = SI;
                   1069:                     arg_leido = SI;
                   1070:                     break;
                   1071: 
                   1072:                     default:
                   1073:                     sprintf(mensaje, "[CapturarArgumentos] La opción -C%c no se reconoce", (char)*(*argv));
                   1074:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                   1075:                     break;
                   1076:                 }
                   1077:             }
                   1078:             break;
                   1079: 
                   1080:             case 'V':        /* informes: volcar datos en ficheros */
                   1081:             switch((*argv)[2])
                   1082:             {
                   1083:                 case 'd':    /* volcar bases de datos */
                   1084:                 configuracion.volcarBD = NO;
                   1085:                 arg_leido = SI;
                   1086:                 break;
                   1087: 
                   1088:                 case 'c':    /* crear nuevo fichero de configuración */
                   1089:                 configuracion.crearficheroconfig = SI;
                   1090:                 arg_leido = SI;
                   1091:                 /* si queda al menos un argumento y es una ruta y no otra opción */
                   1092:                 if(--argc!=0 && (*++argv)[0]!='-') strcpy(configuracion.nuevoficheroconfig, argv[0]);
                   1093:                 else {++argc;    *--argv;}    /* recupero la situación */
                   1094:                 break;
                   1095: 
                   1096:                 case 'v':    /* listado de ventanas a salvar */
                   1097:                 /* si queda al menos un argumento y es una lista y no otra opción */
                   1098:                 if(--argc!=0 && (*++argv)[0]!='-')    
                   1099:                 {                
                   1100:                     strcpy(configuracion.volcarventana, argv[0]);
                   1101:                     arg_leido = SI;
                   1102:                 }
                   1103:                 else
                   1104:                 {
                   1105:                     sprintf(mensaje, "[CapturarArgumentos] La opción -Vv no especifica lista y no se tendrá en cuenta");
                   1106:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                   1107:                     ++argc;    *--argv;    /* recupero la situación */
                   1108:                 }
                   1109:                 break;
                   1110:                 
                   1111:                 default:
                   1112:                 sprintf(mensaje, "[CapturarArgumentos] La opción -V%c no se reconoce", (*argv)[2]);
                   1113:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                   1114:                 break;
                   1115:             }
                   1116:             break;
                   1117: 
                   1118:             case 'R':        /* fichero de resultados */
                   1119:             /* si queda al menos un argumento y es una ruta y no otra opción */
                   1120:             if(--argc!=0 && (*++argv)[0]!='-')    
                   1121:             {                
                   1122:                 strcpy(configuracion.ficheroresultados, argv[0]);
                   1123:                 arg_leido = SI;
                   1124:             }
                   1125:             else
                   1126:             {
                   1127:                 sprintf(mensaje, "[CapturarArgumentos] La opción -R no especifica ruta y no se tendrá en cuenta");
                   1128:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                   1129:                 ++argc;    *--argv;    /* recupero la situación */
                   1130:             }
                   1131:             break;
                   1132: 
                   1133:             case 'N':        /* nivel de notificaciones en el fichero de log */
                   1134:             /* si queda al menos un argumento y es una ruta y no otra opción */
                   1135:             if(--argc!=0 && (*++argv)[0]!='-')    
                   1136:             {                
                   1137:                 configuracion.nivelnotificaciones = atoi(argv[0]);
                   1138:                 arg_leido = SI;
                   1139:             }
                   1140:             else
                   1141:             {
                   1142:                 sprintf(mensaje, "[CapturarArgumentos] La opción -N no especifica nivel y no se tendrá en cuenta");
                   1143:                 Notificar(mensaje, NO_ERROR, ECO_NO);
                   1144:                 ++argc;    *--argv;    /* recupero la situación */
                   1145:             }
                   1146:             break;
                   1147: 
                   1148:             case 'M':        /* mostrar en pantalla */
                   1149:             /* detrás de la 'M' podemos colocar seguidos todos los argumentos del grupo */
                   1150:             *++(*argv);        /* avanzo hasta el primer caracter después de la 'M' */
                   1151:             while((char)*++(*argv))        /* barro todos los caracteres hasta el final de la cadena */
                   1152:             {
                   1153:                 switch((char)*(*argv))
                   1154:                 {
                   1155:                     case 'i':    /* mostrar instrucción en curso en la pantalla */
                   1156:                     configuracion.verinstruccion = SI;
                   1157:                     arg_leido = SI;
                   1158:                     break;
                   1159: 
                   1160: #if 0                /* no se ha incluido el parámetro aún */
                   1161:                     case 'e':    /* mostrar estado */
                   1162:                     configuracion.XXXXXX = SI;
                   1163:                     arg_leido = SI;
                   1164:                     break;
                   1165: #endif
                   1166: 
                   1167:                     case 'v':    /* mostrar ventana */
                   1168:                     configuracion.verventana = SI;
                   1169:                     arg_leido = SI;
                   1170:                     break;
                   1171:                 
                   1172:                     default:
                   1173:                     sprintf(mensaje, "[CapturarArgumentos] La opción -M%c no se reconoce", (char)*(*argv));
                   1174:                     Notificar(mensaje, NO_ERROR, ECO_NO);
                   1175:                     break;
                   1176:                 }
                   1177:             }
                   1178:             break;
                   1179: 
                   1180:             default:
                   1181:             sprintf(mensaje, "[CapturarArgumentos] La opción -%c no se reconoce", (*argv)[1]);
                   1182:             Notificar(mensaje, NO_ERROR, ECO_NO);
                   1183:             break;
                   1184:         }
                   1185:     }
                   1186: 
                   1187:     if(arg_leido == SI) strcpy(configuracion.captura, "Paso de argumentos"); 
                   1188:     
                   1189:     ValidarConfiguracion();
                   1190: }
                   1191: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>