Annotation of micropolis/res/init.tcl, revision 1.1

1.1     ! root        1: # init.tcl --
        !             2: #
        !             3: # Default system startup file for Tcl-based applications.  Defines
        !             4: # "unknown" procedure and auto-load facilities.
        !             5: #
        !             6: # $Header: /user6/ouster/tcl/scripts/RCS/init.tcl,v 1.7 92/07/25 16:29:36 ouster Exp $ SPRITE (Berkeley)
        !             7: #
        !             8: # Copyright 1991-1992 Regents of the University of California
        !             9: # Permission to use, copy, modify, and distribute this
        !            10: # software and its documentation for any purpose and without
        !            11: # fee is hereby granted, provided that this copyright
        !            12: # notice appears in all copies.  The University of California
        !            13: # makes no representations about the suitability of this
        !            14: # software for any purpose.  It is provided "as is" without
        !            15: # express or implied warranty.
        !            16: #
        !            17: 
        !            18: # unknown:
        !            19: # Invoked when a Tcl command is invoked that doesn't exist in the
        !            20: # interpreter:
        !            21: #
        !            22: #      1. See if the autoload facility can locate the command in a
        !            23: #         Tcl script file.  If so, load it and execute it.
        !            24: #      2. See if the command exists as an executable UNIX program.
        !            25: #         If so, "exec" the command.
        !            26: #      3. See if the command is a valid abbreviation for another command.
        !            27: #         if so, invoke the command.  However, only permit abbreviations
        !            28: #         at top-level.
        !            29: 
        !            30: proc unknown args {
        !            31:     global auto_noexec auto_noload env unknown_active
        !            32: 
        !            33:     if [info exists unknown_active] {
        !            34:        unset unknown_active
        !            35:        error "unexpected recursion in \"unknown\" command"
        !            36:     }
        !            37:     set unknown_active 1
        !            38:     set name [lindex $args 0]
        !            39:     if ![info exists auto_noload] {
        !            40:        if [auto_load $name] {
        !            41:            unset unknown_active
        !            42:            return [uplevel $args]
        !            43:        }
        !            44:     }
        !            45:     if ![info exists auto_noexec] {
        !            46:        if [auto_execok $name] {
        !            47:            unset unknown_active
        !            48:            return [uplevel exec $args]
        !            49:        }
        !            50:     }
        !            51:     if {([info level] == 1) && ([info script] == "")} {
        !            52:        set cmds [info commands $name*]
        !            53:        if {[llength $cmds] == 1} {
        !            54:            unset unknown_active
        !            55:            return [uplevel [lreplace $args 0 0 $cmds]]
        !            56:        }
        !            57:        if {[llength $cmds] != 0} {
        !            58:            unset unknown_active
        !            59:            if {$name == ""} {
        !            60:                error "empty command name \"\""
        !            61:            } else {
        !            62:                error "ambiguous command name \"$name\": [lsort $cmds]"
        !            63:            }
        !            64:        }
        !            65:     }
        !            66:     unset unknown_active
        !            67:     error "invalid command name \"$name\""
        !            68: }
        !            69: 
        !            70: # auto_load:
        !            71: # Checks a collection of library directories to see if a procedure
        !            72: # is defined in one of them.  If so, it sources the appropriate
        !            73: # library file to create the procedure.  Returns 1 if it successfully
        !            74: # loaded the procedure, 0 otherwise.
        !            75: 
        !            76: proc auto_load cmd {
        !            77:     global auto_index auto_oldpath auto_path env
        !            78:     if [info exists auto_index($cmd)] {
        !            79:        uplevel #0 source $auto_index($cmd)
        !            80:        return 1
        !            81:     }
        !            82:     if [catch {set path $auto_path}] {
        !            83:        if [catch {set path $env(TCLLIBPATH)}] {
        !            84:            if [catch {set path [info library]}] {
        !            85:                return 0
        !            86:            }
        !            87:        }
        !            88:     }
        !            89:     if [info exists auto_oldpath] {
        !            90:        if {$auto_oldpath == $path} {
        !            91:            return 0
        !            92:        }
        !            93:     }
        !            94:     set auto_oldpath $path
        !            95:     catch {unset auto_index}
        !            96:     foreach dir $path {
        !            97:        set f ""
        !            98:        catch {
        !            99:            set f [open $dir/tclindex]
        !           100:            if {[gets $f] != "# Tcl autoload index file: each line identifies a Tcl"} {
        !           101:                puts stdout "Bad id line in file $dir/tclindex"
        !           102:                error done
        !           103:            }
        !           104:            while {[gets $f line] >= 0} {
        !           105:                if {([string index $line 0] == "#") || ([llength $line] != 2)} {
        !           106:                    continue
        !           107:                }
        !           108:                set name [lindex $line 0]
        !           109:                if {![info exists auto_index($name)]} {
        !           110:                    set auto_index($name) $dir/[lindex $line 1]
        !           111:                }
        !           112:            }
        !           113:        }
        !           114:        if {$f != ""} {
        !           115:            close $f
        !           116:        }
        !           117:     }
        !           118:     if [info exists auto_index($cmd)] {
        !           119:        uplevel #0 source $auto_index($cmd)
        !           120:        return 1
        !           121:     }
        !           122:     return 0
        !           123: }
        !           124: 
        !           125: # auto_execok:
        !           126: # Returns 1 if there's an executable in the current path for the
        !           127: # given name, 0 otherwise.  Builds an associative array auto_execs
        !           128: # that caches information about previous checks, for speed.
        !           129: 
        !           130: proc auto_execok name {
        !           131:     global auto_execs env
        !           132: 
        !           133:     if [info exists auto_execs($name)] {
        !           134:        return $auto_execs($name)
        !           135:     }
        !           136:     set auto_execs($name) 0
        !           137:     foreach dir [split $env(PATH) :] {
        !           138:        if {[file executable $dir/$name] && ![file isdirectory $dir/$name]} {
        !           139:            set auto_execs($name) 1
        !           140:            return 1
        !           141:        }
        !           142:     }
        !           143:     return 0
        !           144: }
        !           145: 
        !           146: # auto_reset:
        !           147: # Destroy all cached information for auto-loading and auto-execution,
        !           148: # so that the information gets recomputed the next time it's needed.
        !           149: 
        !           150: proc auto_reset {} {
        !           151:     global auto_execs auto_index
        !           152:     unset auto_execs auto_index
        !           153: }

unix.superglobalmegacorp.com

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