/* UI_FILE - a generic STDIO like output stream.
   Copyright (C) 1999, 2000, 2007, 2008, 2009, 2010
   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 3 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, see <http://www.gnu.org/licenses/>.  */

#ifndef UI_FILE_H
#define UI_FILE_H

struct obstack;
struct ui_file;

/* Create a generic ui_file object with null methods. */

extern struct ui_file *ui_file_new (void);

/* Override methods used by specific implementations of a UI_FILE
   object. */

typedef void (ui_file_flush_ftype) (struct ui_file * stream);
extern void set_ui_file_flush (struct ui_file *stream, ui_file_flush_ftype * flush);

/* NOTE: Both fputs and write methods are available. Default
   implementations that mapping one onto the other are included. */
typedef void (ui_file_write_ftype) (struct ui_file * stream, const char *buf, long length_buf);
extern void set_ui_file_write (struct ui_file *stream, ui_file_write_ftype *fputs);

typedef void (ui_file_fputs_ftype) (const char *, struct ui_file * stream);
extern void set_ui_file_fputs (struct ui_file *stream, ui_file_fputs_ftype * fputs);

typedef long (ui_file_read_ftype) (struct ui_file * stream, char *buf, long length_buf);
extern void set_ui_file_read (struct ui_file *stream, ui_file_read_ftype *fread);

typedef int (ui_file_isatty_ftype) (struct ui_file * stream);
extern void set_ui_file_isatty (struct ui_file *stream, ui_file_isatty_ftype * isatty);

typedef void (ui_file_rewind_ftype) (struct ui_file * stream);
extern void set_ui_file_rewind (struct ui_file *stream, ui_file_rewind_ftype * rewind);

typedef void (ui_file_put_method_ftype) (void *object, const char *buffer, long length_buffer);
typedef void (ui_file_put_ftype) (struct ui_file *stream, ui_file_put_method_ftype * method, void *context);
extern void set_ui_file_put (struct ui_file *stream, ui_file_put_ftype * put);

typedef void (ui_file_delete_ftype) (struct ui_file * stream);
extern void set_ui_file_data (struct ui_file *stream, void *data, ui_file_delete_ftype * delete);

extern void *ui_file_data (struct ui_file *file);


extern void gdb_flush (struct ui_file *);

extern void ui_file_delete (struct ui_file *stream);

extern void ui_file_rewind (struct ui_file *stream);

extern int ui_file_isatty (struct ui_file *);

extern void ui_file_write (struct ui_file *file, const char *buf, long length_buf);

/* NOTE: copies left to right */
extern void ui_file_put (struct ui_file *src, ui_file_put_method_ftype *write, void *dest);

/* Returns a freshly allocated buffer containing the entire contents
   of FILE (as determined by ui_file_put()) with a NUL character
   appended.  LENGTH, if not NULL, is set to the size of the buffer
   minus that appended NUL. */
extern char *ui_file_xstrdup (struct ui_file *file, long *length);

/* Similar to ui_file_xstrdup, but return a new string allocated on
   OBSTACK.  */
extern char *ui_file_obsavestring (struct ui_file *file,
				   struct obstack *obstack, long *length);

extern long ui_file_read (struct ui_file *file, char *buf, long length_buf);

/* Create/open a memory based file. Can be used as a scratch buffer
   for collecting output. */
extern struct ui_file *mem_fileopen (void);



/* Open/create a an STDIO based UI_FILE using the already open FILE. */
extern struct ui_file *stdio_fileopen (FILE *file);

/* Open NAME returning an STDIO based UI_FILE. */
extern struct ui_file *gdb_fopen (char *name, char *mode);

/* Create a file which writes to both ONE and TWO.  CLOSE_ONE
   and CLOSE_TWO indicate whether the original files should be
   closed when the new file is closed.  */
struct ui_file *tee_file_new (struct ui_file *one,
			      int close_one,
			      struct ui_file *two,
			      int close_two);
#endif
