On 07/30/2016 08:47 AM, Andris Pavenis wrote:
This last patch (4/4) contains DJGPP related changes to adaint.c (except one which belongs to
patch 1/4).
ChangeLog entry:
2016-07-30 Andris Pavenis <andris.pave...@iki.fi>
* ada/adaint.c: Include process.h, signal.h, dir.h and utime.h for DJGPP.
(DIR_SEPARATOR) define to '\\' for DJGPP.
(__gnat_get_maximum_file_name_length): decide return value depending on
availability of LFN for DJGPP
(__gnat_get_file_names_case_sensitive): return 0 for DJGPP unless
overriden in environment
(__gnat_get_default_identifier_character_set): return '1' for DJGPP
(__gnat_is_absolute_path): Support MS-DOS style absolute paths for DJGPP.
(__gnat_portable_spawn): Use spewnvp for DJGPP.
(__gnat_portable_no_block_spawn): Use spawnvp for DJGPP.
(__gnat_portable_wait): Return 0 for DJGPP.
New revision of patch is in the attachment.
Only 1 additional change:
include ctype.h and define ISALPHA to isalpha for DJGPP when IN_RTS is defined.
Updated ChangeLog entry is in the attachment.
Andris
>From 7d102a4d4d5d31d8225e69c3e53f3d4a234515ba Mon Sep 17 00:00:00 2001
From: Andris Pavenis <andris.pave...@iki.fi>
Date: Sat, 3 Sep 2016 08:20:14 +0300
Subject: [PATCH 4/4] [DJGPP, Ada] Ada support
* ada/adaint.c: Include process.h, signal.h, dir.h and utime.h for DJGPP.
ISALPHA: include <ctype.h> and define to isalpha for DJGPP when IN_RTS is defined.
(DIR_SEPARATOR) define to '\\' for DJGPP.
(__gnat_get_maximum_file_name_length): decide return value depending on
availability of LFN for DJGPP
(__gnat_get_file_names_case_sensitive): return 0 for DJGPP unless
overriden in environment
(__gnat_get_default_identifier_character_set): return '1' for DJGPP
(__gnat_is_absolute_path): Support MS-DOS style absolute paths for DJGPP.
(__gnat_portable_spawn): Use spewnvp for DJGPP.
(__gnat_portable_no_block_spawn): Use spawnvp for DJGPP.
(__gnat_portable_wait): Return 0 for DJGPP.
Signed-off-by: Andris Pavenis <andris.pave...@iki.fi>
---
gcc/ada/adaint.c | 45 ++++++++++++++++++++++++++++++++++++++-------
1 file changed, 38 insertions(+), 7 deletions(-)
diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c
index f317865..23fca5d 100644
--- a/gcc/ada/adaint.c
+++ b/gcc/ada/adaint.c
@@ -112,7 +112,18 @@
extern "C" {
#endif
-#if defined (__MINGW32__) || defined (__CYGWIN__)
+#if defined (__DJGPP__)
+
+/* For isalpha-like tests in the compiler, we're expected to resort to
+ safe-ctype.h/ISALPHA. This isn't available for the runtime library
+ build, so we fallback on ctype.h/isalpha there. */
+
+#ifdef IN_RTS
+#include <ctype.h>
+#define ISALPHA isalpha
+#endif
+
+#elif defined (__MINGW32__) || defined (__CYGWIN__)
#include "mingw32.h"
@@ -165,11 +176,16 @@ UINT CurrentCCSEncoding;
#include <sys/wait.h>
#endif
-#if defined (_WIN32)
-
+#if defined (__DJGPP__)
#include <process.h>
#include <signal.h>
#include <dir.h>
+#include <utime.h>
+#undef DIR_SEPARATOR
+#define DIR_SEPARATOR '\\'
+
+#elif defined (_WIN32)
+
#include <windows.h>
#include <accctrl.h>
#include <aclapi.h>
@@ -538,7 +554,11 @@ __gnat_try_lock (char *dir, char *file)
int
__gnat_get_maximum_file_name_length (void)
{
+#if defined (__DJGPP__)
+ return (_use_lfn(".")) ? -1 : 8;
+#else
return -1;
+#endif
}
/* Return nonzero if file names are case sensitive. */
@@ -560,7 +580,7 @@ __gnat_get_file_names_case_sensitive (void)
{
/* By default, we suppose filesystems aren't case sensitive on
Windows and Darwin (but they are on arm-darwin). */
-#if defined (WINNT) \
+#if defined (WINNT) || defined (__DJGPP__) \
|| (defined (__APPLE__) && !(defined (__arm__) || defined (__arm64__)))
file_names_case_sensitive_cache = 0;
#else
@@ -576,7 +596,7 @@ __gnat_get_file_names_case_sensitive (void)
int
__gnat_get_env_vars_case_sensitive (void)
{
-#if defined (WINNT)
+#if defined (WINNT) || defined (__DJGPP__)
return 0;
#else
return 1;
@@ -586,7 +606,11 @@ __gnat_get_env_vars_case_sensitive (void)
char
__gnat_get_default_identifier_character_set (void)
{
+#if defined (__DJGPP__)
+ return 'p';
+#else
return '1';
+#endif
}
/* Return the current working directory. */
@@ -1646,7 +1670,7 @@ __gnat_is_absolute_path (char *name, int length)
#else
return (length != 0) &&
(*name == '/' || *name == DIR_SEPARATOR
-#if defined (WINNT)
+#if defined (WINNT) || defined(__DJGPP__)
|| (length > 1 && ISALPHA (name[0]) && name[1] == ':')
#endif
);
@@ -2234,7 +2258,7 @@ __gnat_portable_spawn (char *args[] ATTRIBUTE_UNUSED)
#if defined (__vxworks) || defined(__PikeOS__)
return -1;
-#elif defined (_WIN32)
+#elif defined (__DJGPP__) || defined (_WIN32)
/* args[0] must be quotes as it could contain a full pathname with spaces */
char *args_0 = args[0];
args[0] = (char *)xmalloc (strlen (args_0) + 3);
@@ -2606,6 +2630,12 @@ __gnat_portable_no_block_spawn (char *args[] ATTRIBUTE_UNUSED)
/* Not supported. */
return -1;
+#elif defined(__DJGPP__)
+ if (spawnvp (P_WAIT, args[0], args) != 0)
+ return -1;
+ else
+ return 0;
+
#elif defined (_WIN32)
HANDLE h = NULL;
@@ -2649,6 +2679,7 @@ __gnat_portable_wait (int *process_status)
pid = win32_wait (&status);
+#elif defined (__DJGPP__)
#else
pid = waitpid (-1, &status, 0);
--
2.7.4