Tcl Source Code

View Ticket
Login
Ticket UUID: 491789
Title: setargv() doesn't support a unicode cmdline
Type: RFE Version: None
Submitter: davygrvy Created on: 2001-12-11 22:37:34
Subsystem: 50. Embedding Support Assigned To: nijtmans
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2010-11-19 22:34:18
Resolution: Fixed Closed By: nijtmans
    Closed on: 2010-11-04 22:24:10
Description:
It is possible to have tclsh on windows get the
unicode commandline instead of the ansi one.
GetCommandlineW() exists on all win platforms
including Win95/OSR2.

Do I change the meaning of argv going into Tcl_Main()
and now call it clean UTF-8 and change the docs or
make a new wrapper function (Umm, Tcl_MainEx?) that
knows a clean argv and have the old one call the new
one after just doing the conversions?
User Comments: nijtmans added on 2010-11-19 22:34:18:
Well, I thought the implementation was compete, because I
was satisfied with MSVC++ only. I assumed that for mingw32
and cygwin this would be impossible, because support for the
mWinMain/_wmain functions is not built in there.

However, I discovered the existance of mingw-w64, whose guys
implemented the -municode linker option, which does exactly
what was required. Therefore my follow-up commit
(HEAD 2010-11-17), which enhanced configure.in checking
if there is a workong -municode option. This makes the unicode
command line compiletely working with the latest mingw-w64

Then, noting that mingw32 and cygwin already have a
workaround, not thrusting their crt implementation, I
could use this trick for mingw32 and cygwin as well.
Why not use the normal WinMain/main entry point,
but throw away the command and just get it again
using GetCommandLineW. This way we still can
get the unicode commandline! That was my
next follow-up commit (2010-11-18).

So, now it's really complete!

nijtmans added on 2010-11-05 05:24:10:

allow_comments - 1

Implementation complete, for Tcl as well. In HEAD

nijtmans added on 2010-10-12 04:51:47:
Now implemented in HEAD, for Tk on MSVC++.

nijtmans added on 2010-09-16 21:46:09:

File Added - 386839: 491789.patch

nijtmans added on 2010-09-16 21:43:07:
Here is a first patch, implementing part of what is suggested here.

It adds a new function Tk_MainExW, which does the
same as Tk_MainEx, but then using wchar_t in stead
of char arguments.

winMain.c is not modified yet, but I already hacked
a modified winMain which uses this Tk_MainExW,
so I know it works. A clean new winMain.c
implementation is the next step

davygrvy added on 2004-11-03 02:47:18:

File Deleted - 14535: 



File Added - 107390: patch.txt

Logged In: YES 
user_id=7549

Here is a new patch that doesn't modify the signature of
Tcl_Main, but moves the body of Tcl_Main to a new
Tcl_UniMain with the sig of:
int Tcl_UniMain(int argc, Tcl_UniChar **wargv,
Tcl_AppInitProc *appInitProc)

This change allows Tcl_Main to just 'upcast' it's argv
vector to unicode and call Tcl_UniMain and allows a user of
the API to call Tcl_UniMain directly.  This fixes the long
standing unicode commandline args problem.

Sticky points are:
1) We need a new unicode form of Tcl_FindExecutable
2) maybe the choice of name is better Tcl_WMain and we
should use the wchar_t type instead to match the declaration
of microsoft's use of _wmain (not an ANSI feature)?

dgp added on 2002-02-24 09:56:16:
Logged In: YES 
user_id=80530

Rather than close this completely, I'm moving it
to Feature Requests for further consideration
down the road.

davygrvy added on 2002-02-23 15:00:26:
Logged In: YES 
user_id=7549

I don't see a way to impliment this without changing the 
Tcl_Main sig.  Not good.

dgp added on 2001-12-15 01:08:22:
Logged In: YES 
user_id=80530

Only (half-formed) thought I have is to encode the
argv strings in some non-lossy encoding, then
somehow trick Tcl_FindExecutable into thinking
that's the system encoding.  Then finally in the
appInitProc switching back to the real system encoding.
Pretty kludgy.

davygrvy added on 2001-12-15 01:00:56:
Logged In: YES 
user_id=7549

Yeah, that would lossy and the limit I'm trying to get 
around.  Without changing the meaning of Tcl_Main's argv[],
how could we add this change?  I honestly have no use for 
this change, but the possibility for getting the full 
spread in unicode is there.  I haven't tested 
GetCommandLineW() on Win95, but it's doc'd as working.  This
probably isn't worth the sweat as it's just tclsh.

dgp added on 2001-12-15 00:09:33:
Logged In: YES 
user_id=80530

Tcl_Main assumes the system encoding for its
argv[i] arguments.  I'd be reluctant to change
that.  Is it reasonable to have the Win setargv()
convert string to the system encoding before passing
to Tcl_Main, or is that operation lossy?

davygrvy added on 2001-12-12 05:37:37:

File Added - 14535: patch.txt

Attachments: