summaryrefslogtreecommitdiffstats
path: root/generic/tclStubInit.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2012-03-30 14:44:03 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2012-03-30 14:44:03 (GMT)
commitf3146e6826308cf112fccc9ac29ab18bca2a6071 (patch)
tree3a9aaf5da71029699163071fe0dae4b19e775887 /generic/tclStubInit.c
parent3a73c145323d7a85af7f9e5ad7de9e601cbaf903 (diff)
downloadtcl-f3146e6826308cf112fccc9ac29ab18bca2a6071.zip
tcl-f3146e6826308cf112fccc9ac29ab18bca2a6071.tar.gz
tcl-f3146e6826308cf112fccc9ac29ab18bca2a6071.tar.bz2
[Bug 3508771] load tclreg.dll in cygwin tclsh
Implement TclWinGetTclInstance, TclpGetTZName, and various others for Cygwin
Diffstat (limited to 'generic/tclStubInit.c')
-rw-r--r--generic/tclStubInit.c49
1 files changed, 28 insertions, 21 deletions
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index 347bdcb..8c497288 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -57,21 +57,31 @@ Tcl_NotifierProcs tclOriginalNotifier = {
#ifdef __CYGWIN__
+/* Trick, so we don't have to include <windows.h> here, which
+ * - b.t.w. - lacks this function anyway */
+#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 0x00000004
+int __stdcall GetModuleHandleExW(unsigned int, const char *, void *);
+
#define TclWinGetPlatformId winGetPlatformId
#define Tcl_WinUtfToTChar winUtfToTChar
#define Tcl_WinTCharToUtf winTCharToUtf
#define TclWinGetTclInstance winGetTclInstance
#define TclWinNToHS winNToHS
#define TclWinSetSockOpt winSetSockOpt
-#define TclWinAddProcess winAddProcess
#define TclpGetTZName pGetTZName
#define TclWinNoBackslash winNoBackslash
-#define TclWinSetInterfaces (void (*) _ANSI_ARGS_((int))) doNothing
+#define TclWinSetInterfaces (void (*) (int)) doNothing
+#define TclWinAddProcess (void (*) (void *, unsigned int)) doNothing
#define TclWinFlushDirtyChannels doNothing
#define TclWinResetInterfaces doNothing
static Tcl_Encoding winTCharEncoding;
+typedef struct ThreadSpecificData {
+ char tzName[64]; /* Time zone name */
+} ThreadSpecificData;
+static Tcl_ThreadDataKey dataKey;
+
static int
TclWinGetPlatformId()
{
@@ -80,38 +90,35 @@ TclWinGetPlatformId()
return 2; /* VER_PLATFORM_WIN32_NT */;
}
-static int TclWinGetTclInstance()
+static void *TclWinGetTclInstance()
{
- Tcl_Panic("TclWinGetTclInstance not yet implemented for CYGWIN");
- return 0;
+ void *hInstance = NULL;
+ GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
+ (const char *)&winTCharEncoding, &hInstance);
+ return hInstance;
}
static unsigned short
TclWinNToHS(unsigned short ns)
{
- Tcl_Panic("TclWinNToHS not yet implemented for CYGWIN");
- return (unsigned short) -1;
+ return ntohs(ns);
}
+
static int
-TclWinSetSockOpt(int s, int level, int optname,
+TclWinSetSockOpt(void *s, int level, int optname,
const char *optval, int optlen)
{
- Tcl_Panic("TclWinSetSockOpt not yet implemented for CYGWIN");
- return -1;
-}
-
-static void
-TclWinAddProcess(void *hProcess, unsigned long id)
-{
- Tcl_Panic("TclWinAddProcess not yet implemented for CYGWIN");
+ return setsockopt((int) s, level, optname, optval, optlen);
}
static char *
TclpGetTZName(int isdst)
{
- /* TODO: implementation */
- Tcl_Panic("TclpGetTZName not yet implemented for CYGWIN");
- return 0;
+ ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
+ const char *zone = getenv("TZ");
+ Tcl_ExternalToUtf(NULL, NULL, zone, strlen(zone), 0, NULL,
+ tsdPtr->tzName, sizeof(tsdPtr->tzName), NULL, NULL, NULL);
+ return tsdPtr->tzName;
}
static char *
@@ -175,9 +182,9 @@ Tcl_WinTCharToUtf(
# define TclWinConvertError (void (*) _ANSI_ARGS_((unsigned int))) TclGetAndDetachPids
# define TclWinConvertWSAError (void (*) _ANSI_ARGS_((unsigned int))) TclpCloseFile
# define TclWinGetPlatformId (int (*)()) TclpCreateTempFile
-# define TclWinGetTclInstance (int (*)()) TclpCreateProcess
+# define TclWinGetTclInstance (void *(*)()) TclpCreateProcess
# define TclWinNToHS (unsigned short (*) _ANSI_ARGS_((unsigned short ns))) TclpMakeFile
-# define TclWinSetSockOpt (int (*) _ANSI_ARGS_((int, int, int, const char *, int))) TclpOpenFile
+# define TclWinSetSockOpt (int (*) _ANSI_ARGS_((void *, int, int, const char *, int))) TclpOpenFile
# define TclWinAddProcess 0
# define TclpGetTZName 0
# define TclWinNoBackslash 0