Annotation of micropolis/res/tcl.tlb, revision 1.1.1.1

1.1       root        1: 
                      2: #@package: TclX-ArrayProcedures for_array_keys
                      3: 
                      4: proc for_array_keys {varName arrayName codeFragment} {
                      5:     upvar $varName enumVar $arrayName enumArray
                      6: 
                      7:     if ![info exists enumArray] {
                      8:        error "\"$arrayName\" isn't an array"
                      9:     }
                     10: 
                     11:     set searchId [array startsearch enumArray]
                     12:     while {[array anymore enumArray $searchId]} {
                     13:        set enumVar [array nextelement enumArray $searchId]
                     14:        uplevel $codeFragment
                     15:     }
                     16:     array donesearch enumArray $searchId
                     17: }
                     18: 
                     19: #@package: TclX-assign_fields assign_fields
                     20: 
                     21: proc assign_fields {list args} {
                     22:     foreach varName $args {
                     23:         set value [lvarpop list]
                     24:         uplevel "set $varName [list $value]"
                     25:     }
                     26: }
                     27: 
                     28: #@package: TclX-developer_utils saveprocs edprocs
                     29: 
                     30: proc saveprocs {fileName args} {
                     31:     set fp [open $fileName w]
                     32:     puts $fp "# tcl procs saved on [fmtclock [getclock]]\n"
                     33:     puts $fp [eval "showprocs $args"]
                     34:     close $fp
                     35: }
                     36: 
                     37: proc edprocs {args} {
                     38:     global env
                     39: 
                     40:     set tmpFilename /tmp/tcldev.[id process]
                     41: 
                     42:     set fp [open $tmpFilename w]
                     43:     puts $fp "\n# TEMP EDIT BUFFER -- YOUR CHANGES ARE FOR THIS SESSION ONLY\n"
                     44:     puts $fp [eval "showprocs $args"]
                     45:     close $fp
                     46: 
                     47:     if [info exists env(EDITOR)] {
                     48:         set editor $env(EDITOR)
                     49:     } else {
                     50:        set editor vi
                     51:     }
                     52: 
                     53:     set startMtime [file mtime $tmpFilename]
                     54:     system "$editor $tmpFilename"
                     55: 
                     56:     if {[file mtime $tmpFilename] != $startMtime} {
                     57:        source $tmpFilename
                     58:        echo "Procedures were reloaded."
                     59:     } else {
                     60:        echo "No changes were made."
                     61:     }
                     62:     unlink $tmpFilename
                     63:     return
                     64: }
                     65: 
                     66: #@package: TclX-forfile for_file
                     67: 
                     68: proc for_file {var filename code} {
                     69:     upvar $var line
                     70:     set fp [open $filename r]
                     71:     while {[gets $fp line] >= 0} {
                     72:         uplevel $code
                     73:     }
                     74:     close $fp
                     75: }
                     76: 
                     77: 
                     78: #@package: TclX-forrecur for_recursive_glob
                     79: 
                     80: proc for_recursive_glob {var globlist code {depth 1}} {
                     81:     upvar $depth $var myVar
                     82:     foreach globpat $globlist {
                     83:         foreach file [glob -nocomplain $globpat] {
                     84:             if [file isdirectory $file] {
                     85:                 for_recursive_glob $var $file/* $code [expr {$depth + 1}]
                     86:            }
                     87:            set myVar $file
                     88:            uplevel $depth $code
                     89:         }
                     90:     }
                     91: }
                     92: 
                     93: #@package: TclX-globrecur recursive_glob
                     94: 
                     95: proc recursive_glob {globlist} {
                     96:     set result ""
                     97:     foreach pattern $globlist {
                     98:         foreach file [glob -nocomplain $pattern] {
                     99:             lappend result $file
                    100:             if [file isdirectory $file] {
                    101:                 set result [concat $result [recursive_glob $file/*]]
                    102:             }
                    103:         }
                    104:     }
                    105:     return $result
                    106: }
                    107: 
                    108: #@package: TclX-help help helpcd helppwd apropos
                    109: 
                    110: 
                    111: proc help:flattenPath {pathName} {
                    112:     set newPath {}
                    113:     foreach element [split $pathName /] {
                    114:         if {"$element" == "."} {
                    115:            continue
                    116:         }
                    117:         if {"$element" == ".."} {
                    118:             if {[llength [join $newPath /]] == 0} {
                    119:                 error "Help: name goes above subject directory root"}
                    120:             lvarpop newPath [expr [llength $newPath]-1]
                    121:             continue
                    122:         }
                    123:         lappend newPath $element
                    124:     }
                    125:     set newPath [join $newPath /]
                    126:     
                    127: 
                    128:     if {("$newPath" == "") && [string match "/*" $pathName]} {
                    129:         set newPath "/"}
                    130:         
                    131:     return $newPath
                    132: }
                    133: 
                    134: 
                    135: proc help:EvalPath {pathName} {
                    136:     global TCLENV
                    137: 
                    138:     if {![string match "/*" $pathName]} {
                    139:         if {"$pathName" == ""} {
                    140:             return $TCLENV(help:curDir)}
                    141:         if {"$TCLENV(help:curDir)" == "/"} {
                    142:             set pathName "/$pathName"
                    143:         } else {
                    144:             set pathName "$TCLENV(help:curDir)/$pathName"
                    145:         }
                    146:     }
                    147:     set pathName [help:flattenPath $pathName]
                    148:     if {[string match "*/" $pathName] && ($pathName != "/")} {
                    149:         set pathName [csubstr $pathName 0 [expr [length $pathName]-1]]}
                    150: 
                    151:     return $pathName    
                    152: }
                    153: 
                    154: 
                    155: proc help:Display {line} {
                    156:     global TCLENV
                    157:     if {$TCLENV(help:lineCnt) >= 23} {
                    158:         set TCLENV(help:lineCnt) 0
                    159:         puts stdout ":" nonewline
                    160:         flush stdout
                    161:         gets stdin response
                    162:         if {![lempty $response]} {
                    163:             return 0}
                    164:     }
                    165:     puts stdout $line
                    166:     incr TCLENV(help:lineCnt)
                    167: }
                    168: 
                    169: 
                    170: proc help:DisplayFile {filepath} {
                    171: 
                    172:     set inFH [open $filepath r]
                    173:     while {[gets $inFH fileBuf] >= 0} {
                    174:         if {![help:Display $fileBuf]} {
                    175:             break}
                    176:     }
                    177:     close $inFH
                    178: 
                    179: }    
                    180: 
                    181: 
                    182: proc help:ListDir {dirPath} {
                    183:     set dirList {}
                    184:     set fileList {}
                    185:     if {[catch {set dirFiles [glob $dirPath/*]}] != 0} {
                    186:         error "No files in subject directory: $dirPath"}
                    187:     foreach fileName $dirFiles {
                    188:         if [file isdirectory $fileName] {
                    189:             lappend dirList "[file tail $fileName]/"
                    190:         } else {
                    191:             lappend fileList [file tail $fileName]
                    192:         }
                    193:     }
                    194:    return [list [lsort $dirList] [lsort $fileList]]
                    195: }
                    196: 
                    197: 
                    198: proc help:DisplayColumns {nameList} {
                    199:     set count 0
                    200:     set outLine ""
                    201:     foreach name $nameList {
                    202:         if {$count == 0} {
                    203:             append outLine "   "}
                    204:         append outLine $name
                    205:         if {[incr count] < 4} {
                    206:             set padLen [expr 17-[clength $name]]
                    207:             if {$padLen < 3} {
                    208:                set padLen 3}
                    209:             append outLine [replicate " " $padLen]
                    210:         } else {
                    211:            if {![help:Display $outLine]} {
                    212:                return}
                    213:            set outLine ""
                    214:            set count 0
                    215:         }
                    216:     }
                    217:     if {$count != 0} {
                    218:         help:Display $outLine}
                    219:     return
                    220: }
                    221: 
                    222: 
                    223: 
                    224: proc help {{subject {}}} {
                    225:     global TCLENV
                    226: 
                    227:     set TCLENV(help:lineCnt) 0
                    228: 
                    229: 
                    230:     if {($subject == "help") || ($subject == "?")} {
                    231:         help:DisplayFile "$TCLENV(help:root)/help"
                    232:         return
                    233:     }
                    234: 
                    235:     set request [help:EvalPath $subject]
                    236:     set requestPath "$TCLENV(help:root)$request"
                    237: 
                    238:     if {![file exists $requestPath]} {
                    239:         error "Help:\"$request\" does not exist"}
                    240:     
                    241:     if [file isdirectory $requestPath] {
                    242:         set dirList [help:ListDir $requestPath]
                    243:         set subList  [lindex $dirList 0]
                    244:         set fileList [lindex $dirList 1]
                    245:         if {[llength $subList] != 0} {
                    246:             help:Display "\nSubjects available in $request:"
                    247:             help:DisplayColumns $subList
                    248:         }
                    249:         if {[llength $fileList] != 0} {
                    250:             help:Display "\nHelp files available in $request:"
                    251:             help:DisplayColumns $fileList
                    252:         }
                    253:     } else {
                    254:         help:DisplayFile $requestPath
                    255:     }
                    256:     return
                    257: }
                    258: 
                    259: 
                    260: 
                    261: proc helpcd {{dir /}} {
                    262:     global TCLENV
                    263: 
                    264:     set request [help:EvalPath $dir]
                    265:     set requestPath "$TCLENV(help:root)$request"
                    266: 
                    267:     if {![file exists $requestPath]} {
                    268:         error "Helpcd: \"$request\" does not exist"}
                    269:     
                    270:     if {![file isdirectory $requestPath]} {
                    271:         error "Helpcd: \"$request\" is not a directory"}
                    272: 
                    273:     set TCLENV(help:curDir) $request
                    274:     return    
                    275: }
                    276: 
                    277: 
                    278: proc helppwd {} {
                    279:         global TCLENV
                    280:         echo "Current help subject directory: $TCLENV(help:curDir)"
                    281: }
                    282: 
                    283: 
                    284: proc apropos {name} {
                    285:     global TCLENV
                    286: 
                    287:     set TCLENV(help:lineCnt) 0
                    288: 
                    289:     set aproposCT [scancontext create]
                    290:     scanmatch -nocase $aproposCT $name {
                    291:         set path [lindex $matchInfo(line) 0]
                    292:         set desc [lrange $matchInfo(line) 1 end]
                    293:         if {![help:Display [format "%s - %s" $path $desc]]} {
                    294:             return}
                    295:     }
                    296:     foreach brief [glob -nocomplain $TCLENV(help:root)/*.brf] {
                    297:         set briefFH [open $brief]
                    298:         scanfile $aproposCT $briefFH
                    299:         close $briefFH
                    300:     }
                    301:     scancontext delete $aproposCT
                    302: }
                    303: 
                    304: global TCLENV TCLPATH
                    305: 
                    306: set TCLENV(help:root) [searchpath $TCLPATH help]
                    307: set TCLENV(help:curDir) "/"
                    308: set TCLENV(help:outBuf) {}
                    309: 
                    310: #@package: TclX-packages packages autoprocs
                    311: 
                    312: proc packages {{option {}}} {
                    313:     global TCLENV
                    314:     set packList {}
                    315:     foreach key [array names TCLENV] {
                    316:         if {[string match "PKG:*" $key]} {
                    317:             lappend packList [string range $key 4 end]
                    318:         }
                    319:     }
                    320:     if [lempty $option] {
                    321:         return $packList
                    322:     } else {
                    323:         if {$option != "-location"} {
                    324:             error "Unknow option \"$option\", expected \"-location\""
                    325:         }
                    326:         set locList {}
                    327:         foreach pack $packList {
                    328:             set fileId [lindex $TCLENV(PKG:$pack) 0]
                    329:             
                    330:             lappend locList [list $pack [concat $TCLENV($fileId) \
                    331:                                              [lrange $TCLENV(PKG:$pack) 1 2]]]
                    332:         }
                    333:         return $locList
                    334:     }
                    335: }
                    336: 
                    337: proc autoprocs {} {
                    338:     global TCLENV
                    339:     set procList {}
                    340:     foreach key [array names TCLENV] {
                    341:         if {[string match "PROC:*" $key]} {
                    342:             lappend procList [string range $key 5 end]
                    343:         }
                    344:     }
                    345:     return $procList
                    346: }
                    347: 
                    348: #@package: TclX-directory_stack pushd popd dirs
                    349: 
                    350: global TCLENV(dirPushList)
                    351: 
                    352: set TCLENV(dirPushList) ""
                    353: 
                    354: proc pushd {args} {
                    355:     global TCLENV
                    356: 
                    357:     if {[llength $args] > 1} {
                    358:         error "bad # args: pushd [dir_to_cd_to]"
                    359:     }
                    360:     set TCLENV(dirPushList) [linsert $TCLENV(dirPushList) 0 [pwd]]
                    361: 
                    362:     if {[llength $args] != 0} {
                    363:         cd [glob $args]
                    364:     }
                    365: }
                    366: 
                    367: proc popd {} {
                    368:     global TCLENV
                    369: 
                    370:     if [llength $TCLENV(dirPushList)] {
                    371:         cd [lvarpop TCLENV(dirPushList)]
                    372:         pwd
                    373:     } else {
                    374:         error "directory stack empty"
                    375:     }
                    376: }
                    377: 
                    378: proc dirs {} { 
                    379:     global TCLENV
                    380:     echo [pwd] $TCLENV(dirPushList)
                    381: }
                    382: 
                    383: #@package: TclX-set_functions union intersect intersect3 lrmdups
                    384: 
                    385: proc union {lista listb} {
                    386:     set full_list [lsort [concat $lista $listb]]
                    387:     set check_element [lindex $full_list 0]
                    388:     set outlist $check_element
                    389:     foreach element [lrange $full_list 1 end] {
                    390:        if {$check_element == $element} continue
                    391:        lappend outlist $element
                    392:        set check_element $element
                    393:     }
                    394:     return $outlist
                    395: }
                    396: 
                    397: proc lrmdups {list} {
                    398:     set list [lsort $list]
                    399:     set result [lvarpop list]
                    400:     lappend last $result
                    401:     foreach element $list {
                    402:        if {$last != $element} {
                    403:            lappend result $element
                    404:            set last $element
                    405:        }
                    406:     }
                    407:     return $result
                    408: }
                    409: 
                    410: 
                    411: proc intersect3 {list1 list2} {
                    412:     set list1Result ""
                    413:     set list2Result ""
                    414:     set intersectList ""
                    415: 
                    416:     set list1 [lrmdups $list1]
                    417:     set list2 [lrmdups $list2]
                    418: 
                    419:     while {1} {
                    420:         if [lempty $list1] {
                    421:             if ![lempty $list2] {
                    422:                 set list2Result [concat $list2Result $list2]
                    423:             }
                    424:             break
                    425:         }
                    426:         if [lempty $list2] {
                    427:            set list1Result [concat $list1Result $list1]
                    428:             break
                    429:         }
                    430:         set compareResult [string compare [lindex $list1 0] [lindex $list2 0]]
                    431: 
                    432:         if {$compareResult < 0} {
                    433:             lappend list1Result [lvarpop list1]
                    434:             continue
                    435:         }
                    436:         if {$compareResult > 0} {
                    437:             lappend list2Result [lvarpop list2]
                    438:             continue
                    439:         }
                    440:         lappend intersectList [lvarpop list1]
                    441:         lvarpop list2
                    442:     }
                    443:     return [list $list1Result $intersectList $list2Result]
                    444: }
                    445: 
                    446: proc intersect {list1 list2} {
                    447:     set intersectList ""
                    448: 
                    449:     set list1 [lsort $list1]
                    450:     set list2 [lsort $list2]
                    451: 
                    452:     while {1} {
                    453:         if {[lempty $list1] || [lempty $list2]} break
                    454: 
                    455:         set compareResult [string compare [lindex $list1 0] [lindex $list2 0]]
                    456: 
                    457:         if {$compareResult < 0} {
                    458:             lvarpop list1
                    459:             continue
                    460:         }
                    461: 
                    462:         if {$compareResult > 0} {
                    463:             lvarpop list2
                    464:             continue
                    465:         }
                    466: 
                    467:         lappend intersectList [lvarpop list1]
                    468:         lvarpop list2
                    469:     }
                    470:     return $intersectList
                    471: }
                    472: 
                    473: 
                    474: 
                    475: #@package: TclX-show_procedures showproc showprocs
                    476: 
                    477: proc showproc {procname} {
                    478:     if [lempty [info procs $procname]] {demand_load $procname}
                    479:        set arglist [info args $procname]
                    480:        set nargs {}
                    481:        while {[llength $arglist] > 0} {
                    482:            set varg [lvarpop arglist 0]
                    483:            if [info default $procname $varg defarg] {
                    484:                lappend nargs [list $varg $defarg]
                    485:            } else {
                    486:                lappend nargs $varg
                    487:            }
                    488:     }
                    489:     format "proc %s \{%s\} \{%s\}\n" $procname $nargs [info body $procname]
                    490: }
                    491: 
                    492: proc showprocs {args} {
                    493:     if [lempty $args] { set args [info procs] }
                    494:     set out ""
                    495: 
                    496:     foreach i $args {
                    497:        foreach j $i { append out [showproc $j] "\n"}
                    498:     }
                    499:     return $out
                    500: }
                    501: 
                    502: 
                    503: #@package: TclX-stringfile_functions read_file write_file
                    504: 
                    505: proc read_file {fileName {numBytes {}}} {
                    506:     set fp [open $fileName]
                    507:     if {$numBytes != ""} {
                    508:         set result [read $fp $numBytes]
                    509:     } else {
                    510:         set result [read $fp]
                    511:     }
                    512:     close $fp
                    513:     return $result
                    514: } 
                    515: 
                    516: proc write_file {fileName args} {
                    517:     set fp [open $fileName w]
                    518:     foreach string $args {
                    519:         puts $fp $string
                    520:     }
                    521:     close $fp
                    522: }
                    523: 
                    524: 
                    525: #@package: TclX-Compatibility execvp
                    526: 
                    527: proc execvp {progname args} {
                    528:     execl $progname $args
                    529: }
                    530: 
                    531: #@package: TclX-convertlib convert_lib
                    532: 
                    533: proc convert_lib {tclIndex packageLib {ignore {}}} {
                    534:     if {[file tail $tclIndex] != "tclIndex"} {
                    535:         error "Tail file name numt be `tclIndex': $tclIndex"}
                    536:     set srcDir [file dirname $tclIndex]
                    537: 
                    538:     if {[file extension $packageLib] != ".tlib"} {
                    539:         append packageLib ".tlib"}
                    540: 
                    541: 
                    542:     set tclIndexFH [open $tclIndex r]
                    543:     while {[gets $tclIndexFH line] >= 0} {
                    544:         if {([cindex $line 0] == "#") || ([llength $line] != 2)} {
                    545:             continue}
                    546:         if {[lsearch $ignore [lindex $line 1]] >= 0} {
                    547:             continue}
                    548:         lappend entryTable([lindex $line 1]) [lindex $line 0]
                    549:     }
                    550:     close $tclIndexFH
                    551: 
                    552:     set libFH [open $packageLib w]
                    553:     foreach srcFile [array names entryTable] {
                    554:         set srcFH [open $srcDir/$srcFile r]
                    555:         puts $libFH "#@package: $srcFile $entryTable($srcFile)\n"
                    556:         copyfile $srcFH $libFH
                    557:         close $srcFH
                    558:     }
                    559:     close $libFH
                    560:     buildpackageindex $packageLib
                    561: }
                    562: 
                    563: #@package: TclX-profrep profrep
                    564: 
                    565: proc profrep:summarize {profDataVar stackDepth sumProfDataVar} {
                    566:     upvar $profDataVar profData $sumProfDataVar sumProfData
                    567: 
                    568:     if {(![info exists profData]) || ([catch {array size profData}] != 0)} {
                    569:         error "`profDataVar' must be the name of an array returned by the `profile off' command"
                    570:     }
                    571:     set maxNameLen 0
                    572:     foreach procStack [array names profData] {
                    573:         if {[llength $procStack] < $stackDepth} {
                    574:             set sigProcStack $procStack
                    575:         } else {
                    576:             set sigProcStack [lrange $procStack 0 [expr {$stackDepth - 1}]]
                    577:         }
                    578:         set maxNameLen [max $maxNameLen [clength $sigProcStack]]
                    579:         if [info exists sumProfData($sigProcStack)] {
                    580:             set cur $sumProfData($sigProcStack)
                    581:             set add $profData($procStack)
                    582:             set     new [expr [lindex $cur 0]+[lindex $add 0]]
                    583:             lappend new [expr [lindex $cur 1]+[lindex $add 1]]
                    584:             lappend new [expr [lindex $cur 2]+[lindex $add 2]]
                    585:             set $sumProfData($sigProcStack) $new
                    586:         } else {
                    587:             set sumProfData($sigProcStack) $profData($procStack)
                    588:         }
                    589:     }
                    590:     return $maxNameLen
                    591: }
                    592: 
                    593: proc profrep:sort {sumProfDataVar sortKey} {
                    594:     upvar $sumProfDataVar sumProfData
                    595: 
                    596:     case $sortKey {
                    597:         {calls} {set keyIndex 0}
                    598:         {real}  {set keyIndex 1}
                    599:         {cpu}   {set keyIndex 2}
                    600:         default {
                    601:             error "Expected a sort of: `calls',  `cpu' or ` real'"}
                    602:     }
                    603: 
                    604: 
                    605:     foreach procStack [array names sumProfData] {
                    606:         set key [format "%016d" [lindex $sumProfData($procStack) $keyIndex]]
                    607:         lappend keyProcList [list $key $procStack]
                    608:     }
                    609:     set keyProcList [lsort $keyProcList]
                    610: 
                    611: 
                    612:     for {set idx [expr [llength $keyProcList]-1]} {$idx >= 0} {incr idx -1} {
                    613:         lappend sortedProcList [lindex [lindex $keyProcList $idx] 1]
                    614:     }
                    615:     return $sortedProcList
                    616: }
                    617: 
                    618: 
                    619: proc profrep:print {sumProfDataVar sortedProcList maxNameLen outFile
                    620:                     userTitle} {
                    621:     upvar $sumProfDataVar sumProfData
                    622:     
                    623:     if {$outFile == ""} {
                    624:         set outFH stdout
                    625:     } else {
                    626:         set outFH [open $outFile w]
                    627:     }
                    628: 
                    629: 
                    630:     set stackTitle "Procedure Call Stack"
                    631:     set maxNameLen [max $maxNameLen [clength $stackTitle]]
                    632:     set hdr [format "%-${maxNameLen}s %10s %10s %10s" $stackTitle \
                    633:                     "Calls" "Real Time" "CPU Time"]
                    634:     if {$userTitle != ""} {
                    635:         puts $outFH [replicate - [clength $hdr]]
                    636:         puts $outFH $userTitle
                    637:     }
                    638:     puts $outFH [replicate - [clength $hdr]]
                    639:     puts $outFH $hdr
                    640:     puts $outFH [replicate - [clength $hdr]]
                    641: 
                    642: 
                    643:     foreach procStack $sortedProcList {
                    644:         set data $sumProfData($procStack)
                    645:         puts $outFH [format "%-${maxNameLen}s %10d %10d %10d" $procStack \
                    646:                             [lindex $data 0] [lindex $data 1] [lindex $data 2]]
                    647:     }
                    648:     if {$outFile != ""} {
                    649:         close $outFH
                    650:     }
                    651: }
                    652: 
                    653: 
                    654: proc profrep {profDataVar sortKey stackDepth {outFile {}} {userTitle {}}} {
                    655:     upvar $profDataVar profData
                    656: 
                    657:     set maxNameLen [profrep:summarize profData $stackDepth sumProfData]
                    658:     set sortedProcList [profrep:sort sumProfData $sortKey]
                    659:     profrep:print sumProfData $sortedProcList $maxNameLen $outFile $userTitle
                    660: 
                    661: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.