#ifdef __vxworks
#include "ioLib.h"
#include "selectLib.h"
#include "vxWorks.h"
#endif
#ifdef IN_RTS
#define POSIX
#include "tconfig.h"
#include "tsystem.h"
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>
#ifdef VMS
#include <unixio.h>
#endif
#else
#include "config.h"
#include "system.h"
#endif
#include "adaint.h"
#if defined(WINNT) || defined (MSDOS) || defined (__EMX__)
static const char *mode_read_text = "rt";
static const char *mode_write_text = "wt";
static const char *mode_append_text = "at";
static const char *mode_read_binary = "rb";
static const char *mode_write_binary = "wb";
static const char *mode_append_binary = "ab";
static const char *mode_read_text_plus = "r+t";
static const char *mode_write_text_plus = "w+t";
static const char *mode_append_text_plus = "a+t";
static const char *mode_read_binary_plus = "r+b";
static const char *mode_write_binary_plus = "w+b";
static const char *mode_append_binary_plus = "a+b";
const char __gnat_text_translation_required = 1;
void
__gnat_set_binary_mode (int handle)
{
_setmode (handle, O_BINARY);
}
void
__gnat_set_text_mode (int handle)
{
_setmode (handle, O_TEXT);
}
#ifdef __MINGW32__
#include <windows.h>
char *
__gnat_ttyname (int filedes)
{
if (isatty (filedes))
return "console";
else
return NULL;
}
static void winflush_init (void);
static void winflush_95 (void);
static void winflush_nt (void);
int __gnat_is_windows_xp (void);
static void (*winflush_function) (void) = winflush_init;
static void
winflush_init (void)
{
DWORD dwVersion = GetVersion();
if (dwVersion < 0x80000000)
winflush_function = winflush_nt;
else
winflush_function = winflush_95;
(*winflush_function)();
}
static void
winflush_95 (void)
{
FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE));
}
static void
winflush_nt (void)
{
}
int
__gnat_is_windows_xp (void)
{
static int is_win_xp=0, is_win_xp_checked=0;
if (!is_win_xp_checked)
{
OSVERSIONINFO version;
is_win_xp_checked = 1;
memset (&version, 0, sizeof (version));
version.dwOSVersionInfoSize = sizeof (version);
is_win_xp = GetVersionEx (&version)
&& version.dwPlatformId == VER_PLATFORM_WIN32_NT
&& (version.dwMajorVersion > 5
|| (version.dwMajorVersion == 5 && version.dwMinorVersion >= 1));
}
return is_win_xp;
}
#endif
#else
static const char *mode_read_text = "r";
static const char *mode_write_text = "w";
static const char *mode_append_text = "a";
static const char *mode_read_binary = "r";
static const char *mode_write_binary = "w";
static const char *mode_append_binary = "a";
static const char *mode_read_text_plus = "r+";
static const char *mode_write_text_plus = "w+";
static const char *mode_append_text_plus = "a+";
static const char *mode_read_binary_plus = "r+";
static const char *mode_write_binary_plus = "w+";
static const char *mode_append_binary_plus = "a+";
const char __gnat_text_translation_required = 0;
void
__gnat_set_binary_mode (int handle ATTRIBUTE_UNUSED)
{
}
void
__gnat_set_text_mode (int handle ATTRIBUTE_UNUSED)
{
}
char *
__gnat_ttyname (int filedes)
{
#ifndef __vxworks
extern char *ttyname (int);
return ttyname (filedes);
#else
return "";
#endif
}
#endif
#if defined (linux) || defined (sun) || defined (sgi) || defined (__EMX__) \
|| (defined (__osf__) && ! defined (__alpha_vxworks)) || defined (WINNT) \
|| defined (__MACHTEN__) || defined (__hpux__) || defined (_AIX) \
|| (defined (__svr4__) && defined (i386)) || defined (__Lynx__) \
|| defined (__CYGWIN__) || defined (__FreeBSD__)
#ifdef __MINGW32__
#if OLD_MINGW
#include <termios.h>
#else
#include <conio.h>
#endif
#else
#include <termios.h>
#endif
#else
#if defined (VMS)
extern char *decc$ga_stdscr;
static int initted = 0;
#endif
#endif
extern void getc_immediate (FILE *, int *, int *);
extern void getc_immediate_nowait (FILE *, int *, int *, int *);
extern void getc_immediate_common (FILE *, int *, int *, int *, int);
void
getc_immediate (FILE *stream, int *ch, int *end_of_file)
{
int avail;
getc_immediate_common (stream, ch, end_of_file, &avail, 1);
}
void
getc_immediate_nowait (FILE *stream, int *ch, int *end_of_file, int *avail)
{
getc_immediate_common (stream, ch, end_of_file, avail, 0);
}
void
getc_immediate_common (FILE *stream,
int *ch,
int *end_of_file,
int *avail,
int waiting)
{
#if defined (linux) || defined (sun) || defined (sgi) || defined (__EMX__) \
|| (defined (__osf__) && ! defined (__alpha_vxworks)) \
|| defined (__CYGWIN32__) || defined (__MACHTEN__) || defined (__hpux__) \
|| defined (_AIX) || (defined (__svr4__) && defined (i386)) \
|| defined (__Lynx__) || defined (__FreeBSD__)
char c;
int nread;
int good_one = 0;
int eof_ch = 4;
int fd = fileno (stream);
struct termios otermios_rec, termios_rec;
if (isatty (fd))
{
tcgetattr (fd, &termios_rec);
memcpy (&otermios_rec, &termios_rec, sizeof (struct termios));
termios_rec.c_lflag = termios_rec.c_lflag & ~ICANON & ~ECHO;
#if defined(linux) || defined (sun) || defined (sgi) || defined (__EMX__) \
|| defined (__osf__) || defined (__MACHTEN__) || defined (__hpux__) \
|| defined (_AIX) || (defined (__svr4__) && defined (i386)) \
|| defined (__Lynx__) || defined (__FreeBSD__)
eof_ch = termios_rec.c_cc[VEOF];
#ifdef __EMX__
termios_rec.c_cc[VMIN] = 0;
termios_rec.c_cc[VTIME] = waiting;
#else
termios_rec.c_cc[VMIN] = waiting;
termios_rec.c_cc[VTIME] = 0;
#endif
#endif
tcsetattr (fd, TCSANOW, &termios_rec);
while (! good_one)
{
nread = read (fd, &c, 1);
if (nread > 0)
{
if (c == eof_ch)
{
*avail = 0;
*end_of_file = 1;
good_one = 1;
}
else if (c != eof_ch)
{
*avail = 1;
*end_of_file = 0;
good_one = 1;
}
}
else if (! waiting)
{
*avail = 0;
*end_of_file = 0;
good_one = 1;
}
else
good_one = 0;
}
tcsetattr (fd, TCSANOW, &otermios_rec);
*ch = c;
}
else
#elif defined (VMS)
int fd = fileno (stream);
if (isatty (fd))
{
if (initted == 0)
{
decc$bsd_initscr ();
initted = 1;
}
decc$bsd_cbreak ();
*ch = decc$bsd_wgetch (decc$ga_stdscr);
if (*ch == 4)
*end_of_file = 1;
else
*end_of_file = 0;
*avail = 1;
decc$bsd_nocbreak ();
}
else
#elif defined (__MINGW32__)
int fd = fileno (stream);
int char_waiting;
int eot_ch = 4;
if (isatty (fd))
{
if (waiting)
{
*ch = getch ();
(*winflush_function) ();
if (*ch == eot_ch)
*end_of_file = 1;
else
*end_of_file = 0;
*avail = 1;
}
else
{
char_waiting = kbhit();
if (char_waiting == 1)
{
*avail = 1;
*ch = getch ();
(*winflush_function) ();
if (*ch == eot_ch)
*end_of_file = 1;
else
*end_of_file = 0;
}
else
{
*avail = 0;
*end_of_file = 0;
}
}
}
else
#elif defined (__vxworks)
struct fd_set readFds;
struct timeval timeOut;
char c;
int fd = fileno (stream);
int nread;
int option;
int readable;
int status;
int width;
if (isatty (fd))
{
if (! waiting)
{
timeOut.tv_sec = 0;
timeOut.tv_usec = 0;
FD_ZERO (&readFds);
FD_SET (fd, &readFds);
width = 2;
readable = select (width, &readFds, NULL, NULL, &timeOut);
if (readable == ERROR)
*avail = -1, *end_of_file = -1;
else if (readable == 0)
*avail = 0, *end_of_file = 0;
else
{
nread = read (fd, &c, 1);
if (nread > 0)
*avail = 1, *end_of_file = 0;
else if (nread == 0)
*avail = 0, *end_of_file = 1;
else
*avail = -1, *end_of_file = -1;
}
}
else
{
*avail = -1;
*end_of_file = -1;
option = ioctl (fd, FIOGETOPTIONS, 0);
status = ioctl (fd, FIOSETOPTIONS, OPT_RAW);
if (status != -1)
{
nread = read (fd, &c, 1);
if (nread > 0)
*avail = 1, *end_of_file = 0;
else if (nread == 0)
*avail = 0, *end_of_file = 1;
}
status = ioctl (fd, FIOSETOPTIONS, option);
}
*ch = c;
}
else
#endif
{
*ch = fgetc (stream);
if (feof (stream))
{
*end_of_file = 1;
*avail = 0;
}
else
{
*end_of_file = 0;
*avail = 1;
}
}
}
#ifdef WINNT
#include <windows.h>
char *rts_get_hInstance (void);
char *rts_get_hPrevInstance (void);
char *rts_get_lpCommandLine (void);
int rts_get_nShowCmd (void);
char *
rts_get_hInstance (void)
{
return (char *)GetModuleHandleA (0);
}
char *
rts_get_hPrevInstance (void)
{
return 0;
}
char *
rts_get_lpCommandLine (void)
{
return GetCommandLineA ();
}
int
rts_get_nShowCmd (void)
{
return 1;
}
#endif
#ifdef VMS
#include <time.h>
extern long get_gmtoff (void);
long
get_gmtoff (void)
{
time_t t;
struct tm *ts;
t = time ((time_t) 0);
ts = localtime (&t);
return ts->tm_gmtoff;
}
#endif
#if defined (__EMX__)
#define Lock_Task system__soft_links__lock_task
extern void (*Lock_Task) (void);
#define Unlock_Task system__soft_links__unlock_task
extern void (*Unlock_Task) (void);
extern struct tm *__gnat_localtime_r (const time_t *, struct tm *);
struct tm *
__gnat_localtime_r (const time_t *timer, struct tm *tp)
{
struct tm *tmp;
(*Lock_Task) ();
tmp = localtime (timer);
memcpy (tp, tmp, sizeof (struct tm));
(*Unlock_Task) ();
return tp;
}
#else
#if defined (__Lynx__) && defined (___THREADS_POSIX4ad4__)
extern struct tm *__gnat_localtime_r (const time_t *, struct tm *);
struct tm *
__gnat_localtime_r (const time_t *timer, struct tm *tp)
{
localtime_r (tp, timer);
return NULL;
}
#else
#if defined (VMS) || defined (__MINGW32__)
#else
extern struct tm *__gnat_localtime_r (const time_t *, struct tm *);
struct tm *
__gnat_localtime_r (const time_t *timer, struct tm *tp)
{
return (struct tm *) localtime_r (timer, tp);
}
#endif
#endif
#endif