Merge pull request #891 from kupsch/remove-muldivfuncs
[dyninst.git] / external / rose / rose_msvc.h
1 // This is support for Microsoft Visual Studio C++ use with ROSE
2 // (it is initial work with no clear idea if MSVC will be supported in the future).
3
4
5
6 // DQ (3/22/2009): Added support for detection of Microsoft specific usage.
7 // Determine if this is a WIN32 (e.g., Windows NT or Windows 95) system.
8 #ifndef ROSE_WIN32
9   #if defined(__WATCOMC__) && defined(__NT__)
10  // Some versions of the Watcom compiler fail to set _WIN32.  Set ROSE_WIN32 when running the Watcom compiler on NT.
11     #define ROSE_WIN32 1
12   #endif
13 #endif
14
15 #ifndef ROSE_WIN32
16   #ifdef _WIN32
17     #define ROSE_WIN32 1
18   #else
19     #define ROSE_WIN32 0
20   #endif
21 #endif
22
23
24 #ifndef ROSE_MSDOS
25   #if defined(MSDOS) || defined(__MSDOS__)
26 // Turbo-C defines __MSDOS__ and Microsoft C defines MSDOS, so this is MS-DOS.
27     #define ROSE_MSDOS 1
28   #else
29     #define ROSE_MSDOS 0
30   #endif
31 #endif
32
33 // Set a flag that indicates that some Microsoft operating system is being used.
34 #ifndef ROSE_MICROSOFT_OS
35   #if ROSE_WIN32 || ROSE_MSDOS
36     #define ROSE_MICROSOFT_OS 1
37   #else
38     #define ROSE_MICROSOFT_OS 0
39   #endif
40 #endif
41
42 // If this is a Microsoft operating system, as indicated by the macro
43 // "ROSE_MICROSOFT_OS", determine which compiler it is.  Borland, Zortech,
44 // and Microsoft are supported.
45 #if ROSE_MICROSOFT_OS
46   #ifdef __TURBOC__
47 // Borland's (Turbo-C or C++) library is ANSI compatible.
48     #define __ANSIC__ 1
49   #else /* __TURBOC__ */
50     #ifdef __ZTC__
51    // Zortech's library is ANSI compatible.
52       #define __ANSIC__ 1
53     #else /* __ZTC__ */
54    // Then it must be MSC.
55       #define __MSC__ 1
56    // MSC's library is ANSI compatible.
57       #define __ANSIC__ 1
58     #endif
59   #endif
60 #endif
61
62 // If this has not be set yet, then set it explicitly
63 #ifndef __MSC__
64   #define __MSC__ 0
65 #endif
66
67
68
69 #if 0
70 // These options are specific to the platforms and the Microsoft Visual C++ compilers supported by the MKS Toolkit.
71
72 // _MSC_VER : defines the compiler version for the versions supported by the current version of MKS Toolkit. Possible values include:
73 //         Microsoft Visual C++ 7.1     _MSC_VER = 1310
74 //         Microsoft Visual C++ 7.0     _MSC_VER = 1300
75 //         Microsoft Visual C++ 6.0     _MSC_VER = 1200
76 //         Microsoft Visual C++ 5.0     _MSC_VER = 1100
77 // 
78 // _WIN32 : is defined for Win32 applications and is always defined as 1.
79 // 
80 // _M_IX86 : defines the processor. Possible values include:
81 //         Blend                _M_IX86 = 500 
82 //         Pentium              _M_IX86 = 500
83 //         Pentium Pro  _M_IX86 = 600
84 //         80386                _M_IX86 = 300
85 //         80486                _M_IX86 = 400
86 #endif
87
88
89 // DQ (3/22/2009): MS does not define some of the standard Linux types
90 #if ROSE_MICROSOFT_OS
91 // Using boost/cstdint.hpp instead.
92 // typedef uint64_t unsigned long long;
93
94 // DQ (3/22/2009): This is defined in <linux/limits.h>, for MS we pick a value consistatn with MKS.
95 // Expanded API PATH_MAX. The size of PATH_MAX used by the MKS Toolkit UNIX APIs has been increased 
96 // to 4096 bytes on Windows NT/2000/XP/2003 systems.
97 #define PATH_MAX 4096
98
99 // This is defined in <sys/param.h> but MSVS does not support that header file.
100 #define MAXPATHLEN PATH_MAX
101
102 #if 0 // def _MSC_VER
103 // DQ (11/27/2009): Needed to cope with bug in MS library: it fails to define min/max 
104 template <class T>
105 inline T max(const T& a, const T& b) 
106    {
107      return (a > b) ? a : b;
108    }
109
110 template <class T>
111 inline T min(const T& a, const T& b) 
112    { 
113      return (a < b) ? a : b;
114    }
115 #endif 
116
117 // DQ (11/27/2009): Needed to cope with bug in MS library: it fails to define min/max 
118 // This solution is from the web at: http://www.codeproject.com/Messages/3178857/Overcoming-problem-with-std-min-std-max-sharpdefin.aspx
119 // And then I simplified it to just undefine the min and max macros (which seems to be all that is required.
120 // #define NOMINMAX
121 // #ifndef max
122 // #define max(a,b)            (((a) > (b)) ? (a) : (b))
123 // #endif
124 // #ifndef min
125 // #define min(a,b)            (((a) < (b)) ? (a) : (b))
126 // #endif
127 // #include <afxcontrolbars.h>
128 #define NOMINMAX
129 #undef max
130 #undef min
131 // ...contine to use std::mix, std::max from here on
132
133 #ifdef _MSC_VER
134 // DQ (11/27/2009): "__func__" is C99, but MSVC uses "__FUNCTION__" instead.
135 #define __func__ __FUNCTION__
136 #endif
137
138 // DQ (12/28/2009): Moved this from where is was placed by Thomas in the ROSETTA grenerated code.
139 // This simplifies the generated code to support splitting large generated files into smaller files.
140 // tps (11/25/2009) : Added ssize_t for Windows
141 // tps (01/04/2010) LONG_PTR is defined in windows.h
142 #ifdef _MSC_VER
143 #include <windows.h>
144 typedef LONG_PTR ssize_t;
145 #endif
146
147 #endif