Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include<stdlib.h>
- #include <stdint.h>
- #include<string.h> // atoi
- #include<time.h>
- #include "parser.h"
- /*
- Ingresar opcion de tipo de archivo y nombre de archivo que queremos obtener
- relleno con un vector de n datos
- */
- /*
- -t ----> .txt
- -c ----> .csv
- -d ----> .dat
- programa.exe -/[options] -/n [tamanio vector] {-/i[value] -/s [value] -/o [archivo_salida.[txt/csv/dat]]}
- Programa.exe -t
- Programa.exe -c
- Programa.exe -d
- Programa.exe -t -c
- Programa.exe -c -t
- Programa.exe -t -d
- Programa.exe -d -t
- Programa.exe -d -c
- programa.exe -c -d
- programa.exe -t -c -d
- programa.exe -t -d -c
- programa.exe -c -t -d
- programa.exe -c -d -t
- programa.exe -d -c -t
- programa.exe -d -t -c
- programa.exe -tc
- programa.exe -ct
- programa.exe -td
- programa.exe -dt
- programa.exe -cd
- programa.exe -dc
- Programa.exe -tcd
- Programa.exe -tdc
- programa.exe -ctd
- programa.exe -cdt
- Programa.exe -dtc
- programa.exe -dct
- Opcionales:
- programa.exe -h
- programa.exe --help
- programa.exe -v
- programa.exe --version
- *** Ver caso cuando no ingresamos un numero en la ubicacion de numeros
- */
- #define MAX_LENGHT_DEFAULT 1000L
- #define MAX_VECTOR_DEFAULT MAX_LENGHT_DEFAULT
- #define MIN_VECTOR_DEFAULT 0L
- FILE *fileOutput = NULL;
- int main(int argc, char **argv){
- int _argc = argc;
- int k;
- for(k = 0;_argc>0;_argc--,k++)
- printf("argv[%d] = %s\n",k,argv[k]);
- _argc = argc;
- uint8_t txt,csv,dat,ene,min,Max, ene_min,emeOffEne,maxOffMin, min_max,outputFile;
- txt = csv = dat = ene = min = Max = ene_min = min_max = outputFile = false;
- emeOffEne = maxOffMin = true;
- long lenghtVector = MAX_LENGHT_DEFAULT;
- long maxVector = MAX_VECTOR_DEFAULT;
- long minVector = MIN_VECTOR_DEFAULT;
- long value;
- int files = 0;
- int n, nptos,ncharfile;
- const char *namesFilesOutput[3] = {NULL};
- ///char *formato[] = {".txt",".csv",".dat"};
- int lockTDC = true;
- Format f_txt = {'t','x','t',{"xt","t"},{"t","tx","txt"},".txt"};
- Format f_csv = {'c','s','v',{"sv","v"},{"c","cs","csv"},".csv"};
- Format f_dat = {'d','a','t',{"at","t"},{"d","da","dat"},".dat"};
- if(_argc <2)
- printf("Se crea vector por defecto,formato txt, Mil datos aleatorios entre 0 y 1000\n");
- int i = 1,j = 1;
- // lee todos los comandos
- while(_argc>1 && argv[i]!=NULL){ // avanza por string
- if((argv[i][0] == '-' || argv[i][0] =='/') ){
- while(argv[i][j]!='\0'){ // avanza por caracter
- switch(toupper(argv[i][j])){
- case 'T':
- if(!txt && lockTDC){
- printf("Soy t\n");
- txt = true;
- }
- else{
- if(!lockTDC){
- printf("Valor invalido, formato debe ser asignado al principio -t -c -d v -tdc\n");
- }
- else{
- printf("Error: -t ya fue incluido\n");
- return EXIT_FAILURE;
- }
- }
- break;
- case 'C':
- if(!csv && lockTDC){
- csv = true;
- printf("Soy c\n");
- }
- else{
- if(!lockTDC){
- printf("Valor invalido, formato debe ser asignado al principio -t -c -d v -tdc\n");
- }
- else{
- printf("Error: -c ya fue incluido\n");
- return EXIT_FAILURE;
- }
- }
- break;
- case 'D':
- if(!dat && lockTDC){
- dat = true;
- printf("Soy d\n");
- }else{
- if(!lockTDC){
- printf("Valor invalido, formato debe ser asignado al principio -t -c -d v -tdc\n");
- }else{
- printf("Error: -d ya fue incluido\n");
- return EXIT_FAILURE;
- }
- }
- break;
- case 'N':
- if(!ene){
- if(txt || csv || dat){
- printf("Soy n\n");
- ene = true;
- lockTDC = false; // deshabilita -t -c -d
- }
- else{
- printf("*** Error1: Uso equivocado: file -[opcion] -n ***\n");
- return EXIT_FAILURE;
- }
- }
- else{
- printf("Error: -n ya fue incluido\n");
- return EXIT_FAILURE;
- }
- break;
- case 'I':
- if(ene_min){
- if(!min){
- min = true;
- emeOffEne = false; // apaga ene
- printf("Soy min\n");
- }
- else{
- printf("Error: -i ya fue incluido\n");
- return EXIT_FAILURE;
- }
- }
- else{
- printf("Error: Debe ingresar un numero de iteraciones primero (>0)\n");
- return EXIT_FAILURE;
- }
- break;
- case 'S':
- if(min_max){
- if(!Max){
- Max = true;
- maxOffMin = false;
- printf("Soy el Max\n");
- }
- else{
- printf("Error: -s ya fue incluido\n");
- return EXIT_FAILURE;
- }
- }
- else {
- printf("Error: Primero debe ingresar el valor minimo del vector (>0)\n");
- return EXIT_FAILURE;
- }
- break;
- case 'O':
- if(ene_min || Max){
- outputFile = true;
- printf("Soy el -O\n");
- }
- else {
- printf("Debe especificar al menos el formato de salida -t, -c o -d -n iteraciones -o\n");
- return EXIT_FAILURE;
- }
- break;
- default:
- printf("*** Error2: Uso equivocado: file -t -n ***\n");
- return EXIT_FAILURE;
- }
- j++;
- }
- if((argv[i][0] == '-' || argv[i][0]=='/') && argv[i][1]=='\0'){ // caso '-' v '/' solito antes de -algo
- printf("***ErrorX: Uso equivocado file -t -n \n");
- return EXIT_FAILURE;
- }
- i++;
- }
- else{
- printf("*** Error3: Uso equivocado: file -t -d -c ***\n");
- return EXIT_FAILURE;
- }
- if(argv[i]){ // existe un string a continuacion de [Opcion]
- if(ene || min || Max){
- if(esUnNumero(argv[i]) && !outputFile ){ // si el string es numerico v -o
- value = atoi(argv[i]);
- if(ene && emeOffEne ){ // argv[i] es el siguiente de -n i.e. el numero de iteraciones
- if(value>0){
- lenghtVector = value;
- printf("Tamanio vector: %d: argc =%d\n",lenghtVector,_argc);
- ene_min = true; // Habilita -m
- //ene = false;
- }
- else if(value<0){
- lenghtVector = -value;
- ene_min = true;
- }
- else{
- printf("Numero de iteraciones tiene que ser entero positivo\n");
- return EXIT_FAILURE;
- }
- i++;
- _argc--;
- }else if(min && maxOffMin){ // argv[i] es minValorVector siguiente a -m
- minVector = value;
- printf("Minimo vector: %d: argc =%d\n",minVector,_argc);
- min_max = true; // habilita -M
- //min_Max = true;
- i++;
- _argc--;
- }
- else if(Max){ // argv[i] es maxValorVector siguiente a -M
- if(value>minVector){
- maxVector = value;
- printf("Tope valor del vector: %d: argc =%d\n",maxVector,_argc);
- i++;
- _argc--;
- }
- else{
- printf("Tope del vector debe ser mayor al limite inferior %d\n",minVector);
- return EXIT_FAILURE;
- }
- }
- }
- else if(outputFile){ // se conforman los nombres finales
- files = (txt<<0) | (csv<<1) | (dat<<2);
- if(argv[i]){ // existe un argumento siguiente de -o
- n = nPunct(argv[i],&nptos,&ncharfile);
- printf("Numero de signos de puntuacion %d\n",n);
- switch(files){
- case 1: // txt
- namesFilesOutput[0] = revisorN(argv[i],n,f_txt,ncharfile,nptos);
- if(namesFilesOutput[0] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy el fichero final****: %s\n",namesFilesOutput[0]);
- i++;
- //return EXIT_SUCCESS;
- break;
- case 2: // csv
- namesFilesOutput[1] = revisorN(argv[i],n,f_csv,ncharfile,nptos);
- if(namesFilesOutput[1] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy el fichero final: %s\n",namesFilesOutput[1]);
- i++;
- //return EXIT_SUCCESS;
- break;
- case 4: // dat
- namesFilesOutput[2] = revisorN(argv[i],n,f_dat,ncharfile,nptos);
- if(namesFilesOutput[2] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy el fichero final: %s\n",namesFilesOutput[2]);
- i++;
- //return EXIT_SUCCESS;
- break;
- case 3: // csv && txt
- namesFilesOutput[0] = revisorN(argv[i++],n,f_txt,ncharfile,nptos);
- if(namesFilesOutput[0] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[0]);
- if(argv[i]){
- n = nPunct(argv[i],&nptos,&ncharfile);
- namesFilesOutput[1] = revisorN(argv[i++],n,f_csv,ncharfile,nptos);
- if(namesFilesOutput[1] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[1]);
- }else{
- printf("Solo %s despues del -o\n",argv[i-1]);
- }
- break;
- case 5: // dat && txt
- namesFilesOutput[0] = revisorN(argv[i++],n,f_txt,ncharfile,nptos);
- if(namesFilesOutput[0] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[0]);
- if(argv[i]){
- n = nPunct(argv[i],&nptos,&ncharfile);
- namesFilesOutput[2] = revisorN(argv[i++],n,f_dat,ncharfile,nptos);
- if(namesFilesOutput[2] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[2]);
- }else {
- printf("Solo %s despues del -o\n",argv[i-1]);
- }
- break;
- case 6: // csv && dat
- namesFilesOutput[1] = revisorN(argv[i++],n,f_csv,ncharfile,nptos);
- if(namesFilesOutput[1] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[1]);
- if(argv[i]){
- n = nPunct(argv[i],&nptos,&ncharfile);
- namesFilesOutput[2] = revisorN(argv[i++],n,f_dat,ncharfile,nptos);
- if(namesFilesOutput[2] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[2]);
- }else{
- printf("Solo %s despues del -o\n",argv[i-1]);
- }
- break;
- case 7: // txt && csv && dat
- namesFilesOutput[0] = revisorN(argv[i++],n,f_txt,ncharfile,nptos); // txt
- if(namesFilesOutput[0] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[0]);
- if(argv[i]){
- n = nPunct(argv[i],&nptos,&ncharfile);
- namesFilesOutput[1] = revisorN(argv[i++],n,f_csv,ncharfile,nptos); // csv
- if(namesFilesOutput[1] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[1]);
- if(argv[i]){
- n = nPunct(argv[i],&nptos,&ncharfile);
- namesFilesOutput[2] = revisorN(argv[i++],n,f_dat,ncharfile,nptos); // dat
- if(namesFilesOutput[2] == NULL){
- printf("Error: Nombre de archivo no generado\n");
- return EXIT_FAILURE;
- }
- printf("Soy: %s\n",namesFilesOutput[2]);
- }else{
- printf("Solo dos nombres:\n");
- }
- }else{
- printf("Solo %s despues del -o\n",argv[i-1]);
- }
- break;
- default:
- printf("Error:Valor no esperado\n");
- return EXIT_FAILURE;
- }
- }// fin if outputfile
- else {
- printf("No hay nombres de archivos despues de -o\n");
- }
- }// fin if argv[i]
- else{
- printf("Error: Ingrese un valor numerico\n");
- return EXIT_FAILURE;
- }
- }
- }
- _argc--;
- j = 1;
- if(argv[i]==NULL)
- printf("Terminando...\n");
- } // fin while principal
- // Procesamiento de todos los datos recopilados
- char *nameFileDefault[] = {"FileTxtDefault.txt","FileCsvDefault.csv","FileDatDefault.dat"};
- int error = false;
- Data d = {lenghtVector,minVector,maxVector};
- if(argc == 1){
- //lenghtVector = MAX_LENGHT_DEFAULT;
- //minVector = MIN_VECTOR_DEFAULT; // limite valores del vector por defecto
- //maxVector = MAX_VECTOR_DEFAULT;
- namesFilesOutput[0] = nameFileDefault[0];
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- }else {
- printf("files:%d\n",files); // files existe solo si {ponemos -o CualquierNombreDeArchivo}
- //_lenghtVector = lenghtVector;
- // _minVector = minVector;
- // _maxVector = maxVector;
- switch(files){
- case 0: // no entró a -o
- switch((txt<<0) | (csv<<1) | (dat<<2)){
- case 1: // txt
- namesFilesOutput[0] = nameFileDefault[0];
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- break;
- case 2: // csv
- namesFilesOutput[1] = nameFileDefault[1];
- writeFileOutput(argc,argv,namesFilesOutput[1],fileOutput,&d);
- break;
- case 4: // dat
- namesFilesOutput[2] = nameFileDefault[2];
- writeFileOutput(argc,argv,namesFilesOutput[2],fileOutput,&d);
- break;
- case 3: // csv && txt
- namesFilesOutput[0] = nameFileDefault[0]; // name txt
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- namesFilesOutput[1] = nameFileDefault[1]; // name csv
- writeFileOutput(argc,argv,namesFilesOutput[1],fileOutput,&d);
- break;
- case 5: // dat && txt
- namesFilesOutput[0] = nameFileDefault[0]; // name txt
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- namesFilesOutput[2] = nameFileDefault[2]; // name dat
- writeFileOutput(argc,argv,namesFilesOutput[2],fileOutput,&d);
- break;
- case 6: // csv && dat
- namesFilesOutput[1] = nameFileDefault[1]; // name csv
- writeFileOutput(argc,argv,namesFilesOutput[1],fileOutput,&d);
- namesFilesOutput[2] = nameFileDefault[2]; // name dat
- writeFileOutput(argc,argv,namesFilesOutput[2],fileOutput,&d);
- break;
- case 7:
- namesFilesOutput[0] = nameFileDefault[0]; // name txt
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- namesFilesOutput[1] = nameFileDefault[1]; // name csv
- writeFileOutput(argc,argv,namesFilesOutput[1],fileOutput,&d);
- namesFilesOutput[2] = nameFileDefault[2]; // name dat
- writeFileOutput(argc,argv,namesFilesOutput[2],fileOutput,&d);
- break;
- default:
- printf("Error: Valor no esperado");
- return EXIT_FAILURE;
- }
- break;
- case 1: // despues del -o // solo txt
- //printf("ESTOYYYYYYYYYYYYY\n");
- if(namesFilesOutput[0]==NULL)
- namesFilesOutput[0] = nameFileDefault[0];
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- break;
- case 2: // solo csv
- if(namesFilesOutput[1]==NULL)
- namesFilesOutput[1] = nameFileDefault[1];
- writeFileOutput(argc,argv,namesFilesOutput[1],fileOutput,&d);
- break;
- case 3:// csv && txt
- if(namesFilesOutput[0]==NULL)
- namesFilesOutput[0] = nameFileDefault[0];
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- if(namesFilesOutput[1]==NULL)
- namesFilesOutput[1] = nameFileDefault[1];
- writeFileOutput(argc,argv,namesFilesOutput[1],fileOutput,&d);
- break;
- case 4: // dat
- if(namesFilesOutput[2]==NULL)
- namesFilesOutput[2] = nameFileDefault[2];
- writeFileOutput(argc,argv,namesFilesOutput[2],fileOutput,&d);
- break;
- case 5: // dat && txt
- if(namesFilesOutput[0]==NULL)
- namesFilesOutput[0] = nameFileDefault[0];
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- if(namesFilesOutput[2]==NULL)
- namesFilesOutput[2] = nameFileDefault[2];
- writeFileOutput(argc,argv,namesFilesOutput[2],fileOutput,&d);
- break;
- case 6: // csv && dat
- if(namesFilesOutput[1]==NULL)
- namesFilesOutput[1] = nameFileDefault[1];
- writeFileOutput(argc,argv,namesFilesOutput[1],fileOutput,&d);
- if(namesFilesOutput[2]==NULL)
- namesFilesOutput[2] = nameFileDefault[2];
- writeFileOutput(argc,argv,namesFilesOutput[2],fileOutput,&d);
- break;
- case 7: // txt && csv && dat
- if(namesFilesOutput[0]==NULL)
- namesFilesOutput[0] = nameFileDefault[0];
- writeFileOutput(argc,argv,namesFilesOutput[0],fileOutput,&d);
- if(namesFilesOutput[1]==NULL)
- namesFilesOutput[1] = nameFileDefault[1];
- writeFileOutput(argc,argv,namesFilesOutput[1],fileOutput,&d);
- if(namesFilesOutput[2]==NULL)
- namesFilesOutput[2] = nameFileDefault[2];
- writeFileOutput(argc,argv,namesFilesOutput[2],fileOutput,&d);
- break;
- default:
- printf("Error: Valor no esperado");
- return EXIT_FAILURE;
- }
- }
- return 0;
- }
- void writeFileOutput(int argc, char *argv[],const char *nameFileOutput,FILE * outFile, Data *d){
- int *dataVec;
- fileOutput = fopen(nameFileOutput,"w");
- if(!fileOutput){
- fputs ("Error: Archivo no puede ser abierto\n",stderr);
- }
- dataVec = requestMemory(d);
- if(strstr(nameFileOutput,".txt"))
- writeTxt(argc,argv,dataVec,d); //creamos .txt
- else if(strstr(nameFileOutput,".csv"))
- writeCsv(argc,argv,dataVec,d); // creamos .csv
- else if(strstr(nameFileOutput,".dat")){
- writeDat(argc,argv,dataVec,d); // creamos .dat
- }
- else // error
- printf("Error\n");
- }
- /* El archivo txt contendra lo siguiente:
- // comando aplicado: <programa> <opciones> <basenombrearchivo>
- #ifndef __VECTOR_BENCHMARK_H__
- #define __VECTOR_BENCHMARK_H__
- #define lenghtVector xxxxxx
- // minVector = ValorMinimo
- // maxVector = ValorMaximo
- int vectorOutput[lengthVector] = { valor0, valor1,... valor15
- };
- //
- #endif // end __VECTOR_BENCHMARK_H__
- */
- void writeTxt(int argc, char *argv[], int * v,Data *d){
- printCommand(argc,argv);
- fprintf(fileOutput,"%s\n","#ifndef __VECTOR_BENCHMARK_H__");
- fprintf(fileOutput,"%s\n","#define __VECTOR_BENCHMARK_H__");
- fprintf(fileOutput,"%s %d\n\n","#define lenghtVector",d->lenght);
- fprintf(fileOutput,"%s = %d\n","// limInferior ",d->min);
- fprintf(fileOutput,"%s = %d\n","// limSuperior ",d->max);
- fprintf(fileOutput,"%s","\n\nstatic int vectorBenchmark[lenghtVector] = \n{\n");
- int i;
- fprintf(fileOutput,"%s"," ");
- for(i = 0; i<d->lenght;i++){
- if(i%15 == 0 && i!=0) // revisar modulo generalizado
- fprintf(fileOutput,"\n ");
- if(i == d->lenght-1)
- fprintf(fileOutput,"%d",v[i]);
- else
- fprintf(fileOutput,"%d,",v[i]);
- }
- fprintf(fileOutput,"%s","\n};\n\n");
- fprintf(fileOutput,"%s","#endif // end __VECTOR_BENCHMARK_H__");
- }
- void writeCsv(int argc, char *argv[], int *v, Data *d){
- int i = 0;
- fprintf(fileOutput,"%s","ValuesVector\n");
- fprintf(fileOutput,"%d",v[i]);
- for(i = 1; i<d->lenght;i++){
- if(i%15 == 0)
- fprintf(fileOutput,"\n%d",v[i]);
- else
- fprintf(fileOutput,",%d",v[i]);
- }
- }
- void writeDat(int argc, char *argv[],int *v,Data *d){
- printCommand(argc,argv);
- fprintf(fileOutput,"%s","\n\nstatic int vectorBenchmark[");
- fprintf(fileOutput,"%d",d->lenght);
- fprintf(fileOutput,"%s","] = \n{\n");
- int i;
- fprintf(fileOutput,"%s"," ");
- for(i = 0; i<d->lenght;i++){
- if(i%15 == 0 && i!=0) // revisar modulo generalizado
- fprintf(fileOutput,"\n ");
- if(i == d->lenght-1)
- fprintf(fileOutput,"%d",v[i]);
- else
- fprintf(fileOutput,"%d,",v[i]);
- }
- fprintf(fileOutput,"%s","\n};\n\n");
- }
- void printCommand(int argc, char *argv[]){
- int i;
- fprintf(fileOutput,"// Comando aplicado: ");
- for(i = 0;i<argc;i++)
- fprintf(fileOutput,"%s ",argv[i]);
- fprintf(fileOutput,"\n\n");
- }
- int *requestMemory(Data *d){
- int i;
- srand((unsigned)time(NULL)); // marca semilla
- int *vectorData = (int *)malloc((d->lenght)*sizeof(int));
- for(i = 0;i<d->lenght;i++)
- vectorData[i] = d->min + rand()%(d->max + 1 -d->min ); //vector aleatorio
- return vectorData;
- }
- int esUnNumero(const char *argv){
- if(*argv == '-'){
- if(*(argv+1)>= '0' && *(argv+1)<='9'){ // si es digito negativo
- //printf("%c\n",*(argv + 1));
- return true;
- }else
- return false;
- }else if(*argv == '0'){
- return true;
- }
- else if(isdigit(*argv)){
- //printf("%c\n",*argv);
- return true;
- }
- else
- return false;
- }
- int nPunct(const char *str,int *ptos, int *nchar){
- const char *pstr;
- int countPunct = 0;
- for(*nchar = 0,*ptos = 0,pstr = str;*pstr!='\0';pstr++,(*nchar)++){
- if(ispunct(*pstr)){ // revisar tipo dato ispunct
- countPunct++;
- if(*pstr == '.')
- (*ptos)++;
- }
- }
- printf("caracteres %d\n",*nchar);
- return countPunct;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement