/* The common simulator framework for GDB, the GNU Debugger.

   Copyright 2002-2024 Free Software Foundation, Inc.

   Contributed by Andrew Cagney and Red Hat.

   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 SIM_IO_H
#define SIM_IO_H

#include <stdarg.h>
#include <stdint.h>
#include <sys/stat.h>
#include <sys/types.h>

#include "ansidecl.h"

/* See the file include/callbacks.h for a description */

int sim_io_init (SIM_DESC sd);

int sim_io_shutdown (SIM_DESC sd);

int sim_io_unlink (SIM_DESC sd, const char *);

int64_t sim_io_time (SIM_DESC sd);

int sim_io_system (SIM_DESC sd, const char *);

int sim_io_rename (SIM_DESC sd, const char *, const char *);

int sim_io_write_stdout (SIM_DESC sd, const char *, int);

void sim_io_flush_stdout (SIM_DESC sd);

int sim_io_write_stderr (SIM_DESC sd, const char *, int);

void sim_io_flush_stderr (SIM_DESC sd);

int sim_io_write (SIM_DESC sd, int, const char *, int);

int sim_io_read_stdin (SIM_DESC sd, char *, int);

int sim_io_read (SIM_DESC sd, int, char *, int);

int sim_io_open (SIM_DESC sd, const char *, int);

int64_t sim_io_lseek (SIM_DESC sd, int, int64_t, int);

int sim_io_isatty (SIM_DESC sd, int);

int sim_io_get_errno (SIM_DESC sd);

int sim_io_close (SIM_DESC sd, int);

void sim_io_printf (SIM_DESC sd,
		    const char *fmt,
		    ...) ATTRIBUTE_PRINTF (2, 3);

void sim_io_vprintf (SIM_DESC sd, const char *fmt, va_list ap)
  ATTRIBUTE_PRINTF (2, 0);

void sim_io_eprintf (SIM_DESC sd,
		     const char *fmt,
		     ...) ATTRIBUTE_PRINTF (2, 3);

void sim_io_evprintf (SIM_DESC sd, const char *fmt, va_list ap)
  ATTRIBUTE_PRINTF (2, 0);

void sim_io_error (SIM_DESC sd,
		   const char *fmt,
		   ...)
  ATTRIBUTE_PRINTF (2, 3)
  ATTRIBUTE_NORETURN;

void sim_io_poll_quit (SIM_DESC sd);

/* Returns -1 and sets (host) EAGAIN if not ready. */
int sim_io_poll_read (SIM_DESC sd, int, char *, int);

int sim_io_stat (SIM_DESC sd, const char *path, struct stat *buf);

int sim_io_fstat (SIM_DESC sd, int fd, struct stat *buf);
#endif
