Index: kitdll/buildsrc/kitdll-0.0/Makefile.in ================================================================== --- kitdll/buildsrc/kitdll-0.0/Makefile.in +++ kitdll/buildsrc/kitdll-0.0/Makefile.in @@ -20,14 +20,15 @@ vfs_kitdll.tcl.h: vfs_kitdll.tcl ./stringify.tcl vfs_kitdll.tcl > vfs_kitdll.tcl.h ## Extensions rechan.o: rechan.c +pwb.o: pwb.c ## DLL Build -libtcl.@SHOBJEXT@: vfs_kitdll_data_tcl.o kitInit.o rechan.o - $(CC) $(CPPFLAGS) $(CFLAGS) -o libtcl.so vfs_kitdll_data_tcl.o kitInit.o rechan.o $(LDFLAGS) $(SHOBJLDFLAGS) -Wl,--whole-archive $(STATICLIBS) -Wl,--no-whole-archive $(LIBS) +libtcl.@SHOBJEXT@: vfs_kitdll_data_tcl.o kitInit.o rechan.o pwb.o + $(CC) $(CPPFLAGS) $(CFLAGS) -o libtcl.so vfs_kitdll_data_tcl.o kitInit.o rechan.o pwb.o $(LDFLAGS) $(SHOBJLDFLAGS) -Wl,--whole-archive $(STATICLIBS) -Wl,--no-whole-archive $(LIBS) # Test driver test.o: test.c test: test.o $(CC) $(CPPFLAGS) $(CFLAGS) -o test test.o -L. -ltcl -Wl,-R,`pwd` Index: kitdll/buildsrc/kitdll-0.0/boot.tcl ================================================================== --- kitdll/buildsrc/kitdll-0.0/boot.tcl +++ kitdll/buildsrc/kitdll-0.0/boot.tcl @@ -2,12 +2,12 @@ rename tclInit {} global auto_path tcl_library tcl_libPath global tcl_version tcl_rcFileName - # Resolve symlinks - set noe /.KITDLL_TCL + # Set path where to mount VFS + set noe "/.KITDLL_TCL" set tcl_library [file join $noe lib tcl$tcl_version] set tcl_libPath [list $tcl_library [file join $noe lib]] # get rid of a build residue @@ -15,19 +15,14 @@ # the following code only gets executed once on startup if {[info exists tcl_rcFileName]} { set vfsHandler [list ::vfs::kitdll::vfshandler tcl] - # mount the executable, i.e. make all runtime files available - vfs::filesystem mount $noe $vfsHandler - # alter path to find encodings if {[info tclversion] eq "8.4"} { - catch { - load {} pwb - librarypath [info library] - } + load {} pwb + librarypath [info library] } else { encoding dirs [list [file join [info library] encoding]] ;# TIP 258 } # fix system encoding, if it wasn't properly set up (200207.004 bug) Index: kitdll/buildsrc/kitdll-0.0/kitInit.c ================================================================== --- kitdll/buildsrc/kitdll-0.0/kitInit.c +++ kitdll/buildsrc/kitdll-0.0/kitInit.c @@ -1,37 +1,79 @@ -#include #include #include "tclInt.h" + +#if defined(HAVE_TCL_GETENCODINGNAMEFROMENVIRONMENT) && defined(HAVE_TCL_SETSYSTEMENCODING) +# define TCLKIT_CAN_SET_ENCODING 1 +#endif +#if 10 * TCL_MAJOR_VERSION + TCL_MINOR_VERSION < 85 +# define KIT_INCLUDES_PWB 1 +#endif Tcl_AppInitProc Vfs_Init, Rechan_Init; Tcl_AppInitProc Vfs_kitdll_data_tcl_Init; +#ifdef KIT_INCLUDES_PWB +Tcl_AppInitProc Pwb_Init; +#endif static char *preInitCmd = "proc tclKitInit {} {\n" -"puts \"Ran tclKitInit\"\n" "rename tclKitInit {}\n" + "load {} tclkit::init\n" "load {} rechan\n" "load {} vfs\n" "load {} vfs_kitdll_data_tcl\n" -"puts \"Loaded VFS\"\n" #include "vfs_kitdll.tcl.h" "vfs::kitdll::Mount tcl /.KITDLL_TCL\n" -"puts \"Mounted VFS\"\n" "set f [open \"/.KITDLL_TCL/boot.tcl\"]\n" "set s [read $f]\n" "close $f\n" + "::tclkit::init::initInterp\n" + "rename ::tclkit::init::initInterp {}\n" "uplevel #0 $s\n" "}\n" "tclKitInit"; -void __attribute__((constructor)) _Tclkit_Init(void) { - int tcl_ret = -1; +static int tclkit_init_initinterp(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { +#ifdef _WIN32 + Tcl_SetVar(interp, "tcl_rcFileName", "~/tclkitrc.tcl", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclkitrc", TCL_GLOBAL_ONLY); +#endif + +#ifdef TCLKIT_CAN_SET_ENCODING + /* Set the encoding from the Environment */ + Tcl_GetEncodingNameFromEnvironment(&encodingName); + Tcl_SetSystemEncoding(NULL, Tcl_DStringValue(&encodingName)); + Tcl_SetVar(interp, "tclkit_system_encoding", Tcl_DStringValue(&encodingName), 0); + Tcl_DStringFree(&encodingName); +#endif + + return(TCL_OK); +} + +int Tclkit_init_Init(Tcl_Interp *interp) { + Tcl_Command tclCreatComm_ret; + int tclPkgProv_ret; + + tclCreatComm_ret = Tcl_CreateObjCommand(interp, "::tclkit::init::initInterp", tclkit_init_initinterp, NULL, NULL); + if (!tclCreatComm_ret) { + return(TCL_ERROR); + } + + tclPkgProv_ret = Tcl_PkgProvide(interp, "tclkit::init", "1.0"); + + return(tclPkgProv_ret); +} +void __attribute__((constructor)) _Tclkit_Init(void) { + Tcl_StaticPackage(0, "tclkit::init", Tclkit_init_Init, NULL); Tcl_StaticPackage(0, "rechan", Rechan_Init, NULL); Tcl_StaticPackage(0, "vfs", Vfs_Init, NULL); Tcl_StaticPackage(0, "vfs_kitdll_data_tcl", Vfs_kitdll_data_tcl_Init, NULL); +#ifdef KIT_INCLUDES_PWB + Tcl_StaticPackage(0, "pwb", Pwb_Init, NULL); +#endif TclSetPreInitScript(preInitCmd); - printf("TclSetPreInitScript() = %i\n", tcl_ret); return; } Index: kitdll/buildsrc/kitdll-0.0/test.c ================================================================== --- kitdll/buildsrc/kitdll-0.0/test.c +++ kitdll/buildsrc/kitdll-0.0/test.c @@ -2,34 +2,14 @@ # include #endif #include -int main(int argc, char **argv) { - Tcl_Interp *interp; - int tcl_ret; - - interp = Tcl_CreateInterp(); - if (interp == NULL) { - fprintf(stderr, "Unable to create an interpreter.\n"); - - return(1); - } - - tcl_ret = Tcl_Init(interp); - if (tcl_ret != TCL_OK) { - fprintf(stderr, "Tcl_Init() returned in failure. %s\n", Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY)); - - return(1); - } - - tcl_ret = Tcl_Eval(interp, "puts \"Hello World. Current Time is: [clock format [clock seconds]]\""); - if (tcl_ret != TCL_OK) { - fprintf(stderr, "Tcl_Eval() returned in failure.\n"); - - return(1); - } - - Tcl_DeleteInterp(interp); - - return(0); +int Tcl_AppInit(Tcl_Interp *interp) { + return(Tcl_Init(interp)); +} + +int main(int argc, char **argv) { + Tcl_Main(argc, argv, Tcl_AppInit); + + return(1); }