1 /****************************************************************************
3 * GNAT COMPILER COMPONENTS *
5 * I N I T I A L I Z E *
7 * C Implementation File *
9 * Copyright (C) 2014-2016, Free Software Foundation, Inc. *
11 * GNAT is free software; you can redistribute it and/or modify it under *
12 * terms of the GNU General Public License as published by the Free Soft- *
13 * ware Foundation; either version 3, or (at your option) any later ver- *
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
16 * or FITNESS FOR A PARTICULAR PURPOSE. *
18 * As a special exception under Section 7 of GPL version 3, you are granted *
19 * additional permissions described in the GCC Runtime Library Exception, *
20 * version 3.1, as published by the Free Software Foundation. *
22 * You should have received a copy of the GNU General Public License and *
23 * a copy of the GCC Runtime Library Exception along with this program; *
24 * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see *
25 * <http://www.gnu.org/licenses/>. *
27 * GNAT was originally developed by the GNAT team at New York University. *
28 * Extensive contributions were provided by Ada Core Technologies Inc. *
30 ****************************************************************************/
32 /* This unit provides implementation for __gnat_runtime_initialize ()
33 which is called in adainit() to do special initialization needed by
37 /* The following include is here to meet the published VxWorks requirement
38 that the __vxworks header appear before any other include. */
46 /* We don't have libiberty, so use malloc. */
47 #define xmalloc(S) malloc (S)
48 #define xrealloc(V,S) realloc (V,S)
61 /**************************************************/
62 /* __gnat_runtime_initialize (NT-mingw32 Version) */
63 /**************************************************/
65 extern void __gnat_install_handler(void);
67 int __gnat_wide_text_translation_required
= 0;
68 /* wide text translation, 0=none, 1=activated */
70 int __gnat_rt_init_count
= 0;
71 /* number of references to the GNAT runtime, this is used to initialize
72 and finalize properly the run-time. */
74 #if defined (__MINGW32__)
78 extern void __gnat_init_float (void);
81 extern char **gnat_argv
;
82 extern CRITICAL_SECTION ProcListCS
;
83 extern HANDLE ProcListEvt
;
85 #ifdef GNAT_UNICODE_SUPPORT
87 #define EXPAND_ARGV_RATE 128
89 int __gnat_do_argv_expansion
= 1;
90 #pragma weak __gnat_do_argv_expansion
93 append_arg (int *index
, LPWSTR dir
, LPWSTR value
,
94 char ***argv
, int *last
, int quoted
)
98 int vallen
= _tcslen (value
);
105 fullvalue
= (LPWSTR
) xmalloc ((vallen
+ 1) * sizeof(TCHAR
));
110 dirlen
= _tcslen (dir
);
112 fullvalue
= (LPWSTR
) xmalloc ((dirlen
+ vallen
+ 1) * sizeof(TCHAR
));
113 _tcscpy (fullvalue
, dir
);
120 _tcsncpy (fullvalue
+ dirlen
, value
+ 1, vallen
- 1);
121 fullvalue
[dirlen
+ vallen
- sizeof(TCHAR
)] = _T('\0');
124 _tcscpy (fullvalue
+ dirlen
, value
);
128 *last
+= EXPAND_ARGV_RATE
;
129 *argv
= (char **) xrealloc (*argv
, (*last
) * sizeof (char *));
132 size
= WS2SC (NULL
, fullvalue
, 0);
133 (*argv
)[*index
] = (char *) xmalloc (size
+ sizeof(TCHAR
));
134 WS2SC ((*argv
)[*index
], fullvalue
, size
);
143 __gnat_runtime_initialize(int install_handler
)
145 /* increment the reference counter */
147 __gnat_rt_init_count
++;
149 /* if already initialized return now */
150 if (__gnat_rt_init_count
> 1)
153 /* Initialize floating-point coprocessor. This call is needed because
154 the MS libraries default to 64-bit precision instead of 80-bit
155 precision, and we require the full precision for proper operation,
156 given that we have set Max_Digits etc with this in mind */
158 __gnat_init_float ();
160 /* Initialize the critical section and event handle for the win32_wait()
161 implementation, see adaint.c */
163 InitializeCriticalSection (&ProcListCS
);
164 ProcListEvt
= CreateEvent (NULL
, FALSE
, FALSE
, NULL
);
166 #ifdef GNAT_UNICODE_SUPPORT
167 /* Set current code page for filenames handling. */
169 char *codepage
= getenv ("GNAT_CODE_PAGE");
171 /* Default code page is UTF-8. */
172 __gnat_current_codepage
= CP_UTF8
;
174 if (codepage
!= NULL
)
176 if (strcmp (codepage
, "CP_ACP") == 0)
177 __gnat_current_codepage
= CP_ACP
;
178 else if (strcmp (codepage
, "CP_UTF8") == 0)
179 __gnat_current_codepage
= CP_UTF8
;
183 /* Set current encoding for the IO. */
185 char *ccsencoding
= getenv ("GNAT_CCS_ENCODING");
187 /* Default CCS Encoding. */
188 __gnat_current_ccs_encoding
= _O_TEXT
;
189 __gnat_wide_text_translation_required
= 0;
191 if (ccsencoding
!= NULL
)
193 if (strcmp (ccsencoding
, "U16TEXT") == 0)
195 __gnat_current_ccs_encoding
= _O_U16TEXT
;
196 __gnat_wide_text_translation_required
= 1;
198 else if (strcmp (ccsencoding
, "TEXT") == 0)
200 __gnat_current_ccs_encoding
= _O_TEXT
;
201 __gnat_wide_text_translation_required
= 0;
203 else if (strcmp (ccsencoding
, "WTEXT") == 0)
205 __gnat_current_ccs_encoding
= _O_WTEXT
;
206 __gnat_wide_text_translation_required
= 1;
208 else if (strcmp (ccsencoding
, "U8TEXT") == 0)
210 __gnat_current_ccs_encoding
= _O_U8TEXT
;
211 __gnat_wide_text_translation_required
= 1;
216 /* Adjust gnat_argv to support Unicode characters. */
222 int argc_expanded
= 0;
223 TCHAR result
[MAX_PATH
];
226 wargv
= CommandLineToArgvW (GetCommandLineW(), &wargc
);
230 /* Set gnat_argv with arguments encoded in UTF-8. */
232 gnat_argv
= (char **) xmalloc ((last
) * sizeof (char *));
234 /* argv[0] is the executable full path-name. */
236 SearchPath (NULL
, wargv
[0], _T(".exe"), MAX_PATH
, result
, NULL
);
237 append_arg (&argc_expanded
, NULL
, result
, &gnat_argv
, &last
, 0);
239 for (k
=1; k
<wargc
; k
++)
241 quoted
= (wargv
[k
][0] == _T('\''));
243 /* Check for wildcard expansion if the argument is not quoted. */
244 if (!quoted
&& __gnat_do_argv_expansion
245 && (_tcsstr (wargv
[k
], _T("?")) != 0 ||
246 _tcsstr (wargv
[k
], _T("*")) != 0))
248 /* Wilcards are present, append all corresponding matches. */
249 WIN32_FIND_DATA FileData
;
250 HANDLE hDir
= FindFirstFile (wargv
[k
], &FileData
);
252 LPWSTR ldir
= _tcsrchr (wargv
[k
], _T('\\'));
255 ldir
= _tcsrchr (wargv
[k
], _T('/'));
257 if (hDir
== INVALID_HANDLE_VALUE
)
259 /* No match, append arg as-is. */
260 append_arg (&argc_expanded
, NULL
, wargv
[k
],
261 &gnat_argv
, &last
, quoted
);
267 int n
= ldir
- wargv
[k
] + 1;
268 dir
= (LPWSTR
) xmalloc ((n
+ 1) * sizeof (TCHAR
));
269 _tcsncpy (dir
, wargv
[k
], n
);
273 /* Append first match and all remaining ones. */
276 /* Do not add . and .. special entries */
278 if (_tcscmp (FileData
.cFileName
, _T(".")) != 0
279 && _tcscmp (FileData
.cFileName
, _T("..")) != 0)
280 append_arg (&argc_expanded
, dir
, FileData
.cFileName
,
281 &gnat_argv
, &last
, 0);
282 } while (FindNextFile (hDir
, &FileData
));
292 /* No wildcard. Store parameter as-is. Remove quote if
294 append_arg (&argc_expanded
, NULL
, wargv
[k
],
296 quoted
&& __gnat_do_argv_expansion
);
301 gnat_argc
= argc_expanded
;
302 gnat_argv
= (char **) xrealloc
303 (gnat_argv
, argc_expanded
* sizeof (char *));
309 __gnat_install_handler();
312 /**************************************************/
313 /* __gnat_runtime_initialize (init_float version) */
314 /**************************************************/
316 #elif defined (__Lynx__) || defined (__FreeBSD__) || defined(__NetBSD__) \
317 || defined (__OpenBSD__)
319 extern void __gnat_init_float (void);
322 __gnat_runtime_initialize(int install_handler
)
324 /* increment the reference counter */
326 __gnat_rt_init_count
++;
328 /* if already initialized return now */
329 if (__gnat_rt_init_count
> 1)
332 __gnat_init_float ();
335 __gnat_install_handler();
338 /***********************************************/
339 /* __gnat_runtime_initialize (VxWorks Version) */
340 /***********************************************/
342 #elif defined(__vxworks)
344 extern void __gnat_init_float (void);
347 __gnat_runtime_initialize(int install_handler
)
349 /* increment the reference counter */
351 __gnat_rt_init_count
++;
353 /* if already initialized return now */
354 if (__gnat_rt_init_count
> 1)
357 __gnat_init_float ();
360 __gnat_install_handler();
365 /***********************************************/
366 /* __gnat_runtime_initialize (default version) */
367 /***********************************************/
370 __gnat_runtime_initialize(int install_handler
)
372 /* increment the reference counter */
374 __gnat_rt_init_count
++;
376 /* if already initialized return now */
377 if (__gnat_rt_init_count
> 1)
381 __gnat_install_handler();