
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

#define MAX 1000000



//                                 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30     

#define STRING_1_30 sscanf(string,"%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s ",s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15],s[16],s[17],s[18],s[19],s[20],s[21],s[22],s[23],s[24],s[25],s[26],s[27],s[28],s[29],s[30]); 

	

void files(void);

void read_data(void);

void column_detect(void);
void header(void);

float x[31][MAX],sens[31];

long i,ic, j,n, num;



long ijk=0;



long iflag=0;

double sr,dt;



long numBytes = 300;




//                                 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30     

#define STRING_1_30 sscanf(string,"%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s ",s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15],s[16],s[17],s[18],s[19],s[20],s[21],s[22],s[23],s[24],s[25],s[26],s[27],s[28],s[29],s[30]); 


char s[31][31];



char string[500];



char prefix[20];
char prefixn[20];



char filename[32][FILENAME_MAX];

FILE *pFile[32];

int main()
{
    printf("\n uci.cpp, ver 3.7,  May 20, 2010");
	printf("\n\n by Tom Irvine ");
	printf("\n Email:  tomirvine@aol.com ");





	for(i=0; i<31; i++)

	{

		for(j=0; j<MAX; j++)

		{

			x[i][j] = 0.;

		}
    }

    files();


//	printf("\n\n How many columns does the input file contain including the time column? \n");
//	scanf("%ld",&ic);





//    printf("\n\n Enter the number of header lines to skip. \n");

//	scanf("%ld",&num);





    column_detect();


	 printf("\n Total columns = %ld",ic);
	fprintf(pFile[31],"\n Total columns = %ld",ic);

    if(ic>30)
	{
		printf("\n\n Error:  maximum column limit=30 \n"); 
        exit(1);
	}
	if(ic<=1)
	{
		printf("\n\n Error:  minimum column limit=2 \n"); 
        exit(1);
	}

	for(i=0; i< ic; i++)
	{
		sens[i]=1.;
	}

	int iscale=0;

	printf("\n\n Do you wish to apply a scale factor to the data? \n 1=yes 2=no\n");
    scanf("%d",&iscale);

    if(iscale ==1)
	{
		for(i=1; i<ic; i++)
		{
			printf("\n\n Enter the scale factor for channel %ld (Engineering Units/volt):   \n",i);
			scanf("%f",&sens[i]);

			fprintf(pFile[31],"\n Scale factor for channel %ld = %14.7g (Engineering Unit/volt)",i,sens[i]);
		}
	}


	fprintf(pFile[31],"\n\n Skip %ld header lines",num);




	for(i=1; i<ic; i++)

	{

		pFile[i]=fopen(filename[i], "w");

    }


	printf("\n\n Reading input data......\n");


	ijk=2;



	header();

    
	n=0;



	while(1)

    {



		read_data();
	
		n=j;
	
		printf("\n n=%ld lines read.\n",n);
		fprintf(pFile[31],"\n n=%ld lines read\n",n);


		dt = (x[0][n-1]-x[0][0])/long(n-1);
		sr=1./dt;



		printf("\n start time = %f ",x[0][0]);
		printf("\n end   time = %f \n\n",x[0][n-1]);




		printf("\n sample rate = %14.4g samples/sec \n",sr);
		fprintf(pFile[31],"\n sample rate = %14.4g samples/sec \n",sr);


		for(i=1; i<ic; i++)
		{
			for(j=0;j<n; ++j)
			{
				fprintf(pFile[i],"%16.9e %14.7e\n", x[0][j],sens[i]*x[i][j]);
			}	
		}

		if(iflag==999){break;}

	

	}

	fclose(pFile[0]);

	fclose(pFile[31]);



	printf("\n\n Output data files: \n\n");



	for(i=1; i<ic; i++)

	{

		printf("\n  %s ",filename[i] );

		fclose(pFile[i]);

	}


	printf("\n\n Input parameters written to file:\n\n %s ",filename[31] );
    
	printf("\n\n Program complete. \n Press any key to exit.");
    getch();

}
void files(void)
{
   printf("\n\n The input file must be an ASCII text file. ");



   printf("\n The first column must be time(sec). \n");



   printf("\n\n Enter input filename:\n");
   scanf("%s",&filename[0]);
   pFile[0]=fopen(filename[0], "rb");

  
   for(i=0; i<=0; i++)
   {
      if(pFile[i] == NULL )
      {
         printf(" Failed to open file: %s \n", filename[i]);
         fclose(pFile[i]);
      }
      else
      {
         printf(" File: %s opened. \n", filename[i]);
      }
   }

   printf("\n\n Enter output filename prefix: (example:  testdata )\n");
   scanf("%s",&prefix);


   char nnn[10];



   for(i=1;i<30;i++)
   {

	    strcpy(prefixn,prefix);



		sprintf(nnn,".%ld",i);

        

		strcat(prefixn,nnn);


		sprintf(filename[i],"%s",prefixn);

	}


   sprintf(filename[31],"%s.par",prefix);
   pFile[31]=fopen(filename[31], "w");

   fprintf(pFile[31],"\n Input file = %s \n",filename[0]);
		     
} 
void read_data(void)
{

	long ik=0;



	long ij;



	char s[31][31];



	long iv;




	for(j=0;j<MAX; ++j)
    {



		if( fgets(string,numBytes,pFile[0] ) <=0 )

		{

			iflag=999;

			break;

		}



		if(strrchr(string,',' ) != NULL)

		{

			char *ptr=string;



			char temp[500];



			strcpy(temp,string);



			for(iv=0;iv<500;iv++)

			{



				if( *(ptr+iv) == ',')

				{

					temp[iv]=' ';

				}



			}

			strcpy(string,temp);



		}

		STRING_1_30



		for(ij=0; ij< ic; ij++)

		{

			x[ij][j] = float(atof(s[ij+1]));

        }



	}


}

void column_detect(void)

{

	long iv;



	header();



	fgets(string,numBytes,pFile[0] );





//***************************************



		if(strrchr(string,',' ) != NULL)

		{

			char *ptr=string;



			char temp[500];



			strcpy(temp,string);



			for(iv=0;iv<500;iv++)

			{



				if( *(ptr+iv) == ',')

				{

					temp[iv]=' ';

				}



			}

			strcpy(string,temp);



		}

		STRING_1_30



//***************************************

	



    int cflag=1;

	

	ic=30;



    char buffer[10];





    for(i=1; i<=ic; i++)

	{

		 cflag=0;



		 for(j=0;j<=9;j++)

		 {

			itoa (j,buffer,10);



			if( strstr( s[i],buffer )!=NULL )

			{

				cflag=1;



				break;

			}

		 }



		 if(cflag==0)

		 {

			 ic=i-1;

			 break;

		 }

	}

	rewind(pFile[0]);



}

void header(void)

{

	long numBytes=300;



	char string[300];



	int nmax=0;

	long j=1;



	while(fgets(string,numBytes,pFile[0] )>0)
	{

//		printf("%ld.  %s\n",j,string);

		if( strrchr(string,'0' ) == NULL && strrchr(string,'1' ) == NULL && strrchr(string,'2' ) == NULL && strrchr(string,'3' ) == NULL && strrchr(string,'4' ) == NULL && strrchr(string,'5' ) == NULL && strrchr(string,'6' ) == NULL && strrchr(string,'7' ) == NULL && strrchr(string,'8' ) == NULL && strrchr(string,'9' ) == NULL)
        {
                        
 //           printf(" no number found \n");
 //           exit(1);
            nmax=j;
        }

		if( strrchr(string,'A' ) != NULL )
        {     nmax=j;  }

		if( strrchr(string,'B' ) != NULL ){nmax=j;}

		if( strrchr(string,'C' ) != NULL ){nmax=j;}

		if( strrchr(string,'D' ) != NULL ){nmax=j;}

//		if( strrchr(string,'E' ) != NULL && strstr(string,"E+")==NULL && strstr(string,"E-")==NULL ){nmax=j;}

		if( strrchr(string,'F' ) != NULL ){nmax=j;}

		if( strrchr(string,'G' ) != NULL ){nmax=j;}

		if( strrchr(string,'H' ) != NULL ){nmax=j;}

		if( strrchr(string,'I' ) != NULL ){nmax=j;}

		if( strrchr(string,'J' ) != NULL ){nmax=j;}

		if( strrchr(string,'K' ) != NULL ){nmax=j;}

		if( strrchr(string,'L' ) != NULL ){nmax=j;}

		if( strrchr(string,'M' ) != NULL ){nmax=j;}

		if( strrchr(string,'N' ) != NULL ){nmax=j;}

		if( strrchr(string,'O' ) != NULL ){nmax=j;}

		if( strrchr(string,'P' ) != NULL ){nmax=j;}

		if( strrchr(string,'Q' ) != NULL ){nmax=j;}

		if( strrchr(string,'R' ) != NULL ){nmax=j;}

		if( strrchr(string,'S' ) != NULL ){nmax=j;}

		if( strrchr(string,'T' ) != NULL ){nmax=j;}

		if( strrchr(string,'U' ) != NULL ){nmax=j;}

		if( strrchr(string,'V' ) != NULL ){nmax=j;}

		if( strrchr(string,'W' ) != NULL ){nmax=j;}

		if( strrchr(string,'X' ) != NULL ){nmax=j;}

		if( strrchr(string,'Y' ) != NULL ){nmax=j;}

		if( strrchr(string,'Z' ) != NULL ){nmax=j;}

//

		if( strrchr(string,'a' ) != NULL ){nmax=j;}

		if( strrchr(string,'b' ) != NULL ){nmax=j;}

		if( strrchr(string,'c' ) != NULL ){nmax=j;}

		if( strrchr(string,'d' ) != NULL ){nmax=j;}

//		if( strrchr(string,'e' ) != NULL  && strstr(string,"e+")==NULL && strstr(string,"e-")==NULL ){nmax=j;}

		if( strrchr(string,'f' ) != NULL ){nmax=j;}

		if( strrchr(string,'g' ) != NULL ){nmax=j;}

		if( strrchr(string,'h' ) != NULL ){nmax=j;}

		if( strrchr(string,'i' ) != NULL ){nmax=j;}

		if( strrchr(string,'j' ) != NULL ){nmax=j;}

		if( strrchr(string,'k' ) != NULL ){nmax=j;}

		if( strrchr(string,'l' ) != NULL ){nmax=j;}

		if( strrchr(string,'m' ) != NULL ){nmax=j;}

		if( strrchr(string,'n' ) != NULL ){nmax=j;}

		if( strrchr(string,'o' ) != NULL ){nmax=j;}

		if( strrchr(string,'p' ) != NULL ){nmax=j;}

		if( strrchr(string,'q' ) != NULL ){nmax=j;}

		if( strrchr(string,'r' ) != NULL ){nmax=j;}

		if( strrchr(string,'s' ) != NULL ){nmax=j;}

		if( strrchr(string,'t' ) != NULL ){nmax=j;}

		if( strrchr(string,'u' ) != NULL ){nmax=j;}

		if( strrchr(string,'v' ) != NULL ){nmax=j;}

		if( strrchr(string,'w' ) != NULL ){nmax=j;}

		if( strrchr(string,'x' ) != NULL ){nmax=j;}

		if( strrchr(string,'y' ) != NULL ){nmax=j;}

		if( strrchr(string,'z' ) != NULL ){nmax=j;}

//

		if( strrchr(string,'!' ) != NULL ){nmax=j;}

		if( strrchr(string,'@' ) != NULL ){nmax=j;}

		if( strrchr(string,'#' ) != NULL ){nmax=j;}

		if( strrchr(string,'$' ) != NULL ){nmax=j;}

		if( strrchr(string,'%' ) != NULL ){nmax=j;}

		if( strrchr(string,'^' ) != NULL ){nmax=j;}

		if( strrchr(string,'&' ) != NULL ){nmax=j;}

		if( strrchr(string,'*' ) != NULL ){nmax=j;}

		if( strrchr(string,'/' ) != NULL ){nmax=j;}

		if( strrchr(string,'>' ) != NULL ){nmax=j;}

		if( strrchr(string,'<' ) != NULL ){nmax=j;}

		if( strrchr(string,'?' ) != NULL ){nmax=j;}

		if( strrchr(string,'=' ) != NULL ){nmax=j;}

		if( strrchr(string,';' ) != NULL ){nmax=j;}



		j++;



		if(j>200){break;}

	}

	rewind(pFile[0]);



	if(ijk!=2)

	{

		printf("\n %ld header lines detected \n\n",nmax);

	}



	for(j=0;j<nmax;j++)

	{

		fgets(string,numBytes,pFile[0] );

	



		if(ijk==2)

		{

			fprintf(pFile[31],"\n %ld. %s ",j,string);

		}

		else

		{

			printf(" %s ",string);

		}



	}

}



