|
|
1.1 ! root 1: # ! 2: # buildidx.tcl -- ! 3: # ! 4: # Code to build Tcl package library. Defines the proc `buildpackageindex'. ! 5: # ! 6: #------------------------------------------------------------------------------ ! 7: # Copyright 1992 Karl Lehenbauer and Mark Diekhans. ! 8: # ! 9: # Permission to use, copy, modify, and distribute this software and its ! 10: # documentation for any purpose and without fee is hereby granted, provided ! 11: # that the above copyright notice appear in all copies. Karl Lehenbauer and ! 12: # Mark Diekhans make no representations about the suitability of this ! 13: # software for any purpose. It is provided "as is" without express or ! 14: # implied warranty. ! 15: #------------------------------------------------------------------------------ ! 16: # $Id: buildidx.tcl,v 2.0 1992/10/16 04:51:38 markd Rel $ ! 17: #------------------------------------------------------------------------------ ! 18: # ! 19: ! 20: proc TCHSH:PutLibLine {outfp package where endwhere autoprocs} { ! 21: puts $outfp [concat $package $where [expr {$endwhere - $where - 1}] \ ! 22: $autoprocs] ! 23: } ! 24: ! 25: proc TCLSH:CreateLibIndex {libName} { ! 26: ! 27: if {[file extension $libName] != ".tlb"} { ! 28: error "Package library `$libName' does not have the extension `.tlb'"} ! 29: set idxName "[file root $libName].tndx" ! 30: ! 31: unlink -nocomplain $idxName ! 32: set libFH [open $libName r] ! 33: set idxFH [open $idxName w] ! 34: ! 35: set contectHdl [scancontext create] ! 36: ! 37: scanmatch $contectHdl "^#@package: " { ! 38: set size [llength $matchInfo(line)] ! 39: if {$size < 2} { ! 40: error [format "invalid package header \"%s\"" $matchInfo(line)] ! 41: } ! 42: if $inPackage { ! 43: TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere \ ! 44: $matchInfo(offset) $pkgDefProcs ! 45: } ! 46: set pkgDefName [lindex $matchInfo(line) 1] ! 47: set pkgDefWhere [tell $matchInfo(handle)] ! 48: set pkgDefProcs [lrange $matchInfo(line) 2 end] ! 49: set inPackage 1 ! 50: } ! 51: ! 52: scanmatch $contectHdl "^#@packend" { ! 53: if !$inPackage { ! 54: error "#@packend without #@package in $libName ! 55: } ! 56: TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere $matchInfo(offset) \ ! 57: $pkgDefProcs ! 58: set inPackage 0 ! 59: } ! 60: ! 61: set inPackage 0 ! 62: if {[catch { ! 63: scanfile $contectHdl $libFH ! 64: } msg] != 0} { ! 65: global errorInfo errorCode ! 66: close libFH ! 67: close idxFH ! 68: error $msg $errorInfo $errorCode ! 69: } ! 70: if {![info exists pkgDefName]} { ! 71: error "No #@package definitions found in $libName" ! 72: } ! 73: if $inPackage { ! 74: TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere [tell $libFH] \ ! 75: $pkgDefProcs ! 76: } ! 77: close $libFH ! 78: close $idxFH ! 79: ! 80: scancontext delete $contectHdl ! 81: ! 82: # Set mode and ownership of the index to be the same as the library. ! 83: ! 84: file stat $libName statInfo ! 85: chmod $statInfo(mode) $idxName ! 86: chown [list $statInfo(uid) $statInfo(gid)] $idxName ! 87: ! 88: } ! 89: ! 90: proc buildpackageindex {libfile} { ! 91: ! 92: set status [catch {TCLSH:CreateLibIndex $libfile} errmsg] ! 93: if {$status != 0} { ! 94: global errorInfo errorCode ! 95: error "building package index for `$libfile' failed: $errmsg" \ ! 96: $errorInfo $errorCode ! 97: } ! 98: } ! 99:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.