
#include <stdio.h>
#include <stdlib.h>

#define N_BP 25

struct wine_bp{
  unsigned long addr;
  char in_use;
  char enabled;
  unsigned char databyte;
};

static struct wine_bp wbp[N_BP] = {{0,},};

void info_break()
{
  int j;
  fprintf(stderr,"Breakpoint status\n");
  for(j=0; j<N_BP; j++)
    if(wbp[j].in_use)
      fprintf(stderr,"%d: %c %8.8x\n", j, (wbp[j].enabled ? 'y' : 'n'),
	      wbp[j].addr);
}

void disable_break(int bpnum)
{
  if(bpnum >= N_BP || bpnum < 0)
    fprintf(stderr,"Breakpoint number out of range\n");

  wbp[bpnum].enabled = 0;
}

void enable_break(int bpnum)
{
  if(bpnum >= N_BP || bpnum < 0)
    fprintf(stderr,"Breakpoint number out of range\n");

  wbp[bpnum].enabled = 1;
}

void add_break(unsigned long addr)
{
  int j;
  for(j=0; j<N_BP; j++)
    if(!wbp[j].in_use)
      {
	wbp[j].in_use = 1;
	wbp[j].enabled = 1;
	wbp[j].addr = addr;
	return;
      }
  fprintf(stderr,"No more breakpoints\n");
}

void insert_break(int flag)
{
  unsigned char * pnt;
  int j;

  for(j=0; j<N_BP; j++)
    if(wbp[j].enabled)
      {
	pnt = (unsigned char *) wbp[j].addr;
	if(flag) {
	  wbp[j].databyte = *pnt;
	  *pnt = 0xcc;  /* Change to an int 3 instruction */
	} else {
	  *pnt = wbp[j].databyte;
	}
      }
}

/* Get the breakpoint number that we broke upon */
int get_bpnum(unsigned int addr)
{
  int j;

  for(j=0; j<N_BP; j++)
    if(wbp[j].enabled)
      if(wbp[j].addr == addr) return j;

  return -1;
}
