win32 fixes for VC 6.0 nits
[p5sagit/p5-mst-13.2.git] / win32 / win32.h
CommitLineData
68dc0745 1/* WIN32.H
2 *
3 * (c) 1995 Microsoft Corporation. All rights reserved.
4 * Developed by hip communications inc., http://info.hip.com/info/
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 */
0a753a76 9#ifndef _INC_WIN32_PERL5
10#define _INC_WIN32_PERL5
11
9d8a25dc 12#ifdef PERL_OBJECT
ab39fa9d 13# define WIN32IO_IS_STDIO /* don't pull in custom stdio layer */
14# ifdef PERL_GLOBAL_STRUCT
15# error PERL_GLOBAL_STRUCT cannot be defined with PERL_OBJECT
16# endif
e5a95ffb 17# define win32_get_privlib PerlEnv_lib_path
ab39fa9d 18# define win32_get_sitelib PerlEnv_sitelib_path
9d8a25dc 19#endif
20
a835ef8a 21#ifdef __GNUC__
a835ef8a 22typedef long long __int64;
23#define Win32_Winsock
ac4c12e7 24# ifdef __cplusplus
25#undef __attribute__ /* seems broken in 2.8.0 */
26#define __attribute__(p)
27# endif
22239a37 28/* GCC does not do __declspec() - render it a nop
29 * and turn on options to avoid importing data
30 */
31#define __declspec(x)
32#define PERL_GLOBAL_STRUCT
33#define MULTIPLICITY
a835ef8a 34#endif
35
22239a37 36/* Define DllExport akin to perl's EXT,
37 * If we are in the DLL or mimicing the DLL for Win95 work round
38 * then Export the symbol,
39 * otherwise import it.
40 */
41
c69f6586 42#if defined(PERL_OBJECT)
43#define DllExport
44#else
22239a37 45#if defined(PERLDLL) || defined(WIN95FIX)
852c2e52 46#define DllExport
47/*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */
22239a37 48#else
49#define DllExport __declspec(dllimport)
50#endif
c69f6586 51#endif
c69f112c 52
0a753a76 53#define WIN32_LEAN_AND_MEAN
54#include <windows.h>
55
68dc0745 56#ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */
57#define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */
68dc0745 58#endif /*WIN32_LEAN_AND_MEAN */
0a753a76 59
eda5ff31 60#ifndef TLS_OUT_OF_INDEXES
61#define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
62#endif
63
0a753a76 64#include <dirent.h>
65#include <io.h>
66#include <process.h>
67#include <stdio.h>
68#include <direct.h>
390b85e7 69#include <stdlib.h>
70#ifndef EXT
71#include "EXTERN.h"
72#endif
73
c69f112c 74struct tms {
75 long tms_utime;
76 long tms_stime;
77 long tms_cutime;
78 long tms_cstime;
79};
80
390b85e7 81#ifndef START_EXTERN_C
b3e5c95e 82#undef EXTERN_C
390b85e7 83#ifdef __cplusplus
84# define START_EXTERN_C extern "C" {
85# define END_EXTERN_C }
86# define EXTERN_C extern "C"
87#else
88# define START_EXTERN_C
89# define END_EXTERN_C
90# define EXTERN_C
91#endif
92#endif
93
94#define STANDARD_C 1
95#define DOSISH 1 /* no escaping our roots */
96#define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */
0a753a76 97
f3986ebb 98/* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as
99 * real filehandles. XXX Should always be defined (the other version is untested) */
100#define USE_SOCKETS_AS_HANDLES
101
102/* if USE_WIN32_RTL_ENV is not defined, Perl uses direct Win32 calls
103 * to read the environment, bypassing the runtime's (usually broken)
104 * facilities for accessing the same. See note in util.c/my_setenv(). */
105/*#define USE_WIN32_RTL_ENV */
0a753a76 106
f3986ebb 107/* Define USE_FIXED_OSFHANDLE to fix VC's _open_osfhandle() on W95.
108 * Can only enable it if not using the DLL CRT (it doesn't expose internals) */
109#if defined(_MSC_VER) && !defined(_DLL) && defined(_M_IX86)
110#define USE_FIXED_OSFHANDLE
111#endif
112
902173a3 113#define ENV_IS_CASELESS
114
d41de25a 115#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers don't have this */
f3986ebb 116#define VER_PLATFORM_WIN32_WINDOWS 1
117#endif
118
d41de25a 119#ifndef FILE_SHARE_DELETE /* VC-4.0 headers don't have this */
120#define FILE_SHARE_DELETE 0x00000004
121#endif
122
f3986ebb 123/* Compiler-specific stuff. */
124
910dfcc8 125#ifdef __BORLANDC__ /* Borland C++ */
3e3baf6d 126
127#define _access access
128#define _chdir chdir
129#include <sys/types.h>
130
84902520 131#ifndef DllMain
132#define DllMain DllEntryPoint
133#endif
134
189b2af5 135#pragma warn -ccc /* "condition is always true/false" */
136#pragma warn -rch /* "unreachable code" */
137#pragma warn -sig /* "conversion may lose significant digits" */
138#pragma warn -pia /* "possibly incorrect assignment" */
139#pragma warn -par /* "parameter 'foo' is never used" */
140#pragma warn -aus /* "'foo' is assigned a value that is never used" */
141#pragma warn -use /* "'foo' is declared but never used" */
142#pragma warn -csu /* "comparing signed and unsigned values" */
143#pragma warn -pro /* "call to function with no prototype" */
3e3baf6d 144
4b556e6c 145#define USE_RTL_WAIT /* Borland has a working wait() */
146
ac4c12e7 147/* Borland is picky about a bare member function name used as its ptr */
148#ifdef PERL_OBJECT
149#define FUNC_NAME_TO_PTR(name) &(name)
150#endif
151
910dfcc8 152#endif
3e3baf6d 153
f3986ebb 154#ifdef _MSC_VER /* Microsoft Visual C++ */
155
0a753a76 156typedef long uid_t;
157typedef long gid_t;
f3986ebb 158#pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761)
159
0f4eea8f 160#ifndef PERL_OBJECT
161
162/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */
163#define STRUCT_MGVTBL_DEFINITION \
164struct mgvtbl { \
165 union { \
166 int (CPERLscope(*svt_get)) _((SV *sv, MAGIC* mg)); \
167 char handle_VC_problem1[16]; \
168 }; \
169 union { \
170 int (CPERLscope(*svt_set)) _((SV *sv, MAGIC* mg)); \
171 char handle_VC_problem2[16]; \
172 }; \
173 union { \
174 U32 (CPERLscope(*svt_len)) _((SV *sv, MAGIC* mg)); \
175 char handle_VC_problem3[16]; \
176 }; \
177 union { \
178 int (CPERLscope(*svt_clear)) _((SV *sv, MAGIC* mg)); \
179 char handle_VC_problem4[16]; \
180 }; \
181 union { \
182 int (CPERLscope(*svt_free)) _((SV *sv, MAGIC* mg)); \
183 char handle_VC_problem5[16]; \
184 }; \
185}
186
187#define BASEOP_DEFINITION \
188 OP* op_next; \
189 OP* op_sibling; \
190 OP* (CPERLscope(*op_ppaddr))_((ARGSproto)); \
191 char handle_VC_problem[12]; \
192 PADOFFSET op_targ; \
193 OPCODE op_type; \
194 U16 op_seq; \
195 U8 op_flags; \
196 U8 op_private;
197
198#define UNION_ANY_DEFINITION union any { \
199 void* any_ptr; \
200 I32 any_i32; \
201 IV any_iv; \
202 long any_long; \
203 void (CPERLscope(*any_dptr)) _((void*)); \
204 char handle_VC_problem[16]; \
205}
206
207#endif /* PERL_OBJECT */
208
f3986ebb 209#endif /* _MSC_VER */
210
910dfcc8 211#ifdef __MINGW32__ /* Minimal Gnu-Win32 */
212
213typedef long uid_t;
214typedef long gid_t;
3730b96e 215#define _environ environ
216#define flushall _flushall
217#define fcloseall _fcloseall
910dfcc8 218
ac4c12e7 219#ifndef _O_NOINHERIT
220# define _O_NOINHERIT 0x0080
221# ifndef _NO_OLDNAMES
222# define O_NOINHERIT _O_NOINHERIT
223# endif
224#endif
225
ba3eb2af 226#ifndef _O_NOINHERIT
227# define _O_NOINHERIT 0x0080
228# ifndef _NO_OLDNAMES
229# define O_NOINHERIT _O_NOINHERIT
230# endif
231#endif
232
910dfcc8 233#endif /* __MINGW32__ */
234
f3986ebb 235/* compatibility stuff for other compilers goes here */
0a753a76 236
0a753a76 237
390b85e7 238START_EXTERN_C
f3986ebb 239
240/* For UNIX compatibility. */
241
0a753a76 242extern uid_t getuid(void);
243extern gid_t getgid(void);
244extern uid_t geteuid(void);
245extern gid_t getegid(void);
0a753a76 246extern int setuid(uid_t uid);
247extern int setgid(gid_t gid);
248extern int kill(int pid, int sig);
161b471a 249extern void *sbrk(int need);
e34ffe5a 250extern char * getlogin(void);
b990f8c8 251extern int chown(const char *p, uid_t o, gid_t g);
d55594ae 252
f3986ebb 253#undef Stat
254#define Stat win32_stat
3e3baf6d 255
f3986ebb 256#undef init_os_extras
257#define init_os_extras Perl_init_os_extras
390b85e7 258
22239a37 259DllExport void Perl_win32_init(int *argcp, char ***argvp);
260DllExport void Perl_init_os_extras(void);
3730b96e 261DllExport void win32_str_os_error(void *sv, DWORD err);
0551aaa8 262
f3986ebb 263#ifndef USE_SOCKETS_AS_HANDLES
264extern FILE * my_fdopen(int, char *);
d55594ae 265#endif
f3986ebb 266extern int my_fclose(FILE *);
2d7a9237 267extern int do_aspawn(void *really, void **mark, void **sp);
f3986ebb 268extern int do_spawn(char *cmd);
2d7a9237 269extern int do_spawn_nowait(char *cmd);
f3986ebb 270extern char do_exec(char *cmd);
e5a95ffb 271extern char * win32_get_privlib(char *pl);
00dc2f4f 272extern char * win32_get_sitelib(char *pl);
f3986ebb 273extern int IsWin95(void);
274extern int IsWinNT(void);
d55594ae 275
f3986ebb 276extern char * staticlinkmodules[];
390b85e7 277
278END_EXTERN_C
d55594ae 279
68dc0745 280typedef char * caddr_t; /* In malloc.c (core address). */
0a753a76 281
68dc0745 282/*
68dc0745 283 * handle socket stuff, assuming socket is always available
284 */
0a753a76 285#include <sys/socket.h>
286#include <netdb.h>
287
bbc8f9de 288#ifdef MYMALLOC
289#define EMBEDMYMALLOC /**/
290/* #define USE_PERL_SBRK /**/
291/* #define PERL_SBRK_VIA_MALLOC /**/
292#endif
293
c31fac66 294#if defined(PERLDLL) && !defined(PERL_CORE)
bbc8f9de 295#define PERL_CORE
296#endif
297
a868473f 298#ifdef USE_BINMODE_SCRIPTS
299#define PERL_SCRIPT_MODE "rb"
300EXT void win32_strip_return(struct sv *sv);
301#else
302#define PERL_SCRIPT_MODE "r"
303#define win32_strip_return(sv) NOOP
304#endif
305
4b556e6c 306#define HAVE_INTERP_INTERN
307struct interp_intern {
308 char * w32_perlshell_tokens;
309 char ** w32_perlshell_vec;
310 long w32_perlshell_items;
311 struct av * w32_fdpid;
312#ifndef USE_RTL_WAIT
313 long w32_num_children;
314 HANDLE w32_child_pids[MAXIMUM_WAIT_OBJECTS];
315#endif
316};
317
9f699bd9 318#define w32_perlshell_tokens (sys_intern.w32_perlshell_tokens)
319#define w32_perlshell_vec (sys_intern.w32_perlshell_vec)
320#define w32_perlshell_items (sys_intern.w32_perlshell_items)
321#define w32_fdpid (sys_intern.w32_fdpid)
4b556e6c 322
323#ifndef USE_RTL_WAIT
9f699bd9 324# define w32_num_children (sys_intern.w32_num_children)
325# define w32_child_pids (sys_intern.w32_child_pids)
4b556e6c 326#endif
327
c53bd28a 328/*
329 * Now Win32 specific per-thread data stuff
330 */
331
332#ifdef USE_THREADS
e34ffe5a 333# ifndef USE_DECLSPEC_THREAD
334# define HAVE_THREAD_INTERN
335
336struct thread_intern {
337 /* XXX can probably use one buffer instead of several */
338 char Wstrerror_buffer[512];
339 struct servent Wservent;
340 char Wgetlogin_buffer[128];
4b556e6c 341 char Ww32_perllib_root[MAX_PATH+1];
401ef382 342# ifdef USE_SOCKETS_AS_HANDLES
343 int Winit_socktype;
344# endif
e34ffe5a 345# ifdef HAVE_DES_FCRYPT
346 char Wcrypt_buffer[30];
347# endif
2d7a9237 348# ifdef USE_RTL_THREAD_API
349 void * retv; /* slot for thread return value */
350# endif
c53bd28a 351};
e34ffe5a 352# endif /* !USE_DECLSPEC_THREAD */
353#endif /* USE_THREADS */
c53bd28a 354
68dc0745 355#endif /* _INC_WIN32_PERL5 */