#define _GNU_SOURCE
#include <sys/time.h>
#include <stdio.h>      /* standard I/O                */
#include <stdlib.h>     /* for exit   - 1 occurrence   */
#include <unistd.h>
#include <pthread.h>

double ge0,ge1,lsgfx,lsmem,lsalu,lsfpu,lscomp,lscompress,lsmedia,x;
struct timeval starttime,endtime;
FILE *fp;
int i;

void title() {
        printf("\tLSBENCH is a product of the linuxsociety team\n");
        printf("\tThis is version beta-0.3.1 dated 12/24/2007\n");
        printf("\tIt is not recommended that you run this benchmark on systems with less than 64MB of physical memory\n\n");
return;
}

void usage() {
        printf("Usage: lsbench -[option]\n");
        printf("Options:\n");
	printf("        -h: display this help menu\n");
	printf("        -a: run all tests\n");
        printf("        -1: memory bandwidth tests\n");
        printf("        -2: fpu tests\n");
        printf("        -3: alu tests\n");
        printf("        -4: compiling tests\n");
        printf("        -5: media conversion tests\n");
        printf("        -6: archiving/compression tests\n");
	printf("        -7: graphics tests\n");
        printf("        -s: silent, suppress all output except final indexes\n");
        printf("\n");
        printf("\n");
}


int All() {
        title();
        //printf("\nRunning Memory tests (3 for now):\n");
        system("memdir/lsmem");
                
	//printf("\nRunning ALU tests(2 for now):");
	//fflush(stdout);
	system("aludir/lsalu");

        //printf("\nRunning FPU tests (6 for now):");
	//fflush(stdout);
        system("fpudir/lsfpu");

        //printf("\nRunning Compiler tests:\n");
	//fflush(stdout);
	system("compiledir/lscompile");        

        //printf("\nRunning Media conversion tests:\n");
	//fflush(stdout);
        system("mediadir/lsmedia");

        //printf("\nRunning Compression/Archiving tests:");
	//fflush(stdout);
        system("compressiondir/lscompress");
	
	printf("\nRunning Simple graphics tests:");
        gettimeofday(&starttime, NULL);
        system("gfxdir/lsgfx");
        gettimeofday(&endtime, NULL);
        ge0=((double)(endtime.tv_sec*1000000-starttime.tv_sec*1000000+endtime.tv_usec-starttime.tv_usec))/1000000;
        printf("\tdone.\n");
	
        lsgfx = 200/ge0;


fp=fopen("memdir/lsmem.log", "r");
fscanf(fp, "%lf", &x);
lsmem=x;
fclose(fp);

fp=fopen("aludir/lsalu.log", "r");
fscanf(fp, "%lf", &x);
lsalu=x;
fclose(fp);

fp=fopen("fpudir/lsfpu.log", "r");
fscanf(fp, "%lf", &x);
lsfpu=x;
fclose(fp);

fp=fopen("compiledir/lscompile.log", "r");
fscanf(fp, "%lf", &x);
lscomp=x;
fclose(fp);

fp=fopen("compressiondir/lscompress.log", "r");
fscanf(fp, "%lf", &x);
lscompress=x;
fclose(fp);

fp=fopen("mediadir/lsmedia.log", "r");
fscanf(fp, "%lf", &x);
lsmedia=x;
fclose(fp);



	printf("\n\n\tfinished.\n");
        printf("\nLSBENCH Results:\n");
        printf("\tMemory index:           %.3f \n", lsmem);
        printf("\tFPU index:              %lf\n", lsfpu);
        printf("\tALU index:              %lf\n", lsalu);
        printf("\tCompile index:          %lf\n", lscomp);
        printf("\tMedia index:            %lf\n", lsmedia);
        printf("\tCompression index:      %lf\n", lscompress);
	printf("\tGraphics index:         %lf\n\n", lsgfx);
        return 0;
}


//int argc, char** argv
int main(int argc, char **argv) {
	int o;
        while((o=getopt(argc, argv, "ha1234567s")) != EOF) {
                switch(o) {
                        case 'h':
                                usage();
                                exit(1);
                                break;
                        case 'a': 
				All();                                
				exit(1);
                                break;
                        case '1': 
				title();
				//printf("\nRunning Memory tests (3 for now):\n");
				system("memdir/lsmem");
				fp=fopen("memdir/lsmem.log", "r");
				fscanf(fp, "%lf", &x);           
				lsmem=x;
				fclose(fp);
				printf("\n\n\tfinished.\n");
				printf("\nLSBENCH Results:");
				printf("\n\tMemory index:           %.3f \n", lsmem);                                
				exit(1);
                                break;
                        case '2':
				title();
				//printf("\nRunning FPU tests (6 for now):");
				system("fpudir/lsfpu");
				fp=fopen("fpudir/lsfpu.log", "r");
				fscanf(fp, "%lf", &x);           
				lsfpu=x;
				fclose(fp);
				printf("\n\n\tfinished.\n");
				printf("\nLSBENCH Results:");
				printf("\n\tFPU index:              %lf\n", lsfpu); 
                                exit(1);
                                break;
                        case '3':
				title();
				system("aludir/lsalu");
        			//lsalu = 64/ge0;
				//return prob0;

				fp=fopen("aludir/lsalu.log", "r");
				fscanf(fp, "%lf", &x);
				lsalu=x;
				fclose(fp);
				printf("\n\n\tfinished.\n");
				printf("\nLSBENCH Results:");
				printf("\n\tALU index:              %lf\n", lsalu);
                                exit(1);
                                break;
                        case '4':
				title();
			        //printf("\nRunning Compiler tests:\n");
				system("compiledir/lscompile");
				fp=fopen("compiledir/lscompile.log", "r");
				fscanf(fp, "%lf", &x);
				lscomp=x;
				fclose(fp);
				printf("\tdone.\n");
				printf("\n\n\tfinished.\n");
				printf("\nLSBENCH Results:");
				printf("\n\tCompile index:          %lf\n", lscomp);
				exit(1);
                                break;
                        case '5':
				title();
			        //printf("\nRunning Media conversion tests:\n");
			        system("mediadir/lsmedia");
				fp=fopen("mediadir/lsmedia.log", "r");  
				fscanf(fp, "%lf", &x);
				lsmedia=x;
				fclose(fp);
        			printf("\tdone.\n");				
				printf("\n\n\tfinished.\n");
				printf("\nLSBENCH Results:");
				printf("\n\tMedia index:            %lf\n", lsmedia);
				exit(1);
				break;
                        case '6':
				title();
				//printf("\nRunning Compression/Archiving tests:\n");
				system("compressiondir/lscompress");
				fp=fopen("compressiondir/lscompress.log", "r");
				fscanf(fp, "%lf", &x);
				lscompress=x;
				fclose(fp);        			
			        printf("\tdone.\n");
				printf("\n\n\tfinished.\n");
				printf("\nLSBENCH Results:");
        			printf("\n\tCompression index:      %lf\n\n", lscompress);
				exit(1);
				break;
                       case '7': 
                                title();
                                printf("\nRunning Simple Graphics test:\n");
				//gettimeofday(&starttime, NULL);
				system("gfxdir/lsgfx");
				//gettimeofday(&endtime, NULL);
				//ge0=((double)(endtime.tv_sec*1000000-starttime.tv_sec*1000000+endtime.tv_usec-starttime.tv_usec))/1000000;
				//lsgfx = 200/ge0;
                                fp=fopen("gfxdir/lsgfx.log", "r");
                                fscanf(fp, "%lf", &x);
                                lsgfx=x;
                                fclose(fp);
                                printf("\n\n\tfinished.\n");
                                printf("\nLSBENCH Results:");
                                printf("\n\tGraphics index:      %lf\n\n", lsgfx);
                                exit(1);
                                break;
                        case 's':
				title();
				printf("\n\tWill be added soon!\n\n");
				exit(1);
				break;
                        default:
			        break;
			}
        }
        while(optind) {
        	title();
                usage();
		printf("\nError: No run options specified!\n\n");
                exit(1);
        }


return 0;
}
