#include "wstune.h"

#define WSTUNEVER "0.3"



#define COMMAND_LINE_LEN 128
#define FILE_NAME_LEN 40

#define FAKE_IT 1

#define ERR fprintf(stderr

VOID wsTuneUsage(VOID);


CHAR *szProgname; /* so all parts of the program will know the name */
INT nMode;

/* main()
 *
 * parses command line args
 */
INT _CRTAPI1 main(INT argc,CHAR **argv)
{
    CHAR 	szBaseName[24];
	CHAR 	szFileWSP[24];
	CHAR 	szFileWSR[24];
	CHAR 	szFileTMI[24];
	CHAR 	szFileDAT[24];
	CHAR 	szVar[24];
	CHAR 	szTemp[24];
	CHAR 	*szNull;
	CHAR 	*vargv[8];
	BOOL 	fVerbose = FALSE;
	BOOL 	fOutPut = FALSE;
	BOOL	fNoReduce = FALSE;
	BOOL	fNoDump = TRUE;
	INT		cArgCnt = 0;

    ConvertAppToOem( argc, argv );
    szProgname = *argv; // argv will soon be clobbered
    nMode = 0; // default flags set

    while (--argc && (**(++argv) == '-' || **argv=='/'))
    {
        while(*(++(*argv))) switch (**argv)
        {
			case '?':
				wsTuneUsage();
				break;

			case 'f':
			case 'F':
				nMode |= FAKE_IT;
				break;
			case 'V':
			case 'v':
				fVerbose = TRUE;
				break;
			case 'O':
			case 'o':
				fOutPut = TRUE;
				break;
			case 'N':
			case 'n':
				fNoDump = FALSE;
				break;
			case 'D':
			case 'd':

				fNoReduce = TRUE;
				break;


			default: ERR,"%s: Unrecognized switch: %c\n",
                    szProgname,**argv);
                    return(-1);
        }
    }

    /* any files */
    if (argc <1)
    {
	   wsTuneUsage();
	   return(-1);
    }

    /* now we go to work -- walk through the file names on the command line */
    while (argc--)
    {
        strcpy (szBaseName, *(argv++));

        printf("%s: using \042%s\042\n",szProgname,szBaseName);

		if (szNull = strchr(szBaseName, '.')) {
			*szNull = '\0';
		}

        /* WSREDUCE file.WSP */
		sprintf(szTemp, "wsReduce");
		vargv[0] = szTemp;
		sprintf(szFileWSP, "%s.WSP", szBaseName);
		vargv[1] = szFileWSP;
        if (!(nMode & FAKE_IT)){
			if(!fNoReduce){
				if ((wsReduceMain(2, vargv))!=NO_ERROR){
					ERR,"Unable to call wsreduce for %s\n", vargv[1]);
					return(FALSE);
				}
			}
		}

		if(fNoDump){
			
			/* WSPDUMP /V /Ffile.WSP /Tfile.TMI /Rfile.WSR > file.DT */
			sprintf(szTemp,"%s", "wspDump");
			sprintf(szVar, "%s", "/V");
			sprintf(szFileWSP, "/F%s.WSP", szBaseName);
			sprintf(szFileTMI, "/T%s.TMI", szBaseName);
			sprintf(szFileWSR, "/R%s.WSR", szBaseName);
			cArgCnt = 5;
			if (fOutPut) {
				sprintf(szFileDAT, "/D%s.DT", szBaseName);
				vargv[5] = szFileDAT;
				cArgCnt = 6;
			}
	
			vargv[0] = szTemp;
			vargv[1] = szVar;
			vargv[2] = szFileWSP;
			vargv[3] = szFileTMI;
			vargv[4] = szFileWSR;

			if(!(nMode & FAKE_IT)){
				if ((wspDumpMain (cArgCnt, vargv))!=NO_ERROR) {
					ERR,"Unable to dump random data\n");
					return(FALSE);
				
				}
			}

			/* wspdump /Ffile.wsp /Tfile.tmi > file.DN */
			vargv[1] = szFileWSP;
			vargv[2] = szFileTMI;
			cArgCnt = 3;
			if (fOutPut) {
				sprintf(szFileDAT, "/D%s.DN", szBaseName);
				vargv[3] = szFileDAT;
				cArgCnt = 4;
			}
			vargv[4] = NULL;
			vargv[5] = NULL;

			if (!(nMode & FAKE_IT)){
				if ((wspDumpMain(cArgCnt, vargv))!=NO_ERROR ){
					ERR,"Unable to dump sequential data\n");
					return(FALSE);
				}
			}
		}
    }

}


/*
 *			
 * VOID wsTuneUsage	(VOID)
 *					
 *							
 * Effects:							
 *								
 *	Prints out usage message, and exits with an error.			
 *								
 * Returns:							
 *	
 *	Exits with ERROR.	
 */

VOID wsTuneUsage(VOID)
{
	fprintf(stdout,"\nUsage: %s [/O] [/D] [/N] [?] moduleName.WSP\n", szProgname);
	fprintf(stdout,"  /O   Dump analysis data to file (*.DT tuned *.DN not tuned)\n");
	fprintf(stdout,"  /D   Dump analysis data only\n");
	fprintf(stdout,"  /N   Analyize bitstring data, don't dump any data\n");
	fprintf(stdout,"  /?   Causes this usage message to be displayed.\n");

    exit(ERROR);
}