X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/46e77f111828d72136c91f0837803182535da01d..500c19467028989935b081c5fb7b8b33ffb86d40:/win32/win32.h diff --git a/win32/win32.h b/win32/win32.h index 2a87528..65d6d31 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -1,7 +1,7 @@ /* WIN32.H * * (c) 1995 Microsoft Corporation. All rights reserved. - * Developed by hip communications inc., http://info.hip.com/info/ + * Developed by hip communications inc. * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -10,7 +10,7 @@ #define _INC_WIN32_PERL5 #ifndef _WIN32_WINNT -# define _WIN32_WINNT 0x0400 /* needed for TryEnterCriticalSection() etc. */ +# define _WIN32_WINNT 0x0500 /* needed for CreateHardlink() etc. */ #endif #if defined(PERL_IMPLICIT_SYS) @@ -41,23 +41,56 @@ /* Define DllExport akin to perl's EXT, - * If we are in the DLL or mimicing the DLL for Win95 work round - * then Export the symbol, + * If we are in the DLL then Export the symbol, * otherwise import it. */ /* now even GCC supports __declspec() */ -#if defined(PERLDLL) || defined(WIN95FIX) +#if defined(PERLDLL) #define DllExport /*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */ #else #define DllExport __declspec(dllimport) #endif +/* The Perl APIs can only be called directly inside the perl5xx.dll. + * All other code has to import them. By declaring them as "dllimport" + * we tell the compiler to generate an indirect call instruction and + * avoid redirection through a call thunk. + * + * The XS code in the re extension is special, in that it redefines + * core APIs locally, so don't mark them as "dllimport" because GCC + * cannot handle this situation. + */ +#if !defined(PERLDLL) && !defined(PERL_EXT_RE_BUILD) +# ifdef __cplusplus +# define PERL_CALLCONV extern "C" __declspec(dllimport) +# else +# define PERL_CALLCONV __declspec(dllimport) +# endif +#endif + #define WIN32_LEAN_AND_MEAN #include +/* + * Bug in winbase.h in mingw-w64 4.4.0-1 at least... they + * do #define GetEnvironmentStringsA GetEnvironmentStrings and fail + * to declare GetEnvironmentStringsA. + */ +#if defined(__MINGW64__) && defined(GetEnvironmentStringsA) && !defined(UNICODE) +#ifdef __cplusplus +extern "C" { +#endif +#undef GetEnvironmentStringsA +WINBASEAPI LPCH WINAPI GetEnvironmentStringsA(VOID); +#define GetEnvironmentStrings GetEnvironmentStringsA +#ifdef __cplusplus +} +#endif +#endif + #ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */ #define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */ #endif /*WIN32_LEAN_AND_MEAN */ @@ -124,14 +157,6 @@ struct utsname { #define PERL_NO_FORCE_LINK /* no need for PL_force_link_funcs */ -/* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95. - It now uses some black magic to work seamlessly with the DLL CRT and - works with MSVC++ 4.0+ or GCC/Mingw32 - -- BKS 1-24-2000 */ -#if (defined(_M_IX86) && _MSC_VER >= 1000) || defined(__MINGW32__) -#define USE_FIXED_OSFHANDLE -#endif - /* Define PERL_WIN32_SOCK_DLOAD to have Perl dynamically load the winsock DLL when needed. Don't use if your compiler supports delayloading (ie, VC++ 6.0) -- BKS 5-29-2000 */ @@ -167,6 +192,14 @@ struct utsname { /* Compiler-specific stuff. */ +#if defined(_MSC_VER) || defined(__MINGW32__) +/* VC uses non-standard way to determine the size and alignment if bit-fields */ +/* MinGW will compiler with -mms-bitfields, so should use the same types */ +# define PERL_BITFIELD8 unsigned char +# define PERL_BITFIELD16 unsigned short +# define PERL_BITFIELD32 unsigned int +#endif + #ifdef __BORLANDC__ /* Borland C++ */ #if (__BORLANDC__ <= 0x520) @@ -232,7 +265,9 @@ typedef long gid_t; #endif #define flushall _flushall #define fcloseall _fcloseall +#ifndef isnan #define isnan _isnan /* ...same libraries as MSVC */ +#endif #ifndef _O_NOINHERIT # define _O_NOINHERIT 0x0080 @@ -282,6 +317,7 @@ extern gid_t getegid(void); extern int setuid(uid_t uid); extern int setgid(gid_t gid); extern int kill(int pid, int sig); +extern int killpg(int pid, int sig); #ifndef USE_PERL_SBRK extern void *sbrk(ptrdiff_t need); # define HAS_SBRK_PROTO @@ -332,13 +368,9 @@ DllExport HWND win32_create_message_window(void); extern FILE * my_fdopen(int, char *); #endif extern int my_fclose(FILE *); -extern int my_fstat(int fd, Stat_t *sbufptr); -extern char * win32_get_privlib(const char *pl); -extern char * win32_get_sitelib(const char *pl); -extern char * win32_get_vendorlib(const char *pl); -extern int IsWin95(void); -extern int IsWinNT(void); -extern void win32_argv2utf8(int argc, char** argv); +extern char * win32_get_privlib(const char *pl, STRLEN *const len); +extern char * win32_get_sitelib(const char *pl, STRLEN *const len); +extern char * win32_get_vendorlib(const char *pl, STRLEN *const len); #ifdef PERL_IMPLICIT_SYS extern void win32_delete_internal_host(void *h); @@ -362,10 +394,6 @@ typedef char * caddr_t; /* In malloc.c (core address). */ /* #define PERL_SBRK_VIA_MALLOC /**/ #endif -#if defined(PERLDLL) && !defined(PERL_CORE) -#define PERL_CORE -#endif - #ifdef PERL_TEXTMODE_SCRIPTS # define PERL_SCRIPT_MODE "r" #else @@ -394,9 +422,7 @@ struct thread_intern { # ifdef USE_SOCKETS_AS_HANDLES int Winit_socktype; # endif -# ifdef HAVE_DES_FCRYPT char Wcrypt_buffer[30]; -# endif # ifdef USE_RTL_THREAD_API void * retv; /* slot for thread return value */ # endif @@ -490,59 +516,6 @@ DllExport int win32_async_check(pTHX); } STMT_END #endif -#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX) -#ifdef PERL_CORE - -/* C doesn't like repeat struct definitions */ -#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3) -#undef _CRTIMP -#endif -#ifndef _CRTIMP -#define _CRTIMP __declspec(dllimport) -#endif - -/* - * Control structure for lowio file handles - */ -typedef struct { - intptr_t osfhnd;/* underlying OS file HANDLE */ - char osfile; /* attributes of file (e.g., open in text mode?) */ - char pipech; /* one char buffer for handles opened on pipes */ - int lockinitflag; - CRITICAL_SECTION lock; -} ioinfo; - - -/* - * Array of arrays of control structures for lowio files. - */ -EXTERN_C _CRTIMP ioinfo* __pioinfo[]; - -/* - * Definition of IOINFO_L2E, the log base 2 of the number of elements in each - * array of ioinfo structs. - */ -#define IOINFO_L2E 5 - -/* - * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array - */ -#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E) - -/* - * Access macros for getting at an ioinfo struct and its fields from a - * file handle - */ -#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1))) -#define _osfhnd(i) (_pioinfo(i)->osfhnd) -#define _osfile(i) (_pioinfo(i)->osfile) -#define _pipech(i) (_pioinfo(i)->pipech) - -/* since we are not doing a dup2(), this works fine */ -#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh) -#endif -#endif - /* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */ #if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX) #undef PERLIO_NOT_STDIO