diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2013-01-10 09:23:39 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2013-01-10 09:23:39 (GMT) |
commit | 2930daf68ce7f2d1c8d17c5e4c7084d77d21aa1c (patch) | |
tree | a0c98594c805de0c60f6583c90ea930bc0cefd51 /generic/tclEncoding.c | |
parent | 0481e3ca74a06381151d36ed72e32d8c12c7c29d (diff) | |
parent | 8f2f7117fc58a586d63160ce0df15bc7112fa169 (diff) | |
download | tcl-2930daf68ce7f2d1c8d17c5e4c7084d77d21aa1c.zip tcl-2930daf68ce7f2d1c8d17c5e4c7084d77d21aa1c.tar.gz tcl-2930daf68ce7f2d1c8d17c5e4c7084d77d21aa1c.tar.bz2 |
Implement TCL_INIT_CREATE_UTF8/TCL_INIT_CREATE_UNICODE
Diffstat (limited to 'generic/tclEncoding.c')
-rw-r--r-- | generic/tclEncoding.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c index 9a64f10..257089e 100644 --- a/generic/tclEncoding.c +++ b/generic/tclEncoding.c @@ -1446,7 +1446,7 @@ Tcl_InitSubsystems(int flags, ...) va_list argList; int argc = 0; - char **argv = NULL; + void **argv = NULL; va_start(argList, flags); if (flags & TCL_INIT_PANIC) { @@ -1454,7 +1454,7 @@ Tcl_InitSubsystems(int flags, ...) } if (flags & TCL_INIT_CREATE) { argc = va_arg(argList, int); - argv = va_arg(argList, char **); + argv = va_arg(argList, void **); } va_end (argList); @@ -1463,18 +1463,28 @@ Tcl_InitSubsystems(int flags, ...) TclpFindExecutable(argv ? argv[0] : NULL); if (flags & TCL_INIT_CREATE) { Tcl_Interp *interp = Tcl_CreateInterp(); - if (argc > 0) { + if (--argc >= 0) { Tcl_Obj *argvPtr; - argc--; - argv++; Tcl_SetVar2Ex(interp, "argc", NULL, Tcl_NewIntObj(argc), TCL_GLOBAL_ONLY); argvPtr = Tcl_NewListObj(argc, NULL); - while (argc--) { + if ((flags & TCL_INIT_CREATE) == TCL_INIT_CREATE_UTF8) { + while (argc--) { + Tcl_ListObjAppendElement(NULL, argvPtr, + Tcl_NewStringObj(*++argv, -1)); + } + } else if ((flags & TCL_INIT_CREATE) == TCL_INIT_CREATE_UNICODE) { + while (argc--) { + Tcl_ListObjAppendElement(NULL, argvPtr, + Tcl_NewUnicodeObj(*++argv, -1)); + } + } else { Tcl_DString ds; - Tcl_ExternalToUtfDString(NULL, *argv++, -1, &ds); - Tcl_ListObjAppendElement(NULL, argvPtr, TclDStringToObj(&ds)); + while (argc--) { + Tcl_ExternalToUtfDString(NULL, *++argv, -1, &ds); + Tcl_ListObjAppendElement(NULL, argvPtr, TclDStringToObj(&ds)); + } } Tcl_SetVar2Ex(interp, "argv", NULL, argvPtr, TCL_GLOBAL_ONLY); } |