diff options
Diffstat (limited to 'gcc/ada/rtinit.c')
-rw-r--r-- | gcc/ada/rtinit.c | 586 |
1 files changed, 0 insertions, 586 deletions
diff --git a/gcc/ada/rtinit.c b/gcc/ada/rtinit.c deleted file mode 100644 index 1b351d3..0000000 --- a/gcc/ada/rtinit.c +++ /dev/null @@ -1,586 +0,0 @@ -/**************************************************************************** - * * - * GNAT COMPILER COMPONENTS * - * * - * I N I T I A L I Z E * - * * - * C Implementation File * - * * - * Copyright (C) 2014-2022, Free Software Foundation, Inc. * - * * - * GNAT is free software; you can redistribute it and/or modify it under * - * terms of the GNU General Public License as published by the Free Soft- * - * ware Foundation; either version 3, or (at your option) any later ver- * - * sion. GNAT is distributed in the hope that it will be useful, but WITH- * - * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * - * or FITNESS FOR A PARTICULAR PURPOSE. * - * * - * As a special exception under Section 7 of GPL version 3, you are granted * - * additional permissions described in the GCC Runtime Library Exception, * - * version 3.1, as published by the Free Software Foundation. * - * * - * You should have received a copy of the GNU General Public License and * - * a copy of the GCC Runtime Library Exception along with this program; * - * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see * - * <http://www.gnu.org/licenses/>. * - * * - * GNAT was originally developed by the GNAT team at New York University. * - * Extensive contributions were provided by Ada Core Technologies Inc. * - * * - ****************************************************************************/ - -/* This unit provides implementation for __gnat_runtime_initialize () - which is called in adainit() to do special initialization needed by - the GNAT runtime. */ - - -/* The following include is here to meet the published VxWorks requirement - that the __vxworks header appear before any other include. */ -#ifdef __vxworks -#include "vxWorks.h" -#endif - -#ifdef IN_RTS -/* We don't have libiberty, so use malloc. */ -#define xmalloc(S) malloc (S) -#define xrealloc(V,S) realloc (V,S) -#else -#include "config.h" -#include "system.h" -#endif - -#include "raise.h" -#include <fcntl.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/**************************************************/ -/* __gnat_runtime_initialize (NT-mingw32 Version) */ -/**************************************************/ - -extern void __gnat_install_handler (void); - -int __gnat_wide_text_translation_required = 0; -/* wide text translation, 0=none, 1=activated */ - -int __gnat_rt_init_count = 0; -/* number of references to the GNAT runtime, this is used to initialize - and finalize properly the run-time. */ - -#if defined (__MINGW32__) -#include "mingw32.h" -#include <windows.h> - -extern void __gnat_init_float (void); - -extern int gnat_argc; -extern char **gnat_argv; -extern CRITICAL_SECTION ProcListCS; -extern HANDLE ProcListEvt; - -#ifdef GNAT_UNICODE_SUPPORT - -#define EXPAND_ARGV_RATE 128 - -int __gnat_do_argv_expansion = 1; -#pragma weak __gnat_do_argv_expansion - -/* Assuming we are pointing to the beginning of a quoted part of an -argument, skip until the end of the quoted part. */ -static void skip_quoted_string (const WCHAR **current_in, - WCHAR **current_out) -{ - /* Number of backslashes buffered. */ - int qbs_count = 0; - - /* Pointer to current input character. */ - const WCHAR *ci = *current_in; - - /* Pointer to next output character. */ - WCHAR *co = *current_out; - - /* Skip initial quote. */ - ci++; - - while (*ci) - { - if (*ci == '\\') - { - /* Buffer incoming backslashes. */ - qbs_count++; - } - else if (*ci == '"') - { - /* Append qbs_count / 2 backslahes. */ - for (int i=0; i<qbs_count / 2; i++) - { - *co = '\\'; - co++; - } - if ((qbs_count & 1) == 0) - { - /* 2n backslashes means that the quotation mark is the end of - the quoted portion. */ - qbs_count = 0; - break; - } - else - { - /* Otherwise this is a double quote literal. */ - qbs_count = 0; - *co = '"'; co++; - } - } - else - { - /* If the character is not a double quote we should append - qbs_count backslashes. */ - for (int i=0; i<qbs_count; i++) - { - *co = '\\'; - co++; - } - *co = *ci; co++; - qbs_count = 0; - } - ci++; - } - - /* Handle the case in which a nul character was found instead of a closing - double quote. In that case consider all the backslashes as literal - characters. */ - if (*ci == '\0') - { - for (int i=0; i<qbs_count; i++) - { - *co='\\'; - co++; - } - } - - *current_in = ci; - *current_out = co; -} - -/* Assuming that this is the beginning of an argument. Skip characters - until we reach the character right after the last argument character. */ -static void skip_argument (const WCHAR **current_in, - WCHAR **current_out) -{ - /* Number of backslashes buffered. */ - int bs_count = 0; - - /* Pointer to current input character. */ - const WCHAR *ci = *current_in; - - /* Pointer to next output character. */ - WCHAR *co = *current_out; - - while (*ci && ! (*ci == ' ' || *ci == '\t')) - { - if (*ci == '\\') - { - /* Buffer incoming backslashes. */ - bs_count++; - } - else if (*ci == '"') - { - /* Append qbs_count / 2 backslahes. */ - for (int i=0; i< bs_count / 2; i++) - { - *co = '\\'; co++; - } - if ((bs_count & 1) == 0) - { - /* 2n backslashes followed by a quotation mark means that - this is a start of a quoted string. */ - skip_quoted_string (&ci, &co); - } - else - { - /* Otherwise this is quotation mark literal. */ - *co = '"'; - co++; - } - bs_count = 0; - } - else - { - /* This is a regular character. */ - /* Backslashes are interpreted literally. */ - for (int i=0; i<bs_count; i++) - { - *co = '\\'; - co++; - } - bs_count = 0; - *co = *ci; co++; - } - if (*ci != '\0') - { - ci++; - } - } - - for (int i=0; i<bs_count; i++) - { - *co = '\\'; - co++; - } - - /* End the argument with a null character. */ - *co = '\0'; - co++; - - *current_in = ci; - *current_out = co; -} - - -void __gnat_get_argw (const WCHAR *command_line, WCHAR ***argv, int *argc) -{ - WCHAR *inline_argv; - WCHAR *co; - int arg_count = 1; - const WCHAR *ci; - - inline_argv = - (WCHAR *) xmalloc ((wcslen (command_line) + 1) * sizeof (WCHAR)); - co = inline_argv; - - /* Start iteration on command line characters. */ - ci = command_line; - - /* Skip command name. Note that if the command line starts with whitechars - then the command name will be the empty string. */ - skip_argument (&ci, &co); - - /* Count remaining arguments. */ - while (*ci) - { - /* skip whitechar */ - while (*ci && (*ci == ' ' || *ci == '\t')) { ci++; } - if (*ci) - { - skip_argument (&ci, &co); - arg_count++; - } - else - break; - } - - /* Allocate table with pointer to each arguments */ - argv[0] = (WCHAR **) xmalloc (arg_count * sizeof (WCHAR *)); - - for (int idx = 0; idx < arg_count; idx++) - { - argv[0][idx] = inline_argv; - while (*inline_argv) - { - inline_argv++; - } - inline_argv++; - } - *argc = arg_count; -} - -static void -append_arg (int *index, LPWSTR dir, LPWSTR value, - char ***argv, int *last, int quoted) -{ - int size; - LPWSTR fullvalue; - int vallen = _tcslen (value); - int dirlen; - - if (dir == NULL) - { - /* no dir prefix */ - dirlen = 0; - fullvalue = (LPWSTR) xmalloc ((vallen + 1) * sizeof (TCHAR)); - } - else - { - /* Add dir first */ - dirlen = _tcslen (dir); - - fullvalue = (LPWSTR) xmalloc ((dirlen + vallen + 1) * sizeof (TCHAR)); - _tcscpy (fullvalue, dir); - } - - /* Append value */ - - if (quoted) - { - _tcsncpy (fullvalue + dirlen, value + 1, vallen - 1); - fullvalue [dirlen + vallen - sizeof (TCHAR)] = _T ('\0'); - } - else - _tcscpy (fullvalue + dirlen, value); - - if (*last <= *index) - { - *last += EXPAND_ARGV_RATE; - *argv = (char **) xrealloc (*argv, (*last) * sizeof (char *)); - } - - size = WS2SC (NULL, fullvalue, 0); - (*argv)[*index] = (char *) xmalloc (size + sizeof (TCHAR)); - WS2SC ((*argv)[*index], fullvalue, size); - - free (fullvalue); - - (*index)++; -} -#endif - -void -__gnat_runtime_initialize (int install_handler) -{ - /* increment the reference counter */ - - __gnat_rt_init_count++; - - /* if already initialized return now */ - if (__gnat_rt_init_count > 1) - return; - - /* Initialize floating-point coprocessor. This call is needed because - the MS libraries default to 64-bit precision instead of 80-bit - precision, and we require the full precision for proper operation, - given that we have set Max_Digits etc with this in mind */ - - __gnat_init_float (); - - /* Initialize the critical section and event handle for the win32_wait() - implementation, see adaint.c */ - - InitializeCriticalSection (&ProcListCS); - ProcListEvt = CreateEvent (NULL, FALSE, FALSE, NULL); - -#ifdef GNAT_UNICODE_SUPPORT - /* Set current code page for filenames handling. */ - { - char *codepage = getenv ("GNAT_CODE_PAGE"); - - /* Default code page is UTF-8. */ - __gnat_current_codepage = CP_UTF8; - - if (codepage != NULL) - { - if (strcmp (codepage, "CP_ACP") == 0) - __gnat_current_codepage = CP_ACP; - else if (strcmp (codepage, "CP_UTF8") == 0) - __gnat_current_codepage = CP_UTF8; - } - } - - /* Set current encoding for the IO. */ - { - char *ccsencoding = getenv ("GNAT_CCS_ENCODING"); - - /* Default CCS Encoding. */ - __gnat_current_ccs_encoding = _O_TEXT; - __gnat_wide_text_translation_required = 0; - - if (ccsencoding != NULL) - { - if (strcmp (ccsencoding, "U16TEXT") == 0) - { - __gnat_current_ccs_encoding = _O_U16TEXT; - __gnat_wide_text_translation_required = 1; - } - else if (strcmp (ccsencoding, "TEXT") == 0) - { - __gnat_current_ccs_encoding = _O_TEXT; - __gnat_wide_text_translation_required = 0; - } - else if (strcmp (ccsencoding, "WTEXT") == 0) - { - __gnat_current_ccs_encoding = _O_WTEXT; - __gnat_wide_text_translation_required = 1; - } - else if (strcmp (ccsencoding, "U8TEXT") == 0) - { - __gnat_current_ccs_encoding = _O_U8TEXT; - __gnat_wide_text_translation_required = 1; - } - } - } - - /* Adjust gnat_argv to support Unicode characters. */ - { - LPWSTR *wargv; - int wargc; - int k; - int last; - int argc_expanded = 0; - TCHAR result [MAX_PATH]; - int quoted; - - __gnat_get_argw (GetCommandLineW (), &wargv, &wargc); - - if (wargv != NULL) - { - /* Set gnat_argv with arguments encoded in UTF-8. */ - last = wargc + 1; - gnat_argv = (char **) xmalloc ((last) * sizeof (char *)); - - /* argv[0] is the executable full path-name. */ - - SearchPath (NULL, wargv[0], _T(".exe"), MAX_PATH, result, NULL); - append_arg (&argc_expanded, NULL, result, &gnat_argv, &last, 0); - - for (k=1; k<wargc; k++) - { - quoted = (wargv[k][0] == _T('\'')); - - /* Check for wildcard expansion if the argument is not quoted. */ - if (!quoted && __gnat_do_argv_expansion - && (_tcsstr (wargv[k], _T("?")) != 0 || - _tcsstr (wargv[k], _T("*")) != 0)) - { - /* Wilcards are present, append all corresponding matches. */ - WIN32_FIND_DATA FileData; - HANDLE hDir = FindFirstFile (wargv[k], &FileData); - LPWSTR dir = NULL; - LPWSTR ldir = _tcsrchr (wargv[k], _T('\\')); - - if (ldir == NULL) - ldir = _tcsrchr (wargv[k], _T('/')); - - if (hDir == INVALID_HANDLE_VALUE) - { - /* No match, append arg as-is. */ - append_arg (&argc_expanded, NULL, wargv[k], - &gnat_argv, &last, quoted); - } - else - { - if (ldir != NULL) - { - int n = ldir - wargv[k] + 1; - dir = (LPWSTR) xmalloc ((n + 1) * sizeof (TCHAR)); - _tcsncpy (dir, wargv[k], n); - dir[n] = _T('\0'); - } - - /* Append first match and all remaining ones. */ - - do { - /* Do not add . and .. special entries */ - - if (_tcscmp (FileData.cFileName, _T(".")) != 0 - && _tcscmp (FileData.cFileName, _T("..")) != 0) - append_arg (&argc_expanded, dir, FileData.cFileName, - &gnat_argv, &last, 0); - } while (FindNextFile (hDir, &FileData)); - - FindClose (hDir); - - if (dir != NULL) - free (dir); - } - } - else - { - /* No wildcard. Store parameter as-is. Remove quote if - needed. */ - append_arg (&argc_expanded, NULL, wargv[k], - &gnat_argv, &last, - quoted && __gnat_do_argv_expansion); - } - } - - free (wargv[0]); - free (wargv); - gnat_argc = argc_expanded; - gnat_argv = (char **) xrealloc - (gnat_argv, argc_expanded * sizeof (char *)); - } - } -#endif - - if (install_handler) - __gnat_install_handler(); -} - -/**************************************************/ -/* __gnat_runtime_initialize (init_float version) */ -/**************************************************/ - -#elif defined (__Lynx__) || defined (__FreeBSD__) || defined(__NetBSD__) \ - || defined (__OpenBSD__) - -extern void __gnat_init_float (void); - -void -__gnat_runtime_initialize(int install_handler) -{ - /* increment the reference counter */ - - __gnat_rt_init_count++; - - /* if already initialized return now */ - if (__gnat_rt_init_count > 1) - return; - - __gnat_init_float (); - - if (install_handler) - __gnat_install_handler(); -} - -/***********************************************/ -/* __gnat_runtime_initialize (VxWorks Version) */ -/***********************************************/ - -#elif defined(__vxworks) - -extern void __gnat_init_float (void); - -void -__gnat_runtime_initialize(int install_handler) -{ - /* increment the reference counter */ - - __gnat_rt_init_count++; - - /* if already initialized return now */ - if (__gnat_rt_init_count > 1) - return; - - __gnat_init_float (); - - if (install_handler) - __gnat_install_handler(); -} - -#else - -/***********************************************/ -/* __gnat_runtime_initialize (default version) */ -/***********************************************/ - -void -__gnat_runtime_initialize(int install_handler) -{ - /* increment the reference counter */ - - __gnat_rt_init_count++; - - /* if already initialized return now */ - if (__gnat_rt_init_count > 1) - return; - - if (install_handler) - __gnat_install_handler(); -} - -#endif - -#ifdef __cplusplus -} -#endif |