From 935f11dbb31a46358a5927ad41cc6877683c13aa Mon Sep 17 00:00:00 2001
From: Andris Pavenis <andris.pavenis@iki.fi>
Date: Mon, 25 Jul 2016 19:37:55 +0300
Subject: [PATCH 2/4] [DJGPP, Ada] DJGPP support

* ada/ctrl_c.c: Do not use macro SA_RESTART for DJGPP.

* ada/gsocket.h: Do not support sockets for DJGPP.

* ada/init.c (timestruct_t): Define for DJGPP.
  (nanosleep): Implement for DJGPP using usleep().
  (__gnat_install_handler): Implememt for DJGPP

* ada/sysdep.c: Include <io.h> for DJGPP
  (_setmode): Define to setmode for DJGPP
  (__gnat_set_mode): Add implementation for DJGPP
  (__gnat_localtime_tzoff): Add implementation for DJGPP

* ada/terminals.c: Add DJGPP to list of unsupported platforms.
---
 gcc/ada/ctrl_c.c    |  4 ++--
 gcc/ada/gsocket.h   |  2 +-
 gcc/ada/init.c      | 25 ++++++++++++++++++++++++
 gcc/ada/sysdep.c    | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++--
 gcc/ada/terminals.c |  2 +-
 5 files changed, 83 insertions(+), 6 deletions(-)

diff --git a/gcc/ada/ctrl_c.c b/gcc/ada/ctrl_c.c
index 7f8d177..d4fc551 100644
--- a/gcc/ada/ctrl_c.c
+++ b/gcc/ada/ctrl_c.c
@@ -92,8 +92,8 @@ __gnat_install_int_handler (void (*proc) (void))
   if (sigint_intercepted == 0)
     {
       act.sa_handler = __gnat_int_handler;
-#if defined (__Lynx__) || defined (VMS)
-      /* LynxOS and VMS do not support SA_RESTART. */
+#if defined (__Lynx__) || defined (VMS) || defined(__DJGPP__)
+      /* LynxOS, VMS or DJGPP do not support SA_RESTART. */
       act.sa_flags = 0;
 #else
       act.sa_flags = SA_RESTART;
diff --git a/gcc/ada/gsocket.h b/gcc/ada/gsocket.h
index 31a3ccf..a979d3a 100644
--- a/gcc/ada/gsocket.h
+++ b/gcc/ada/gsocket.h
@@ -29,7 +29,7 @@
  *                                                                          *
  ****************************************************************************/
 
-#if defined(VTHREADS) || defined(__PikeOS__)
+#if defined(VTHREADS) || defined(__PikeOS__) || defined(__DJGPP__)
 
 /* Sockets not supported on these platforms.  */
 #undef HAVE_SOCKETS
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index 6d51896..eed212c 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -2516,6 +2516,31 @@ __gnat_install_handler (void)
   __gnat_handler_installed = 1;
 }
 
+#elif defined (__DJGPP__)
+
+struct timestruc_t
+{
+   time_t  tv_sec;
+   long    tv_nsec;
+};
+
+int
+nanosleep (struct timestruc_t *Rqtp, struct timestruc_t *Rmtp);
+
+int
+nanosleep (struct timestruc_t *Rqtp, struct timestruc_t *Rmtp)
+{
+    usleep (1000000*Rqtp->tv_sec+Rqtp->tv_nsec/1000);
+    if (Rmtp) { Rmtp->tv_sec = Rmtp->tv_nsec=0; }
+    return 0;
+}
+
+void
+__gnat_install_handler ()
+{
+  __gnat_handler_installed = 1;
+}
+
 #elif defined(__ANDROID__)
 
 /*******************/
diff --git a/gcc/ada/sysdep.c b/gcc/ada/sysdep.c
index 465007e..bfabf30 100644
--- a/gcc/ada/sysdep.c
+++ b/gcc/ada/sysdep.c
@@ -126,7 +126,7 @@ extern struct tm *localtime_r(const time_t *, struct tm *);
 
 */
 
-#if defined (WINNT) || defined (__CYGWIN__)
+#if defined (WINNT) || defined (__CYGWIN__) || defined(__DJGPP__)
 
 const char __gnat_text_translation_required = 1;
 
@@ -137,6 +137,11 @@ const char __gnat_text_translation_required = 1;
 #define WIN_SETMODE _setmode
 #endif
 
+#if defined(__DJGPP__)
+#include <io.h>
+#define _setmode setmode
+#endif /* __DJGPP__ */
+
 void
 __gnat_set_binary_mode (int handle)
 {
@@ -149,6 +154,30 @@ __gnat_set_text_mode (int handle)
   WIN_SETMODE (handle, O_TEXT);
 }
 
+#ifdef __DJGPP__
+void
+__gnat_set_mode (int handle, int mode)
+{
+  /*  the values here must be synchronized with
+      System.File_Control_Block.Content_Encodding:
+
+      None         = 0
+      Default_Text = 1
+      Text         = 2
+      U8text       = 3
+      Wtext        = 4
+      U16text      = 5  */
+
+ switch (mode) {
+    case 0 : setmode(handle, O_BINARY);          break;
+    case 1 : setmode(handle, O_TEXT);            break;
+    case 2 : setmode(handle, O_TEXT);            break;
+    case 3 : setmode(handle, O_TEXT);            break;
+    case 4 : setmode(handle, O_BINARY);          break;
+    case 5 : setmode(handle, O_BINARY);          break;
+ }
+}
+#else
 void
 __gnat_set_mode (int handle, int mode)
 {
@@ -171,6 +200,7 @@ __gnat_set_mode (int handle, int mode)
     case 5 : WIN_SETMODE (handle, _O_U16TEXT);         break;
  }
 }
+#endif
 
 #ifdef __CYGWIN__
 
@@ -603,7 +633,29 @@ long __gnat_invalid_tzoff = 259273;
 
 /* Definition of __gnat_localtime_r used by a-calend.adb */
 
-#if defined (__MINGW32__)
+#if defined (__DJGPP__)
+
+/* FIXME: this is draft version only. Fix me if that is not correct  */
+/*        or not complete (AP)                                       */
+
+extern void
+__gnat_localtime_tzoff (const time_t *, long *);
+
+void
+__gnat_localtime_tzoff (const time_t *timer, long *off)
+{
+  struct tm *tmp;
+
+  tmp = localtime (timer);
+  *off = (long) -tmp->tm_gmtoff;
+
+  /* Correct the offset if Daylight Saving Time is in effect */
+
+  if (tmp->tm_isdst > 0)
+    *off = *off + 3600;
+}
+
+#elif defined (__MINGW32__)
 
 /* Reentrant localtime for Windows. */
 
diff --git a/gcc/ada/terminals.c b/gcc/ada/terminals.c
index d72eb09..7b14997 100644
--- a/gcc/ada/terminals.c
+++ b/gcc/ada/terminals.c
@@ -32,7 +32,7 @@
 /* First all usupported platforms. Add stubs for exported routines. */
 
 #if defined (VMS) || defined (__vxworks) || defined (__Lynx__) \
-  || defined (__ANDROID__) || defined (__PikeOS__)
+  || defined (__ANDROID__) || defined (__PikeOS__) || defined(__DJGPP__)
 
 #define ATTRIBUTE_UNUSED __attribute__((unused))
 
-- 
2.7.4



