# endif
# define win32_get_privlib PerlEnv_lib_path
# define win32_get_sitelib PerlEnv_sitelib_path
-#endif
-
-#if defined(PERL_IMPLICIT_CONTEXT)
-# define PERL_GET_INTERP ((PerlInterpreter*)GetPerlInterpreter())
-# define PERL_SET_INTERP(i) (SetPerlInterpreter(i))
+# define win32_get_vendorlib PerlEnv_vendorlib_path
#endif
#ifdef __GNUC__
#include <stdio.h>
#include <direct.h>
#include <stdlib.h>
+#include <fcntl.h>
#ifndef EXT
#include "EXTERN.h"
#endif
#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 */
+#if !(defined(_M_IX86) && _MSC_VER >= 1200)
+#define PERL_WIN32_SOCK_DLOAD
+#endif
#define ENV_IS_CASELESS
#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers don't have this */
# define F_OK 0
#endif
+/* for waitpid() */
+#ifndef WNOHANG
+# define WNOHANG 1
+#endif
+
+#define PERL_GET_CONTEXT_DEFINED
+
/* Compiler-specific stuff. */
#ifdef __BORLANDC__ /* Borland C++ */
#define _access access
#define _chdir chdir
#define _getpid getpid
+#define wcsicmp _wcsicmp
#include <sys/types.h>
#ifndef DllMain
/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */
#define PERL_MEMBER_PTR_SIZE 16
+#define isnan _isnan
+
#endif /* _MSC_VER */
#ifdef __MINGW32__ /* Minimal Gnu-Win32 */
#endif
#define flushall _flushall
#define fcloseall _fcloseall
-
-#ifndef CP_UTF8
-# define CP_UTF8 65001
-#endif
+#define isnan _isnan /* ...same libraries as MSVC */
#ifdef PERL_OBJECT
# define MEMBER_TO_FPTR(name) &(name)
#endif /* __MINGW32__ */
+/* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */
+#ifndef CP_UTF8
+# define CP_UTF8 65001
+#endif
+
/* compatibility stuff for other compilers goes here */
-#if !defined(PERL_OBJECT) && defined(PERL_MEMBER_PTR_SIZE)
+#if !defined(PERL_OBJECT) && defined(PERL_CAPI) && defined(PERL_MEMBER_PTR_SIZE)
# define STRUCT_MGVTBL_DEFINITION \
struct mgvtbl { \
union { \
U8 op_flags; \
U8 op_private;
-#endif /* !PERL_OBJECT && PERL_MEMBER_PTR_SIZE */
+#endif /* !PERL_OBJECT && PERL_CAPI && PERL_MEMBER_PTR_SIZE */
START_EXTERN_C
DllExport void Perl_init_os_extras();
DllExport void win32_str_os_error(void *sv, DWORD err);
DllExport int RunPerl(int argc, char **argv, char **env);
-DllExport bool SetPerlInterpreter(void* interp);
-DllExport void* GetPerlInterpreter(void);
+
+typedef struct {
+ HANDLE childStdIn;
+ HANDLE childStdOut;
+ HANDLE childStdErr;
+ /*
+ * the following correspond to the fields of the same name
+ * in the STARTUPINFO structure. Embedders can use these to
+ * control the spawning process' look.
+ * Example - to hide the window of the spawned process:
+ * dwFlags = STARTF_USESHOWWINDOW;
+ * wShowWindow = SW_HIDE;
+ */
+ DWORD dwFlags;
+ DWORD dwX;
+ DWORD dwY;
+ DWORD dwXSize;
+ DWORD dwYSize;
+ DWORD dwXCountChars;
+ DWORD dwYCountChars;
+ DWORD dwFillAttribute;
+ WORD wShowWindow;
+} child_IO_table;
+
+DllExport void win32_get_child_IO(child_IO_table* ptr);
#ifndef USE_SOCKETS_AS_HANDLES
extern FILE * my_fdopen(int, char *);
extern int do_aspawn(void *really, void **mark, void **sp);
extern int do_spawn(char *cmd);
extern int do_spawn_nowait(char *cmd);
-extern char * win32_get_privlib(char *pl);
-extern char * win32_get_sitelib(char *pl);
+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);
+
+#ifdef PERL_IMPLICIT_SYS
+extern void win32_delete_internal_host(void *h);
+#endif
extern char * staticlinkmodules[];
/* Use CP_ACP when mode is ANSI */
/* Use CP_UTF8 when mode is UTF8 */
-#define A2WHELPER(lpa, lpw, nBytes)\
- lpw[0] = 0, MultiByteToWideChar((IN_UTF8) ? CP_UTF8 : CP_ACP, 0, lpa, -1, lpw, (nBytes/sizeof(WCHAR)))
+#define A2WHELPER_LEN(lpa, alen, lpw, nBytes)\
+ (lpw[0] = 0, MultiByteToWideChar((IN_BYTE) ? CP_ACP : CP_UTF8, 0, \
+ lpa, alen, lpw, (nBytes/sizeof(WCHAR))))
+#define A2WHELPER(lpa, lpw, nBytes) A2WHELPER_LEN(lpa, -1, lpw, nBytes)
-#define W2AHELPER(lpw, lpa, nChars)\
- lpa[0] = '\0', WideCharToMultiByte((IN_UTF8) ? CP_UTF8 : CP_ACP, 0, lpw, -1, (LPSTR)lpa, nChars, NULL, NULL)
+#define W2AHELPER_LEN(lpw, wlen, lpa, nChars)\
+ (lpa[0] = '\0', WideCharToMultiByte((IN_BYTE) ? CP_ACP : CP_UTF8, 0, \
+ lpw, wlen, (LPSTR)lpa, nChars,NULL,NULL))
+#define W2AHELPER(lpw, lpa, nChars) W2AHELPER_LEN(lpw, -1, lpa, nChars)
-#define USING_WIDE() (PerlEnv_os_id() == VER_PLATFORM_WIN32_NT)
+#define USING_WIDE() (PL_widesyscalls && PerlEnv_os_id() == VER_PLATFORM_WIN32_NT)
#ifdef USE_ITHREADS
# define PERL_WAIT_FOR_CHILDREN \