/* Generic support for remote debugging interfaces.

   Copyright 1993 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., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

#ifndef REMOTE_UTILS_H
#define REMOTE_UTILS_H

#include "serial.h"
#include "target.h"
#include "dcache.h"

/* Stuff that should be shared (and handled consistently) among the various
   remote targets.  */

struct _sr_settings
  {
    unsigned int timeout;

    int retries;

    char *device;
    serial_t desc;

  };

extern struct _sr_settings sr_settings;

/* get and set debug value. */
#define sr_get_debug()			(remote_debug)
#define sr_set_debug(newval)		(remote_debug = (newval))

/* get and set timeout. */
#define sr_get_timeout()		(sr_settings.timeout)
#define sr_set_timeout(newval)		(sr_settings.timeout = (newval))

/* get and set device. */
#define sr_get_device()			(sr_settings.device)
#define sr_set_device(newval) \
{ \
    if (sr_settings.device) free(sr_settings.device); \
    sr_settings.device = (newval); \
}

/* get and set descriptor value. */
#define sr_get_desc()			(sr_settings.desc)
#define sr_set_desc(newval)		(sr_settings.desc = (newval))

/* get and set retries. */
#define sr_get_retries()		(sr_settings.retries)
#define sr_set_retries(newval)		(sr_settings.retries = (newval))

#define sr_is_open()			(sr_settings.desc != NULL)

#define sr_check_open() 	{ if (!sr_is_open()) \
				    error ("Remote device not open"); }

struct gr_settings
  {
    /* This is our data cache. */
    DCACHE *dcache;
    char *prompt;
    struct target_ops *ops;
    int (*clear_all_breakpoints) (void);
    memxferfunc readfunc;
    memxferfunc writefunc;
    void (*checkin) (void);
  };

extern struct gr_settings *gr_settings;

/* get and set dcache. */
#define gr_get_dcache()			(gr_settings->dcache)
#define gr_set_dcache(newval)		(gr_settings->dcache = (newval))

/* get and set prompt. */
#define gr_get_prompt()			(gr_settings->prompt)
#define gr_set_prompt(newval)		(gr_settings->prompt = (newval))

/* get and set ops. */
#define gr_get_ops()			(gr_settings->ops)
#define gr_set_ops(newval)		(gr_settings->ops = (newval))

#define gr_clear_all_breakpoints()	((gr_settings->clear_all_breakpoints)())
#define gr_checkin()			((gr_settings->checkin)())

/* Keep discarding input until we see the prompt.

   The convention for dealing with the prompt is that you
   o give your command
   o *then* wait for the prompt.

   Thus the last thing that a procedure does with the serial line
   will be an gr_expect_prompt().  Exception:  resume does not
   wait for the prompt, because the terminal is being handed over
   to the inferior.  However, the next thing which happens after that
   is a bug_wait which does wait for the prompt.
   Note that this includes abnormal exit, e.g. error().  This is
   necessary to prevent getting into states from which we can't
   recover.  */

#define gr_expect_prompt()	sr_expect(gr_get_prompt())

int gr_fetch_word (CORE_ADDR addr);
int gr_multi_scan (char *list[], int passthrough);
int sr_get_hex_digit (int ignore_space);
int sr_pollchar (void);
int sr_readchar (void);
int sr_timed_read (char *buf, int n);
long sr_get_hex_word (void);
void gr_close (int quitting);
void gr_create_inferior (char *execfile, char *args, char **env);
void gr_detach (char *args, int from_tty);
void gr_files_info (struct target_ops *ops);
void gr_generic_checkin (void);
void gr_kill (void);
void gr_mourn (void);
void gr_prepare_to_store (void);
void gr_store_word (CORE_ADDR addr, int word);
void sr_expect (char *string);
void sr_get_hex_byte (char *byt);
void sr_scan_args (char *proto, char *args);
void sr_write (char *a, int l);
void sr_write_cr (char *s);

void gr_open (char *args, int from_tty, struct gr_settings *gr_settings);
void gr_load_image (char *, int from_tty);
#endif /* REMOTE_UTILS_H */
