/** * Comprueba los parámetros de entrada del sistema. * Entre las comprobaciones que realiza controla la cantidad, la validez y si algun parámetro esta repetido. * @param argc Cantidad de argumentos recibidos en la ejecución * @param argv Arreglo con los argumentos recibidos en la ejecución * @return Devuelve 1 si se comprueban los parámetros correctamente o 0 (cero) en otro caso */ int comprobarParametros(int argc, char *argv[]) { /* * Datos de entrada -p nombre archivo Para especificar archivo de procesos -io nombre archivo Para especificar archivo de solicitudes de I/O de cada proceso -prec nombre archivo Para especificar archivo precedencia de los procesos Datos de salida -rs nombre archivo Para especificar archivo de resultados a nivel sistema -rp nombre archivo Para especificar archivo de resultados a nivel proceso -ev nombre archivo Para especificar archivo de eventos tratados */ // Si solo envío un parámetro y ademas el parámetro es --help o -h if (argc == 2 && (!strcmp(argv[1],"--help") || !strcmp(argv[1],"-h"))) { imprimirAyuda(); return 0; } // Si se envío algun parámetro, estos tienen que venir "paramtero" "valor" // Por lo que si, restando el argv[0] la cantidad de parámetros es impar: error // O si la cantidad de parametros es mayor a 10: error if ((argc > 1 && (argc -1) % 2 != 0) || argc > 10) { printf("Error: Cantidad de parámetros incorrectos.\n"); imprimirAyuda(); return 0; } int i; // Verifico que las opciones de parámetros sean válidas for (i=1; i<argc; i+=2) { if (strcmp(argv[i],"-p") && strcmp(argv[i],"-io") && strcmp(argv[i],"-prec") && strcmp(argv[i],"-rs") && strcmp(argv[i],"-rp") && strcmp(argv[i],"-ev")) { printf("Error: El parámetro %s es inválido!.\n",argv[i]); imprimirAyuda(); return 0; } } // Verifico que no hay parámetros repetidos int j=1,k; while (j<argc) { k=j+2; while (k<argc && strcmp(argv[j],argv[k])) k+=2; if (k<argc) { printf("Error: Parámetro %s repetido.\n",argv[j]); imprimirAyuda(); return 0; } j+=2; } return 1; }
void evaluarArgumentos(int argc, char *argv[]) { int i = 0; char *nombresArchivos[maxcantArchivos]; int cantArchivos = 0; bool LineasPorDefecto = true; int cantOpcionesTail = 0; for(i=1;i<argc;i++) /*buscamos los archivos*/ { if (*argv[i] == '-') //descartamos las opciones { switch ( *(argv[i] +1) ) { case caracteres: i++; //si es caracter descartamos su parametro k cantOpcionesTail++; break; case lineas: //si es linea descartamos su parametro k cantOpcionesTail++; i++; break; } } else { nombresArchivos[cantArchivos++] = argv[i]; } } if(cantOpcionesTail > 1) // solo puede haber una opcion de Tail caracter o linea { char* error_doble_funcionalidad = "\n error en los parametros, usar -n o -c pero no ambos \n"; fputs(error_doble_funcionalidad,stderr); exit(EXIT_FAILURE); } for (i = 1;i<argc;i++) //no contamos el argumento cero dado que es el programa, ni el ultimo porque es el archivo { if (*argv[i] == '-') switch ( *(argv[i] +1) ) { case ayuda: imprimirAyuda(); exit(EXIT_SUCCESS); break; case version: imprimirVersion(); exit(EXIT_SUCCESS); break; case caracteres: validacionEntero(atoi(argv[i+1])); tail(atoi(argv[i+1]),nombresArchivos,cantArchivos,false); LineasPorDefecto = false; break; case lineas: validacionEntero(atoi(argv[i+1])); tail(atoi(argv[i+1]),nombresArchivos,cantArchivos,true); LineasPorDefecto = false; break; default: fputs("\n error la opcion del menu no es correcta: ayuda\n",stderr); imprimirAyuda(); //imprimir ayuda en caso de parametros incorrectos exit(EXIT_FAILURE); break; } } if(LineasPorDefecto == true) tail(cantLineasPorDefecto,nombresArchivos,cantArchivos,true); }