Index: lib/xvfs/xvfs.c.rvt ================================================================== --- lib/xvfs/xvfs.c.rvt +++ lib/xvfs/xvfs.c.rvt @@ -40,94 +40,46 @@ #endif #ifndef HAVE_DEFINED_XVFS_FILE_DATA #define HAVE_DEFINED_XVFS_FILE_DATA 1 struct xvfs_file_data { - const char *name; - xvfs_file_type_t type; - xvfs_size_t size; + const char * const name; + const xvfs_file_type_t type; + const xvfs_size_t size; union { - const unsigned char *fileContents; + const unsigned char * const fileContents; const char **dirChildren; } data; }; #endif if (memcmp(path, xvfs__data[].name, ) == 0) { - return(); -} - static long xvfs__nameToIndex(const char *path) { - $::xvfs::hashNameThreshold} { - set needZlib true - break; - } - } -?> unsigned int pathHash; - size_t pathLen; - + long pathIndex; + ssize_t pathLen; + if (path == NULL) { return(XVFS_NAME_LOOKUP_ERROR); } pathLen = strlen(path); - switch (pathLen) { - case : - $::xvfs::hashNameThreshold} { -?> pathHash = Tcl_ZlibAdler32(0, (const unsigned char *) path, ); - switch (pathHash) { - case : - break; - } - break; - } + + pathIndex = ; + if (pathIndex < 0 || pathIndex > ) { + pathIndex = XVFS_NAME_LOOKUP_ERROR; + } + + if (pathIndex != XVFS_NAME_LOOKUP_ERROR) { + if (strcmp(path, xvfs__data[pathIndex].name) == 0) { + return(pathIndex); + } + } return(XVFS_NAME_LOOKUP_ERROR); } static const char **xvfs__getChildren(const char *path, Tcl_WideInt *count) { Index: lib/xvfs/xvfs.tcl ================================================================== --- lib/xvfs/xvfs.tcl +++ lib/xvfs/xvfs.tcl @@ -308,7 +308,69 @@ proc ::xvfs::staticIncludeHeader {pathToHeaderFile} { set fd [open $pathToHeaderFile] ::xvfs::staticIncludeHeaderData [read $fd] close $fd } + +proc ::xvfs::generatePerfectHashFunctionCall {cVarName cVarLength invalidValue nameList} { + set minVal 0 + set maxVal [llength $nameList] + set testExpr {([zlib adler32 $nameItem $alpha] + $beta) % $gamma} + set testExprC {((Tcl_ZlibAdler32($alpha, (unsigned char *) $cVarName, $cVarLength) + $beta) % $gamma)} + + set round -1 + + set beta 0 + set gamma $maxVal + + while true { + incr round + + set alpha $round + set gamma [expr {($round % ($maxVal + 1)) + $maxVal}] + + set idx -1 + set seenIndexes [list] + set failed false + foreach nameItem $nameList { + incr idx + + set testExprVal [expr $testExpr] + + if {$testExprVal in $seenIndexes} { + incr alpha + set failed true + break + } + + lappend seenIndexes $testExprVal + } + + if {!$failed} { + break + } + } + + unset -nocomplain mapArray + for {set idx 0} {$idx < $gamma} {incr idx} { + set mapArray($idx) $invalidValue + } + + set idx -1 + foreach nameItem $nameList { + incr idx + + set mapArray([expr $testExpr]) $idx + } + + set map "(long\[\])\{" + for {set idx 0} {$idx < $gamma} {incr idx} { + append map "$mapArray($idx), " + } + set map [string range $map 0 end-2] + append map "\}\[[subst $testExprC]\]" + set phfCall $map + + return $phfCall +} package provide xvfs 1