From 49015a63e708824dbd80fb90520c33b8e1607c43 Mon Sep 17 00:00:00 2001 From: Andris Pavenis Date: Thu, 15 Sep 2016 19:31:54 +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 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_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 --- gcc/ada/adaint.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index f317865..ed49ed7 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 +#define ISALPHA isalpha +#endif + +#elif defined (__MINGW32__) || defined (__CYGWIN__) #include "mingw32.h" @@ -165,11 +176,16 @@ UINT CurrentCCSEncoding; #include #endif -#if defined (_WIN32) - +#if defined (__DJGPP__) #include #include #include +#include +#undef DIR_SEPARATOR +#define DIR_SEPARATOR '\\' + +#elif defined (_WIN32) + #include #include #include @@ -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; @@ -1646,7 +1666,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 +2254,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 +2626,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 +2675,9 @@ __gnat_portable_wait (int *process_status) pid = win32_wait (&status); +#elif defined (__DJGPP__) + /* Child process has already ended in case of DJGPP. + No need to do anything. Just return success. */ #else pid = waitpid (-1, &status, 0); -- 2.7.4