per Larry's idea, parse 1.2.3 as v1.2.3; C<require 5.6.0> and
[p5sagit/p5-mst-13.2.git] / win32 / win32.h
index d447f2b..4e73a23 100644 (file)
@@ -75,6 +75,7 @@
 #include <stdio.h>
 #include <direct.h>
 #include <stdlib.h>
+#include <fcntl.h>
 #ifndef EXT
 #include "EXTERN.h"
 #endif
@@ -130,9 +131,11 @@ struct utsname {
  * facilities for accessing the same.  See note in util.c/my_setenv(). */
 /*#define USE_WIN32_RTL_ENV */
 
-/* Define USE_FIXED_OSFHANDLE to fix VC's _open_osfhandle() on W95.
- * Can only enable it if not using the DLL CRT (it doesn't expose internals) */
-#if defined(_MSC_VER) && !defined(_DLL) && defined(_M_IX86)
+/* 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
 
@@ -161,6 +164,7 @@ struct utsname {
 #define _access access
 #define _chdir chdir
 #define _getpid getpid
+#define wcsicmp _wcsicmp
 #include <sys/types.h>
 
 #ifndef DllMain
@@ -230,7 +234,7 @@ typedef long                gid_t;
 /* 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 {                                                            \
@@ -266,7 +270,7 @@ struct mgvtbl {                                                             \
     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
@@ -297,6 +301,14 @@ 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;
+} child_IO_table;
+
+DllExport void         win32_get_child_IO(child_IO_table* ptr);
+
 #ifndef USE_SOCKETS_AS_HANDLES
 extern FILE *          my_fdopen(int, char *);
 #endif
@@ -419,13 +431,17 @@ struct interp_intern {
 /* 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 \