#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "newString.h"
#include "stretchArray.h"
#include "global.h"
#include "extFuncDefn.h"


extern FILE* yyin;
extern StretchArray<String> arcFunc;
extern int fcount;
//extern yydebug; //Added by Aruna

int
main(int argc, char** argv)
{
    int  len;
    int  i;   
    char cltFile[ 256 ];
    char filename[ 256 ];
    char* tok;
    char  buff3[256];
    char  buff1[256];
    char  buff2[256];
	FILE *tspproc; 

	char buff4[200];
	char buff5[200];

	int wait;

    
    progName = argv[0];
    yyin     = moreInput(argv, argc);
	//char *Line = new char[100];

	//yydebug = 1; //Aruna 
    while (yyin)
    {
		//fgets(Line,99,yyin);
		//printf("%s\n",Line);

//	------------------------------------------  make cltFile
        
        getExtension(cltFile, fileName, ".c");
        cltFP  = efopen(cltFile, "w");

        lineNo = 1;
		if(ferror(yyin))
        printf("Failing here ....\n");
		
	//printf(" IN file main.cpp %s\n",cltFile);
        yyparse();

        fclose(yyin);
        fclose(cltFP);
        getExtension(cltFile, fileName, "");
        getExtension(filename, fileName, "");
        strcat( cltFile, "_tmp");
        cltFP  = efopen(cltFile, "w");

        fprintf(cltFP, "#include <arcGlob.h> \n");
        fprintf(cltFP, "#include <Coordinator.h> \n");
        for(i = 0; i < fcount; i++)
        {
            strcpy( buff3, arcFunc[i].GetString());
            tok = strtok( buff3, ", \t\n");
            tok = strtok( NULL, ", \t\n");
            fprintf(cltFP, "#include \"_%s_%s.h\" \n", filename, tok);
            fprintf(cltFP, "#define    ARC_%s       %d \n", tok, i);
            fprintf(cltFP, "%sArguments     %sArgs; \n", tok, tok);
            fprintf(cltFP, "%sResults       %sRes; \n", tok, tok);
            fprintf(cltFP, "char*           %sDirectives = \" \";\n", tok);
        }
fprintf(cltFP, "void \n");
fprintf(cltFP, "PostArgs( int ribId) \n");
fprintf(cltFP, "{\n");
    fprintf(cltFP, "\tCLIENT* cl;\n");
    fprintf(cltFP, "\tstatic struct timeval  timeout = {0, 0};\n");

    fprintf(cltFP, "\tif( Buffer[ribId].LockId >= 0)\n");
    fprintf(cltFP, "\t{\n");
        fprintf(cltFP, "\t\tif ((cl = clnt_create(lockList->LocalLockArr_val[Buffer[ribId].LockId].IPAddress.String_val,\n"); 
               fprintf(cltFP, "\t\t\t\t(u_long)Buffer[ribId].ProgNum, 1, \"tcp\")) == NULL)\n");
        fprintf(cltFP, "\t\t{\n");
            fprintf(cltFP, "\t\t\tclnt_pcreateerror(lockList->LocalLockArr_val[Buffer[ribId].LockId].IPAddress.String_val);\n");
            fprintf(cltFP, "\t\t\treturn;\n");
        fprintf(cltFP, "\t\t}\n");
    fprintf(cltFP, "\t}\n");
    fprintf(cltFP, "\telse\n");
    fprintf(cltFP, "\t{\n");
        fprintf(cltFP, "\t\tif ((cl = clnt_create(str.String_val, (u_long)Buffer[ribId].ProgNum,\n");
                fprintf(cltFP, "\t\t\t\t1, \"tcp\")) == NULL)\n");
        fprintf(cltFP, "\t\t{\n");
            fprintf(cltFP, "\t\t\tclnt_pcreateerror(str.String_val);\n");
            fprintf(cltFP, "\t\t\treturn; \n");
        fprintf(cltFP, "\t\t}\n");
    fprintf(cltFP, "\t}\n");


        upperStr(buff1, filename);
        for(i = 0; i < fcount; i++)
        {
            strcpy( buff3, arcFunc[i].GetString());
            tok = strtok( buff3, ", \t\n");
            tok = strtok( NULL, ", \t\n");
            upperStr(buff2, tok);
    fprintf(cltFP, "\tif( Buffer[ribId].FuncType == ARC_%s) \n", tok);
    fprintf(cltFP, "\t{\n");
        fprintf(cltFP, "\t\t%sArgs = *( (%sArguments *)Buffer[ribId].Arguments);\n", tok, tok);
        fprintf(cltFP, "\t\tclnt_call(cl,  SEND_%d_%s_%s_ARGS, xdr_%sArguments, (char *)&%sArgs, \n", i, buff1, 
                buff2, tok, tok);
                 fprintf(cltFP, "\t\t\t\txdr_void, NULL, timeout);\n");
    fprintf(cltFP, "\t\tclnt_destroy(cl);\n");
    fprintf(cltFP, "\t\treturn;\n");
    fprintf(cltFP, "\t}\n");
        }
fprintf(cltFP, "}\n");

    
fprintf(cltFP, "void\n");
fprintf(cltFP, "GetResults( int ribId, u_long prognum)\n");
fprintf(cltFP, "{\n");
    fprintf(cltFP, "\tCLIENT* cl; \n\n");

    fprintf(cltFP, "\tif( Buffer[ribId].LockId >= 0) \n");
    fprintf(cltFP, "\t{\n");
        fprintf(cltFP, "\t\tif ((cl = clnt_create(lockList->LocalLockArr_val[Buffer[ribId].LockId].IPAddress.String_val, \n");
               fprintf(cltFP, "\t\t\t\t(u_long)prognum, 1, \"tcp\")) == NULL)\n");
        fprintf(cltFP, "\t\t{\n");
            fprintf(cltFP, "\t\t\tclnt_pcreateerror(lockList->LocalLockArr_val[Buffer[ribId].LockId].IPAddress.String_val); \n");
            fprintf(cltFP, "\t\t\treturn;\n");
        fprintf(cltFP, "\t\t}\n");
    fprintf(cltFP, "\t}\n");
    fprintf(cltFP, "\telse\n");
    fprintf(cltFP, "\t{\n");
        fprintf(cltFP, "\t\tif ((cl = clnt_create(str.String_val, (u_long)prognum, 1, \n");
                fprintf(cltFP, "\t\t\t\t\"tcp\")) == NULL)\n");
        fprintf(cltFP, "\t\t{\n");
            fprintf(cltFP, "\t\t\tclnt_pcreateerror(str.String_val);\n");
            fprintf(cltFP, "\t\t\treturn; \n");
        fprintf(cltFP, "\t\t}\n");
    fprintf(cltFP, "\t}\n");

        for(i = 0; i < fcount; i++)
        {
            strcpy( buff3, arcFunc[i].GetString());
            tok = strtok( buff3, ", \t\n");
            tok = strtok( NULL, ", \t\n");
            upperStr(buff2, tok);
    fprintf(cltFP, "\tif( Buffer[ribId].FuncType == ARC_%s) \n", tok);
    fprintf(cltFP, "\t{\n");    
        fprintf(cltFP, "\t\tif( Buffer[ribId].LockId >= 0)\n");
        fprintf(cltFP, "\t\t{\n");
            fprintf(cltFP, "\t\t\tif (clnt_call(cl,  GET_%d_%s_%s_RESULT, xdr_void, NULL,\n",
                    i, buff1, buff2);
                 fprintf(cltFP, "\t\t\t\txdr_%sResults, (char *)&%sRes, TIMEOUT) != RPC_SUCCESS) \n", 
                         tok, tok);
            fprintf(cltFP, "\t\t\t{\n");
                fprintf(cltFP, "\t\t\t\tclnt_perror( cl, lockList->LocalLockArr_val[Buffer[ribId].LockId].IPAddress.String_val);\n");
                fprintf(cltFP, "\t\t\t\treturn;\n");
            fprintf(cltFP, "\t\t\t}\n");
        fprintf(cltFP, "\t\t}\n");
        fprintf(cltFP, "\t\telse\n");
        fprintf(cltFP, "\t\t{\n");
            fprintf(cltFP, "\t\t\tif (clnt_call(cl,  GET_%d_%s_%s_RESULT, xdr_void, NULL, \n",
                    i , buff1, buff2);
                 fprintf(cltFP, "\t\t\t\t\txdr_%sResults, (char *)&%sRes, TIMEOUT) != RPC_SUCCESS) \n", tok, tok);
            fprintf(cltFP, "\t\t\t{\n");
                fprintf(cltFP, "\t\t\t\tclnt_perror( cl, str.String_val); \n");
                fprintf(cltFP, "\t\t\t\treturn; \n");
            fprintf(cltFP, "\t\t\t}\n");
        fprintf(cltFP, "\t\t}\n");
        fprintf(cltFP, "\t\tBuffer[ribId].Results = (char *) malloc( sizeof(%sRes));\n", tok);

        fprintf(cltFP, "\t\tmemcpy( Buffer[ribId].Results, (char *)&%sRes, sizeof( %sRes)); \n", tok, tok);
        fprintf(cltFP, "\t\tBuffer[ribId].Status = Available;\n");
    fprintf(cltFP, "\t\tclnt_destroy(cl);\n");
    fprintf(cltFP, "\t\treturn;\n");
    fprintf(cltFP, "\t}\n");
        }
fprintf(cltFP, "}\n");

fprintf(cltFP, "void\n");
fprintf(cltFP, "Terminate( int ribId) \n");
fprintf(cltFP, "{\n");
    fprintf(cltFP, "\tRibInf  ribInf; \n");
    fprintf(cltFP, "\tCLIENT* cl;\n");
    fprintf(cltFP, "\tchar    server[50];\n");
    fprintf(cltFP, "\tint     clntFlag = 1;\n");
    fprintf(cltFP, "\tstatic struct timeval  timeout = {0, 0};\n\n");

    fprintf(cltFP, "\t\tGetHostNameAndIPadd(NULL, server ); \n");
    fprintf(cltFP, "\tif( Buffer[ribId].LockId == -1) \n");
    fprintf(cltFP, "\t{\n");
        fprintf(cltFP, "\t\tif ((cl = clnt_create(server, (u_long)Buffer[ribId].ProgNum, \n");
                fprintf(cltFP, "\t\t\t\t1, \"tcp\")) == NULL) \n");
        fprintf(cltFP, "\t\t{\n");
            fprintf(cltFP, "\t\t\tclnt_pcreateerror(server);\n");
            fprintf(cltFP, "\t\t\treturn;\n");
        fprintf(cltFP, "\t\t}\n");
        
        for(i = 0; i < fcount; i++)
        {
            strcpy( buff3, arcFunc[i].GetString());
            tok = strtok( buff3, ", \t\n");
            tok = strtok( NULL, ", \t\n");
            upperStr(buff2, tok);
    fprintf(cltFP, "\t\tif( Buffer[ribId].FuncType == ARC_%s) \n", tok);
    fprintf(cltFP, "\t\t{\n");    
        fprintf(cltFP, "\t\t\tclnt_call(cl,  KILL_%d_%s_%s, xdr_void, NULL, xdr_void, \n", i, buff1, buff2);
                        fprintf(cltFP, "\t\t\t\tNULL, timeout); \n");
        fprintf(cltFP, "\t\t\tclnt_destroy(cl); \n");
        fprintf(cltFP, "\t\t\tBuffer[ribId].Status = Terminated; \n");
        fprintf(cltFP, "\t\t\treturn;\n");
        fprintf(cltFP, "\t\t}\n");
        }
    fprintf(cltFP, "\t}\n");
    fprintf(cltFP, "\telse\n");
    fprintf(cltFP, "\t{\n");
        fprintf(cltFP, "\t\tif ((cl = clnt_create(lockList->LocalLockArr_val[Buffer[ribId].LockId].IPAddress.String_val,\n");
                fprintf(cltFP, "\t\t\t\t(u_long)Buffer[ribId].ProgNum, 1, \"tcp\")) == NULL)\n");
        fprintf(cltFP, "\t\t{\n");
            fprintf(cltFP, "\t\t\tclnt_pcreateerror(lockList->LocalLockArr_val[Buffer[ribId].LockId].IPAddress.String_val);\n");
            fprintf(cltFP, "\t\t\treturn;\n");
        fprintf(cltFP, "\t\t}\n");
        for(i = 0; i < fcount; i++)
        {
            strcpy( buff3, arcFunc[i].GetString());
            tok = strtok( buff3, ", \t\n");
            tok = strtok( NULL, ", \t\n");
            upperStr(buff2, tok);
    fprintf(cltFP, "\t\tif( Buffer[ribId].FuncType == ARC_%s) \n", tok);
    fprintf(cltFP, "\t\t{\n");    
        fprintf(cltFP, "\t\t\tclnt_call(cl,  KILL_%d_%s_%s, xdr_void, NULL, xdr_void, \n", i, buff1, buff2);
                        fprintf(cltFP, "\t\t\t\tNULL, timeout); \n");
        fprintf(cltFP, "\t\t\tclnt_destroy(cl);\n");
        fprintf(cltFP, "\t\t}\n");
        }
        fprintf(cltFP, "\t\tBuffer[ribId].Status = Terminated; \n");
    fprintf(cltFP, "\t}\n");
fprintf(cltFP, "}\n");

        fclose(cltFP);

		strcpy (buff4, "cp ");;
		strcat (buff4, filename);
		strcat (buff4,".c ____tmp");
		system (buff4);
		
        strcpy( buff1, "cat ");
        strcat(buff1, filename); 
        strcat(buff1, ".c >> ");
        strcat(buff1, cltFile);

        system( buff1);


        strcpy( buff2, "mv ");
        strcat( buff2, cltFile);
        strcat( buff2, " ");
        strcat( buff2, filename);
        strcat( buff2, ".c ");
        system(buff2);



        for(i = 0; i < fcount; i++)
        {
            strcpy( buff3, arcFunc[i].GetString());
            tok = strtok( buff3, ", \t\n");
            tok = strtok( NULL, ", \t\n");
            

		system ("maskmain ____tmp ____tmp2");

		strcpy (buff4,"cat ");
		strcat(buff4," ____tmp2 >> ");
		sprintf (buff5,"_%s_%s_proc.c",filename,tok);
		strcat(buff4,buff5);
		system (buff4); 

        
		strcpy (buff4,"cat ");
		strcat(buff4," Otherfunc >> ");
		sprintf (buff5,"_%s_%s_proc.c",filename,tok);
		strcat(buff4,buff5);
		system (buff4); 
		

        sprintf(buff1, "_%s_%s ARC_%s_%s", filename, tok, filename, tok);
        printf(" %s \n", buff1);

        }

        yyin = moreInput(argv, argc);
    }
}

