Index: kitdll/buildsrc/kitdll-0.0/Makefile ================================================================== --- kitdll/buildsrc/kitdll-0.0/Makefile +++ kitdll/buildsrc/kitdll-0.0/Makefile @@ -1,23 +1,23 @@ CC = gcc CFLAGS = -Wall -O3 -CPPFLAGS = -DUSE_TCL_STUBS +CPPFLAGS = -DUSE_TCL_STUBS -DKITDLL_MAKE_LOADABLE=1 -DHAVE_STDC=1 LIBS = -ltclstub8.5 -all: vfs_kitdll_data.so +all: vfs_kitdll_data_tcl.so -vfs_kitdll_data.h: dir2c.tcl starpack.vfs - ./dir2c.tcl vfs_kitdll_data starpack.vfs > vfs_kitdll_data.h +vfs_kitdll_data_tcl.c: dir2c.tcl starpack.vfs vfs_kitdll_data.c + ./dir2c.tcl tcl starpack.vfs > vfs_kitdll_data_tcl.c vfs_kitdll.tcl.h: vfs_kitdll.tcl ./stringify.tcl vfs_kitdll.tcl > vfs_kitdll.tcl.h -vfs_kitdll_data.o: vfs_kitdll_data.c vfs_kitdll_data.h vfs_kitdll.tcl.h +vfs_kitdll_data_tcl.o: vfs_kitdll_data_tcl.c -vfs_kitdll_data.so: vfs_kitdll_data.o - $(CC) $(CPPFLAGS) $(CFLAGS) -rdynamic -shared $(LDFLAGS) -o vfs_kitdll_data.so vfs_kitdll_data.o $(LIBS) +vfs_kitdll_data_tcl.so: vfs_kitdll_data_tcl.o + $(CC) $(CPPFLAGS) $(CFLAGS) -rdynamic -shared $(LDFLAGS) -o vfs_kitdll_data_tcl.so vfs_kitdll_data_tcl.o $(LIBS) clean: - rm -f vfs_kitdll_data.so vfs_kitdll_data.o - rm -f vfs_kitdll.tcl.h vfs_kitdll_data.h + rm -f vfs_kitdll_data_tcl.so vfs_kitdll_data_tcl.o + rm -f vfs_kitdll_data_tcl.c .PHONY: clean Index: kitdll/buildsrc/kitdll-0.0/dir2c.tcl ================================================================== --- kitdll/buildsrc/kitdll-0.0/dir2c.tcl +++ kitdll/buildsrc/kitdll-0.0/dir2c.tcl @@ -103,10 +103,11 @@ set files [linsert $files 0 "__DUMMY__"] # Produce C89 compatible header set cpp_tag "KITDLL_[string toupper $hashkey]" set code_tag "kitdll_[string tolower $hashkey]" +set hashkey [string tolower $hashkey] puts "#ifndef $cpp_tag" puts "# define $cpp_tag 1" puts { # ifdef HAVE_STDC @@ -348,6 +349,47 @@ puts "" puts "\treturn(num_children);" puts "}" puts "" +puts "# ifdef KITDLL_MAKE_LOADABLE" + +set fd [open "vfs_kitdll_data.c"] +puts [read $fd] +close $fd + + +puts "static cmd_getData_t *getCmdData(const char *hashkey) {" +puts "\treturn(${code_tag}_getData);" +puts "}" +puts "" +puts "static cmd_getChildren_t *getCmdChildren(const char *hashkey) {" +puts "\treturn(${code_tag}_getChildren);" +puts "}" +puts "" + +puts "int Vfs_kitdll_data_${hashkey}_Init(Tcl_Interp *interp) {" +puts "\tTcl_Command tclCreatComm_ret;" +puts "\tint tclPkgProv_ret;" +puts "" +puts "\ttclCreatComm_ret = Tcl_CreateObjCommand(interp, \"::vfs::kitdll::data::${hashkey}::getMetadata\", getMetadata, NULL, NULL);" +puts "\tif (!tclCreatComm_ret) {" +puts "\t\treturn(TCL_ERROR);" +puts "\t}" +puts "" +puts "\ttclCreatComm_ret = Tcl_CreateObjCommand(interp, \"::vfs::kitdll::data::${hashkey}::getData\", getData, NULL, NULL);" +puts "\tif (!tclCreatComm_ret) {" +puts "\t\treturn(TCL_ERROR);" +puts "\t}" +puts "" +puts "\ttclCreatComm_ret = Tcl_CreateObjCommand(interp, \"::vfs::kitdll::data::${hashkey}::getChildren\", getChildren, NULL, NULL);" +puts "\tif (!tclCreatComm_ret) {" +puts "\t\treturn(TCL_ERROR);" +puts "\t}" +puts "" +puts "\ttclPkgProv_ret = Tcl_PkgProvide(interp, \"vfs::kitdll::data::${hashkey}\", \"1.0\");" +puts "" +puts "\treturn(tclPkgProv_ret);" +puts "\t}" +puts "# endif /* KITDLL_MAKE_LOADABLE */" + puts "#endif /* !$cpp_tag */" Index: kitdll/buildsrc/kitdll-0.0/vfs_kitdll.tcl ================================================================== --- kitdll/buildsrc/kitdll-0.0/vfs_kitdll.tcl +++ kitdll/buildsrc/kitdll-0.0/vfs_kitdll.tcl @@ -14,10 +14,39 @@ proc ::vfs::kitdll::Unmount {local} { vfs::filesystem unmount $local } # Implementation +## I/O Handlers (pass to appropriate hashkey) +namespace eval ::vfs::kitdll::data {} +proc ::vfs::kitdll::data::getChildren args { + set hashkey [lindex $args 0] + + set cmd "::vfs::kitdll::data::${hashkey}::getChildren" + set cmd [linsert $args 0 $cmd] + + eval $cmd +} + +proc ::vfs::kitdll::data::getMetadata args { + set hashkey [lindex $args 0] + + set cmd "::vfs::kitdll::data::${hashkey}::getMetadata" + set cmd [linsert $args 0 $cmd] + + eval $cmd +} + +proc ::vfs::kitdll::data::getData args { + set hashkey [lindex $args 0] + + set cmd "::vfs::kitdll::data::${hashkey}::getData" + set cmd [linsert $args 0 $cmd] + + eval $cmd +} + ## VFS and Chan I/O ### Dispatchers proc ::vfs::kitdll::vfshandler {hashkey subcmd args} { set cmd $args set cmd [linsert $cmd 0 "::vfs::kitdll::vfsop_${subcmd}" $hashkey] @@ -301,6 +330,6 @@ vfs::filesystem posixerror $::vfs::posix(EROFS) } package provide vfs::kitdll 1.0 -::vfs::kitdll::Mount vfs_kitdll_data /tmp +::vfs::kitdll::Mount tcl /tmp Index: kitdll/buildsrc/kitdll-0.0/vfs_kitdll_data.c ================================================================== --- kitdll/buildsrc/kitdll-0.0/vfs_kitdll_data.c +++ kitdll/buildsrc/kitdll-0.0/vfs_kitdll_data.c @@ -1,34 +1,16 @@ -#define HAVE_STDC 1 - #include -#include #include -#include "vfs_kitdll_data.h" - typedef struct kitdll_data *(cmd_getData_t)(const char *, unsigned long); typedef unsigned long (cmd_getChildren_t)(const char *, unsigned long *, unsigned long); -static cmd_getData_t *getCmdData(const char *hashkey) { - /* XXX: TODO: Look up symbol using dlsym() */ - if (strcmp(hashkey, "vfs_kitdll_data") == 0) { - return(kitdll_vfs_kitdll_data_getData); - } - - return(NULL); -} - -static cmd_getChildren_t *getCmdChildren(const char *hashkey) { - /* XXX: TODO: Look up symbol using dlsym() */ - if (strcmp(hashkey, "vfs_kitdll_data") == 0) { - return(kitdll_vfs_kitdll_data_getChildren); - } - - return(NULL); -} - +/* Your implementation must provide these */ +static cmd_getData_t *getCmdData(const char *hashkey); +static cmd_getChildren_t *getCmdChildren(const char *hashkey); + +/* Tcl Commands */ static int getMetadata(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { cmd_getData_t *cmd_getData; cmd_getChildren_t *cmd_getChildren; struct kitdll_data *finfo = NULL; Tcl_Obj *ret_list, *ret_list_items[20]; @@ -281,29 +263,5 @@ Tcl_SetObjResult(interp, ret_list); return(TCL_OK); } - -int Vfs_kitdll_data_Init(Tcl_Interp *interp) { - Tcl_Command tclCreatComm_ret; - int tclPkgProv_ret; - - tclCreatComm_ret = Tcl_CreateObjCommand(interp, "::vfs::kitdll::data::getMetadata", getMetadata, NULL, NULL); - if (!tclCreatComm_ret) { - return(TCL_ERROR); - } - - tclCreatComm_ret = Tcl_CreateObjCommand(interp, "::vfs::kitdll::data::getData", getData, NULL, NULL); - if (!tclCreatComm_ret) { - return(TCL_ERROR); - } - - tclCreatComm_ret = Tcl_CreateObjCommand(interp, "::vfs::kitdll::data::getChildren", getChildren, NULL, NULL); - if (!tclCreatComm_ret) { - return(TCL_ERROR); - } - - tclPkgProv_ret = Tcl_PkgProvide(interp, "vfs::kitdll::data", "1.0"); - - return(tclPkgProv_ret); -}