#include <HPCxx_Profile.h>
#include <iostream.h>
#include <hpcxx_rts.h>
#include "allHPCxxTemplates.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "TM_ClientServer.h"


/* local function */
int checkArg(int num);

#define MAX_ARG 5
#define MAX_MON 5

/* variables with scope of this file */

char
  cmdBuf[200],
  cmd[30],
  arg[5][30],
  hostName[200],
  *rtrnStr;

void main(int argc, char *argv[]) {

  int
    i,
    count,
    crntMon,
    numMons = 0;
    
  TM_Monitor
    *myMon[MAX_MON];

  while(1) {

    cmd[0]='\0'; for(i=0;i<MAX_ARG;i++) arg[i][0] = '\0';
    printf(">> ");
    gets(cmdBuf);
    sscanf(cmdBuf, "%s %s %s %s %s %s",
      cmd,arg[0],arg[1],arg[2],arg[3],arg[4]);

    if(strcasecmp(cmd,"")==0) {
      continue;
    }

    if(strcasecmp(cmd,"start")==0) {       /* initialize, get port, and attach */
      if(checkArg(1)) {
	// Create the object.  This takes care of all the HPC++ stuff;
	myMon[numMons] = new TM_Client(argc, argv, arg[0]);
	crntMon = numMons;
	numMons++;
	printf (" Result:\n   Total monitors = %d\n   current = %d\n",
          numMons, crntMon);
      }
      continue;
    }

    if(strcasecmp(cmd,"setmonitor")==0) {
      if(checkArg(1)) {
	crntMon = atoi(arg[0]);
	printf (" Result: Current monitor is %d\n", crntMon);

      }
      continue;
    }

    if(strcasecmp(cmd,"exit")==0) {
      if(checkArg(0)) {
	delete(myMon[crntMon]);
      }
      continue;
    }

    if(strcasecmp(cmd,"wait")==0) {
      if(checkArg(1))
	printf (" Result: %d\n",
	  myMon[crntMon]->Wait(atoi(arg[0])));
      continue;
    }


    if(strcasecmp(cmd,"signal")==0) {
      if(checkArg(1))
	printf (" Result: %d\n",
          myMon[crntMon]->Signal(atoi(arg[0])));
      continue;
    }

    /* getting information from the running application */

    if(strcasecmp(cmd,"funcdbsize")==0) {
      if(checkArg(0))
	printf (" Result: %d\n",
          myMon[crntMon]->GetFuncDBSize());
      continue;
    }

    if(strcasecmp(cmd,"allfuncs")==0) {
      if(checkArg(0)) {
	count = myMon[crntMon]->GetFuncDBSize();
	printf (" Result:\n");
	for(i=0;i<count;i++) {
	  myMon[crntMon]->GetFuncInfo((functionID)i,0);
	  myMon[crntMon]->PrintCrntFuncInfo();
	} /* end for */
      } /* end if(checkArg(0)) */
      continue;
    }

    if(strcasecmp(cmd,"callstack")==0) {
      if(checkArg(1)) {
	printf(" Result: %d\n", myMon[crntMon]->GetCallStack(atoi(arg[0])));
	myMon[crntMon]->PrintCrntCallStack();
      }
      continue;
    }

    if(strcasecmp(cmd,"getfuncinfo")==0) {
      if(checkArg(2)) {
	printf (" Result:\n");
	myMon[crntMon]->GetFuncInfo((functionID)atoi(arg[0]), atoi(arg[1]));
	myMon[crntMon]->PrintCrntFuncInfo();
      }
      continue;
    }

    if(strcasecmp(cmd,"")==0) {
      continue;
    }

    if(strcasecmp(cmd,"quit")==0) {
      break;
    }

    /* default */
    printf("  invalid command:  %s\n", cmd);

  } /* end while(1) */
}

int checkArg(int num) {
  int
    i;

    for(i=0;i<num;i++) {
      if(arg[i][0] == '\0') {
	printf("  error: command %s takes %d argument(s)\n",cmd,num);
	return(0);
      }
    }
    return(1);
}

