Annotation of micropolis/src/tclx/tclsrc/help.tcl, revision 1.1.1.1

1.1       root        1: #
                      2: # help.tcl --
                      3: #
                      4: # Tcl help command. (see TclX manual)
                      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: help.tcl,v 2.0 1992/10/16 04:52:01 markd Rel $
                     17: #------------------------------------------------------------------------------
                     18: #
                     19: 
                     20: #@package: TclX-help help helpcd helppwd apropos
                     21: 
                     22: #------------------------------------------------------------------------------
                     23: # Take a path name which might have . and .. elements and flatten them out.
                     24: 
                     25: proc help:flattenPath {pathName} {
                     26:     set newPath {}
                     27:     foreach element [split $pathName /] {
                     28:         if {"$element" == "."} {
                     29:            continue
                     30:         }
                     31:         if {"$element" == ".."} {
                     32:             if {[llength [join $newPath /]] == 0} {
                     33:                 error "Help: name goes above subject directory root"}
                     34:             lvarpop newPath [expr [llength $newPath]-1]
                     35:             continue
                     36:         }
                     37:         lappend newPath $element
                     38:     }
                     39:     set newPath [join $newPath /]
                     40:     
                     41:     # Take care of the case where we started with something line "/" or "/."
                     42: 
                     43:     if {("$newPath" == "") && [string match "/*" $pathName]} {
                     44:         set newPath "/"}
                     45:         
                     46:     return $newPath
                     47: }
                     48: 
                     49: #------------------------------------------------------------------------------
                     50: # Take the help current directory and a path and evaluate it into a help root-
                     51: # based path name.
                     52: 
                     53: proc help:EvalPath {pathName} {
                     54:     global TCLENV
                     55: 
                     56:     if {![string match "/*" $pathName]} {
                     57:         if {"$pathName" == ""} {
                     58:             return $TCLENV(help:curDir)}
                     59:         if {"$TCLENV(help:curDir)" == "/"} {
                     60:             set pathName "/$pathName"
                     61:         } else {
                     62:             set pathName "$TCLENV(help:curDir)/$pathName"
                     63:         }
                     64:     }
                     65:     set pathName [help:flattenPath $pathName]
                     66:     if {[string match "*/" $pathName] && ($pathName != "/")} {
                     67:         set pathName [csubstr $pathName 0 [expr [length $pathName]-1]]}
                     68: 
                     69:     return $pathName    
                     70: }
                     71: 
                     72: #------------------------------------------------------------------------------
                     73: # Display a line of output, pausing waiting for input before displaying if the
                     74: # screen size has been reached.  Return 1 if output is to continue, return
                     75: # 0 if no more should be outputed, indicated by input other than return.
                     76: #
                     77: 
                     78: proc help:Display {line} {
                     79:     global TCLENV
                     80:     if {$TCLENV(help:lineCnt) >= 23} {
                     81:         set TCLENV(help:lineCnt) 0
                     82:         puts stdout ":" nonewline
                     83:         flush stdout
                     84:         gets stdin response
                     85:         if {![lempty $response]} {
                     86:             return 0}
                     87:     }
                     88:     puts stdout $line
                     89:     incr TCLENV(help:lineCnt)
                     90: }
                     91: 
                     92: #------------------------------------------------------------------------------
                     93: # Display a file.
                     94: 
                     95: proc help:DisplayFile {filepath} {
                     96: 
                     97:     set inFH [open $filepath r]
                     98:     while {[gets $inFH fileBuf] >= 0} {
                     99:         if {![help:Display $fileBuf]} {
                    100:             break}
                    101:     }
                    102:     close $inFH
                    103: 
                    104: }    
                    105: 
                    106: #------------------------------------------------------------------------------
                    107: # Procedure to return contents of a directory.  A list is returned, consisting
                    108: # of two lists.  The first list are all the directories (subjects) in the
                    109: # specified directory.  The second is all of the help files.  Eash sub-list
                    110: # is sorted in alphabetical order.
                    111: #
                    112: 
                    113: proc help:ListDir {dirPath} {
                    114:     set dirList {}
                    115:     set fileList {}
                    116:     if {[catch {set dirFiles [glob $dirPath/*]}] != 0} {
                    117:         error "No files in subject directory: $dirPath"}
                    118:     foreach fileName $dirFiles {
                    119:         if [file isdirectory $fileName] {
                    120:             lappend dirList "[file tail $fileName]/"
                    121:         } else {
                    122:             lappend fileList [file tail $fileName]
                    123:         }
                    124:     }
                    125:    return [list [lsort $dirList] [lsort $fileList]]
                    126: }
                    127: 
                    128: #------------------------------------------------------------------------------
                    129: # Display a list of file names in a column format. This use columns of 14 
                    130: # characters 3 blanks.
                    131: 
                    132: proc help:DisplayColumns {nameList} {
                    133:     set count 0
                    134:     set outLine ""
                    135:     foreach name $nameList {
                    136:         if {$count == 0} {
                    137:             append outLine "   "}
                    138:         append outLine $name
                    139:         if {[incr count] < 4} {
                    140:             set padLen [expr 17-[clength $name]]
                    141:             if {$padLen < 3} {
                    142:                set padLen 3}
                    143:             append outLine [replicate " " $padLen]
                    144:         } else {
                    145:            if {![help:Display $outLine]} {
                    146:                return}
                    147:            set outLine ""
                    148:            set count 0
                    149:         }
                    150:     }
                    151:     if {$count != 0} {
                    152:         help:Display $outLine}
                    153:     return
                    154: }
                    155: 
                    156: 
                    157: #------------------------------------------------------------------------------
                    158: # Help command main.
                    159: 
                    160: proc help {{subject {}}} {
                    161:     global TCLENV
                    162: 
                    163:     set TCLENV(help:lineCnt) 0
                    164: 
                    165:     # Special case "help help", so we can get it at any level.
                    166: 
                    167:     if {($subject == "help") || ($subject == "?")} {
                    168:         help:DisplayFile "$TCLENV(help:root)/help"
                    169:         return
                    170:     }
                    171: 
                    172:     set request [help:EvalPath $subject]
                    173:     set requestPath "$TCLENV(help:root)$request"
                    174: 
                    175:     if {![file exists $requestPath]} {
                    176:         error "Help:\"$request\" does not exist"}
                    177:     
                    178:     if [file isdirectory $requestPath] {
                    179:         set dirList [help:ListDir $requestPath]
                    180:         set subList  [lindex $dirList 0]
                    181:         set fileList [lindex $dirList 1]
                    182:         if {[llength $subList] != 0} {
                    183:             help:Display "\nSubjects available in $request:"
                    184:             help:DisplayColumns $subList
                    185:         }
                    186:         if {[llength $fileList] != 0} {
                    187:             help:Display "\nHelp files available in $request:"
                    188:             help:DisplayColumns $fileList
                    189:         }
                    190:     } else {
                    191:         help:DisplayFile $requestPath
                    192:     }
                    193:     return
                    194: }
                    195: 
                    196: 
                    197: #------------------------------------------------------------------------------
                    198: # Helpcd main.
                    199: #   
                    200: # The name of the new current directory is assembled from the current 
                    201: # directory and the argument.  The name will be flatten and any trailing
                    202: # "/" will be removed, unless the name is just "/".
                    203: 
                    204: proc helpcd {{dir /}} {
                    205:     global TCLENV
                    206: 
                    207:     set request [help:EvalPath $dir]
                    208:     set requestPath "$TCLENV(help:root)$request"
                    209: 
                    210:     if {![file exists $requestPath]} {
                    211:         error "Helpcd: \"$request\" does not exist"}
                    212:     
                    213:     if {![file isdirectory $requestPath]} {
                    214:         error "Helpcd: \"$request\" is not a directory"}
                    215: 
                    216:     set TCLENV(help:curDir) $request
                    217:     return    
                    218: }
                    219: 
                    220: #------------------------------------------------------------------------------
                    221: # Helpcd main.
                    222: 
                    223: proc helppwd {} {
                    224:         global TCLENV
                    225:         echo "Current help subject directory: $TCLENV(help:curDir)"
                    226: }
                    227: 
                    228: #==============================================================================
                    229: #     Tcl apropos command.  (see Tcl shell manual)
                    230: #------------------------------------------------------------------------------
                    231: 
                    232: proc apropos {name} {
                    233:     global TCLENV
                    234: 
                    235:     set TCLENV(help:lineCnt) 0
                    236: 
                    237:     set aproposCT [scancontext create]
                    238:     scanmatch -nocase $aproposCT $name {
                    239:         set path [lindex $matchInfo(line) 0]
                    240:         set desc [lrange $matchInfo(line) 1 end]
                    241:         if {![help:Display [format "%s - %s" $path $desc]]} {
                    242:             return}
                    243:     }
                    244:     foreach brief [glob -nocomplain $TCLENV(help:root)/*.brf] {
                    245:         set briefFH [open $brief]
                    246:         scanfile $aproposCT $briefFH
                    247:         close $briefFH
                    248:     }
                    249:     scancontext delete $aproposCT
                    250: }
                    251: 
                    252: #------------------------------------------------------------------------------
                    253: # One time initialization done when the file is sourced.
                    254: #
                    255: global TCLENV TCLPATH
                    256: 
                    257: set TCLENV(help:root) [searchpath $TCLPATH help]
                    258: set TCLENV(help:curDir) "/"
                    259: set TCLENV(help:outBuf) {}

unix.superglobalmegacorp.com

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