1/****************************************************************************
2 *                                                                          *
3 *                         GNAT COMPILER COMPONENTS                         *
4 *                                                                          *
5 *                               M I N G W 3 2                              *
6 *                                                                          *
7 *                              C Header File                               *
8 *                                                                          *
9 *          Copyright (C) 2002-2014, Free Software Foundation, Inc.         *
10 *                                                                          *
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.                                     *
17 *                                                                          *
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.               *
21 *                                                                          *
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/>.                                          *
26 *                                                                          *
27 * GNAT was originally developed  by the GNAT team at  New York University. *
28 * Extensive contributions were provided by Ada Core Technologies Inc.      *
29 *                                                                          *
30 ****************************************************************************/
31
32/*  This file provides some macros used for the MINGW32 platform. The main
33    goal is to be able to build GNAT with a standard MINGW32 C header
34    set. This files contains also the circuitry for the unicode support.   */
35
36#ifndef _MINGW32_H
37#define _MINGW32_H
38
39#include <_mingw.h>
40
41#ifndef RTX
42#define GNAT_UNICODE_SUPPORT
43#define _UNICODE /* For C runtime */
44#define UNICODE  /* For Win32 API */
45#endif
46
47/* We need functionality available only starting with Windows XP */
48#ifndef _WIN32_WINNT
49#define _WIN32_WINNT 0x0501
50#endif
51
52#ifndef __CYGWIN__
53#include <tchar.h>
54#endif
55#if defined (__CYGWIN__) && !defined (__CYGWIN32__) && !defined (IN_RTS)
56/* Note: windows.h on cygwin-64 includes x86intrin.h which uses malloc.
57   That fails to compile, if malloc is poisoned, i.e. if !IN_RTS.  */
58#define _X86INTRIN_H_INCLUDED
59#endif
60#include <windows.h>
61
62#ifndef _O_U8TEXT
63#define _O_U8TEXT _O_TEXT
64#endif
65#ifndef _O_U16TEXT
66#define _O_U16TEXT _O_TEXT
67#endif
68#ifndef _O_WTEXT
69#define _O_WTEXT _O_TEXT
70#endif
71
72/* After including this file it is possible to use the character t as prefix
73   to routines. If GNAT_UNICODE_SUPPORT is defined then the unicode enabled
74   versions will be used.  */
75
76/* Copy to/from wide-string, if GNAT_UNICODE_SUPPORT activated this will do
77   the proper translations using the UTF-8 encoding.  */
78
79#ifdef GNAT_UNICODE_SUPPORT
80
81extern UINT CurrentCodePage;
82extern UINT CurrentCCSEncoding;
83
84/*  Macros to convert to/from the code page specified in CurrentCodePage.  */
85#define S2WSC(wstr,str,len) \
86   MultiByteToWideChar (CurrentCodePage,0,str,-1,wstr,len)
87#define WS2SC(str,wstr,len) \
88   WideCharToMultiByte (CurrentCodePage,0,wstr,-1,str,len,NULL,NULL)
89
90/*  Macros to convert to/from UTF-8 code page.  */
91#define S2WSU(wstr,str,len) \
92   MultiByteToWideChar (CP_UTF8,0,str,-1,wstr,len)
93#define WS2SU(str,wstr,len) \
94   WideCharToMultiByte (CP_UTF8,0,wstr,-1,str,len,NULL,NULL)
95
96/*  Macros to convert to/from Windows default code page.  */
97#define S2WS(wstr,str,len) \
98   MultiByteToWideChar (CP_ACP,0,str,-1,wstr,len)
99#define WS2S(str,wstr,len) \
100   WideCharToMultiByte (CP_ACP,0,wstr,-1,str,len,NULL,NULL)
101#else
102#define S2WSC(wstr,str,len) strncpy(wstr,str,len)
103#define WS2SC(str,wstr,len) strncpy(str,wstr,len)
104#define S2WSU(wstr,str,len) strncpy(wstr,str,len)
105#define WS2SU(str,wstr,len) strncpy(str,wstr,len)
106#define S2WS(wstr,str,len) strncpy(wstr,str,len)
107#define WS2S(str,wstr,len) strncpy(str,wstr,len)
108#endif
109
110#include <stdlib.h>
111
112/* STD_MINGW: standard if MINGW32 version > 1.3, we have switched to this
113   version instead of the previous enhanced version to ease building GNAT on
114   Windows platforms. By using STD_MINGW or OLD_MINGW it is possible to build
115   GNAT using both MingW include files (Old MingW + ACT changes and standard
116   MingW starting with version 1.3.
117   For w64 Mingw the define STD_MINGW is always set to value 1, because
118   there is no old header set present.  */
119#ifdef _WIN64
120#define STD_MINGW 1
121#else
122#define STD_MINGW ((__MINGW32_MAJOR_VERSION == 1 \
123		   && __MINGW32_MINOR_VERSION >= 3) \
124     || (__MINGW32_MAJOR_VERSION >= 2))
125#endif
126
127#define OLD_MINGW (!(STD_MINGW))
128
129#ifndef MAXPATHLEN
130#define MAXPATHLEN MAX_PATH
131#endif
132
133#endif /* _MINGW32_H */
134