/* Copyright (C) 1990 Free Software Foundation, Inc.

This file is part of GDB.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */

#if !defined (BREAKPOINT_H)
#define BREAKPOINT_H 1

/* This is the maximum number of bytes a breakpoint instruction can take.
   Feel free to increase it.  It's just used in a few places to size
   arrays that should be independent of the target architecture.  */

#define	BREAKPOINT_MAX	10

extern void breakpoint_re_set ();
extern void clear_momentary_breakpoints ();
extern void set_momentary_breakpoint ();
extern void set_ignore_count ();
extern void set_default_breakpoint ();

extern void mark_breakpoints_out ();
extern void breakpoint_auto_delete ();
extern void breakpoint_clear_ignore_counts ();

/* The following are for displays, which aren't really breakpoints, but
   here is as good a place as any for them.  */

extern void disable_current_display ();
extern void do_displays ();
extern void disable_display ();
extern void clear_displays ();


/* The follow stuff is an abstract data type "bpstat" ("breakpoint status").
   This provides the ability to determine whether we have stopped at a
   breakpoint, and what we should do about it.  */

typedef struct bpstat__struct *bpstat;

/* Interface:  */

/* Clear a bpstat so that it says we are not at any breakpoint.
   Also free any storage that is part of a bpstat.  */
void bpstat_clear();

/* Return a copy of a bpstat.  Like "bs1 = bs2" but all storage that
   is part of the bpstat is copied as well.  */
bpstat bpstat_copy();

/* Get a bpstat associated with having just stopped at address *PC
   and frame address FRAME_ADDRESS.  Update *PC to point at the
   breakpoint (if we hit a breakpoint).  */
bpstat bpstat_stop_status (/* CORE_ADDR *pc; FRAME_ADDR frame_address */);

/* Nonzero if we should print the frame.  */
#define bpstat_should_print(bs) ((bs) != NULL && (bs)->print)

/* Nonzero if we should stop.  */
#define bpstat_stop(bs) ((bs) != NULL && (bs)->stop)

/* Nonzero if we hit a momentary breakpoint.  */
#define bpstat_momentary_breakpoint(bs) ((bs) != NULL && (bs)->momentary)

/* Nonzero if a signal that we got in wait() was due to circumstances
   explained by the BS.  */
/* Currently that is true iff we have hit a breakpoint.  */
#define bpstat_explains_signal(bs) ((bs) != NULL)

/* Nonzero if we should step constantly (e.g. watchpoints on machines
   without hardware support).  This isn't related to a specific bpstat,
   just to things like whether watchpoints are set.  */
int bpstat_should_step (/* void */);

/* Print a message indicating what happened.  Returns nonzero to
   say that only the source line should be printed after this (zero
   return means print the frame as well as the source line).  */
int bpstat_print (/* bpstat bs */);

/* Return the breakpoint number of the first breakpoint we are stopped
   at.  *BSP upon return is a bpstat which points to the remaining
   breakpoints stopped at (but which is not guaranteed to be good for
   anything but further calls to bpstat_num).
   Return 0 if passed a bpstat which does not indicate any breakpoints.  */
int bpstat_num (/* bpstat *bsp; */);

/* Perform actions associated with having stopped at *BSP.  */
void bpstat_do_actions (/* bpstat bs; */);

/* Modify BS so that the actions will not be performed.  */
void bpstat_clear_actions (/* bpstat bs; */);


/* Implementation:  */
#include "value.h"
struct bpstat__struct
{
  /* Linked list because there can be two breakpoints at the
     same place, and a bpstat reflects the fact that both have been hit.  */
  bpstat next;
  /* Breakpoint that we are at.  */
  struct breakpoint *breakpoint_at;
  /* Commands left to be done.  */
  struct command_line *commands;
  /* Old value associated with a watchpoint.  */
  value old_val;
  /* Nonzero if we should print the frame.  Only significant for the first
     bpstat in the chain.  */
  char print;
  /* Nonzero if we should stop.  Only significant for the first bpstat in
     the chain.  */
  char stop;
  /* Nonzero if we hit a momentary breakpoint.  Only significant for the
     first bpstat in the chain.  */
  char momentary;
};
#endif /* breakpoint.h not already included.  */
