summaryrefslogtreecommitdiffstats
path: root/generic/tclEncoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclEncoding.c')
-rw-r--r--generic/tclEncoding.c26
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);
}