aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/rtinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/rtinit.c')
-rw-r--r--gcc/ada/rtinit.c586
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