/*
 * Copyright (c) 2002 The Board of Trustees of the University of Illinois and
 *                    William Marsh Rice University
 * Copyright (c) 2002 The University of Utah
 * Copyright (c) 2002 The University of Notre Dame du Lac
 *
 * All rights reserved.
 *
 * Based on RSIM 1.0, developed by:
 *   Professor Sarita Adve's RSIM research group
 *   University of Illinois at Urbana-Champaign and
     William Marsh Rice University
 *   http://www.cs.uiuc.edu/rsim and http://www.ece.rice.edu/~rsim/dist.html
 * ML-RSIM/URSIM extensions by:
 *   The Impulse Research Group, University of Utah
 *   http://www.cs.utah.edu/impulse
 *   Lambert Schaelicke, University of Utah and University of Notre Dame du Lac
 *   http://www.cse.nd.edu/~lambert
 *   Mike Parker, University of Utah
 *   http://www.cs.utah.edu/~map
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal with the Software without restriction, including without
 * limitation the rights to use, copy, modify, merge, publish, distribute,
 * sublicense, and/or sell copies of the Software, and to permit persons to
 * whom the Software is furnished to do so, subject to the following
 * conditions:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimers. 
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimers in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the names of Professor Sarita Adve's RSIM research group,
 *    the University of Illinois at Urbana-Champaign, William Marsh Rice
 *    University, nor the names of its contributors may be used to endorse
 *    or promote products derived from this Software without specific prior
 *    written permission. 
 * 4. Neither the names of the ML-RSIM project, the URSIM project, the
 *    Impulse research group, the University of Utah, the University of
 *    Notre Dame du Lac, nor the names of its contributors may be used to
 *    endorse or promote products derived from this software without specific
 *    prior written permission. 
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS WITH THE SOFTWARE. 
 */

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sim_main/invoke_debugger.h>

void invoke_debugger(char *progname)
{
  char buf[100];
  char command[500];
  char *term;

#ifdef __sgi
  term = "winterm -c";
#else
  term = "xterm -e";
#endif

  for (;;)
    {
      fprintf(stderr, "resume(r)/dbx(d)/gdb(g)/exit(e)? ");
      fflush(stderr);
      while(read(fileno(stdin), buf, 100) <= 0)
	{
	  if(errno != EINTR){
	    fprintf(stderr, "\nCould not read response, sleeping for 20 seconds.\n");
	    sleep(20);
	    buf[0]='e';
	    break;
	  }
	}
      switch (buf[0])
	{
	case 'r': case 'R':  /* resume */
	  return;
	case 'd': case 'D':  /* dbx */
	  if(getenv("MLRSIM_DBXCOMMAND"))
	    {
	      sprintf(command, getenv("MLRSIM_DBXCOMMAND"), getpid());
	    } else {
	      sprintf(command, "%s dbx %s %d &", term, progname, getpid());
	    }
	  system(command);
	  break;
	case 'g': case 'G':  /* gdb */
	  if(getenv("MLRSIM_DBXCOMMAND"))
	    {
	      sprintf(command, getenv("MLRSIM_DBXCOMMAND"), getpid());
	    } else {
	      sprintf(command, "%s gdb %s %d &", term, progname, getpid());
	    }
	  system(command);
	  break;
	case 'e': case 'E':  /* force exit */
	  exit(-1);
	  break;
        /* should add a case or two for a nicer exit!  One that does a
	   shutdown, and one that at least halts all the procs? */
	default:
	  fprintf(stderr, "Unrecognized option\n");
	  break;
	}
    }
}

