summaryrefslogtreecommitdiffstats
path: root/tcllib/support/devel/sak
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/support/devel/sak')
-rw-r--r--tcllib/support/devel/sak/doc/cmd.tcl44
-rw-r--r--tcllib/support/devel/sak/doc/doc.tcl262
-rw-r--r--tcllib/support/devel/sak/doc/doc_auto.tcl323
-rw-r--r--tcllib/support/devel/sak/doc/help.txt42
-rw-r--r--tcllib/support/devel/sak/doc/kwic.txt3802
-rw-r--r--tcllib/support/devel/sak/doc/manpages.txt428
-rw-r--r--tcllib/support/devel/sak/doc/pkgIndex.tcl4
-rw-r--r--tcllib/support/devel/sak/doc/toc.txt1172
-rw-r--r--tcllib/support/devel/sak/doc/toc_apps.txt11
-rw-r--r--tcllib/support/devel/sak/doc/toc_cats.txt488
-rw-r--r--tcllib/support/devel/sak/doc/toc_mods.txt675
-rw-r--r--tcllib/support/devel/sak/doc/topic.txt1
-rw-r--r--tcllib/support/devel/sak/help/cmd.tcl25
-rw-r--r--tcllib/support/devel/sak/help/help.tcl75
-rw-r--r--tcllib/support/devel/sak/help/help.txt8
-rw-r--r--tcllib/support/devel/sak/help/pkgIndex.tcl4
-rw-r--r--tcllib/support/devel/sak/help/topic.txt1
-rw-r--r--tcllib/support/devel/sak/localdoc/cmd.tcl21
-rw-r--r--tcllib/support/devel/sak/localdoc/help.txt8
-rw-r--r--tcllib/support/devel/sak/localdoc/localdoc.tcl129
-rw-r--r--tcllib/support/devel/sak/localdoc/pkgIndex.tcl2
-rw-r--r--tcllib/support/devel/sak/localdoc/topic.txt2
-rw-r--r--tcllib/support/devel/sak/old/help.txt102
-rw-r--r--tcllib/support/devel/sak/old/topic.txt1
-rw-r--r--tcllib/support/devel/sak/readme/cmd.tcl38
-rw-r--r--tcllib/support/devel/sak/readme/help.txt14
-rw-r--r--tcllib/support/devel/sak/readme/pkgIndex.tcl2
-rw-r--r--tcllib/support/devel/sak/readme/readme.tcl480
-rw-r--r--tcllib/support/devel/sak/readme/topic.txt2
-rw-r--r--tcllib/support/devel/sak/registry/pkgIndex.tcl2
-rw-r--r--tcllib/support/devel/sak/registry/registry.man171
-rw-r--r--tcllib/support/devel/sak/registry/registry.tcl287
-rw-r--r--tcllib/support/devel/sak/registry/registry.test450
-rw-r--r--tcllib/support/devel/sak/review/cmd.tcl25
-rw-r--r--tcllib/support/devel/sak/review/help.txt10
-rw-r--r--tcllib/support/devel/sak/review/pkgIndex.tcl2
-rw-r--r--tcllib/support/devel/sak/review/review.tcl985
-rw-r--r--tcllib/support/devel/sak/review/topic.txt1
-rw-r--r--tcllib/support/devel/sak/test/cmd.tcl28
-rw-r--r--tcllib/support/devel/sak/test/help.txt46
-rw-r--r--tcllib/support/devel/sak/test/pkgIndex.tcl5
-rw-r--r--tcllib/support/devel/sak/test/run.tcl880
-rw-r--r--tcllib/support/devel/sak/test/shell.tcl94
-rw-r--r--tcllib/support/devel/sak/test/shells.tcl24
-rw-r--r--tcllib/support/devel/sak/test/test.tcl19
-rw-r--r--tcllib/support/devel/sak/test/topic.txt1
-rw-r--r--tcllib/support/devel/sak/util/anim.tcl64
-rw-r--r--tcllib/support/devel/sak/util/color.tcl54
-rw-r--r--tcllib/support/devel/sak/util/feedback.tcl182
-rw-r--r--tcllib/support/devel/sak/util/pkgIndex.tcl6
-rw-r--r--tcllib/support/devel/sak/util/registry.tcl59
-rw-r--r--tcllib/support/devel/sak/util/util.tcl72
-rw-r--r--tcllib/support/devel/sak/validate/cmd.tcl70
-rw-r--r--tcllib/support/devel/sak/validate/help.txt53
-rw-r--r--tcllib/support/devel/sak/validate/manpages.tcl464
-rw-r--r--tcllib/support/devel/sak/validate/pkgIndex.tcl6
-rw-r--r--tcllib/support/devel/sak/validate/syntax.tcl668
-rw-r--r--tcllib/support/devel/sak/validate/testsuites.tcl512
-rw-r--r--tcllib/support/devel/sak/validate/topic.txt1
-rw-r--r--tcllib/support/devel/sak/validate/validate.tcl37
-rw-r--r--tcllib/support/devel/sak/validate/versions.tcl258
61 files changed, 13702 insertions, 0 deletions
diff --git a/tcllib/support/devel/sak/doc/cmd.tcl b/tcllib/support/devel/sak/doc/cmd.tcl
new file mode 100644
index 0000000..564ac94
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/cmd.tcl
@@ -0,0 +1,44 @@
+# -*- tcl -*-
+# Implementation of 'doc'.
+
+# Available variables
+# * argv - Cmdline arguments
+# * base - Location of sak.tcl = Top directory of Tcllib distribution
+# * cbase - Location of all files relevant to this command.
+# * sbase - Location of all files supporting the SAK.
+
+if {![llength $argv]} {
+ set format *
+} else {
+ set format [lindex $argv 0]*
+ set argv [lrange $argv 1 end]
+}
+
+package require sak::util
+if {![sak::util::checkModules argv]} return
+
+set matches 0
+foreach f {
+ html nroff tmml text wiki latex dvi ps pdf list validate imake ishow index
+} {
+ if {![string match $format $f]} continue
+ incr matches
+}
+if {!$matches} {
+ puts " No format matching \"$format\""
+ return
+}
+
+# ###
+
+package require sak::doc
+
+foreach f {
+ html nroff tmml text wiki latex dvi ps pdf list validate imake ishow index
+} {
+ if {![string match $format $f]} continue
+ sak::doc::$f $argv
+}
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/doc/doc.tcl b/tcllib/support/devel/sak/doc/doc.tcl
new file mode 100644
index 0000000..9e6aab3
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/doc.tcl
@@ -0,0 +1,262 @@
+# -*- tcl -*-
+# sak::doc - Documentation facilities
+
+package require sak::util
+package require sak::doc::auto
+
+namespace eval ::sak::doc {}
+
+# ###
+# API commands
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::index {modules {excluded {}}} {
+ # The argument (= set of modules) is irrelevant to this command.
+ global base
+
+ # First locate all manpages in the CVS workspace.
+ set manpages [auto::findManpages $base $excluded]
+ auto::saveManpages $manpages
+
+ # Then scan the found pages and extract the information needed for
+ # keyword index and table of contents.
+ array set meta [auto::scanManpages $manpages]
+
+ # Sort through the extracted data.
+ array set kwic {} ; # map: keyword -> list (file...)
+ array set title {} ; # map: file -> description
+ array set cat {} ; # map: category -> list (file...)
+ array set name {} ; # map: file -> label
+ set apps {} ; # list (file...)
+ array set mods {} ; # map: module -> list(file...)
+
+ foreach page [array names meta] {
+ unset -nocomplain m
+ array set m $meta($page)
+
+ # Collect keywords and file mapping for index.
+ foreach kw $m(keywords) {
+ lappend kwic($kw) $page
+ }
+ # Get page title, relevant for display order
+ if {$m(desc) eq ""} {
+ set m(desc) $m(shortdesc)
+ }
+ set title($page) $m(desc)
+ # Get page name/title, relevant for display order.
+ set name($page) $m(title)
+ # Get page category, for sectioning and display order in the
+ # table of contents
+ if {$m(category) ne ""} {
+ set c $m(category)
+ } else {
+ set c Unfiled
+ }
+ lappend cat($c) $page
+
+ # Type of documented entity
+ set type [lindex [file split $page] 0]
+ if {$type eq "apps"} {
+ lappend apps $page
+ } else {
+ lappend mods([lindex [file split $page] 1]) $page
+ }
+ }
+
+ #parray meta
+ #parray kwic
+ #parray title
+ #parray name
+ #parray cat
+ #puts "apps = $apps"
+ #parray mods
+
+ auto::saveKeywordIndex kwic name
+ auto::saveTableOfContents title name cat apps mods
+ auto::saveSimpleTableOfContents1 title name apps toc_apps.txt
+ auto::saveSimpleTableOfContents2 title name mods toc_mods.txt
+ auto::saveSimpleTableOfContents3 title name cat toc_cats.txt
+ return
+}
+
+proc ::sak::doc::imake {modules {excluded {}}} {
+ global base
+ # The argument (= set of modules) is irrelevant to this command.
+ auto::saveManpages [auto::findManpages $base $excluded]
+ return
+}
+
+proc ::sak::doc::ishow {modules} {
+ if {[catch {
+ set manpages [auto::loadManpages]
+ } msg]} {
+ puts stderr "Unable to use manpage listing '[auto::manpages]'\n$msg"
+ } else {
+ puts [join $manpages \n]
+ }
+ return
+}
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::validate {modules} {Gen null null $modules}
+proc ::sak::doc::html {modules} {Gen html html $modules}
+proc ::sak::doc::nroff {modules} {Gen nroff n $modules}
+proc ::sak::doc::tmml {modules} {Gen tmml tmml $modules}
+proc ::sak::doc::text {modules} {Gen text txt $modules}
+proc ::sak::doc::wiki {modules} {Gen wiki wiki $modules}
+proc ::sak::doc::latex {modules} {Gen latex tex $modules}
+
+proc ::sak::doc::dvi {modules} {
+ latex $modules
+ file mkdir [file join doc dvi]
+ cd [file join doc dvi]
+
+ foreach f [lsort -dict [glob -nocomplain ../latex/*.tex]] {
+
+ set target [file rootname [file tail $f]].dvi
+ if {[file exists $target]
+ && [file mtime $target] > [file mtime $f]} {
+ continue
+ }
+
+ puts "Gen (dvi): $f"
+ exec latex $f 1>@ stdout 2>@ stderr
+ }
+ cd ../..
+ return
+}
+
+proc ::sak::doc::ps {modules} {
+ dvi $modules
+ file mkdir [file join doc ps]
+ cd [file join doc ps]
+ foreach f [lsort -dict [glob -nocomplain ../dvi/*.dvi]] {
+
+ set target [file rootname [file tail $f]].ps
+ if {[file exists $target]
+ && [file mtime $target] > [file mtime $f]} {
+ continue
+ }
+
+ puts "Gen (ps): $f"
+ exec dvips -o $target $f >@ stdout 2>@ stderr
+ }
+ cd ../..
+ return
+}
+
+proc ::sak::doc::pdf {modules} {
+ dvi $modules
+ file mkdir [file join doc pdf]
+ cd [file join doc pdf]
+ foreach f [lsort -dict [glob -nocomplain ../ps/*.ps]] {
+
+ set target [file rootname [file tail $f]].pdf
+ if {[file exists $target]
+ && [file mtime $target] > [file mtime $f]} {
+ continue
+ }
+
+ puts "Gen (pdf): $f"
+ exec ps2pdf $f $target >@ stdout 2>@ stderr
+ }
+ cd ../..
+ return
+}
+
+proc ::sak::doc::list {modules} {
+ Gen list l $modules
+
+ set FILES [glob -nocomplain doc/list/*.l]
+ set LIST [open [file join doc list manpages.tcl] w]
+
+ foreach file $FILES {
+ set f [open $file r]
+ puts $LIST [read $f]
+ close $f
+ }
+ close $LIST
+
+ eval file delete -force $FILES
+ return
+}
+
+# ### ### ### ######### ######### #########
+## Implementation
+
+proc ::sak::doc::Gen {fmt ext modules} {
+ global distribution
+ global tcl_platform
+
+ getpackage doctools doctools/doctools.tcl
+
+ set null 0 ; if {![string compare $fmt null]} {set null 1}
+ set hidden 0 ; if {![string compare $fmt desc]} {set hidden 1}
+
+ if {!$null} {
+ file mkdir [file join doc $fmt]
+ set prefix "Gen ($fmt)"
+ } else {
+ set prefix "Validate "
+ }
+
+ foreach m $modules {
+ set mpath [sak::util::module2path $m]
+
+ ::doctools::new dt \
+ -format $fmt \
+ -module $m
+
+ set fl [glob -nocomplain [file join $mpath *.man]]
+
+ if {[llength $fl] == 0} {
+ dt destroy
+ continue
+ }
+
+ foreach f $fl {
+ if {!$null} {
+ set target [file join doc $fmt \
+ [file rootname [file tail $f]].$ext]
+ if {[file exists $target]
+ && [file mtime $target] > [file mtime $f]} {
+ continue
+ }
+ }
+ if {!$hidden} {puts "$prefix: $f"}
+
+ dt configure -file $f
+ if {$null} {
+ dt configure -deprecated 1
+ }
+
+ set fail [catch {
+ set data [dt format [get_input $f]]
+ } msg]
+
+ set warnings [dt warnings]
+ if {[llength $warnings] > 0} {
+ puts stderr [join $warnings \n]
+ }
+
+ if {$fail} {
+ puts stderr $msg
+ continue
+ }
+
+ if {!$null} {
+ write_out $target $data
+ }
+ }
+ dt destroy
+ }
+}
+
+# ### ### ### ######### ######### #########
+
+package provide sak::doc 1.0
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/doc/doc_auto.tcl b/tcllib/support/devel/sak/doc/doc_auto.tcl
new file mode 100644
index 0000000..2c1a20e
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/doc_auto.tcl
@@ -0,0 +1,323 @@
+# -*- tcl -*-
+# sak::doc::auto - Documentation facilities, support for automatic
+# list of manpages, keyword index, and table of contents.
+
+package require sak::util
+
+namespace eval ::sak::doc::auto {
+ set here [file dirname [file normalize [info script]]]
+}
+
+getpackage fileutil fileutil/fileutil.tcl
+getpackage doctools doctools/doctools.tcl
+getpackage textutil::repeat textutil/repeat.tcl
+
+# ###
+# API commands
+
+proc ::sak::doc::auto::manpages {} {
+ variable here
+ return [file join $here manpages.txt]
+}
+
+proc ::sak::doc::auto::kwic {} {
+ variable here
+ return [file join $here kwic.txt]
+}
+
+proc ::sak::doc::auto::toc {{name toc.txt}} {
+ variable here
+ return [file join $here $name]
+}
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::auto::findManpages {base {excluded {}}} {
+ set top [file normalize $base]
+ set manpages {}
+ foreach page [glob -nocomplain -directory $top/modules */*.man] {
+ set rpage [fileutil::stripPath $top $page]
+ # rpage = modules/*/foo.man
+ set m [file tail [file dirname $rpage]]
+ if {[isExcluded $excluded $m]} continue
+ lappend manpages $rpage
+ }
+ foreach page [glob -nocomplain -directory $top/apps *.man] {
+ lappend manpages [fileutil::stripPath $top $page]
+ }
+ return [lsort -dict $manpages]
+}
+
+proc ::sak::doc::auto::isExcluded {excluded m} {
+ foreach e $excluded {
+ if {$e eq $m} { return yes }
+ }
+ return no
+}
+
+proc ::sak::doc::auto::saveManpages {manpages} {
+ fileutil::writeFile [manpages] [join [lsort -dict $manpages] \n]\n
+ return
+}
+
+proc ::sak::doc::auto::loadManpages {} {
+ return [lsort -dict [split [fileutil::cat [manpages]] \n]]
+}
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::auto::scanManpages {manpages} {
+ ::doctools::new dt -format list
+ set data {}
+ puts Scanning...
+ foreach page $manpages {
+ puts ...$page
+ if {![file size $page]} { puts "\tEMPTY, IGNORED" ; continue }
+ dt configure -ibase $page
+ lappend data $page [lindex [dt format [fileutil::cat $page]] 1]
+ }
+
+ dt destroy
+ return $data
+}
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::auto::saveKeywordIndex {kv nv} {
+ upvar 1 $kv kwic $nv name
+ # kwic: keyword -> list (files)
+ # name: file -> label
+
+ TagsBegin
+ Tag+ index_begin [list {Keyword Index} {}]
+
+ # Handle the keywords in dictionary order for nice display.
+ foreach kw [lsort -dict [array names kwic]] {
+ set tmp [Sortable $kwic($kw) name max _]
+
+ Tag+ key [list $kw]
+ foreach item [lsort -dict -index 0 $tmp] {
+ foreach {label file} $item break
+ Tag+ manpage [FmtR max $file] [list $label]
+ }
+ }
+
+ Tag+ index_end
+
+ fileutil::writeFile [kwic] [join $lines \n]
+ return
+}
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::auto::saveTableOfContents {tv nv cv av mv} {
+ upvar 1 $tv title $nv name $cv cat $av apps $mv mods
+ # title: file -> description
+ # name: file -> label
+ # cat: category -> list (file...)
+
+ TagsBegin
+ Tag+ toc_begin [list {Table Of Contents} {}]
+
+ # The man pages are sorted in several ways for the toc.
+ # 1. First section by category. Subsections are categories.
+ # Sorted by category name, in dictionary order.
+ # Inside the subsections the files, sorted by label and
+ # description.
+ # 2. Second section for types. Subsections are modules and apps.
+ # Apps first, then modules. For apps items directly, sorted
+ # by name and description. For modules one sub-subsection
+ # per module, elements the packages, sorted by label and
+ # description.
+
+ Tag+ division_start [list {By Categories}]
+ foreach c [lsort -dict [array names cat]] {
+ Tag+ division_start [list $c]
+ foreach item [lsort -dict -index 0 [Sortable $cat($c) name maxf maxl]] {
+ foreach {label file} $item break
+ Tag+ item \
+ [FmtR maxf $file] \
+ [FmtR maxl $label] \
+ [list $title($file)]
+ }
+ Tag+ division_end
+ }
+ Tag+ division_end
+
+ Tag+ division_start [list {By Type}]
+ # Not handled: 'no applications'
+ Tag+ division_start [list {Applications}]
+ foreach item [lsort -dict -index 0 [Sortable $apps name maxf maxl]] {
+ foreach {label file} $item break
+ Tag+ item \
+ [FmtR maxf $file] \
+ [FmtR maxl $label] \
+ [list $title($file)]
+ }
+ Tag+ division_end
+ # Not handled: 'no modules'
+ Tag+ division_start [list {Modules}]
+ foreach m [lsort -dict [array names mods]] {
+ Tag+ division_start [list $m]
+ foreach item [lsort -dict -index 0 [Sortable $mods($m) name maxf maxl]] {
+ foreach {label file} $item break
+ Tag+ item \
+ [FmtR maxf $file] \
+ [FmtR maxl $label] \
+ [list $title($file)]
+ }
+ Tag+ division_end
+ }
+ Tag+ division_end
+ Tag+ division_end
+ Tag+ toc_end
+
+ fileutil::writeFile [toc] [join $lines \n]
+ return
+}
+
+proc ::sak::doc::auto::saveSimpleTableOfContents1 {tv nv dv fname} {
+ upvar 1 $tv title $nv name $dv data
+ # title: file -> description
+ # name: file -> label
+ # data: list(file...)
+
+ TagsBegin
+ Tag+ toc_begin [list {Table Of Contents} {}]
+
+ # The man pages are sorted in several ways for the toc.
+ # Subsections are the modules or apps, whatever is in data.
+
+ # Not handled: 'no applications'
+ Tag+ division_start [list {Applications}]
+ foreach item [lsort -dict -index 0 [Sortable $data name maxf maxl]] {
+ foreach {label file} $item break
+ Tag+ item \
+ [FmtR maxf $file] \
+ [FmtR maxl $label] \
+ [list $title($file)]
+ }
+ Tag+ division_end
+ Tag+ toc_end
+
+ fileutil::writeFile [toc $fname] [join $lines \n]
+ return
+}
+
+proc ::sak::doc::auto::saveSimpleTableOfContents2 {tv nv dv fname} {
+ upvar 1 $tv title $nv name $dv data
+ # title: file -> description
+ # name: file -> label
+ # data: module -> list (file...)
+
+ TagsBegin
+ Tag+ toc_begin [list {Table Of Contents} {}]
+
+ # The man pages are sorted in several ways for the toc.
+ # Subsections are the modules or apps, whatever is in data.
+
+ # Not handled: 'no modules'
+ Tag+ division_start [list {Modules}]
+ foreach m [lsort -dict [array names data]] {
+ Tag+ division_start [list $m]
+ foreach item [lsort -dict -index 0 [Sortable $data($m) name maxf maxl]] {
+ foreach {label file} $item break
+ Tag+ item \
+ [FmtR maxf $file] \
+ [FmtR maxl $label] \
+ [list $title($file)]
+ }
+ Tag+ division_end
+ }
+ Tag+ division_end
+ Tag+ toc_end
+
+ fileutil::writeFile [toc $fname] [join $lines \n]
+ return
+}
+
+proc ::sak::doc::auto::saveSimpleTableOfContents3 {tv nv cv fname} {
+ upvar 1 $tv title $nv name $cv cat
+ # title: file -> description
+ # name: file -> label
+ # cat: category -> list (file...)
+
+ TagsBegin
+ Tag+ toc_begin [list {Table Of Contents} {}]
+
+ Tag+ division_start [list {By Categories}]
+ foreach c [lsort -dict [array names cat]] {
+ Tag+ division_start [list $c]
+ foreach item [lsort -dict -index 0 [Sortable $cat($c) name maxf maxl]] {
+ foreach {label file} $item break
+ Tag+ item \
+ [FmtR maxf $file] \
+ [FmtR maxl $label] \
+ [list $title($file)]
+ }
+ Tag+ division_end
+ }
+ Tag+ division_end
+ Tag+ toc_end
+
+ fileutil::writeFile [toc $fname] [join $lines \n]
+ return
+}
+
+proc ::sak::doc::auto::Sortable {files nv mfv mnv} {
+ upvar 1 $nv name $mfv maxf $mnv maxn
+ # Generate a list of files sortable by name, and also find the
+ # max length of all relevant names.
+ set maxf 0
+ set maxn 0
+ set tmp {}
+ foreach file $files {
+ lappend tmp [list $name($file) $file]
+ Max maxf $file
+ Max maxn $name($file)
+ }
+ return $tmp
+}
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::auto::Max {v str} {
+ upvar 1 $v max
+ set x [string length $str]
+ if {$x <= $max} return
+ set max $x
+ return
+}
+
+proc ::sak::doc::auto::FmtR {v str} {
+ upvar 1 $v max
+ return [list $str][textutil::repeat::blank \
+ [expr {$max - [string length [list $str]]}]]
+}
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::doc::auto::Tag {n args} {
+ if {[llength $args]} {
+ return "\[$n [join $args]\]"
+ } else {
+ return "\[$n\]"
+ }
+ #return \[[linsert $args 0 $n]\]
+}
+
+proc ::sak::doc::auto::Tag+ {n args} {
+ upvar 1 lines lines
+ lappend lines [eval [linsert $args 0 ::sak::doc::auto::Tag $n]]
+ return
+}
+
+proc ::sak::doc::auto::TagsBegin {} {
+ upvar 1 lines lines
+ set lines {}
+ return
+}
+
+## ### ### ### ######### ######### #########
+
+package provide sak::doc::auto 1.0
diff --git a/tcllib/support/devel/sak/doc/help.txt b/tcllib/support/devel/sak/doc/help.txt
new file mode 100644
index 0000000..015d1f0
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/help.txt
@@ -0,0 +1,42 @@
+
+ doc -- Generate and/or validate documentation
+
+ sak doc ?format? ?module...?
+
+ Convert the documentation for the specified module into the
+ given format. Modules can be specified by their plain name, or
+ as relative path.
+
+ The special format 'validate' causes the tool to syntax check
+ of the input without generating actual output. When output is
+ generated it is written into the sub-directory 'doc'/format of
+ the current working directory.
+
+ The special format 'imake' scans the checkout for manpages and
+ saves the list of found files into a file in the support
+ directory. This files will be put into CVS. The special format
+ 'ishow' will dump the contents of this list to stdout. Both
+ have been added to make it easy to verify that a checkout has
+ all manpages it should have. These two formats ignore any
+ module information they are given.
+
+ The format is actually a glob and output is generated for all
+ known formats matching it. It is implicitly padded with a * to
+ allow the use of prefixes.
+
+ The known output formats (beyond 'validate') are
+
+ - dvi See latex, + conversion to dvi (via 'latex' application)
+ - html HTML pages
+ - latex LaTeX pages
+ - list A list of manpages
+ - nroff Manpages
+ - ps See dvi, + conversion to PostScript (via 'dvips' application)
+ - pdf See ps, + conversion to PDF (via 'ps2pdf' application)
+ - text Plain text
+ - tmml TMML (Tcl Manpage Markup Language)
+ - wiki Wiki markup (Tcler's Wiki)
+
+ - validate Validate syntax, no output
+ - imake Make list of all manpages and save in checkout, no output.
+ - ishow Print list of manpages saved in checkout to stdout.
diff --git a/tcllib/support/devel/sak/doc/kwic.txt b/tcllib/support/devel/sak/doc/kwic.txt
new file mode 100644
index 0000000..b0b98f7
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/kwic.txt
@@ -0,0 +1,3802 @@
+[index_begin {Keyword Index} {}]
+[key .ddt]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[key .dtx]
+[manpage modules/docstrip/docstrip.man docstrip]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[manpage apps/tcldocstrip.man tcldocstrip]
+[key /dev/null]
+[manpage modules/virtchannel_base/tcllib_null.man tcl::chan::null]
+[manpage modules/virtchannel_base/nullzero.man tcl::chan::nullzero]
+[key /dev/random]
+[manpage modules/virtchannel_base/tcllib_random.man tcl::chan::random]
+[manpage modules/virtchannel_base/randseed.man tcl::randomseed]
+[key /dev/zero]
+[manpage modules/virtchannel_base/nullzero.man tcl::chan::nullzero]
+[manpage modules/virtchannel_base/tcllib_zero.man tcl::chan::zero]
+[key 3DES]
+[manpage modules/des/des.man des]
+[manpage modules/des/tcldes.man tclDES]
+[manpage modules/des/tcldesjr.man tclDESjr]
+[key {abstract syntax tree}]
+[manpage modules/grammar_me/me_util.man grammar::me::util]
+[manpage modules/grammar_me/me_ast.man grammar::me_ast]
+[key acceptance]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[key acceptor]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[key active]
+[manpage modules/transfer/connect.man transfer::connect]
+[key adaptors]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[key {adjacency list}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {adjacency matrix}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key adjacent]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key adjusting]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[key adler32]
+[manpage modules/virtchannel_transform/adler32.man tcl::transform::adler32]
+[key aes]
+[manpage modules/aes/aes.man aes]
+[key after]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key alias]
+[manpage modules/interp/tcllib_interp.man interp]
+[key amazon]
+[manpage modules/amazon-s3/S3.man S3]
+[key ambiguous]
+[manpage modules/grammar_aycock/aycock.man grammar::aycock]
+[key {American Express}]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[key AMEX]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[key angle]
+[manpage modules/math/math_geometry.man math::geometry]
+[manpage modules/units/units.man units]
+[key {anonymous procedure}]
+[manpage modules/lambda/lambda.man lambda]
+[key ansi]
+[manpage modules/term/ansi_cattr.man term::ansi::code::attr]
+[manpage modules/term/ansi_cctrl.man term::ansi::code::ctrl]
+[manpage modules/term/ansi_cmacros.man term::ansi::code::macros]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[key appender]
+[manpage modules/log/loggerAppender.man logger::appender]
+[manpage modules/log/loggerUtils.man logger::utils]
+[key application]
+[manpage apps/nns.man nns]
+[manpage apps/nnsd.man nnsd]
+[manpage apps/nnslog.man nnslog]
+[key {approximation algorithm}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key arc]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key arcfour]
+[manpage modules/rc4/rc4.man rc4]
+[key archive]
+[manpage modules/tar/tar.man tar]
+[key {argument integrity}]
+[manpage modules/tepam/tepam_introduction.man tepam]
+[manpage modules/tepam/tepam_procedure.man tepam::procedure]
+[key {argument processing}]
+[manpage modules/cmdline/cmdline.man cmdline]
+[key {argument validation}]
+[manpage modules/tepam/tepam_introduction.man tepam]
+[manpage modules/tepam/tepam_procedure.man tepam::procedure]
+[key arguments]
+[manpage modules/tepam/tepam_introduction.man tepam]
+[manpage modules/tepam/tepam_procedure.man tepam::procedure]
+[key argv]
+[manpage modules/cmdline/cmdline.man cmdline]
+[key argv0]
+[manpage modules/cmdline/cmdline.man cmdline]
+[key array]
+[manpage modules/tie/tie.man tie]
+[manpage modules/tie/tie_std.man tie]
+[key {articulation point}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key ascii85]
+[manpage modules/base64/ascii85.man ascii85]
+[key asn]
+[manpage modules/asn/asn.man asn]
+[key assembler]
+[manpage modules/grammar_me/gasm.man grammar::me::cpu::gasm]
+[key assert]
+[manpage modules/control/control.man control]
+[key assign]
+[manpage modules/struct/struct_list.man struct::list]
+[key AST]
+[manpage modules/grammar_me/me_ast.man grammar::me_ast]
+[key asynchronous]
+[manpage modules/cache/async.man cache::async]
+[key {attribute control}]
+[manpage modules/term/ansi_cattr.man term::ansi::code::attr]
+[manpage modules/term/ansi_cctrl.man term::ansi::code::ctrl]
+[key {augmenting network}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {augmenting path}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key authentication]
+[manpage modules/http/autoproxy.man autoproxy]
+[manpage modules/sasl/sasl.man SASL]
+[manpage modules/sasl/ntlm.man SASL::NTLM]
+[manpage modules/sasl/scram.man SASL::SCRAM]
+[manpage modules/sasl/gtoken.man SASL::XGoogleToken]
+[key automatic]
+[manpage modules/nns/nns_auto.man nameserv::auto]
+[key {automatic documentation}]
+[manpage modules/tepam/tepam_doc_gen.man tepam::doc_gen]
+[key automaton]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[key aycock]
+[manpage modules/grammar_aycock/aycock.man grammar::aycock]
+[key bank]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[manpage modules/valtype/iban.man valtype::iban]
+[key base32]
+[manpage modules/base32/base32.man base32]
+[manpage modules/base32/base32core.man base32::core]
+[manpage modules/base32/base32hex.man base32::hex]
+[key base64]
+[manpage modules/base64/base64.man base64]
+[manpage modules/virtchannel_transform/vt_base64.man tcl::transform::base64]
+[key bash]
+[manpage modules/string/token_shell.man string::token::shell]
+[key bee]
+[manpage modules/bee/bee.man bee]
+[key {bench language}]
+[manpage modules/bench/bench_intro.man bench_intro]
+[manpage modules/bench/bench_lang_intro.man bench_lang_intro]
+[manpage modules/bench/bench_lang_spec.man bench_lang_spec]
+[key benchmark]
+[manpage modules/bench/bench.man bench]
+[manpage modules/bench/bench_read.man bench::in]
+[manpage modules/bench/bench_wcsv.man bench::out::csv]
+[manpage modules/bench/bench_wtext.man bench::out::text]
+[manpage modules/bench/bench_intro.man bench_intro]
+[manpage modules/bench/bench_lang_intro.man bench_lang_intro]
+[manpage modules/bench/bench_lang_spec.man bench_lang_spec]
+[key ber]
+[manpage modules/asn/asn.man asn]
+[key {Bessel functions}]
+[manpage modules/math/special.man math::special]
+[key bfs]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key bibliography]
+[manpage modules/bibtex/bibtex.man bibtex]
+[key bibtex]
+[manpage modules/bibtex/bibtex.man bibtex]
+[key bignums]
+[manpage modules/math/bignum.man math::bignum]
+[key bind]
+[manpage modules/uev/uevent.man uevent]
+[key bipartite]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key BitTorrent]
+[manpage modules/bee/bee.man bee]
+[key bittorrent]
+[manpage modules/bee/bee.man bee]
+[key blanks]
+[manpage modules/textutil/repeat.man textutil::repeat]
+[key {block cipher}]
+[manpage modules/aes/aes.man aes]
+[manpage modules/blowfish/blowfish.man blowfish]
+[manpage modules/des/des.man des]
+[manpage modules/des/tcldes.man tclDES]
+[manpage modules/des/tcldesjr.man tclDESjr]
+[key {blocking flow}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key blowfish]
+[manpage modules/blowfish/blowfish.man blowfish]
+[key {Book Number}]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[key breadth-first]
+[manpage modules/struct/struct_tree.man struct::tree]
+[key bridge]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key BWidget]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[key C]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[key C++]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[manpage modules/stooop/stooop.man stooop]
+[manpage modules/stooop/switched.man switched]
+[key cache]
+[manpage modules/cache/async.man cache::async]
+[manpage modules/map/map_slippy_cache.man map::slippy::cache]
+[key {caesar cipher}]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[key calculus]
+[manpage modules/math/calculus.man math::calculus]
+[key callback]
+[manpage modules/cache/async.man cache::async]
+[manpage modules/hook/hook.man hook]
+[manpage modules/lambda/lambda.man lambda]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[manpage modules/uev/uevent_onidle.man uevent::onidle]
+[key callbacks]
+[manpage modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe]
+[key capitalize]
+[manpage modules/textutil/textutil_string.man textutil::string]
+[key {card for credit}]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[key cardinality]
+[manpage modules/struct/struct_set.man struct::set]
+[key cat]
+[manpage modules/fileutil/fileutil.man fileutil]
+[key {catalog package}]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[key catalogue]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[key cell-phone]
+[manpage modules/valtype/imei.man valtype::imei]
+[key cer]
+[manpage modules/asn/asn.man asn]
+[key CFG]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[key CFL]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[key CGI]
+[manpage modules/ncgi/ncgi.man ncgi]
+[key cgraph]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graph1.man struct::graph_v1]
+[key changelog]
+[manpage modules/doctools/changelog.man doctools::changelog]
+[manpage modules/doctools/cvs.man doctools::cvs]
+[key channel]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[manpage modules/transfer/connect.man transfer::connect]
+[manpage modules/transfer/copyops.man transfer::copy]
+[manpage modules/transfer/tqueue.man transfer::copy::queue]
+[manpage modules/transfer/ddest.man transfer::data::destination]
+[manpage modules/transfer/dsource.man transfer::data::source]
+[manpage modules/transfer/receiver.man transfer::receiver]
+[manpage modules/transfer/transmitter.man transfer::transmitter]
+[key {channel transformation}]
+[manpage modules/virtchannel_transform/adler32.man tcl::transform::adler32]
+[manpage modules/virtchannel_transform/vt_base64.man tcl::transform::base64]
+[manpage modules/virtchannel_transform/vt_counter.man tcl::transform::counter]
+[manpage modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32]
+[manpage modules/virtchannel_transform/hex.man tcl::transform::hex]
+[manpage modules/virtchannel_transform/identity.man tcl::transform::identity]
+[manpage modules/virtchannel_transform/limitsize.man tcl::transform::limitsize]
+[manpage modules/virtchannel_transform/observe.man tcl::transform::observe]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[manpage modules/virtchannel_transform/spacer.man tcl::transform::spacer]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[key {character input}]
+[manpage modules/term/receive.man term::receive]
+[manpage modules/term/term_bind.man term::receive::bind]
+[key {character output}]
+[manpage modules/term/ansi_send.man term::ansi::send]
+[manpage modules/term/term_send.man term::send]
+[key chat]
+[manpage modules/irc/irc.man irc]
+[manpage modules/multiplexer/multiplexer.man multiplexer]
+[manpage modules/irc/picoirc.man picoirc]
+[key checkbox]
+[manpage modules/html/html.man html]
+[manpage modules/javascript/javascript.man javascript]
+[key checkbutton]
+[manpage modules/html/html.man html]
+[key Checking]
+[manpage modules/valtype/valtype_common.man valtype::common]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/iban.man valtype::iban]
+[manpage modules/valtype/imei.man valtype::imei]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[manpage modules/valtype/luhn.man valtype::luhn]
+[manpage modules/valtype/luhn5.man valtype::luhn5]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[manpage modules/valtype/verhoeff.man valtype::verhoeff]
+[key checksum]
+[manpage modules/crc/cksum.man cksum]
+[manpage modules/crc/crc16.man crc16]
+[manpage modules/crc/crc32.man crc32]
+[manpage modules/crc/sum.man sum]
+[manpage modules/virtchannel_transform/adler32.man tcl::transform::adler32]
+[manpage modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32]
+[key chop]
+[manpage modules/textutil/textutil_string.man textutil::string]
+[key cipher]
+[manpage modules/pki/pki.man pki]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[key cksum]
+[manpage modules/crc/cksum.man cksum]
+[manpage modules/crc/crc16.man crc16]
+[manpage modules/crc/crc32.man crc32]
+[manpage modules/crc/sum.man sum]
+[key class]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[manpage modules/stooop/stooop.man stooop]
+[manpage modules/stooop/switched.man switched]
+[key {class methods}]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[key {class variables}]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[key cleanup]
+[manpage modules/defer/defer.man defer]
+[manpage modules/try/tcllib_try.man try]
+[key client]
+[manpage modules/nns/nns_client.man nameserv]
+[manpage modules/nns/nns_auto.man nameserv::auto]
+[manpage modules/nns/nns_common.man nameserv::common]
+[manpage apps/nns.man nns]
+[manpage modules/nns/nns_intro.man nns_intro]
+[manpage apps/nnslog.man nnslog]
+[key cloud]
+[manpage modules/amazon-s3/S3.man S3]
+[key {cmdline processing}]
+[manpage modules/cmdline/cmdline.man cmdline]
+[key {color control}]
+[manpage modules/term/ansi_cattr.man term::ansi::code::attr]
+[manpage modules/term/ansi_cctrl.man term::ansi::code::ctrl]
+[key columns]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[key comm]
+[manpage modules/comm/comm.man comm]
+[manpage modules/comm/comm_wire.man comm_wire]
+[manpage modules/interp/deleg_method.man deleg_method]
+[manpage modules/interp/deleg_proc.man deleg_proc]
+[manpage modules/nns/nns_protocol.man nameserv::protocol]
+[key command]
+[manpage modules/doctools2base/tcl_parse.man doctools::tcl::parse]
+[key {command line processing}]
+[manpage modules/cmdline/cmdline.man cmdline]
+[key {command prefix}]
+[manpage modules/lambda/lambda.man lambda]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[key comment]
+[manpage modules/jpeg/jpeg.man jpeg]
+[manpage modules/png/png.man png]
+[key common]
+[manpage modules/struct/struct_list.man struct::list]
+[key {common prefix}]
+[manpage modules/textutil/textutil_string.man textutil::string]
+[key communication]
+[manpage modules/comm/comm.man comm]
+[manpage modules/comm/comm_wire.man comm_wire]
+[key comparison]
+[manpage modules/struct/struct_list.man struct::list]
+[key {complete graph}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {complex numbers}]
+[manpage modules/math/qcomplex.man math::complexnumbers]
+[manpage modules/math/fourier.man math::fourier]
+[key compression]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[manpage modules/zip/encode.man zipfile::encode]
+[key computations]
+[manpage modules/math/bigfloat.man math::bigfloat]
+[key {concatenation channel}]
+[manpage modules/virtchannel_base/cat.man tcl::chan::cat]
+[manpage modules/virtchannel_base/facade.man tcl::chan::facade]
+[key {connected component}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {connected fifos}]
+[manpage modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2]
+[key connection]
+[manpage modules/transfer/connect.man transfer::connect]
+[key constants]
+[manpage modules/math/constants.man math::constants]
+[manpage modules/units/units.man units]
+[key CONTAINER]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[key contents]
+[manpage modules/doctools2toc/toc_introduction.man doctools2toc_introduction]
+[key {context-free grammar}]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[key {context-free languages}]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key control]
+[manpage modules/control/control.man control]
+[manpage modules/term/term.man term]
+[manpage modules/term/ansi_code.man term::ansi::code]
+[manpage modules/term/ansi_cattr.man term::ansi::code::attr]
+[manpage modules/term/ansi_cctrl.man term::ansi::code::ctrl]
+[manpage modules/term/ansi_cmacros.man term::ansi::code::macros]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[manpage modules/term/ansi_send.man term::ansi::send]
+[manpage modules/term/imenu.man term::interact::menu]
+[manpage modules/term/ipager.man term::interact::pager]
+[manpage modules/term/receive.man term::receive]
+[manpage modules/term/term_bind.man term::receive::bind]
+[manpage modules/term/term_send.man term::send]
+[key {control structure}]
+[manpage modules/generator/generator.man generator]
+[key conversion]
+[manpage modules/doctools/doctools.man doctools]
+[manpage modules/doctools2idx/idx_introduction.man doctools2idx_introduction]
+[manpage modules/doctools2toc/toc_introduction.man doctools2toc_introduction]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[manpage modules/math/roman.man math::roman]
+[manpage modules/doctools/mpexpand.man mpexpand]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage apps/tcldocstrip.man tcldocstrip]
+[manpage modules/units/units.man units]
+[key cooked]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[key cookie]
+[manpage modules/ncgi/ncgi.man ncgi]
+[key copy]
+[manpage modules/fileutil/multi.man fileutil::multi]
+[manpage modules/fileutil/multiop.man fileutil::multi::op]
+[manpage modules/transfer/copyops.man transfer::copy]
+[manpage modules/transfer/tqueue.man transfer::copy::queue]
+[manpage modules/transfer/ddest.man transfer::data::destination]
+[manpage modules/transfer/dsource.man transfer::data::source]
+[manpage modules/transfer/receiver.man transfer::receiver]
+[manpage modules/transfer/transmitter.man transfer::transmitter]
+[key coroutine]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[manpage modules/generator/generator.man generator]
+[key Cost]
+[manpage modules/treeql/treeql.man treeql]
+[key counter]
+[manpage modules/virtchannel_transform/vt_counter.man tcl::transform::counter]
+[key counting]
+[manpage modules/counter/counter.man counter]
+[key CPARAM]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[key crc]
+[manpage modules/crc/cksum.man cksum]
+[manpage modules/crc/crc16.man crc16]
+[manpage modules/crc/crc32.man crc32]
+[manpage modules/crc/sum.man sum]
+[key crc16]
+[manpage modules/crc/crc16.man crc16]
+[key crc32]
+[manpage modules/crc/cksum.man cksum]
+[manpage modules/crc/crc16.man crc16]
+[manpage modules/crc/crc32.man crc32]
+[manpage modules/crc/sum.man sum]
+[manpage modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32]
+[key {credit card}]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[key cron]
+[manpage modules/cron/cron.man cron]
+[key cryptography]
+[manpage modules/blowfish/blowfish.man blowfish]
+[key CSS]
+[manpage modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults]
+[key csv]
+[manpage modules/bench/bench_read.man bench::in]
+[manpage modules/bench/bench_wcsv.man bench::out::csv]
+[manpage modules/csv/csv.man csv]
+[key currying]
+[manpage modules/lambda/lambda.man lambda]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[key {cut edge}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {cut vertex}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key CVS]
+[manpage modules/rcs/rcs.man rcs]
+[key cvs]
+[manpage modules/doctools/cvs.man doctools::cvs]
+[key {cvs log}]
+[manpage modules/doctools/cvs.man doctools::cvs]
+[key {cyclic redundancy check}]
+[manpage modules/crc/cksum.man cksum]
+[manpage modules/crc/crc16.man crc16]
+[manpage modules/crc/crc32.man crc32]
+[manpage modules/crc/sum.man sum]
+[key {data analysis}]
+[manpage modules/math/statistics.man math::statistics]
+[key {data destination}]
+[manpage modules/transfer/ddest.man transfer::data::destination]
+[manpage modules/transfer/receiver.man transfer::receiver]
+[key {data entry form}]
+[manpage modules/tepam/tepam_argument_dialogbox.man tepam::argument_dialogbox]
+[key {data exchange}]
+[manpage modules/yaml/huddle.man huddle]
+[manpage modules/json/json.man json]
+[manpage modules/json/json_write.man json::write]
+[manpage modules/yaml/yaml.man yaml]
+[key {data integrity}]
+[manpage modules/aes/aes.man aes]
+[manpage modules/crc/cksum.man cksum]
+[manpage modules/crc/crc16.man crc16]
+[manpage modules/crc/crc32.man crc32]
+[manpage modules/des/des.man des]
+[manpage modules/pki/pki.man pki]
+[manpage modules/rc4/rc4.man rc4]
+[manpage modules/crc/sum.man sum]
+[manpage modules/des/tcldes.man tclDES]
+[manpage modules/des/tcldesjr.man tclDESjr]
+[key {data source}]
+[manpage modules/transfer/dsource.man transfer::data::source]
+[manpage modules/transfer/transmitter.man transfer::transmitter]
+[key {data structures}]
+[manpage modules/struct/record.man struct::record]
+[key database]
+[manpage modules/tie/tie.man tie]
+[manpage modules/tie/tie_std.man tie]
+[key dataflow]
+[manpage modules/page/page_util_flow.man page_util_flow]
+[key DE]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[key debug]
+[manpage modules/debug/debug.man debug]
+[manpage modules/debug/debug_caller.man debug::caller]
+[manpage modules/debug/debug_heartbeat.man debug::heartbeat]
+[manpage modules/debug/debug_timestamp.man debug::timestamp]
+[key decimal]
+[manpage modules/math/decimal.man math::decimal]
+[key declare]
+[manpage modules/term/ansi_code.man term::ansi::code]
+[key decompression]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[manpage modules/zip/decode.man zipfile::decode]
+[manpage modules/zip/mkzip.man zipfile::mkzip]
+[key decryption]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[key deferal]
+[manpage modules/uev/uevent_onidle.man uevent::onidle]
+[key define]
+[manpage modules/term/ansi_code.man term::ansi::code]
+[key degree]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {degree constrained spanning tree}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key degrees]
+[manpage modules/math/constants.man math::constants]
+[key delegation]
+[manpage modules/interp/deleg_method.man deleg_method]
+[manpage modules/interp/deleg_proc.man deleg_proc]
+[key depth-first]
+[manpage modules/struct/struct_tree.man struct::tree]
+[key der]
+[manpage modules/asn/asn.man asn]
+[key DES]
+[manpage modules/des/des.man des]
+[manpage modules/des/tcldes.man tclDES]
+[manpage modules/des/tcldesjr.man tclDESjr]
+[key deserialization]
+[manpage modules/doctools2idx/import_docidx.man doctools::idx::import::docidx]
+[manpage modules/doctools2idx/idx_import_json.man doctools::idx::import::json]
+[manpage modules/doctools2idx/idx_structure.man doctools::idx::structure]
+[manpage modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc]
+[manpage modules/doctools2toc/toc_import_json.man doctools::toc::import::json]
+[manpage modules/doctools2toc/toc_structure.man doctools::toc::structure]
+[key diameter]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key dict]
+[manpage modules/dicttool/dicttool.man dicttool]
+[key diff]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[manpage modules/struct/struct_list.man struct::list]
+[key {diff -n format}]
+[manpage modules/rcs/rcs.man rcs]
+[key difference]
+[manpage modules/struct/struct_set.man struct::set]
+[key differential]
+[manpage modules/struct/struct_list.man struct::list]
+[key {differential equations}]
+[manpage modules/math/calculus.man math::calculus]
+[key dijkstra]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {directory access}]
+[manpage modules/ldap/ldap.man ldap]
+[manpage modules/ldap/ldapx.man ldapx]
+[key {directory traversal}]
+[manpage modules/fileutil/traverse.man fileutil_traverse]
+[key Discover]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[key {discrete items}]
+[manpage modules/struct/pool.man struct::pool]
+[key {disjoint set}]
+[manpage modules/struct/disjointset.man struct::disjointset]
+[key dispatcher]
+[manpage modules/term/term_bind.man term::receive::bind]
+[key distance]
+[manpage modules/math/math_geometry.man math::geometry]
+[manpage modules/struct/graphops.man struct::graph::op]
+[manpage modules/units/units.man units]
+[key DNS]
+[manpage modules/dns/tcllib_dns.man dns]
+[key do]
+[manpage modules/control/control.man control]
+[key docidx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/export_docidx.man doctools::idx::export::docidx]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2idx/import_docidx.man doctools::idx::import::docidx]
+[manpage modules/doctools2idx/idx_parse.man doctools::idx::parse]
+[manpage modules/doctools2idx/idx_structure.man doctools::idx::structure]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[key {docidx commands}]
+[manpage modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref]
+[manpage modules/doctools/docidx_lang_faq.man docidx_lang_faq]
+[manpage modules/doctools/docidx_lang_intro.man docidx_lang_intro]
+[manpage modules/doctools/docidx_lang_syntax.man docidx_lang_syntax]
+[key {docidx language}]
+[manpage modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref]
+[manpage modules/doctools/docidx_lang_faq.man docidx_lang_faq]
+[manpage modules/doctools/docidx_lang_intro.man docidx_lang_intro]
+[manpage modules/doctools/docidx_lang_syntax.man docidx_lang_syntax]
+[key {docidx markup}]
+[manpage modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref]
+[manpage modules/doctools/docidx_lang_faq.man docidx_lang_faq]
+[manpage modules/doctools/docidx_lang_intro.man docidx_lang_intro]
+[manpage modules/doctools/docidx_lang_syntax.man docidx_lang_syntax]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[key {docidx syntax}]
+[manpage modules/doctools/docidx_lang_faq.man docidx_lang_faq]
+[manpage modules/doctools/docidx_lang_intro.man docidx_lang_intro]
+[manpage modules/doctools/docidx_lang_syntax.man docidx_lang_syntax]
+[key docstrip]
+[manpage modules/docstrip/docstrip.man docstrip]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[manpage apps/tcldocstrip.man tcldocstrip]
+[key doctoc]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc]
+[manpage modules/doctools2toc/toc_parse.man doctools::toc::parse]
+[manpage modules/doctools2toc/toc_structure.man doctools::toc::structure]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[key {doctoc commands}]
+[manpage modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref]
+[manpage modules/doctools/doctoc_lang_faq.man doctoc_lang_faq]
+[manpage modules/doctools/doctoc_lang_intro.man doctoc_lang_intro]
+[manpage modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax]
+[key {doctoc language}]
+[manpage modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref]
+[manpage modules/doctools/doctoc_lang_faq.man doctoc_lang_faq]
+[manpage modules/doctools/doctoc_lang_intro.man doctoc_lang_intro]
+[manpage modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax]
+[key {doctoc markup}]
+[manpage modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref]
+[manpage modules/doctools/doctoc_lang_faq.man doctoc_lang_faq]
+[manpage modules/doctools/doctoc_lang_intro.man doctoc_lang_intro]
+[manpage modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[key {doctoc syntax}]
+[manpage modules/doctools/doctoc_lang_faq.man doctoc_lang_faq]
+[manpage modules/doctools/doctoc_lang_intro.man doctoc_lang_intro]
+[manpage modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax]
+[key doctools]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[manpage modules/doctools/changelog.man doctools::changelog]
+[manpage modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults]
+[manpage modules/doctools2idx/export_docidx.man doctools::idx::export::docidx]
+[manpage modules/doctools2idx/idx_export_html.man doctools::idx::export::html]
+[manpage modules/doctools2idx/idx_export_json.man doctools::idx::export::json]
+[manpage modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff]
+[manpage modules/doctools2idx/idx_export_text.man doctools::idx::export::text]
+[manpage modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki]
+[manpage modules/doctools2idx/import_docidx.man doctools::idx::import::docidx]
+[manpage modules/doctools2idx/idx_import_json.man doctools::idx::import::json]
+[manpage modules/doctools2idx/idx_parse.man doctools::idx::parse]
+[manpage modules/doctools2idx/idx_structure.man doctools::idx::structure]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[manpage modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros]
+[manpage modules/doctools2base/tcl_parse.man doctools::tcl::parse]
+[manpage modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc]
+[manpage modules/doctools2toc/toc_export_html.man doctools::toc::export::html]
+[manpage modules/doctools2toc/toc_export_json.man doctools::toc::export::json]
+[manpage modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff]
+[manpage modules/doctools2toc/toc_export_text.man doctools::toc::export::text]
+[manpage modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki]
+[manpage modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc]
+[manpage modules/doctools2toc/toc_import_json.man doctools::toc::import::json]
+[manpage modules/doctools2toc/toc_parse.man doctools::toc::parse]
+[manpage modules/doctools2toc/toc_structure.man doctools::toc::structure]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[key {doctools commands}]
+[manpage modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref]
+[manpage modules/doctools/doctools_lang_faq.man doctools_lang_faq]
+[manpage modules/doctools/doctools_lang_intro.man doctools_lang_intro]
+[manpage modules/doctools/doctools_lang_syntax.man doctools_lang_syntax]
+[key {doctools language}]
+[manpage modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref]
+[manpage modules/doctools/doctools_lang_faq.man doctools_lang_faq]
+[manpage modules/doctools/doctools_lang_intro.man doctools_lang_intro]
+[manpage modules/doctools/doctools_lang_syntax.man doctools_lang_syntax]
+[key {doctools markup}]
+[manpage modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref]
+[manpage modules/doctools/doctools_lang_faq.man doctools_lang_faq]
+[manpage modules/doctools/doctools_lang_intro.man doctools_lang_intro]
+[manpage modules/doctools/doctools_lang_syntax.man doctools_lang_syntax]
+[key {doctools syntax}]
+[manpage modules/doctools/doctools_lang_faq.man doctools_lang_faq]
+[manpage modules/doctools/doctools_lang_intro.man doctools_lang_intro]
+[manpage modules/doctools/doctools_lang_syntax.man doctools_lang_syntax]
+[key document]
+[manpage modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref]
+[key documentation]
+[manpage modules/docstrip/docstrip.man docstrip]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[manpage modules/doctools/doctools.man doctools]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage apps/tcldocstrip.man tcldocstrip]
+[manpage modules/tepam/tepam_doc_gen.man tepam::doc_gen]
+[key DOM]
+[manpage modules/treeql/treeql.man treeql]
+[key dom]
+[manpage modules/amazon-s3/xsxp.man xsxp]
+[key {domain name service}]
+[manpage modules/dns/tcllib_dns.man dns]
+[key e]
+[manpage modules/math/constants.man math::constants]
+[key EAN]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[key EAN13]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[key earley]
+[manpage modules/grammar_aycock/aycock.man grammar::aycock]
+[key EBNF]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key eccentricity]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key edge]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key emacs]
+[manpage modules/doctools/changelog.man doctools::changelog]
+[manpage modules/doctools/cvs.man doctools::cvs]
+[key email]
+[manpage modules/imap4/imap4.man imap4]
+[manpage modules/mime/mime.man mime]
+[manpage modules/pop3/pop3.man pop3]
+[manpage modules/mime/smtp.man smtp]
+[key emptiness]
+[manpage modules/struct/struct_set.man struct::set]
+[key {empty interpreter}]
+[manpage modules/interp/tcllib_interp.man interp]
+[key EN]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[key encoding]
+[manpage modules/base64/ascii85.man ascii85]
+[manpage modules/base64/base64.man base64]
+[manpage modules/base64/uuencode.man uuencode]
+[manpage modules/base64/yencode.man yencode]
+[key encryption]
+[manpage modules/aes/aes.man aes]
+[manpage modules/blowfish/blowfish.man blowfish]
+[manpage modules/des/des.man des]
+[manpage modules/pki/pki.man pki]
+[manpage modules/rc4/rc4.man rc4]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[manpage modules/des/tcldes.man tclDES]
+[manpage modules/des/tcldesjr.man tclDESjr]
+[key {entry mask}]
+[manpage modules/tepam/tepam_introduction.man tepam]
+[key equal]
+[manpage modules/struct/struct_list.man struct::list]
+[key equality]
+[manpage modules/struct/struct_list.man struct::list]
+[key {equivalence class}]
+[manpage modules/struct/disjointset.man struct::disjointset]
+[key error]
+[manpage modules/try/tcllib_throw.man throw]
+[manpage modules/try/tcllib_try.man try]
+[key {error function}]
+[manpage modules/math/special.man math::special]
+[key {European Article Number}]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[key event]
+[manpage modules/hook/hook.man hook]
+[manpage modules/uev/uevent.man uevent]
+[manpage modules/uev/uevent_onidle.man uevent::onidle]
+[key {event management}]
+[manpage modules/virtchannel_core/events.man tcl::chan::events]
+[key events]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key examples]
+[manpage modules/bench/bench_lang_intro.man bench_lang_intro]
+[manpage modules/doctools/docidx_lang_faq.man docidx_lang_faq]
+[manpage modules/doctools/doctoc_lang_faq.man doctoc_lang_faq]
+[manpage modules/doctools/doctools_lang_faq.man doctools_lang_faq]
+[key exception]
+[manpage modules/try/tcllib_try.man try]
+[key {exchange format}]
+[manpage modules/yaml/huddle.man huddle]
+[manpage modules/json/json.man json]
+[manpage modules/json/json_write.man json::write]
+[key exclusion]
+[manpage modules/struct/struct_set.man struct::set]
+[key execution]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[key exif]
+[manpage modules/jpeg/jpeg.man jpeg]
+[key exit]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key export]
+[manpage modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/export_docidx.man doctools::idx::export::docidx]
+[manpage modules/doctools2idx/idx_export_html.man doctools::idx::export::html]
+[manpage modules/doctools2idx/idx_export_json.man doctools::idx::export::json]
+[manpage modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff]
+[manpage modules/doctools2idx/idx_export_text.man doctools::idx::export::text]
+[manpage modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki]
+[manpage modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc]
+[manpage modules/doctools2toc/toc_export_html.man doctools::toc::export::html]
+[manpage modules/doctools2toc/toc_export_json.man doctools::toc::export::json]
+[manpage modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff]
+[manpage modules/doctools2toc/toc_export_text.man doctools::toc::export::text]
+[manpage modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[key expression]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key {extended namespace}]
+[manpage modules/namespacex/namespacex.man namespacex]
+[key faq]
+[manpage modules/doctools/docidx_lang_faq.man docidx_lang_faq]
+[manpage modules/doctools/doctoc_lang_faq.man doctoc_lang_faq]
+[manpage modules/doctools/doctools_lang_faq.man doctools_lang_faq]
+[key {fetching information}]
+[manpage modules/uri/uri.man uri]
+[key FFT]
+[manpage modules/math/fourier.man math::fourier]
+[key fifo]
+[manpage modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo]
+[manpage modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2]
+[manpage modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe]
+[key file]
+[manpage modules/tie/tie.man tie]
+[manpage modules/tie/tie_std.man tie]
+[manpage modules/uri/uri.man uri]
+[key {file recognition}]
+[manpage modules/fumagic/cfront.man fileutil::magic::cfront]
+[manpage modules/fumagic/cgen.man fileutil::magic::cgen]
+[manpage modules/fumagic/filetypes.man fileutil::magic::filetype]
+[manpage modules/fumagic/rtcore.man fileutil::magic::rt]
+[key {file type}]
+[manpage modules/fumagic/cfront.man fileutil::magic::cfront]
+[manpage modules/fumagic/cgen.man fileutil::magic::cgen]
+[manpage modules/fumagic/filetypes.man fileutil::magic::filetype]
+[manpage modules/fumagic/rtcore.man fileutil::magic::rt]
+[key {file utilities}]
+[manpage modules/fileutil/fileutil.man fileutil]
+[manpage modules/fumagic/cfront.man fileutil::magic::cfront]
+[manpage modules/fumagic/cgen.man fileutil::magic::cgen]
+[manpage modules/fumagic/filetypes.man fileutil::magic::filetype]
+[manpage modules/fumagic/rtcore.man fileutil::magic::rt]
+[manpage modules/fileutil/multi.man fileutil::multi]
+[manpage modules/fileutil/multiop.man fileutil::multi::op]
+[key filesystem]
+[manpage modules/map/map_slippy_cache.man map::slippy::cache]
+[key filter]
+[manpage modules/generator/generator.man generator]
+[manpage modules/struct/struct_list.man struct::list]
+[key final]
+[manpage modules/try/tcllib_try.man try]
+[key finance]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[manpage modules/valtype/iban.man valtype::iban]
+[key find]
+[manpage modules/struct/disjointset.man struct::disjointset]
+[key finite]
+[manpage modules/struct/pool.man struct::pool]
+[key {finite automaton}]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[key {FIPS 180-1}]
+[manpage modules/sha1/sha1.man sha1]
+[manpage modules/sha1/sha256.man sha256]
+[key {first permutation}]
+[manpage modules/struct/struct_list.man struct::list]
+[key Fisher-Yates]
+[manpage modules/struct/struct_list.man struct::list]
+[key flatten]
+[manpage modules/struct/struct_list.man struct::list]
+[key floating-point]
+[manpage modules/math/bigfloat.man math::bigfloat]
+[manpage modules/math/fuzzy.man math::fuzzy]
+[key flow]
+[manpage modules/control/control.man control]
+[key {flow network}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key folding]
+[manpage modules/struct/struct_list.man struct::list]
+[key foldl]
+[manpage modules/generator/generator.man generator]
+[key foldr]
+[manpage modules/generator/generator.man generator]
+[key foreach]
+[manpage modules/generator/generator.man generator]
+[key form]
+[manpage modules/html/html.man html]
+[manpage modules/ncgi/ncgi.man ncgi]
+[key {format conversion}]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[key formatter]
+[manpage modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref]
+[key formatting]
+[manpage modules/bench/bench_read.man bench::in]
+[manpage modules/bench/bench_wcsv.man bench::out::csv]
+[manpage modules/bench/bench_wtext.man bench::out::text]
+[manpage modules/doctools2idx/idx_introduction.man doctools2idx_introduction]
+[manpage modules/doctools2toc/toc_introduction.man doctools2toc_introduction]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/textutil/textutil.man textutil]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[manpage modules/textutil/textutil_string.man textutil::string]
+[manpage modules/textutil/tabify.man textutil::tabify]
+[key {formatting engine}]
+[manpage modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref]
+[manpage modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref]
+[manpage modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref]
+[key {Fourier transform}]
+[manpage modules/math/fourier.man math::fourier]
+[key FR]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[key frame]
+[manpage modules/term/ansi_cmacros.man term::ansi::code::macros]
+[key framework]
+[manpage modules/tool/tool.man tool]
+[key ftp]
+[manpage modules/ftp/ftp.man ftp]
+[manpage modules/ftp/ftp_geturl.man ftp::geturl]
+[manpage modules/ftpd/ftpd.man ftpd]
+[manpage modules/uri/uri.man uri]
+[key ftpd]
+[manpage modules/ftpd/ftpd.man ftpd]
+[key ftpserver]
+[manpage modules/ftpd/ftpd.man ftpd]
+[key {full outer join}]
+[manpage modules/struct/struct_list.man struct::list]
+[key {generate event}]
+[manpage modules/uev/uevent.man uevent]
+[key {generate permutations}]
+[manpage modules/struct/struct_list.man struct::list]
+[key generation]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[key generator]
+[manpage modules/generator/generator.man generator]
+[key geocoding]
+[manpage modules/map/map_geocode_nominatim.man map::geocode::nominatim]
+[key geodesy]
+[manpage modules/map/map_slippy.man map::slippy]
+[manpage modules/mapproj/mapproj.man mapproj]
+[key geography]
+[manpage modules/map/map_slippy.man map::slippy]
+[key {get character}]
+[manpage modules/term/receive.man term::receive]
+[key gets]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key global]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key golang]
+[manpage modules/defer/defer.man defer]
+[key gopher]
+[manpage modules/uri/uri.man uri]
+[key gps]
+[manpage modules/gpx/gpx.man gpx]
+[manpage modules/nmea/nmea.man nmea]
+[key gpx]
+[manpage modules/gpx/gpx.man gpx]
+[key grammar]
+[manpage modules/grammar_aycock/aycock.man grammar::aycock]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[manpage modules/grammar_me/me_cpu.man grammar::me::cpu]
+[manpage modules/grammar_me/me_cpucore.man grammar::me::cpu::core]
+[manpage modules/grammar_me/gasm.man grammar::me::cpu::gasm]
+[manpage modules/grammar_me/me_tcl.man grammar::me::tcl]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_me/me_vm.man grammar::me_vm]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key graph]
+[manpage modules/grammar_me/gasm.man grammar::me::cpu::gasm]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[manpage modules/struct/graph1.man struct::graph_v1]
+[manpage modules/struct/queue.man struct::queue]
+[manpage modules/struct/stack.man struct::stack]
+[key {graph walking}]
+[manpage modules/page/page_util_flow.man page_util_flow]
+[manpage modules/page/page_util_norm_lemon.man page_util_norm_lemon]
+[manpage modules/page/page_util_norm_peg.man page_util_norm_peg]
+[key {green threads}]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key grep]
+[manpage modules/fileutil/fileutil.man fileutil]
+[key GUID]
+[manpage modules/uuid/uuid.man uuid]
+[key hashing]
+[manpage modules/md4/md4.man md4]
+[manpage modules/md5/md5.man md5]
+[manpage modules/md5crypt/md5crypt.man md5crypt]
+[manpage modules/otp/otp.man otp]
+[manpage modules/ripemd/ripemd128.man ripemd128]
+[manpage modules/ripemd/ripemd160.man ripemd160]
+[manpage modules/sha1/sha1.man sha1]
+[manpage modules/sha1/sha256.man sha256]
+[key heartbeat]
+[manpage modules/debug/debug_heartbeat.man debug::heartbeat]
+[key heuristic]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key hex]
+[manpage modules/base32/base32hex.man base32::hex]
+[key hexadecimal]
+[manpage modules/virtchannel_transform/hex.man tcl::transform::hex]
+[key histogram]
+[manpage modules/counter/counter.man counter]
+[key hook]
+[manpage modules/hook/hook.man hook]
+[manpage modules/uev/uevent.man uevent]
+[key horspool]
+[manpage modules/grammar_aycock/aycock.man grammar::aycock]
+[key HTML]
+[manpage modules/doctools/doctools.man doctools]
+[manpage modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_export_html.man doctools::idx::export::html]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_export_html.man doctools::toc::export::html]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[manpage modules/doctools/mpexpand.man mpexpand]
+[key html]
+[manpage modules/html/html.man html]
+[manpage modules/htmlparse/htmlparse.man htmlparse]
+[manpage modules/javascript/javascript.man javascript]
+[manpage modules/ncgi/ncgi.man ncgi]
+[key http]
+[manpage modules/http/autoproxy.man autoproxy]
+[manpage modules/map/map_geocode_nominatim.man map::geocode::nominatim]
+[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
+[manpage modules/httpd/httpd.man tool]
+[manpage modules/uri/uri.man uri]
+[manpage modules/websocket/websocket.man websocket]
+[key httpd]
+[manpage modules/httpd/httpd.man tool]
+[key https]
+[manpage modules/uri/uri.man uri]
+[key httpserver]
+[manpage modules/httpd/httpd.man tool]
+[key huddle]
+[manpage modules/yaml/huddle.man huddle]
+[manpage modules/yaml/yaml.man yaml]
+[key {human readable}]
+[manpage modules/bench/bench_read.man bench::in]
+[manpage modules/bench/bench_wtext.man bench::out::text]
+[key hyphenation]
+[manpage modules/textutil/textutil.man textutil]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[key i18n]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[key IBAN]
+[manpage modules/valtype/iban.man valtype::iban]
+[key ident]
+[manpage modules/ident/ident.man ident]
+[key identification]
+[manpage modules/ident/ident.man ident]
+[key identity]
+[manpage modules/virtchannel_transform/identity.man tcl::transform::identity]
+[key idle]
+[manpage modules/uev/uevent_onidle.man uevent::onidle]
+[key image]
+[manpage modules/jpeg/jpeg.man jpeg]
+[manpage modules/png/png.man png]
+[manpage modules/tiff/tiff.man tiff]
+[key imap]
+[manpage modules/imap4/imap4.man imap4]
+[key IMEI]
+[manpage modules/valtype/imei.man valtype::imei]
+[key import]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2idx/import_docidx.man doctools::idx::import::docidx]
+[manpage modules/doctools2idx/idx_import_json.man doctools::idx::import::json]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc]
+[manpage modules/doctools2toc/toc_import_json.man doctools::toc::import::json]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[key {in-memory channel}]
+[manpage modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo]
+[manpage modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2]
+[manpage modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe]
+[manpage modules/virtchannel_base/tcllib_memchan.man tcl::chan::memchan]
+[manpage modules/virtchannel_base/tcllib_string.man tcl::chan::string]
+[manpage modules/virtchannel_base/tcllib_variable.man tcl::chan::variable]
+[key in-order]
+[manpage modules/struct/struct_tree.man struct::tree]
+[key inclusion]
+[manpage modules/struct/struct_set.man struct::set]
+[key {Incr Tcl}]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[key indenting]
+[manpage modules/textutil/textutil.man textutil]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[key {independent set}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key index]
+[manpage modules/doctools/docidx_intro.man docidx_intro]
+[manpage modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref]
+[manpage modules/doctools2idx/idx_introduction.man doctools2idx_introduction]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/export_docidx.man doctools::idx::export::docidx]
+[manpage modules/doctools2idx/idx_export_html.man doctools::idx::export::html]
+[manpage modules/doctools2idx/idx_export_json.man doctools::idx::export::json]
+[manpage modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff]
+[manpage modules/doctools2idx/idx_export_text.man doctools::idx::export::text]
+[manpage modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2idx/import_docidx.man doctools::idx::import::docidx]
+[manpage modules/doctools2idx/idx_import_json.man doctools::idx::import::json]
+[key {index formatter}]
+[manpage modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref]
+[key info]
+[manpage modules/namespacex/namespacex.man namespacex]
+[key {inner join}]
+[manpage modules/struct/struct_list.man struct::list]
+[key {input mode}]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[key integer]
+[manpage modules/math/roman.man math::roman]
+[key integration]
+[manpage modules/math/calculus.man math::calculus]
+[key {inter-thread communication}]
+[manpage modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2]
+[key {International Article Number}]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[key {International Bank Account Number}]
+[manpage modules/valtype/iban.man valtype::iban]
+[key {International Mobile Equipment Identity}]
+[manpage modules/valtype/imei.man valtype::imei]
+[key {International Standard Book Number}]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[key internationalization]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[key internet]
+[manpage modules/asn/asn.man asn]
+[manpage modules/ftp/ftp.man ftp]
+[manpage modules/ftp/ftp_geturl.man ftp::geturl]
+[manpage modules/imap4/imap4.man imap4]
+[manpage modules/ldap/ldap.man ldap]
+[manpage modules/ldap/ldapx.man ldapx]
+[manpage modules/mime/mime.man mime]
+[manpage modules/pop3d/pop3d.man pop3d]
+[manpage modules/pop3d/pop3d_dbox.man pop3d::dbox]
+[manpage modules/pop3d/pop3d_udb.man pop3d::udb]
+[manpage modules/mime/smtp.man smtp]
+[manpage modules/websocket/websocket.man websocket]
+[key {internet address}]
+[manpage modules/dns/tcllib_ip.man tcllib_ip]
+[key interpolation]
+[manpage modules/math/interpolate.man math::interpolate]
+[key interpreter]
+[manpage modules/interp/deleg_method.man deleg_method]
+[manpage modules/interp/deleg_proc.man deleg_proc]
+[manpage modules/interp/tcllib_interp.man interp]
+[manpage modules/wip/wip.man wip]
+[key intersection]
+[manpage modules/struct/struct_set.man struct::set]
+[key interval]
+[manpage modules/math/bigfloat.man math::bigfloat]
+[key ip]
+[manpage modules/dns/tcllib_ip.man tcllib_ip]
+[key ipc]
+[manpage modules/comm/comm.man comm]
+[manpage modules/comm/comm_wire.man comm_wire]
+[key ipv4]
+[manpage modules/dns/tcllib_ip.man tcllib_ip]
+[key ipv6]
+[manpage modules/dns/tcllib_ip.man tcllib_ip]
+[key irc]
+[manpage modules/irc/irc.man irc]
+[manpage modules/irc/picoirc.man picoirc]
+[key isA]
+[manpage modules/valtype/valtype_common.man valtype::common]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/iban.man valtype::iban]
+[manpage modules/valtype/imei.man valtype::imei]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[manpage modules/valtype/luhn.man valtype::luhn]
+[manpage modules/valtype/luhn5.man valtype::luhn5]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[manpage modules/valtype/verhoeff.man valtype::verhoeff]
+[key ISBN]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[key isthmus]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key iterator]
+[manpage modules/generator/generator.man generator]
+[key javascript]
+[manpage modules/javascript/javascript.man javascript]
+[manpage modules/json/json.man json]
+[manpage modules/json/json_write.man json::write]
+[key jfif]
+[manpage modules/jpeg/jpeg.man jpeg]
+[key join]
+[manpage modules/struct/struct_list.man struct::list]
+[key jpeg]
+[manpage modules/jpeg/jpeg.man jpeg]
+[key JSON]
+[manpage modules/doctools2idx/idx_export_json.man doctools::idx::export::json]
+[manpage modules/doctools2idx/idx_import_json.man doctools::idx::import::json]
+[manpage modules/doctools2toc/toc_export_json.man doctools::toc::export::json]
+[manpage modules/doctools2toc/toc_import_json.man doctools::toc::import::json]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[key json]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/yaml/huddle.man huddle]
+[manpage modules/json/json.man json]
+[manpage modules/json/json_write.man json::write]
+[key justification]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[key {keyword index}]
+[manpage modules/doctools/docidx_intro.man docidx_intro]
+[manpage modules/doctools2idx/idx_introduction.man doctools2idx_introduction]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[key keywords]
+[manpage modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref]
+[key knuth]
+[manpage modules/soundex/soundex.man soundex]
+[key l10n]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[key lambda]
+[manpage modules/lambda/lambda.man lambda]
+[key LaTeX]
+[manpage modules/docstrip/docstrip.man docstrip]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[manpage apps/tcldocstrip.man tcldocstrip]
+[key latex]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[key latitute]
+[manpage modules/map/map_slippy.man map::slippy]
+[key ldap]
+[manpage modules/ldap/ldap.man ldap]
+[manpage modules/ldap/ldapx.man ldapx]
+[manpage modules/uri/uri.man uri]
+[key {ldap client}]
+[manpage modules/ldap/ldap.man ldap]
+[manpage modules/ldap/ldapx.man ldapx]
+[key ldif]
+[manpage modules/ldap/ldapx.man ldapx]
+[key {least squares}]
+[manpage modules/math/linalg.man math::linearalgebra]
+[key {left outer join}]
+[manpage modules/struct/struct_list.man struct::list]
+[key lemon]
+[manpage modules/page/page_util_norm_lemon.man page_util_norm_lemon]
+[key {level graph}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key lexer]
+[manpage modules/doctools2idx/idx_parse.man doctools::idx::parse]
+[manpage modules/doctools2toc/toc_parse.man doctools::toc::parse]
+[key lexing]
+[manpage modules/string/token.man string::token]
+[manpage modules/string/token_shell.man string::token::shell]
+[key limitsize]
+[manpage modules/virtchannel_transform/limitsize.man tcl::transform::limitsize]
+[key line]
+[manpage modules/math/math_geometry.man math::geometry]
+[key {linear algebra}]
+[manpage modules/math/linalg.man math::linearalgebra]
+[key {linear equations}]
+[manpage modules/math/linalg.man math::linearalgebra]
+[key {linear program}]
+[manpage modules/math/optimize.man math::optimize]
+[key lines]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[key list]
+[manpage modules/struct/struct_list.man struct::list]
+[manpage modules/struct/queue.man struct::queue]
+[manpage modules/wip/wip.man wip]
+[key listener]
+[manpage modules/term/receive.man term::receive]
+[manpage modules/term/term_bind.man term::receive::bind]
+[key {literate programming}]
+[manpage modules/docstrip/docstrip.man docstrip]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[manpage apps/tcldocstrip.man tcldocstrip]
+[key LL(k)]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key {local searching}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key localization]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[key location]
+[manpage modules/map/map_geocode_nominatim.man map::geocode::nominatim]
+[manpage modules/map/map_slippy.man map::slippy]
+[manpage modules/map/map_slippy_cache.man map::slippy::cache]
+[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
+[key log]
+[manpage modules/debug/debug.man debug]
+[manpage modules/debug/debug_caller.man debug::caller]
+[manpage modules/debug/debug_heartbeat.man debug::heartbeat]
+[manpage modules/debug/debug_timestamp.man debug::timestamp]
+[manpage modules/doctools/cvs.man doctools::cvs]
+[manpage modules/log/log.man log]
+[manpage modules/log/logger.man logger]
+[key {log level}]
+[manpage modules/log/log.man log]
+[manpage modules/log/logger.man logger]
+[key logger]
+[manpage modules/log/logger.man logger]
+[manpage modules/log/loggerAppender.man logger::appender]
+[manpage modules/log/loggerUtils.man logger::utils]
+[key {longest common subsequence}]
+[manpage modules/struct/struct_list.man struct::list]
+[key longitude]
+[manpage modules/map/map_slippy.man map::slippy]
+[key loop]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key luhn]
+[manpage modules/valtype/luhn.man valtype::luhn]
+[manpage modules/valtype/luhn5.man valtype::luhn5]
+[key luhn-5]
+[manpage modules/valtype/luhn5.man valtype::luhn5]
+[key macros]
+[manpage modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros]
+[key mail]
+[manpage modules/imap4/imap4.man imap4]
+[manpage modules/mime/mime.man mime]
+[manpage modules/pop3/pop3.man pop3]
+[manpage modules/mime/smtp.man smtp]
+[key mailto]
+[manpage modules/uri/uri.man uri]
+[key man_macros]
+[manpage modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros]
+[key manpage]
+[manpage modules/doctools/doctools.man doctools]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[manpage modules/doctools/mpexpand.man mpexpand]
+[key map]
+[manpage modules/generator/generator.man generator]
+[manpage modules/map/map_geocode_nominatim.man map::geocode::nominatim]
+[manpage modules/map/map_slippy.man map::slippy]
+[manpage modules/map/map_slippy_cache.man map::slippy::cache]
+[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
+[manpage modules/mapproj/mapproj.man mapproj]
+[manpage modules/struct/struct_list.man struct::list]
+[key markup]
+[manpage modules/doctools/docidx_intro.man docidx_intro]
+[manpage modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref]
+[manpage modules/doctools/docidx_lang_faq.man docidx_lang_faq]
+[manpage modules/doctools/docidx_lang_intro.man docidx_lang_intro]
+[manpage modules/doctools/docidx_lang_syntax.man docidx_lang_syntax]
+[manpage modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref]
+[manpage modules/doctools/doctoc_intro.man doctoc_intro]
+[manpage modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref]
+[manpage modules/doctools/doctoc_lang_faq.man doctoc_lang_faq]
+[manpage modules/doctools/doctoc_lang_intro.man doctoc_lang_intro]
+[manpage modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax]
+[manpage modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref]
+[manpage modules/doctools/doctools.man doctools]
+[manpage modules/doctools2idx/idx_introduction.man doctools2idx_introduction]
+[manpage modules/doctools2toc/toc_introduction.man doctools2toc_introduction]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/doctools/doctools_intro.man doctools_intro]
+[manpage modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref]
+[manpage modules/doctools/doctools_lang_faq.man doctools_lang_faq]
+[manpage modules/doctools/doctools_lang_intro.man doctools_lang_intro]
+[manpage modules/doctools/doctools_lang_syntax.man doctools_lang_syntax]
+[manpage modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[manpage modules/doctools/mpexpand.man mpexpand]
+[manpage apps/tcldocstrip.man tcldocstrip]
+[key MasterCard]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[key matching]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key math]
+[manpage modules/math/math.man math]
+[manpage modules/math/bigfloat.man math::bigfloat]
+[manpage modules/math/bignum.man math::bignum]
+[manpage modules/math/calculus.man math::calculus]
+[manpage modules/math/qcomplex.man math::complexnumbers]
+[manpage modules/math/constants.man math::constants]
+[manpage modules/math/decimal.man math::decimal]
+[manpage modules/math/fuzzy.man math::fuzzy]
+[manpage modules/math/math_geometry.man math::geometry]
+[manpage modules/math/interpolate.man math::interpolate]
+[manpage modules/math/linalg.man math::linearalgebra]
+[manpage modules/math/optimize.man math::optimize]
+[manpage modules/math/pca.man math::PCA]
+[manpage modules/math/polynomials.man math::polynomials]
+[manpage modules/math/rational_funcs.man math::rationalfunctions]
+[manpage modules/math/special.man math::special]
+[manpage modules/simulation/annealing.man simulation::annealing]
+[manpage modules/simulation/montecarlo.man simulation::montecarlo]
+[manpage modules/simulation/simulation_random.man simulation::random]
+[key mathematics]
+[manpage modules/math/fourier.man math::fourier]
+[manpage modules/math/statistics.man math::statistics]
+[key matrices]
+[manpage modules/math/linalg.man math::linearalgebra]
+[key matrix]
+[manpage modules/csv/csv.man csv]
+[manpage modules/math/linalg.man math::linearalgebra]
+[manpage modules/report/report.man report]
+[manpage modules/struct/matrix.man struct::matrix]
+[manpage modules/struct/matrix1.man struct::matrix_v1]
+[manpage modules/struct/queue.man struct::queue]
+[manpage modules/struct/stack.man struct::stack]
+[key {max cut}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key maximum]
+[manpage modules/math/optimize.man math::optimize]
+[key {maximum flow}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key md4]
+[manpage modules/md4/md4.man md4]
+[manpage modules/ripemd/ripemd128.man ripemd128]
+[manpage modules/ripemd/ripemd160.man ripemd160]
+[key md5]
+[manpage modules/md5/md5.man md5]
+[manpage modules/md5crypt/md5crypt.man md5crypt]
+[key md5crypt]
+[manpage modules/md5crypt/md5crypt.man md5crypt]
+[key medicare]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[key {mega widget}]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[key membership]
+[manpage modules/struct/struct_set.man struct::set]
+[key menu]
+[manpage modules/term/ansi_cmacros.man term::ansi::code::macros]
+[manpage modules/term/imenu.man term::interact::menu]
+[key merge]
+[manpage modules/virtchannel_base/randseed.man tcl::randomseed]
+[manpage modules/uev/uevent_onidle.man uevent::onidle]
+[key {merge find}]
+[manpage modules/struct/disjointset.man struct::disjointset]
+[key merging]
+[manpage modules/bench/bench.man bench]
+[key message]
+[manpage modules/comm/comm.man comm]
+[manpage modules/comm/comm_wire.man comm_wire]
+[manpage modules/log/log.man log]
+[key {message catalog}]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[key {message level}]
+[manpage modules/log/log.man log]
+[key {message package}]
+[manpage modules/doctools2base/tcllib_msgcat.man doctools::msgcat]
+[manpage modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c]
+[manpage modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de]
+[manpage modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en]
+[manpage modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr]
+[manpage modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c]
+[manpage modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de]
+[manpage modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en]
+[manpage modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr]
+[key message-digest]
+[manpage modules/md4/md4.man md4]
+[manpage modules/md5/md5.man md5]
+[manpage modules/md5crypt/md5crypt.man md5crypt]
+[manpage modules/otp/otp.man otp]
+[manpage modules/ripemd/ripemd128.man ripemd128]
+[manpage modules/ripemd/ripemd160.man ripemd160]
+[manpage modules/sha1/sha1.man sha1]
+[manpage modules/sha1/sha256.man sha256]
+[key metakit]
+[manpage modules/tie/tie.man tie]
+[manpage modules/tie/tie_std.man tie]
+[key method]
+[manpage modules/interp/deleg_method.man deleg_method]
+[manpage modules/interp/tcllib_interp.man interp]
+[key {method reference}]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[key mime]
+[manpage modules/fumagic/cfront.man fileutil::magic::cfront]
+[manpage modules/fumagic/cgen.man fileutil::magic::cgen]
+[manpage modules/fumagic/rtcore.man fileutil::magic::rt]
+[manpage modules/mime/mime.man mime]
+[manpage modules/mime/smtp.man smtp]
+[key {minimal spanning tree}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key minimum]
+[manpage modules/math/optimize.man math::optimize]
+[key {minimum cost flow}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {minimum degree spanning tree}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {minimum diameter spanning tree}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {mobile phone}]
+[manpage modules/valtype/imei.man valtype::imei]
+[key module]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[key {montecarlo simulation}]
+[manpage modules/simulation/montecarlo.man simulation::montecarlo]
+[key move]
+[manpage modules/fileutil/multi.man fileutil::multi]
+[manpage modules/fileutil/multiop.man fileutil::multi::op]
+[key multi-file]
+[manpage modules/fileutil/multi.man fileutil::multi]
+[manpage modules/fileutil/multiop.man fileutil::multi::op]
+[key multiplexer]
+[manpage modules/multiplexer/multiplexer.man multiplexer]
+[key multiprecision]
+[manpage modules/math/bigfloat.man math::bigfloat]
+[manpage modules/math/bignum.man math::bignum]
+[key {my method}]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[key {name service}]
+[manpage modules/nns/nns_client.man nameserv]
+[manpage modules/nns/nns_auto.man nameserv::auto]
+[manpage modules/nns/nns_common.man nameserv::common]
+[manpage modules/nns/nns_protocol.man nameserv::protocol]
+[manpage modules/nns/nns_server.man nameserv::server]
+[manpage apps/nns.man nns]
+[manpage modules/nns/nns_intro.man nns_intro]
+[manpage apps/nnsd.man nnsd]
+[manpage apps/nnslog.man nnslog]
+[manpage modules/udpcluster/udpcluster.man udpcluster]
+[key {namespace unknown}]
+[manpage modules/namespacex/namespacex.man namespacex]
+[key {namespace utilities}]
+[manpage modules/namespacex/namespacex.man namespacex]
+[key narrative]
+[manpage modules/debug/debug.man debug]
+[manpage modules/debug/debug_caller.man debug::caller]
+[manpage modules/debug/debug_heartbeat.man debug::heartbeat]
+[manpage modules/debug/debug_timestamp.man debug::timestamp]
+[key {National Provider Identifier}]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[key neighbour]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key net]
+[manpage modules/ftp/ftp.man ftp]
+[manpage modules/ftp/ftp_geturl.man ftp::geturl]
+[manpage modules/imap4/imap4.man imap4]
+[manpage modules/mime/mime.man mime]
+[manpage modules/mime/smtp.man smtp]
+[manpage modules/websocket/websocket.man websocket]
+[key nettool]
+[manpage modules/nettool/nettool.man nettool]
+[key network]
+[manpage modules/pop3d/pop3d.man pop3d]
+[manpage modules/pop3d/pop3d_dbox.man pop3d::dbox]
+[manpage modules/pop3d/pop3d_udb.man pop3d::udb]
+[key news]
+[manpage modules/nntp/nntp.man nntp]
+[manpage modules/uri/uri.man uri]
+[key {next permutation}]
+[manpage modules/struct/struct_list.man struct::list]
+[key nmea]
+[manpage modules/nmea/nmea.man nmea]
+[key nntp]
+[manpage modules/nntp/nntp.man nntp]
+[key nntpclient]
+[manpage modules/nntp/nntp.man nntp]
+[key no-op]
+[manpage modules/control/control.man control]
+[key node]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[manpage modules/struct/struct_tree.man struct::tree]
+[key nominatim]
+[manpage modules/map/map_geocode_nominatim.man map::geocode::nominatim]
+[key normalization]
+[manpage modules/bench/bench.man bench]
+[manpage modules/page/page_util_norm_lemon.man page_util_norm_lemon]
+[manpage modules/page/page_util_norm_peg.man page_util_norm_peg]
+[manpage modules/stringprep/unicode.man unicode]
+[key NPI]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[key nroff]
+[manpage modules/doctools/doctools.man doctools]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff]
+[manpage modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[manpage modules/doctools/mpexpand.man mpexpand]
+[key NTLM]
+[manpage modules/sasl/ntlm.man SASL::NTLM]
+[key NTP]
+[manpage modules/ntp/ntp_time.man ntp_time]
+[key null]
+[manpage modules/virtchannel_base/tcllib_null.man tcl::chan::null]
+[manpage modules/virtchannel_base/nullzero.man tcl::chan::nullzero]
+[key {number theory}]
+[manpage modules/math/numtheory.man math::numtheory]
+[key oauth]
+[manpage modules/oauth/oauth.man oauth]
+[key object]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[manpage modules/stooop/stooop.man stooop]
+[manpage modules/stooop/switched.man switched]
+[key {object oriented}]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[manpage modules/stooop/stooop.man stooop]
+[manpage modules/stooop/switched.man switched]
+[key observer]
+[manpage modules/hook/hook.man hook]
+[manpage modules/virtchannel_transform/observe.man tcl::transform::observe]
+[key odie]
+[manpage modules/cron/cron.man cron]
+[manpage modules/nettool/nettool.man nettool]
+[manpage modules/processman/processman.man processman]
+[key on-idle]
+[manpage modules/uev/uevent_onidle.man uevent::onidle]
+[key {one time pad}]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[key optimization]
+[manpage modules/math/optimize.man math::optimize]
+[manpage modules/simulation/annealing.man simulation::annealing]
+[key {ordered list}]
+[manpage modules/struct/prioqueue.man struct::prioqueue]
+[key otp]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[key {outer join}]
+[manpage modules/struct/struct_list.man struct::list]
+[key package]
+[manpage modules/csv/csv.man csv]
+[key {package indexing}]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[key page]
+[manpage modules/page/page_intro.man page_intro]
+[manpage modules/page/page_pluginmgr.man page_pluginmgr]
+[manpage modules/page/page_util_flow.man page_util_flow]
+[manpage modules/page/page_util_norm_lemon.man page_util_norm_lemon]
+[manpage modules/page/page_util_norm_peg.man page_util_norm_peg]
+[manpage modules/page/page_util_peg.man page_util_peg]
+[manpage modules/page/page_util_quote.man page_util_quote]
+[key pager]
+[manpage modules/term/ipager.man term::interact::pager]
+[key paragraph]
+[manpage modules/textutil/textutil.man textutil]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[key PARAM]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[key {parameter entry form}]
+[manpage modules/tepam/tepam_introduction.man tepam]
+[manpage modules/tepam/tepam_argument_dialogbox.man tepam::argument_dialogbox]
+[key parser]
+[manpage modules/doctools2idx/idx_parse.man doctools::idx::parse]
+[manpage modules/doctools2base/tcl_parse.man doctools::tcl::parse]
+[manpage modules/doctools2toc/toc_parse.man doctools::toc::parse]
+[manpage modules/grammar_aycock/aycock.man grammar::aycock]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[manpage modules/amazon-s3/xsxp.man xsxp]
+[key {parser generator}]
+[manpage apps/page.man page]
+[manpage modules/page/page_intro.man page_intro]
+[manpage modules/page/page_pluginmgr.man page_pluginmgr]
+[manpage modules/page/page_util_flow.man page_util_flow]
+[manpage modules/page/page_util_norm_lemon.man page_util_norm_lemon]
+[manpage modules/page/page_util_norm_peg.man page_util_norm_peg]
+[manpage modules/page/page_util_peg.man page_util_peg]
+[manpage modules/page/page_util_quote.man page_util_quote]
+[key parsing]
+[manpage modules/bench/bench_read.man bench::in]
+[manpage modules/bibtex/bibtex.man bibtex]
+[manpage modules/doctools2idx/idx_introduction.man doctools2idx_introduction]
+[manpage modules/doctools2toc/toc_introduction.man doctools2toc_introduction]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/grammar_aycock/aycock.man grammar::aycock]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[manpage modules/grammar_me/me_cpu.man grammar::me::cpu]
+[manpage modules/grammar_me/me_cpucore.man grammar::me::cpu::core]
+[manpage modules/grammar_me/gasm.man grammar::me::cpu::gasm]
+[manpage modules/grammar_me/me_tcl.man grammar::me::tcl]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_me/me_vm.man grammar::me_vm]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage modules/htmlparse/htmlparse.man htmlparse]
+[manpage modules/yaml/huddle.man huddle]
+[manpage modules/string/token_shell.man string::token::shell]
+[manpage modules/yaml/yaml.man yaml]
+[key {parsing expression}]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key {parsing expression grammar}]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage modules/page/page_util_peg.man page_util_peg]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key {partial application}]
+[manpage modules/lambda/lambda.man lambda]
+[key partition]
+[manpage modules/struct/disjointset.man struct::disjointset]
+[key {partitioned set}]
+[manpage modules/struct/disjointset.man struct::disjointset]
+[key passive]
+[manpage modules/transfer/connect.man transfer::connect]
+[key password]
+[manpage modules/otp/otp.man otp]
+[key patch]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[key patching]
+[manpage modules/rcs/rcs.man rcs]
+[key PCA]
+[manpage modules/math/pca.man math::PCA]
+[key PEG]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/page/page_util_norm_peg.man page_util_norm_peg]
+[manpage modules/page/page_util_peg.man page_util_peg]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key performance]
+[manpage modules/bench/bench.man bench]
+[manpage modules/bench/bench_read.man bench::in]
+[manpage modules/bench/bench_wcsv.man bench::out::csv]
+[manpage modules/bench/bench_wtext.man bench::out::text]
+[manpage modules/bench/bench_intro.man bench_intro]
+[manpage modules/bench/bench_lang_intro.man bench_lang_intro]
+[manpage modules/bench/bench_lang_spec.man bench_lang_spec]
+[manpage modules/profiler/profiler.man profiler]
+[key permutation]
+[manpage modules/struct/struct_list.man struct::list]
+[key persistence]
+[manpage modules/tie/tie.man tie]
+[manpage modules/tie/tie_std.man tie]
+[key phone]
+[manpage modules/valtype/imei.man valtype::imei]
+[key pi]
+[manpage modules/math/constants.man math::constants]
+[key {plain text}]
+[manpage modules/doctools2idx/idx_export_text.man doctools::idx::export::text]
+[manpage modules/doctools2toc/toc_export_text.man doctools::toc::export::text]
+[key {plane geometry}]
+[manpage modules/math/math_geometry.man math::geometry]
+[key plugin]
+[manpage modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref]
+[manpage modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref]
+[manpage modules/doctools2idx/idx_introduction.man doctools2idx_introduction]
+[manpage modules/doctools2toc/toc_introduction.man doctools2toc_introduction]
+[manpage modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[key {plugin management}]
+[manpage modules/pluginmgr/pluginmgr.man pluginmgr]
+[key {plugin search}]
+[manpage modules/pluginmgr/pluginmgr.man pluginmgr]
+[key png]
+[manpage modules/png/png.man png]
+[key point]
+[manpage modules/math/math_geometry.man math::geometry]
+[key {polynomial functions}]
+[manpage modules/math/polynomials.man math::polynomials]
+[key pool]
+[manpage modules/struct/pool.man struct::pool]
+[manpage modules/struct/queue.man struct::queue]
+[key pop]
+[manpage modules/pop3/pop3.man pop3]
+[key pop3]
+[manpage modules/pop3/pop3.man pop3]
+[manpage modules/pop3d/pop3d.man pop3d]
+[manpage modules/pop3d/pop3d_dbox.man pop3d::dbox]
+[manpage modules/pop3d/pop3d_udb.man pop3d::udb]
+[key post-order]
+[manpage modules/struct/struct_tree.man struct::tree]
+[key practcl]
+[manpage modules/practcl/practcl.man practcl]
+[key pre-order]
+[manpage modules/struct/struct_tree.man struct::tree]
+[key prefix]
+[manpage modules/textutil/textutil_string.man textutil::string]
+[manpage modules/textutil/trim.man textutil::trim]
+[key prime]
+[manpage modules/math/numtheory.man math::numtheory]
+[key prioqueue]
+[manpage modules/struct/prioqueue.man struct::prioqueue]
+[manpage modules/struct/queue.man struct::queue]
+[key {priority queue}]
+[manpage modules/struct/prioqueue.man struct::prioqueue]
+[key proc]
+[manpage modules/lambda/lambda.man lambda]
+[key procedure]
+[manpage modules/interp/deleg_proc.man deleg_proc]
+[manpage modules/tepam/tepam_introduction.man tepam]
+[manpage modules/tepam/tepam_procedure.man tepam::procedure]
+[key {procedure documentation}]
+[manpage modules/tepam/tepam_doc_gen.man tepam::doc_gen]
+[key processman]
+[manpage modules/processman/processman.man processman]
+[key producer]
+[manpage modules/hook/hook.man hook]
+[key profile]
+[manpage modules/profiler/profiler.man profiler]
+[key projection]
+[manpage modules/mapproj/mapproj.man mapproj]
+[key prospero]
+[manpage modules/uri/uri.man uri]
+[key protocol]
+[manpage modules/asn/asn.man asn]
+[manpage modules/ldap/ldap.man ldap]
+[manpage modules/ldap/ldapx.man ldapx]
+[manpage modules/nns/nns_protocol.man nameserv::protocol]
+[manpage modules/pop3d/pop3d.man pop3d]
+[manpage modules/pop3d/pop3d_dbox.man pop3d::dbox]
+[manpage modules/pop3d/pop3d_udb.man pop3d::udb]
+[key proxy]
+[manpage modules/http/autoproxy.man autoproxy]
+[key {public key cipher}]
+[manpage modules/pki/pki.man pki]
+[key publisher]
+[manpage modules/hook/hook.man hook]
+[key {push down automaton}]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key queue]
+[manpage modules/csv/csv.man csv]
+[manpage modules/htmlparse/htmlparse.man htmlparse]
+[manpage modules/struct/stack.man struct::stack]
+[manpage modules/transfer/tqueue.man transfer::copy::queue]
+[key quoting]
+[manpage modules/page/page_util_quote.man page_util_quote]
+[key radians]
+[manpage modules/math/constants.man math::constants]
+[manpage modules/units/units.man units]
+[key radiobutton]
+[manpage modules/html/html.man html]
+[key radius]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key random]
+[manpage modules/virtchannel_base/tcllib_random.man tcl::chan::random]
+[manpage modules/virtchannel_base/randseed.man tcl::randomseed]
+[key {random numbers}]
+[manpage modules/simulation/simulation_random.man simulation::random]
+[key {rational functions}]
+[manpage modules/math/rational_funcs.man math::rationalfunctions]
+[key raw]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[key rc4]
+[manpage modules/rc4/rc4.man rc4]
+[key RCS]
+[manpage modules/rcs/rcs.man rcs]
+[key {RCS patch}]
+[manpage modules/rcs/rcs.man rcs]
+[key read]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key reading]
+[manpage modules/bench/bench_read.man bench::in]
+[key receiver]
+[manpage modules/term/receive.man term::receive]
+[manpage modules/term/term_bind.man term::receive::bind]
+[manpage modules/transfer/receiver.man transfer::receiver]
+[key reconnect]
+[manpage modules/nns/nns_auto.man nameserv::auto]
+[key record]
+[manpage modules/struct/queue.man struct::queue]
+[manpage modules/struct/record.man struct::record]
+[key {recursive descent}]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key reduce]
+[manpage modules/generator/generator.man generator]
+[manpage modules/struct/struct_list.man struct::list]
+[key reference]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[key {reflected channel}]
+[manpage modules/virtchannel_base/cat.man tcl::chan::cat]
+[manpage modules/virtchannel_core/core.man tcl::chan::core]
+[manpage modules/virtchannel_core/events.man tcl::chan::events]
+[manpage modules/virtchannel_base/facade.man tcl::chan::facade]
+[manpage modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo]
+[manpage modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2]
+[manpage modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe]
+[manpage modules/virtchannel_base/tcllib_memchan.man tcl::chan::memchan]
+[manpage modules/virtchannel_base/tcllib_null.man tcl::chan::null]
+[manpage modules/virtchannel_base/nullzero.man tcl::chan::nullzero]
+[manpage modules/virtchannel_base/tcllib_random.man tcl::chan::random]
+[manpage modules/virtchannel_base/std.man tcl::chan::std]
+[manpage modules/virtchannel_base/tcllib_string.man tcl::chan::string]
+[manpage modules/virtchannel_base/textwindow.man tcl::chan::textwindow]
+[manpage modules/virtchannel_base/tcllib_variable.man tcl::chan::variable]
+[manpage modules/virtchannel_base/tcllib_zero.man tcl::chan::zero]
+[manpage modules/virtchannel_base/randseed.man tcl::randomseed]
+[manpage modules/virtchannel_transform/adler32.man tcl::transform::adler32]
+[manpage modules/virtchannel_transform/vt_base64.man tcl::transform::base64]
+[manpage modules/virtchannel_core/transformcore.man tcl::transform::core]
+[manpage modules/virtchannel_transform/vt_counter.man tcl::transform::counter]
+[manpage modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32]
+[manpage modules/virtchannel_transform/hex.man tcl::transform::hex]
+[manpage modules/virtchannel_transform/identity.man tcl::transform::identity]
+[manpage modules/virtchannel_transform/limitsize.man tcl::transform::limitsize]
+[manpage modules/virtchannel_transform/observe.man tcl::transform::observe]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[manpage modules/virtchannel_transform/spacer.man tcl::transform::spacer]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[key regex]
+[manpage modules/string/token.man string::token]
+[key {regular expression}]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[manpage modules/textutil/textutil.man textutil]
+[manpage modules/textutil/textutil_split.man textutil::split]
+[manpage modules/textutil/trim.man textutil::trim]
+[key {regular grammar}]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[key {regular languages}]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[key {remote communication}]
+[manpage modules/comm/comm.man comm]
+[manpage modules/comm/comm_wire.man comm_wire]
+[key {remote execution}]
+[manpage modules/comm/comm.man comm]
+[manpage modules/comm/comm_wire.man comm_wire]
+[key remove]
+[manpage modules/fileutil/multi.man fileutil::multi]
+[manpage modules/fileutil/multiop.man fileutil::multi::op]
+[key repeating]
+[manpage modules/struct/struct_list.man struct::list]
+[key repetition]
+[manpage modules/struct/struct_list.man struct::list]
+[manpage modules/textutil/repeat.man textutil::repeat]
+[key report]
+[manpage modules/report/report.man report]
+[key reshuffle]
+[manpage modules/struct/struct_list.man struct::list]
+[key {residual graph}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key resolver]
+[manpage modules/dns/tcllib_dns.man dns]
+[key {resource management}]
+[manpage modules/try/tcllib_try.man try]
+[key restore]
+[manpage modules/nns/nns_auto.man nameserv::auto]
+[key return]
+[manpage modules/try/tcllib_throw.man throw]
+[key reverse]
+[manpage modules/struct/struct_list.man struct::list]
+[key {rfc 821}]
+[manpage modules/mime/mime.man mime]
+[manpage modules/mime/smtp.man smtp]
+[manpage modules/smtpd/smtpd.man smtpd]
+[key {rfc 822}]
+[manpage modules/mime/mime.man mime]
+[manpage modules/pop3d/pop3d_dbox.man pop3d::dbox]
+[manpage modules/mime/smtp.man smtp]
+[key {rfc 868}]
+[manpage modules/ntp/ntp_time.man ntp_time]
+[key {rfc 959}]
+[manpage modules/ftp/ftp.man ftp]
+[manpage modules/ftp/ftp_geturl.man ftp::geturl]
+[manpage modules/ftpd/ftpd.man ftpd]
+[key {rfc 977}]
+[manpage modules/nntp/nntp.man nntp]
+[key {rfc 1034}]
+[manpage modules/dns/tcllib_dns.man dns]
+[key {rfc 1035}]
+[manpage modules/dns/tcllib_dns.man dns]
+[key {rfc 1036}]
+[manpage modules/nntp/nntp.man nntp]
+[key {rfc 1320}]
+[manpage modules/md4/md4.man md4]
+[manpage modules/md5/md5.man md5]
+[manpage modules/ripemd/ripemd128.man ripemd128]
+[manpage modules/ripemd/ripemd160.man ripemd160]
+[key {rfc 1321}]
+[manpage modules/md4/md4.man md4]
+[manpage modules/md5/md5.man md5]
+[manpage modules/ripemd/ripemd128.man ripemd128]
+[manpage modules/ripemd/ripemd160.man ripemd160]
+[key {rfc 1413}]
+[manpage modules/ident/ident.man ident]
+[key {rfc 1630}]
+[manpage modules/uri/uri.man uri]
+[key {rfc 1886}]
+[manpage modules/dns/tcllib_dns.man dns]
+[key {rfc 1939}]
+[manpage modules/pop3/pop3.man pop3]
+[manpage modules/pop3d/pop3d.man pop3d]
+[key {rfc 2030}]
+[manpage modules/ntp/ntp_time.man ntp_time]
+[key {rfc 2045}]
+[manpage modules/mime/mime.man mime]
+[key {rfc 2046}]
+[manpage modules/mime/mime.man mime]
+[key {rfc 2049}]
+[manpage modules/mime/mime.man mime]
+[key {rfc 2104}]
+[manpage modules/md4/md4.man md4]
+[manpage modules/md5/md5.man md5]
+[manpage modules/ripemd/ripemd128.man ripemd128]
+[manpage modules/ripemd/ripemd160.man ripemd160]
+[manpage modules/sha1/sha1.man sha1]
+[manpage modules/sha1/sha256.man sha256]
+[key {rfc 2141}]
+[manpage modules/uri/urn-scheme.man uri_urn]
+[key {rfc 2251}]
+[manpage modules/ldap/ldap.man ldap]
+[manpage modules/ldap/ldapx.man ldapx]
+[key {rfc 2255}]
+[manpage modules/uri/uri.man uri]
+[key {rfc 2289}]
+[manpage modules/otp/otp.man otp]
+[key {rfc 2396}]
+[manpage modules/uri/uri.man uri]
+[key {rfc 2554}]
+[manpage modules/mime/smtp.man smtp]
+[key {RFC 2718}]
+[manpage modules/oauth/oauth.man oauth]
+[key {rfc 2821}]
+[manpage modules/mime/smtp.man smtp]
+[manpage modules/smtpd/smtpd.man smtpd]
+[key {rfc 2849}]
+[manpage modules/ldap/ldapx.man ldapx]
+[key {rfc 3207}]
+[manpage modules/mime/smtp.man smtp]
+[key {rfc 3513}]
+[manpage modules/dns/tcllib_ip.man tcllib_ip]
+[key {rfc 3986}]
+[manpage modules/uri/uri.man uri]
+[key {rfc 4511}]
+[manpage modules/ldap/ldap.man ldap]
+[key {RFC 5849}]
+[manpage modules/oauth/oauth.man oauth]
+[key {rfc 6455}]
+[manpage modules/websocket/websocket.man websocket]
+[key {rfc 7858}]
+[manpage modules/dns/tcllib_dns.man dns]
+[key rfc3501]
+[manpage modules/imap4/imap4.man imap4]
+[key rfc3548]
+[manpage modules/base32/base32.man base32]
+[manpage modules/base32/base32hex.man base32::hex]
+[key {right outer join}]
+[manpage modules/struct/struct_list.man struct::list]
+[key RIPEMD]
+[manpage modules/ripemd/ripemd128.man ripemd128]
+[manpage modules/ripemd/ripemd160.man ripemd160]
+[key {roman numeral}]
+[manpage modules/math/roman.man math::roman]
+[key roots]
+[manpage modules/math/calculus.man math::calculus]
+[key rot]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[key rot13]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[key rounding]
+[manpage modules/math/fuzzy.man math::fuzzy]
+[key rows]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[key rpc]
+[manpage modules/comm/comm.man comm]
+[manpage modules/comm/comm_wire.man comm_wire]
+[key rsa]
+[manpage modules/pki/pki.man pki]
+[key running]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[key s3]
+[manpage modules/amazon-s3/S3.man S3]
+[key SASL]
+[manpage modules/sasl/sasl.man SASL]
+[manpage modules/sasl/ntlm.man SASL::NTLM]
+[manpage modules/sasl/scram.man SASL::SCRAM]
+[manpage modules/sasl/gtoken.man SASL::XGoogleToken]
+[key scanl]
+[manpage modules/generator/generator.man generator]
+[key SCCS]
+[manpage modules/rcs/rcs.man rcs]
+[key SCRAM]
+[manpage modules/sasl/scram.man SASL::SCRAM]
+[key secure]
+[manpage modules/comm/comm.man comm]
+[manpage modules/pop3/pop3.man pop3]
+[manpage modules/pop3d/pop3d.man pop3d]
+[manpage modules/transfer/connect.man transfer::connect]
+[manpage modules/transfer/receiver.man transfer::receiver]
+[manpage modules/transfer/transmitter.man transfer::transmitter]
+[key security]
+[manpage modules/aes/aes.man aes]
+[manpage modules/blowfish/blowfish.man blowfish]
+[manpage modules/crc/cksum.man cksum]
+[manpage modules/crc/crc16.man crc16]
+[manpage modules/crc/crc32.man crc32]
+[manpage modules/des/des.man des]
+[manpage modules/md4/md4.man md4]
+[manpage modules/md5/md5.man md5]
+[manpage modules/md5crypt/md5crypt.man md5crypt]
+[manpage modules/otp/otp.man otp]
+[manpage modules/pki/pki.man pki]
+[manpage modules/rc4/rc4.man rc4]
+[manpage modules/ripemd/ripemd128.man ripemd128]
+[manpage modules/ripemd/ripemd160.man ripemd160]
+[manpage modules/sha1/sha1.man sha1]
+[manpage modules/sha1/sha256.man sha256]
+[manpage modules/crc/sum.man sum]
+[manpage modules/des/tcldes.man tclDES]
+[manpage modules/des/tcldesjr.man tclDESjr]
+[key seed]
+[manpage modules/virtchannel_base/randseed.man tcl::randomseed]
+[key selectionbox]
+[manpage modules/javascript/javascript.man javascript]
+[key {semantic markup}]
+[manpage modules/doctools/docidx_intro.man docidx_intro]
+[manpage modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref]
+[manpage modules/doctools/docidx_lang_faq.man docidx_lang_faq]
+[manpage modules/doctools/docidx_lang_intro.man docidx_lang_intro]
+[manpage modules/doctools/docidx_lang_syntax.man docidx_lang_syntax]
+[manpage modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref]
+[manpage modules/doctools/doctoc_intro.man doctoc_intro]
+[manpage modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref]
+[manpage modules/doctools/doctoc_lang_faq.man doctoc_lang_faq]
+[manpage modules/doctools/doctoc_lang_intro.man doctoc_lang_intro]
+[manpage modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax]
+[manpage modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref]
+[manpage modules/doctools2idx/idx_introduction.man doctools2idx_introduction]
+[manpage modules/doctools2toc/toc_introduction.man doctools2toc_introduction]
+[manpage modules/doctools/doctools_intro.man doctools_intro]
+[manpage modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref]
+[manpage modules/doctools/doctools_lang_faq.man doctools_lang_faq]
+[manpage modules/doctools/doctools_lang_intro.man doctools_lang_intro]
+[manpage modules/doctools/doctools_lang_syntax.man doctools_lang_syntax]
+[manpage modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref]
+[key send]
+[manpage modules/comm/comm.man comm]
+[key serialization]
+[manpage modules/bee/bee.man bee]
+[manpage modules/doctools2idx/export_docidx.man doctools::idx::export::docidx]
+[manpage modules/doctools2idx/idx_export_html.man doctools::idx::export::html]
+[manpage modules/doctools2idx/idx_export_json.man doctools::idx::export::json]
+[manpage modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff]
+[manpage modules/doctools2idx/idx_export_text.man doctools::idx::export::text]
+[manpage modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki]
+[manpage modules/doctools2idx/idx_structure.man doctools::idx::structure]
+[manpage modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc]
+[manpage modules/doctools2toc/toc_export_html.man doctools::toc::export::html]
+[manpage modules/doctools2toc/toc_export_json.man doctools::toc::export::json]
+[manpage modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff]
+[manpage modules/doctools2toc/toc_export_text.man doctools::toc::export::text]
+[manpage modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki]
+[manpage modules/doctools2toc/toc_structure.man doctools::toc::structure]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/struct_tree.man struct::tree]
+[key server]
+[manpage modules/map/map_geocode_nominatim.man map::geocode::nominatim]
+[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
+[manpage modules/nns/nns_common.man nameserv::common]
+[manpage modules/nns/nns_server.man nameserv::server]
+[manpage modules/nns/nns_intro.man nns_intro]
+[manpage apps/nnsd.man nnsd]
+[manpage modules/udpcluster/udpcluster.man udpcluster]
+[key service]
+[manpage modules/log/logger.man logger]
+[key services]
+[manpage modules/ftpd/ftpd.man ftpd]
+[manpage modules/smtpd/smtpd.man smtpd]
+[manpage modules/httpd/httpd.man tool]
+[key set]
+[manpage modules/struct/queue.man struct::queue]
+[manpage modules/struct/struct_set.man struct::set]
+[key sha1]
+[manpage modules/sha1/sha1.man sha1]
+[key sha256]
+[manpage modules/sha1/sha256.man sha256]
+[key shell]
+[manpage modules/string/token_shell.man string::token::shell]
+[key {shortest path}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key shuffle]
+[manpage modules/struct/struct_list.man struct::list]
+[key {simulated annealing}]
+[manpage modules/simulation/annealing.man simulation::annealing]
+[key simulation]
+[manpage modules/simulation/simulation_random.man simulation::random]
+[key singleton]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[key {size limit}]
+[manpage modules/virtchannel_transform/limitsize.man tcl::transform::limitsize]
+[key skiplist]
+[manpage modules/struct/queue.man struct::queue]
+[manpage modules/struct/skiplist.man struct::skiplist]
+[key slippy]
+[manpage modules/map/map_slippy.man map::slippy]
+[manpage modules/map/map_slippy_cache.man map::slippy::cache]
+[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
+[key smtp]
+[manpage modules/mime/mime.man mime]
+[manpage modules/mime/smtp.man smtp]
+[manpage modules/smtpd/smtpd.man smtpd]
+[key smtpd]
+[manpage modules/smtpd/smtpd.man smtpd]
+[key Snit]
+[manpage modules/snit/snit.man snit]
+[key snit]
+[manpage modules/interp/deleg_method.man deleg_method]
+[manpage modules/interp/tcllib_interp.man interp]
+[key SNTP]
+[manpage modules/ntp/ntp_time.man ntp_time]
+[key socket]
+[manpage modules/comm/comm.man comm]
+[manpage modules/comm/comm_wire.man comm_wire]
+[manpage modules/smtpd/smtpd.man smtpd]
+[key soundex]
+[manpage modules/soundex/soundex.man soundex]
+[key source]
+[manpage modules/docstrip/docstrip.man docstrip]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[manpage apps/tcldocstrip.man tcldocstrip]
+[key spacing]
+[manpage modules/virtchannel_transform/spacer.man tcl::transform::spacer]
+[key {spatial interpolation}]
+[manpage modules/math/interpolate.man math::interpolate]
+[key {special functions}]
+[manpage modules/math/special.man math::special]
+[key specification]
+[manpage modules/bench/bench_lang_spec.man bench_lang_spec]
+[key speed]
+[manpage modules/profiler/profiler.man profiler]
+[key split]
+[manpage modules/textutil/textutil_split.man textutil::split]
+[key {squared graph}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key ssl]
+[manpage modules/comm/comm.man comm]
+[manpage modules/imap4/imap4.man imap4]
+[manpage modules/pop3/pop3.man pop3]
+[manpage modules/pop3d/pop3d.man pop3d]
+[manpage modules/transfer/connect.man transfer::connect]
+[manpage modules/transfer/receiver.man transfer::receiver]
+[manpage modules/transfer/transmitter.man transfer::transmitter]
+[key stack]
+[manpage modules/struct/queue.man struct::queue]
+[key {standard io}]
+[manpage modules/virtchannel_base/std.man tcl::chan::std]
+[key state]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key {state (de)serialization}]
+[manpage modules/namespacex/namespacex.man namespacex]
+[key {statistical distribution}]
+[manpage modules/simulation/simulation_random.man simulation::random]
+[key statistics]
+[manpage modules/counter/counter.man counter]
+[manpage modules/math/math.man math]
+[manpage modules/math/pca.man math::PCA]
+[manpage modules/math/statistics.man math::statistics]
+[key stdin]
+[manpage modules/virtchannel_base/std.man tcl::chan::std]
+[key stdout]
+[manpage modules/virtchannel_base/std.man tcl::chan::std]
+[key {stochastic modelling}]
+[manpage modules/simulation/montecarlo.man simulation::montecarlo]
+[key {stream cipher}]
+[manpage modules/rc4/rc4.man rc4]
+[key {stream copy}]
+[manpage modules/virtchannel_transform/observe.man tcl::transform::observe]
+[key string]
+[manpage modules/string/token.man string::token]
+[manpage modules/string/token_shell.man string::token::shell]
+[manpage modules/textutil/textutil.man textutil]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[manpage modules/textutil/expander.man textutil::expander]
+[manpage modules/textutil/repeat.man textutil::repeat]
+[manpage modules/textutil/textutil_split.man textutil::split]
+[manpage modules/textutil/textutil_string.man textutil::string]
+[manpage modules/textutil/tabify.man textutil::tabify]
+[manpage modules/textutil/trim.man textutil::trim]
+[key stringprep]
+[manpage modules/stringprep/stringprep.man stringprep]
+[manpage modules/stringprep/stringprep_data.man stringprep::data]
+[manpage modules/stringprep/unicode_data.man unicode::data]
+[key {strongly connected component}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key struct]
+[manpage modules/struct/pool.man struct::pool]
+[manpage modules/struct/record.man struct::record]
+[key structure]
+[manpage modules/control/control.man control]
+[key {structured queries}]
+[manpage modules/treeql/treeql.man treeql]
+[key style]
+[manpage modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults]
+[key subcommand]
+[manpage modules/tepam/tepam_introduction.man tepam]
+[manpage modules/tepam/tepam_procedure.man tepam::procedure]
+[key subgraph]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key subject]
+[manpage modules/hook/hook.man hook]
+[key submitbutton]
+[manpage modules/javascript/javascript.man javascript]
+[key subscriber]
+[manpage modules/hook/hook.man hook]
+[key subsequence]
+[manpage modules/struct/struct_list.man struct::list]
+[key subst]
+[manpage modules/doctools2base/tcl_parse.man doctools::tcl::parse]
+[key sum]
+[manpage modules/crc/sum.man sum]
+[key swapping]
+[manpage modules/struct/struct_list.man struct::list]
+[key {symmetric difference}]
+[manpage modules/struct/struct_set.man struct::set]
+[key synchronous]
+[manpage modules/cache/async.man cache::async]
+[key {syntax tree}]
+[manpage modules/grammar_me/me_util.man grammar::me::util]
+[key table]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/html/html.man html]
+[manpage modules/report/report.man report]
+[key {table of contents}]
+[manpage modules/doctools/doctoc_intro.man doctoc_intro]
+[manpage modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref]
+[manpage modules/doctools2toc/toc_introduction.man doctools2toc_introduction]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc]
+[manpage modules/doctools2toc/toc_export_html.man doctools::toc::export::html]
+[manpage modules/doctools2toc/toc_export_json.man doctools::toc::export::json]
+[manpage modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff]
+[manpage modules/doctools2toc/toc_export_text.man doctools::toc::export::text]
+[manpage modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc]
+[manpage modules/doctools2toc/toc_import_json.man doctools::toc::import::json]
+[key tabstops]
+[manpage modules/textutil/tabify.man textutil::tabify]
+[key tallying]
+[manpage modules/counter/counter.man counter]
+[key {tape archive}]
+[manpage modules/tar/tar.man tar]
+[key tar]
+[manpage modules/tar/tar.man tar]
+[key tcl]
+[manpage modules/math/bigfloat.man math::bigfloat]
+[manpage modules/math/bignum.man math::bignum]
+[manpage modules/math/decimal.man math::decimal]
+[manpage modules/math/pca.man math::PCA]
+[key {Tcl module}]
+[manpage modules/docstrip/docstrip_util.man docstrip_util]
+[key {Tcl syntax}]
+[manpage modules/doctools2base/tcl_parse.man doctools::tcl::parse]
+[key {tcler's wiki}]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[key tcllib]
+[manpage modules/csv/csv.man csv]
+[key TclOO]
+[manpage modules/ooutil/ooutil.man oo::util]
+[manpage modules/tool/meta.man oo::util]
+[manpage modules/oometa/oometa.man oometa]
+[manpage modules/tool/tool.man tool]
+[manpage modules/httpd/httpd.man tool]
+[manpage modules/tool-ui/tool-ui.man tool-ui]
+[manpage modules/tool/tool_dict_ensemble.man tool::dict_ensemble]
+[key TCLPARAM]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[key TDPL]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key {temp file}]
+[manpage modules/fileutil/fileutil.man fileutil]
+[key {template processing}]
+[manpage modules/textutil/expander.man textutil::expander]
+[key terminal]
+[manpage modules/term/term.man term]
+[manpage modules/term/ansi_code.man term::ansi::code]
+[manpage modules/term/ansi_cattr.man term::ansi::code::attr]
+[manpage modules/term/ansi_cctrl.man term::ansi::code::ctrl]
+[manpage modules/term/ansi_cmacros.man term::ansi::code::macros]
+[manpage modules/term/ansi_ctrlu.man term::ansi::ctrl::unix]
+[manpage modules/term/ansi_send.man term::ansi::send]
+[manpage modules/term/imenu.man term::interact::menu]
+[manpage modules/term/ipager.man term::interact::pager]
+[manpage modules/term/receive.man term::receive]
+[manpage modules/term/term_bind.man term::receive::bind]
+[manpage modules/term/term_send.man term::send]
+[key test]
+[manpage modules/fileutil/fileutil.man fileutil]
+[key Testing]
+[manpage modules/valtype/valtype_common.man valtype::common]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/iban.man valtype::iban]
+[manpage modules/valtype/imei.man valtype::imei]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[manpage modules/valtype/luhn.man valtype::luhn]
+[manpage modules/valtype/luhn5.man valtype::luhn5]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[manpage modules/valtype/verhoeff.man valtype::verhoeff]
+[key testing]
+[manpage modules/bench/bench.man bench]
+[manpage modules/bench/bench_read.man bench::in]
+[manpage modules/bench/bench_wcsv.man bench::out::csv]
+[manpage modules/bench/bench_wtext.man bench::out::text]
+[manpage modules/bench/bench_intro.man bench_intro]
+[manpage modules/bench/bench_lang_intro.man bench_lang_intro]
+[manpage modules/bench/bench_lang_spec.man bench_lang_spec]
+[key TeX]
+[manpage modules/textutil/textutil.man textutil]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[key text]
+[manpage modules/bench/bench_read.man bench::in]
+[manpage modules/bench/bench_wtext.man bench::out::text]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[key {text comparison}]
+[manpage modules/soundex/soundex.man soundex]
+[key {text conversion}]
+[manpage modules/rcs/rcs.man rcs]
+[key {text differences}]
+[manpage modules/rcs/rcs.man rcs]
+[key {text display}]
+[manpage modules/term/imenu.man term::interact::menu]
+[manpage modules/term/ipager.man term::interact::pager]
+[key {text expansion}]
+[manpage modules/textutil/expander.man textutil::expander]
+[key {text likeness}]
+[manpage modules/soundex/soundex.man soundex]
+[key {text processing}]
+[manpage modules/bibtex/bibtex.man bibtex]
+[manpage modules/yaml/huddle.man huddle]
+[manpage apps/page.man page]
+[manpage modules/page/page_intro.man page_intro]
+[manpage modules/page/page_pluginmgr.man page_pluginmgr]
+[manpage modules/page/page_util_flow.man page_util_flow]
+[manpage modules/page/page_util_norm_lemon.man page_util_norm_lemon]
+[manpage modules/page/page_util_norm_peg.man page_util_norm_peg]
+[manpage modules/page/page_util_peg.man page_util_peg]
+[manpage modules/page/page_util_quote.man page_util_quote]
+[manpage modules/yaml/yaml.man yaml]
+[key {text widget}]
+[manpage modules/virtchannel_base/textwindow.man tcl::chan::textwindow]
+[key threads]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key throw]
+[manpage modules/try/tcllib_throw.man throw]
+[key thumbnail]
+[manpage modules/jpeg/jpeg.man jpeg]
+[key tie]
+[manpage modules/tie/tie.man tie]
+[manpage modules/tie/tie_std.man tie]
+[key tif]
+[manpage modules/tiff/tiff.man tiff]
+[key tiff]
+[manpage modules/tiff/tiff.man tiff]
+[key tile]
+[manpage modules/map/map_slippy_cache.man map::slippy::cache]
+[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
+[key time]
+[manpage modules/ntp/ntp_time.man ntp_time]
+[key timestamp]
+[manpage modules/png/png.man png]
+[key timestamps]
+[manpage modules/debug/debug_timestamp.man debug::timestamp]
+[key {tip 219}]
+[manpage modules/virtchannel_base/cat.man tcl::chan::cat]
+[manpage modules/virtchannel_core/core.man tcl::chan::core]
+[manpage modules/virtchannel_core/events.man tcl::chan::events]
+[manpage modules/virtchannel_base/facade.man tcl::chan::facade]
+[manpage modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo]
+[manpage modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2]
+[manpage modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe]
+[manpage modules/virtchannel_base/tcllib_memchan.man tcl::chan::memchan]
+[manpage modules/virtchannel_base/tcllib_null.man tcl::chan::null]
+[manpage modules/virtchannel_base/nullzero.man tcl::chan::nullzero]
+[manpage modules/virtchannel_base/tcllib_random.man tcl::chan::random]
+[manpage modules/virtchannel_base/std.man tcl::chan::std]
+[manpage modules/virtchannel_base/tcllib_string.man tcl::chan::string]
+[manpage modules/virtchannel_base/textwindow.man tcl::chan::textwindow]
+[manpage modules/virtchannel_base/tcllib_variable.man tcl::chan::variable]
+[manpage modules/virtchannel_base/tcllib_zero.man tcl::chan::zero]
+[manpage modules/virtchannel_base/randseed.man tcl::randomseed]
+[manpage modules/virtchannel_core/transformcore.man tcl::transform::core]
+[key {tip 230}]
+[manpage modules/virtchannel_transform/adler32.man tcl::transform::adler32]
+[manpage modules/virtchannel_transform/vt_base64.man tcl::transform::base64]
+[manpage modules/virtchannel_transform/vt_counter.man tcl::transform::counter]
+[manpage modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32]
+[manpage modules/virtchannel_transform/hex.man tcl::transform::hex]
+[manpage modules/virtchannel_transform/identity.man tcl::transform::identity]
+[manpage modules/virtchannel_transform/limitsize.man tcl::transform::limitsize]
+[manpage modules/virtchannel_transform/observe.man tcl::transform::observe]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[manpage modules/virtchannel_transform/spacer.man tcl::transform::spacer]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[key {tip 234}]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[key {tip 317}]
+[manpage modules/virtchannel_transform/vt_base64.man tcl::transform::base64]
+[key Tk]
+[manpage modules/virtchannel_base/textwindow.man tcl::chan::textwindow]
+[key tls]
+[manpage modules/comm/comm.man comm]
+[manpage modules/imap4/imap4.man imap4]
+[manpage modules/pop3/pop3.man pop3]
+[manpage modules/pop3d/pop3d.man pop3d]
+[manpage modules/mime/smtp.man smtp]
+[manpage modules/transfer/connect.man transfer::connect]
+[manpage modules/transfer/receiver.man transfer::receiver]
+[manpage modules/transfer/transmitter.man transfer::transmitter]
+[key TMML]
+[manpage modules/doctools/doctools.man doctools]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/dtplite/pkg_dtplite.man dtplite]
+[manpage apps/dtplite.man dtplite]
+[manpage modules/doctools/mpexpand.man mpexpand]
+[key toc]
+[manpage modules/doctools/doctoc_intro.man doctoc_intro]
+[manpage modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc]
+[manpage modules/doctools2toc/toc_export_html.man doctools::toc::export::html]
+[manpage modules/doctools2toc/toc_export_json.man doctools::toc::export::json]
+[manpage modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff]
+[manpage modules/doctools2toc/toc_export_text.man doctools::toc::export::text]
+[manpage modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki]
+[manpage modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc]
+[manpage modules/doctools2toc/toc_import_json.man doctools::toc::import::json]
+[key {toc formatter}]
+[manpage modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref]
+[key tokenization]
+[manpage modules/string/token.man string::token]
+[manpage modules/string/token_shell.man string::token::shell]
+[key TOOL]
+[manpage modules/oometa/oometa.man oometa]
+[manpage modules/tool/tool.man tool]
+[manpage modules/tool/tool_dict_ensemble.man tool::dict_ensemble]
+[key {top-down parsing languages}]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key torrent]
+[manpage modules/bee/bee.man bee]
+[key touch]
+[manpage modules/fileutil/fileutil.man fileutil]
+[key TPDL]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[key trace]
+[manpage modules/debug/debug.man debug]
+[manpage modules/debug/debug_caller.man debug::caller]
+[manpage modules/debug/debug_heartbeat.man debug::heartbeat]
+[manpage modules/debug/debug_timestamp.man debug::timestamp]
+[key transducer]
+[manpage modules/grammar_aycock/aycock.man grammar::aycock]
+[manpage modules/grammar_fa/fa.man grammar::fa]
+[manpage modules/grammar_fa/dacceptor.man grammar::fa::dacceptor]
+[manpage modules/grammar_fa/dexec.man grammar::fa::dexec]
+[manpage modules/grammar_fa/faop.man grammar::fa::op]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_peg/peg.man grammar::peg]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage apps/pt.man pt]
+[manpage modules/pt/pt_astree.man pt::ast]
+[manpage modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl]
+[manpage modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea]
+[manpage modules/pt/pt_json_language.man pt::json_language]
+[manpage modules/pt/pt_param.man pt::param]
+[manpage modules/pt/pt_pexpression.man pt::pe]
+[manpage modules/pt/pt_pexpr_op.man pt::pe::op]
+[manpage modules/pt/pt_pegrammar.man pt::peg]
+[manpage modules/pt/pt_peg_container.man pt::peg::container]
+[manpage modules/pt/pt_peg_container_peg.man pt::peg::container::peg]
+[manpage modules/pt/pt_peg_export.man pt::peg::export]
+[manpage modules/pt/pt_peg_export_container.man pt::peg::export::container]
+[manpage modules/pt/pt_peg_export_json.man pt::peg::export::json]
+[manpage modules/pt/pt_peg_export_peg.man pt::peg::export::peg]
+[manpage modules/pt/pt_peg_from_container.man pt::peg::from::container]
+[manpage modules/pt/pt_peg_from_json.man pt::peg::from::json]
+[manpage modules/pt/pt_peg_from_peg.man pt::peg::from::peg]
+[manpage modules/pt/pt_peg_import.man pt::peg::import]
+[manpage modules/pt/pt_peg_import_container.man pt::peg::import::container]
+[manpage modules/pt/pt_peg_import_json.man pt::peg::import::json]
+[manpage modules/pt/pt_peg_import_peg.man pt::peg::import::peg]
+[manpage modules/pt/pt_peg_interp.man pt::peg::interp]
+[manpage modules/pt/pt_peg_to_container.man pt::peg::to::container]
+[manpage modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam]
+[manpage modules/pt/pt_peg_to_json.man pt::peg::to::json]
+[manpage modules/pt/pt_peg_to_param.man pt::peg::to::param]
+[manpage modules/pt/pt_peg_to_peg.man pt::peg::to::peg]
+[manpage modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam]
+[manpage modules/pt/pt_peg_language.man pt::peg_language]
+[manpage modules/pt/pt_peg_introduction.man pt::pegrammar]
+[manpage modules/pt/pt_pgen.man pt::pgen]
+[manpage modules/pt/pt_rdengine.man pt::rde]
+[manpage modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx]
+[manpage modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit]
+[manpage modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo]
+[manpage modules/pt/pt_util.man pt::util]
+[manpage modules/pt/pt_to_api.man pt_export_api]
+[manpage modules/pt/pt_from_api.man pt_import_api]
+[manpage modules/pt/pt_introduction.man pt_introduction]
+[manpage modules/pt/pt_parse_peg.man pt_parse_peg]
+[manpage modules/pt/pt_parser_api.man pt_parser_api]
+[manpage modules/pt/pt_peg_op.man pt_peg_op]
+[key transfer]
+[manpage modules/transfer/connect.man transfer::connect]
+[manpage modules/transfer/copyops.man transfer::copy]
+[manpage modules/transfer/tqueue.man transfer::copy::queue]
+[manpage modules/transfer/ddest.man transfer::data::destination]
+[manpage modules/transfer/dsource.man transfer::data::source]
+[manpage modules/transfer/receiver.man transfer::receiver]
+[manpage modules/transfer/transmitter.man transfer::transmitter]
+[key transformation]
+[manpage modules/page/page_util_peg.man page_util_peg]
+[manpage modules/virtchannel_transform/adler32.man tcl::transform::adler32]
+[manpage modules/virtchannel_transform/vt_base64.man tcl::transform::base64]
+[manpage modules/virtchannel_transform/vt_counter.man tcl::transform::counter]
+[manpage modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32]
+[manpage modules/virtchannel_transform/hex.man tcl::transform::hex]
+[manpage modules/virtchannel_transform/identity.man tcl::transform::identity]
+[manpage modules/virtchannel_transform/limitsize.man tcl::transform::limitsize]
+[manpage modules/virtchannel_transform/observe.man tcl::transform::observe]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[manpage modules/virtchannel_transform/spacer.man tcl::transform::spacer]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[key transmitter]
+[manpage modules/transfer/transmitter.man transfer::transmitter]
+[key {travelling salesman}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key traversal]
+[manpage modules/fileutil/traverse.man fileutil_traverse]
+[key tree]
+[manpage modules/grammar_me/gasm.man grammar::me::cpu::gasm]
+[manpage modules/grammar_me/me_util.man grammar::me::util]
+[manpage modules/htmlparse/htmlparse.man htmlparse]
+[manpage modules/struct/queue.man struct::queue]
+[manpage modules/struct/stack.man struct::stack]
+[manpage modules/struct/struct_tree.man struct::tree]
+[manpage modules/struct/struct_tree1.man struct::tree_v1]
+[manpage modules/treeql/treeql.man treeql]
+[key {tree query language}]
+[manpage modules/treeql/treeql.man treeql]
+[key {tree walking}]
+[manpage modules/page/page_util_flow.man page_util_flow]
+[manpage modules/page/page_util_norm_lemon.man page_util_norm_lemon]
+[manpage modules/page/page_util_norm_peg.man page_util_norm_peg]
+[key TreeQL]
+[manpage modules/treeql/treeql.man treeql]
+[key trimming]
+[manpage modules/textutil/textutil.man textutil]
+[manpage modules/textutil/trim.man textutil::trim]
+[key twitter]
+[manpage modules/oauth/oauth.man oauth]
+[key type]
+[manpage modules/fileutil/fileutil.man fileutil]
+[manpage modules/fumagic/cfront.man fileutil::magic::cfront]
+[manpage modules/fumagic/cgen.man fileutil::magic::cgen]
+[manpage modules/fumagic/filetypes.man fileutil::magic::filetype]
+[manpage modules/fumagic/rtcore.man fileutil::magic::rt]
+[manpage modules/snit/snit.man snit]
+[key {Type checking}]
+[manpage modules/valtype/valtype_common.man valtype::common]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/iban.man valtype::iban]
+[manpage modules/valtype/imei.man valtype::imei]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[manpage modules/valtype/luhn.man valtype::luhn]
+[manpage modules/valtype/luhn5.man valtype::luhn5]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[manpage modules/valtype/verhoeff.man valtype::verhoeff]
+[key uevent]
+[manpage modules/hook/hook.man hook]
+[key unbind]
+[manpage modules/uev/uevent.man uevent]
+[key uncapitalize]
+[manpage modules/textutil/textutil_string.man textutil::string]
+[key undenting]
+[manpage modules/textutil/adjust.man textutil::adjust]
+[key unicode]
+[manpage modules/stringprep/stringprep.man stringprep]
+[manpage modules/stringprep/stringprep_data.man stringprep::data]
+[manpage modules/stringprep/unicode.man unicode]
+[manpage modules/stringprep/unicode_data.man unicode::data]
+[key union]
+[manpage modules/struct/disjointset.man struct::disjointset]
+[manpage modules/struct/struct_set.man struct::set]
+[key unit]
+[manpage modules/units/units.man units]
+[key {unknown hooking}]
+[manpage modules/namespacex/namespacex.man namespacex]
+[key untie]
+[manpage modules/tie/tie.man tie]
+[manpage modules/tie/tie_std.man tie]
+[key update]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[key uri]
+[manpage modules/uri/uri.man uri]
+[manpage modules/uri/urn-scheme.man uri_urn]
+[key url]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_import.man doctools::idx::import]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_import.man doctools::toc::import]
+[manpage modules/map/map_geocode_nominatim.man map::geocode::nominatim]
+[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
+[manpage modules/uri/uri.man uri]
+[manpage modules/uri/urn-scheme.man uri_urn]
+[key urn]
+[manpage modules/uri/urn-scheme.man uri_urn]
+[key US-NPI]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[key utilities]
+[manpage modules/namespacex/namespacex.man namespacex]
+[key uuencode]
+[manpage modules/base64/uuencode.man uuencode]
+[key UUID]
+[manpage modules/uuid/uuid.man uuid]
+[key Validation]
+[manpage modules/valtype/valtype_common.man valtype::common]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/iban.man valtype::iban]
+[manpage modules/valtype/imei.man valtype::imei]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[manpage modules/valtype/luhn.man valtype::luhn]
+[manpage modules/valtype/luhn5.man valtype::luhn5]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[manpage modules/valtype/verhoeff.man valtype::verhoeff]
+[key {Value checking}]
+[manpage modules/valtype/valtype_common.man valtype::common]
+[manpage modules/valtype/cc_amex.man valtype::creditcard::amex]
+[manpage modules/valtype/cc_discover.man valtype::creditcard::discover]
+[manpage modules/valtype/cc_mastercard.man valtype::creditcard::mastercard]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[manpage modules/valtype/ean13.man valtype::gs1::ean13]
+[manpage modules/valtype/iban.man valtype::iban]
+[manpage modules/valtype/imei.man valtype::imei]
+[manpage modules/valtype/isbn.man valtype::isbn]
+[manpage modules/valtype/luhn.man valtype::luhn]
+[manpage modules/valtype/luhn5.man valtype::luhn5]
+[manpage modules/valtype/usnpi.man valtype::usnpi]
+[manpage modules/valtype/verhoeff.man valtype::verhoeff]
+[key vectors]
+[manpage modules/math/linalg.man math::linearalgebra]
+[key verhoeff]
+[manpage modules/valtype/verhoeff.man valtype::verhoeff]
+[key vertex]
+[manpage modules/struct/graph.man struct::graph]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {vertex cover}]
+[manpage modules/struct/graphops.man struct::graph::op]
+[key {virtual channel}]
+[manpage modules/virtchannel_base/cat.man tcl::chan::cat]
+[manpage modules/virtchannel_core/core.man tcl::chan::core]
+[manpage modules/virtchannel_core/events.man tcl::chan::events]
+[manpage modules/virtchannel_base/facade.man tcl::chan::facade]
+[manpage modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo]
+[manpage modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2]
+[manpage modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe]
+[manpage modules/virtchannel_base/tcllib_memchan.man tcl::chan::memchan]
+[manpage modules/virtchannel_base/tcllib_null.man tcl::chan::null]
+[manpage modules/virtchannel_base/nullzero.man tcl::chan::nullzero]
+[manpage modules/virtchannel_base/tcllib_random.man tcl::chan::random]
+[manpage modules/virtchannel_base/std.man tcl::chan::std]
+[manpage modules/virtchannel_base/tcllib_string.man tcl::chan::string]
+[manpage modules/virtchannel_base/textwindow.man tcl::chan::textwindow]
+[manpage modules/virtchannel_base/tcllib_variable.man tcl::chan::variable]
+[manpage modules/virtchannel_base/tcllib_zero.man tcl::chan::zero]
+[manpage modules/virtchannel_base/randseed.man tcl::randomseed]
+[manpage modules/virtchannel_transform/adler32.man tcl::transform::adler32]
+[manpage modules/virtchannel_transform/vt_base64.man tcl::transform::base64]
+[manpage modules/virtchannel_core/transformcore.man tcl::transform::core]
+[manpage modules/virtchannel_transform/vt_counter.man tcl::transform::counter]
+[manpage modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32]
+[manpage modules/virtchannel_transform/hex.man tcl::transform::hex]
+[manpage modules/virtchannel_transform/identity.man tcl::transform::identity]
+[manpage modules/virtchannel_transform/limitsize.man tcl::transform::limitsize]
+[manpage modules/virtchannel_transform/observe.man tcl::transform::observe]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[manpage modules/virtchannel_transform/rot.man tcl::transform::rot]
+[manpage modules/virtchannel_transform/spacer.man tcl::transform::spacer]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[key {virtual machine}]
+[manpage modules/grammar_me/me_cpu.man grammar::me::cpu]
+[manpage modules/grammar_me/me_cpucore.man grammar::me::cpu::core]
+[manpage modules/grammar_me/gasm.man grammar::me::cpu::gasm]
+[manpage modules/grammar_me/me_tcl.man grammar::me::tcl]
+[manpage modules/grammar_me/me_intro.man grammar::me_intro]
+[manpage modules/grammar_me/me_vm.man grammar::me_vm]
+[manpage modules/grammar_peg/peg_interp.man grammar::peg::interp]
+[manpage modules/pt/pt_param.man pt::param]
+[key VISA]
+[manpage modules/valtype/cc_visa.man valtype::creditcard::visa]
+[key vwait]
+[manpage modules/coroutine/tcllib_coroutine.man coroutine]
+[manpage modules/coroutine/coro_auto.man coroutine::auto]
+[manpage modules/smtpd/smtpd.man smtpd]
+[key wais]
+[manpage modules/uri/uri.man uri]
+[key widget]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[key {widget adaptors}]
+[manpage modules/snit/snit.man snit]
+[manpage modules/snit/snitfaq.man snitfaq]
+[key wiki]
+[manpage modules/doctools2idx/idx_container.man doctools::idx]
+[manpage modules/doctools/docidx.man doctools::idx]
+[manpage modules/doctools2idx/idx_export.man doctools::idx::export]
+[manpage modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki]
+[manpage modules/doctools2toc/toc_container.man doctools::toc]
+[manpage modules/doctools/doctoc.man doctools::toc]
+[manpage modules/doctools2toc/toc_export.man doctools::toc::export]
+[manpage modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki]
+[key word]
+[manpage modules/doctools2base/tcl_parse.man doctools::tcl::parse]
+[manpage modules/wip/wip.man wip]
+[key WWW]
+[manpage modules/httpd/httpd.man tool]
+[key www]
+[manpage modules/uri/uri.man uri]
+[key x.208]
+[manpage modules/asn/asn.man asn]
+[key x.209]
+[manpage modules/asn/asn.man asn]
+[key x.500]
+[manpage modules/ldap/ldap.man ldap]
+[key XGoogleToken]
+[manpage modules/sasl/gtoken.man SASL::XGoogleToken]
+[key xml]
+[manpage modules/amazon-s3/xsxp.man xsxp]
+[key xor]
+[manpage modules/virtchannel_transform/vt_otp.man tcl::transform::otp]
+[key XPath]
+[manpage modules/treeql/treeql.man treeql]
+[key XSLT]
+[manpage modules/treeql/treeql.man treeql]
+[key yaml]
+[manpage modules/yaml/huddle.man huddle]
+[manpage modules/yaml/yaml.man yaml]
+[key ydecode]
+[manpage modules/base64/yencode.man yencode]
+[key yEnc]
+[manpage modules/base64/yencode.man yencode]
+[key yencode]
+[manpage modules/base64/yencode.man yencode]
+[key zero]
+[manpage modules/virtchannel_base/nullzero.man tcl::chan::nullzero]
+[manpage modules/virtchannel_base/tcllib_zero.man tcl::chan::zero]
+[key zip]
+[manpage modules/zip/decode.man zipfile::decode]
+[manpage modules/zip/encode.man zipfile::encode]
+[manpage modules/zip/mkzip.man zipfile::mkzip]
+[key zlib]
+[manpage modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib]
+[key zoom]
+[manpage modules/map/map_slippy.man map::slippy]
+[manpage modules/map/map_slippy_cache.man map::slippy::cache]
+[manpage modules/map/map_slippy_fetcher.man map::slippy::fetcher]
+[index_end] \ No newline at end of file
diff --git a/tcllib/support/devel/sak/doc/manpages.txt b/tcllib/support/devel/sak/doc/manpages.txt
new file mode 100644
index 0000000..6aceb6f
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/manpages.txt
@@ -0,0 +1,428 @@
+apps/dtplite.man
+apps/nns.man
+apps/nnsd.man
+apps/nnslog.man
+apps/page.man
+apps/pt.man
+apps/tcldocstrip.man
+modules/aes/aes.man
+modules/amazon-s3/S3.man
+modules/amazon-s3/xsxp.man
+modules/asn/asn.man
+modules/base32/base32.man
+modules/base32/base32core.man
+modules/base32/base32hex.man
+modules/base64/ascii85.man
+modules/base64/base64.man
+modules/base64/uuencode.man
+modules/base64/yencode.man
+modules/bee/bee.man
+modules/bench/bench.man
+modules/bench/bench_intro.man
+modules/bench/bench_lang_intro.man
+modules/bench/bench_lang_spec.man
+modules/bench/bench_read.man
+modules/bench/bench_wcsv.man
+modules/bench/bench_wtext.man
+modules/bibtex/bibtex.man
+modules/blowfish/blowfish.man
+modules/cache/async.man
+modules/clock/iso8601.man
+modules/clock/rfc2822.man
+modules/cmdline/cmdline.man
+modules/comm/comm.man
+modules/comm/comm_wire.man
+modules/control/control.man
+modules/coroutine/coro_auto.man
+modules/coroutine/tcllib_coroutine.man
+modules/counter/counter.man
+modules/crc/cksum.man
+modules/crc/crc16.man
+modules/crc/crc32.man
+modules/crc/sum.man
+modules/cron/cron.man
+modules/csv/csv.man
+modules/debug/debug.man
+modules/debug/debug_caller.man
+modules/debug/debug_heartbeat.man
+modules/debug/debug_timestamp.man
+modules/defer/defer.man
+modules/des/des.man
+modules/des/tcldes.man
+modules/des/tcldesjr.man
+modules/dicttool/dicttool.man
+modules/dns/tcllib_dns.man
+modules/dns/tcllib_ip.man
+modules/docstrip/docstrip.man
+modules/docstrip/docstrip_util.man
+modules/doctools/changelog.man
+modules/doctools/cvs.man
+modules/doctools/docidx.man
+modules/doctools/docidx_intro.man
+modules/doctools/docidx_lang_cmdref.man
+modules/doctools/docidx_lang_faq.man
+modules/doctools/docidx_lang_intro.man
+modules/doctools/docidx_lang_syntax.man
+modules/doctools/docidx_plugin_apiref.man
+modules/doctools/doctoc.man
+modules/doctools/doctoc_intro.man
+modules/doctools/doctoc_lang_cmdref.man
+modules/doctools/doctoc_lang_faq.man
+modules/doctools/doctoc_lang_intro.man
+modules/doctools/doctoc_lang_syntax.man
+modules/doctools/doctoc_plugin_apiref.man
+modules/doctools/doctools.man
+modules/doctools/doctools_intro.man
+modules/doctools/doctools_lang_cmdref.man
+modules/doctools/doctools_lang_faq.man
+modules/doctools/doctools_lang_intro.man
+modules/doctools/doctools_lang_syntax.man
+modules/doctools/doctools_plugin_apiref.man
+modules/doctools/mpexpand.man
+modules/doctools2base/html_cssdefaults.man
+modules/doctools2base/nroff_manmacros.man
+modules/doctools2base/tcl_parse.man
+modules/doctools2base/tcllib_msgcat.man
+modules/doctools2idx/export_docidx.man
+modules/doctools2idx/idx_container.man
+modules/doctools2idx/idx_export.man
+modules/doctools2idx/idx_export_html.man
+modules/doctools2idx/idx_export_json.man
+modules/doctools2idx/idx_export_nroff.man
+modules/doctools2idx/idx_export_text.man
+modules/doctools2idx/idx_export_wiki.man
+modules/doctools2idx/idx_import.man
+modules/doctools2idx/idx_import_json.man
+modules/doctools2idx/idx_introduction.man
+modules/doctools2idx/idx_msgcat_c.man
+modules/doctools2idx/idx_msgcat_de.man
+modules/doctools2idx/idx_msgcat_en.man
+modules/doctools2idx/idx_msgcat_fr.man
+modules/doctools2idx/idx_parse.man
+modules/doctools2idx/idx_structure.man
+modules/doctools2idx/import_docidx.man
+modules/doctools2toc/export_doctoc.man
+modules/doctools2toc/import_doctoc.man
+modules/doctools2toc/toc_container.man
+modules/doctools2toc/toc_export.man
+modules/doctools2toc/toc_export_html.man
+modules/doctools2toc/toc_export_json.man
+modules/doctools2toc/toc_export_nroff.man
+modules/doctools2toc/toc_export_text.man
+modules/doctools2toc/toc_export_wiki.man
+modules/doctools2toc/toc_import.man
+modules/doctools2toc/toc_import_json.man
+modules/doctools2toc/toc_introduction.man
+modules/doctools2toc/toc_msgcat_c.man
+modules/doctools2toc/toc_msgcat_de.man
+modules/doctools2toc/toc_msgcat_en.man
+modules/doctools2toc/toc_msgcat_fr.man
+modules/doctools2toc/toc_parse.man
+modules/doctools2toc/toc_structure.man
+modules/dtplite/pkg_dtplite.man
+modules/fileutil/fileutil.man
+modules/fileutil/multi.man
+modules/fileutil/multiop.man
+modules/fileutil/traverse.man
+modules/ftp/ftp.man
+modules/ftp/ftp_geturl.man
+modules/ftpd/ftpd.man
+modules/fumagic/cfront.man
+modules/fumagic/cgen.man
+modules/fumagic/filetypes.man
+modules/fumagic/rtcore.man
+modules/generator/generator.man
+modules/gpx/gpx.man
+modules/grammar_aycock/aycock.man
+modules/grammar_fa/dacceptor.man
+modules/grammar_fa/dexec.man
+modules/grammar_fa/fa.man
+modules/grammar_fa/faop.man
+modules/grammar_me/gasm.man
+modules/grammar_me/me_ast.man
+modules/grammar_me/me_cpu.man
+modules/grammar_me/me_cpucore.man
+modules/grammar_me/me_intro.man
+modules/grammar_me/me_tcl.man
+modules/grammar_me/me_util.man
+modules/grammar_me/me_vm.man
+modules/grammar_peg/peg.man
+modules/grammar_peg/peg_interp.man
+modules/hook/hook.man
+modules/html/html.man
+modules/htmlparse/htmlparse.man
+modules/http/autoproxy.man
+modules/httpd/httpd.man
+modules/ident/ident.man
+modules/imap4/imap4.man
+modules/inifile/ini.man
+modules/interp/deleg_method.man
+modules/interp/deleg_proc.man
+modules/interp/tcllib_interp.man
+modules/irc/irc.man
+modules/irc/picoirc.man
+modules/javascript/javascript.man
+modules/jpeg/jpeg.man
+modules/json/json.man
+modules/json/json_write.man
+modules/lambda/lambda.man
+modules/ldap/ldap.man
+modules/ldap/ldapx.man
+modules/log/log.man
+modules/log/logger.man
+modules/log/loggerAppender.man
+modules/log/loggerUtils.man
+modules/map/map_geocode_nominatim.man
+modules/map/map_slippy.man
+modules/map/map_slippy_cache.man
+modules/map/map_slippy_fetcher.man
+modules/mapproj/mapproj.man
+modules/markdown/markdown.man
+modules/math/bigfloat.man
+modules/math/bignum.man
+modules/math/calculus.man
+modules/math/combinatorics.man
+modules/math/constants.man
+modules/math/decimal.man
+modules/math/exact.man
+modules/math/fourier.man
+modules/math/fuzzy.man
+modules/math/interpolate.man
+modules/math/linalg.man
+modules/math/machineparameters.man
+modules/math/math.man
+modules/math/math_geometry.man
+modules/math/numtheory.man
+modules/math/optimize.man
+modules/math/pca.man
+modules/math/polynomials.man
+modules/math/qcomplex.man
+modules/math/rational_funcs.man
+modules/math/roman.man
+modules/math/romberg.man
+modules/math/special.man
+modules/math/statistics.man
+modules/math/symdiff.man
+modules/md4/md4.man
+modules/md5/md5.man
+modules/md5crypt/md5crypt.man
+modules/mime/mime.man
+modules/mime/smtp.man
+modules/multiplexer/multiplexer.man
+modules/namespacex/namespacex.man
+modules/ncgi/ncgi.man
+modules/nettool/nettool.man
+modules/nmea/nmea.man
+modules/nns/nns_auto.man
+modules/nns/nns_client.man
+modules/nns/nns_common.man
+modules/nns/nns_intro.man
+modules/nns/nns_protocol.man
+modules/nns/nns_server.man
+modules/nntp/nntp.man
+modules/ntp/ntp_time.man
+modules/oauth/oauth.man
+modules/oometa/oometa.man
+modules/ooutil/ooutil.man
+modules/otp/otp.man
+modules/page/page_intro.man
+modules/page/page_pluginmgr.man
+modules/page/page_util_flow.man
+modules/page/page_util_norm_lemon.man
+modules/page/page_util_norm_peg.man
+modules/page/page_util_peg.man
+modules/page/page_util_quote.man
+modules/pki/pki.man
+modules/pluginmgr/pluginmgr.man
+modules/png/png.man
+modules/pop3/pop3.man
+modules/pop3d/pop3d.man
+modules/pop3d/pop3d_dbox.man
+modules/pop3d/pop3d_udb.man
+modules/practcl/practcl.man
+modules/processman/processman.man
+modules/profiler/profiler.man
+modules/pt/pt_astree.man
+modules/pt/pt_cparam_config_critcl.man
+modules/pt/pt_cparam_config_tea.man
+modules/pt/pt_from_api.man
+modules/pt/pt_introduction.man
+modules/pt/pt_json_language.man
+modules/pt/pt_param.man
+modules/pt/pt_parse_peg.man
+modules/pt/pt_parser_api.man
+modules/pt/pt_peg_container.man
+modules/pt/pt_peg_container_peg.man
+modules/pt/pt_peg_export.man
+modules/pt/pt_peg_export_container.man
+modules/pt/pt_peg_export_json.man
+modules/pt/pt_peg_export_peg.man
+modules/pt/pt_peg_from_container.man
+modules/pt/pt_peg_from_json.man
+modules/pt/pt_peg_from_peg.man
+modules/pt/pt_peg_import.man
+modules/pt/pt_peg_import_container.man
+modules/pt/pt_peg_import_json.man
+modules/pt/pt_peg_import_peg.man
+modules/pt/pt_peg_interp.man
+modules/pt/pt_peg_introduction.man
+modules/pt/pt_peg_language.man
+modules/pt/pt_peg_op.man
+modules/pt/pt_peg_to_container.man
+modules/pt/pt_peg_to_cparam.man
+modules/pt/pt_peg_to_json.man
+modules/pt/pt_peg_to_param.man
+modules/pt/pt_peg_to_peg.man
+modules/pt/pt_peg_to_tclparam.man
+modules/pt/pt_pegrammar.man
+modules/pt/pt_pexpr_op.man
+modules/pt/pt_pexpression.man
+modules/pt/pt_pgen.man
+modules/pt/pt_rdengine.man
+modules/pt/pt_tclparam_config_nx.man
+modules/pt/pt_tclparam_config_snit.man
+modules/pt/pt_tclparam_config_tcloo.man
+modules/pt/pt_to_api.man
+modules/pt/pt_util.man
+modules/rc4/rc4.man
+modules/rcs/rcs.man
+modules/report/report.man
+modules/rest/rest.man
+modules/ripemd/ripemd128.man
+modules/ripemd/ripemd160.man
+modules/sasl/gtoken.man
+modules/sasl/ntlm.man
+modules/sasl/sasl.man
+modules/sasl/scram.man
+modules/sha1/sha1.man
+modules/sha1/sha256.man
+modules/simulation/annealing.man
+modules/simulation/montecarlo.man
+modules/simulation/simulation_random.man
+modules/smtpd/smtpd.man
+modules/snit/snit.man
+modules/snit/snitfaq.man
+modules/soundex/soundex.man
+modules/stooop/stooop.man
+modules/stooop/switched.man
+modules/string/token.man
+modules/string/token_shell.man
+modules/stringprep/stringprep.man
+modules/stringprep/stringprep_data.man
+modules/stringprep/unicode.man
+modules/stringprep/unicode_data.man
+modules/struct/disjointset.man
+modules/struct/graph.man
+modules/struct/graph1.man
+modules/struct/graphops.man
+modules/struct/matrix.man
+modules/struct/matrix1.man
+modules/struct/pool.man
+modules/struct/prioqueue.man
+modules/struct/queue.man
+modules/struct/record.man
+modules/struct/skiplist.man
+modules/struct/stack.man
+modules/struct/struct_list.man
+modules/struct/struct_set.man
+modules/struct/struct_tree.man
+modules/struct/struct_tree1.man
+modules/tar/tar.man
+modules/tepam/tepam_argument_dialogbox.man
+modules/tepam/tepam_doc_gen.man
+modules/tepam/tepam_introduction.man
+modules/tepam/tepam_procedure.man
+modules/term/ansi_cattr.man
+modules/term/ansi_cctrl.man
+modules/term/ansi_cmacros.man
+modules/term/ansi_code.man
+modules/term/ansi_ctrlu.man
+modules/term/ansi_send.man
+modules/term/imenu.man
+modules/term/ipager.man
+modules/term/receive.man
+modules/term/term.man
+modules/term/term_bind.man
+modules/term/term_send.man
+modules/textutil/adjust.man
+modules/textutil/expander.man
+modules/textutil/repeat.man
+modules/textutil/tabify.man
+modules/textutil/textutil.man
+modules/textutil/textutil_split.man
+modules/textutil/textutil_string.man
+modules/textutil/trim.man
+modules/tie/tie.man
+modules/tie/tie_std.man
+modules/tiff/tiff.man
+modules/tool-ui/tool-ui.man
+modules/tool/meta.man
+modules/tool/tool.man
+modules/tool/tool_dict_ensemble.man
+modules/transfer/connect.man
+modules/transfer/copyops.man
+modules/transfer/ddest.man
+modules/transfer/dsource.man
+modules/transfer/receiver.man
+modules/transfer/tqueue.man
+modules/transfer/transmitter.man
+modules/treeql/treeql.man
+modules/try/tcllib_throw.man
+modules/try/tcllib_try.man
+modules/udpcluster/udpcluster.man
+modules/uev/uevent.man
+modules/uev/uevent_onidle.man
+modules/units/units.man
+modules/uri/uri.man
+modules/uri/urn-scheme.man
+modules/uuid/uuid.man
+modules/valtype/cc_amex.man
+modules/valtype/cc_discover.man
+modules/valtype/cc_mastercard.man
+modules/valtype/cc_visa.man
+modules/valtype/ean13.man
+modules/valtype/iban.man
+modules/valtype/imei.man
+modules/valtype/isbn.man
+modules/valtype/luhn.man
+modules/valtype/luhn5.man
+modules/valtype/usnpi.man
+modules/valtype/valtype_common.man
+modules/valtype/verhoeff.man
+modules/virtchannel_base/cat.man
+modules/virtchannel_base/facade.man
+modules/virtchannel_base/halfpipe.man
+modules/virtchannel_base/nullzero.man
+modules/virtchannel_base/randseed.man
+modules/virtchannel_base/std.man
+modules/virtchannel_base/tcllib_fifo.man
+modules/virtchannel_base/tcllib_fifo2.man
+modules/virtchannel_base/tcllib_memchan.man
+modules/virtchannel_base/tcllib_null.man
+modules/virtchannel_base/tcllib_random.man
+modules/virtchannel_base/tcllib_string.man
+modules/virtchannel_base/tcllib_variable.man
+modules/virtchannel_base/tcllib_zero.man
+modules/virtchannel_base/textwindow.man
+modules/virtchannel_core/core.man
+modules/virtchannel_core/events.man
+modules/virtchannel_core/transformcore.man
+modules/virtchannel_transform/adler32.man
+modules/virtchannel_transform/hex.man
+modules/virtchannel_transform/identity.man
+modules/virtchannel_transform/limitsize.man
+modules/virtchannel_transform/observe.man
+modules/virtchannel_transform/rot.man
+modules/virtchannel_transform/spacer.man
+modules/virtchannel_transform/tcllib_zlib.man
+modules/virtchannel_transform/vt_base64.man
+modules/virtchannel_transform/vt_counter.man
+modules/virtchannel_transform/vt_crc32.man
+modules/virtchannel_transform/vt_otp.man
+modules/websocket/websocket.man
+modules/wip/wip.man
+modules/yaml/huddle.man
+modules/yaml/yaml.man
+modules/zip/decode.man
+modules/zip/encode.man
+modules/zip/mkzip.man
diff --git a/tcllib/support/devel/sak/doc/pkgIndex.tcl b/tcllib/support/devel/sak/doc/pkgIndex.tcl
new file mode 100644
index 0000000..4187efe
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/pkgIndex.tcl
@@ -0,0 +1,4 @@
+if {![package vsatisfies [package provide Tcl] 8.2]} return
+package ifneeded sak::doc 1.0 [list source [file join $dir doc.tcl]]
+package ifneeded sak::doc::auto 1.0 [list source [file join $dir doc_auto.tcl]]
+
diff --git a/tcllib/support/devel/sak/doc/toc.txt b/tcllib/support/devel/sak/doc/toc.txt
new file mode 100644
index 0000000..b1d74b0
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/toc.txt
@@ -0,0 +1,1172 @@
+[toc_begin {Table Of Contents} {}]
+[division_start {By Categories}]
+[division_start {Argument entry form, mega widget}]
+[item modules/tepam/tepam_argument_dialogbox.man tepam::argument_dialogbox {TEPAM argument_dialogbox, reference manual}]
+[division_end]
+[division_start {Benchmark tools}]
+[item modules/bench/bench.man bench {bench - Processing benchmark suites}]
+[item modules/bench/bench_read.man bench::in {bench::in - Reading benchmark results}]
+[item modules/bench/bench_wcsv.man bench::out::csv {bench::out::csv - Formatting benchmark results as CSV}]
+[item modules/bench/bench_wtext.man bench::out::text {bench::out::text - Formatting benchmark results as human readable text}]
+[item modules/bench/bench_intro.man bench_intro {bench introduction}]
+[item modules/bench/bench_lang_intro.man bench_lang_intro {bench language introduction}]
+[item modules/bench/bench_lang_spec.man bench_lang_spec {bench language specification}]
+[division_end]
+[division_start {CGI programming}]
+[item modules/html/html.man html {Procedures to generate HTML structures}]
+[item modules/javascript/javascript.man javascript {Procedures to generate HTML and Java Script structures.}]
+[item modules/json/json.man json {JSON parser}]
+[item modules/json/json_write.man json::write {JSON generation}]
+[item modules/ncgi/ncgi.man ncgi {Procedures to manipulate CGI values.}]
+[division_end]
+[division_start Channels]
+[item modules/virtchannel_base/cat.man tcl::chan::cat {Concatenation channel}]
+[item modules/virtchannel_core/core.man tcl::chan::core {Basic reflected/virtual channel support}]
+[item modules/virtchannel_core/events.man tcl::chan::events {Event support for reflected/virtual channels}]
+[item modules/virtchannel_base/facade.man tcl::chan::facade {Facade channel}]
+[item modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo {In-memory fifo channel}]
+[item modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2 {In-memory interconnected fifo channels}]
+[item modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe {In-memory channel, half of a fifo2}]
+[item modules/virtchannel_base/tcllib_memchan.man tcl::chan::memchan {In-memory channel}]
+[item modules/virtchannel_base/tcllib_null.man tcl::chan::null {Null channel}]
+[item modules/virtchannel_base/nullzero.man tcl::chan::nullzero {Null/Zero channel combination}]
+[item modules/virtchannel_base/tcllib_random.man tcl::chan::random {Random channel}]
+[item modules/virtchannel_base/std.man tcl::chan::std {Standard I/O, unification of stdin and stdout}]
+[item modules/virtchannel_base/tcllib_string.man tcl::chan::string {Read-only in-memory channel}]
+[item modules/virtchannel_base/textwindow.man tcl::chan::textwindow {Textwindow channel}]
+[item modules/virtchannel_base/tcllib_variable.man tcl::chan::variable {In-memory channel using variable for storage}]
+[item modules/virtchannel_base/tcllib_zero.man tcl::chan::zero {Zero channel}]
+[item modules/virtchannel_base/randseed.man tcl::randomseed {Utilities for random channels}]
+[item modules/virtchannel_transform/adler32.man tcl::transform::adler32 {Adler32 transformation}]
+[item modules/virtchannel_transform/vt_base64.man tcl::transform::base64 {Base64 encoding transformation}]
+[item modules/virtchannel_core/transformcore.man tcl::transform::core {Basic reflected/virtual channel transform support}]
+[item modules/virtchannel_transform/vt_counter.man tcl::transform::counter {Counter transformation}]
+[item modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32 {Crc32 transformation}]
+[item modules/virtchannel_transform/hex.man tcl::transform::hex {Hexadecimal encoding transformation}]
+[item modules/virtchannel_transform/identity.man tcl::transform::identity {Identity transformation}]
+[item modules/virtchannel_transform/limitsize.man tcl::transform::limitsize {limiting input}]
+[item modules/virtchannel_transform/observe.man tcl::transform::observe {Observer transformation, stream copy}]
+[item modules/virtchannel_transform/vt_otp.man tcl::transform::otp {Encryption via one-time pad}]
+[item modules/virtchannel_transform/rot.man tcl::transform::rot rot-encryption]
+[item modules/virtchannel_transform/spacer.man tcl::transform::spacer {Space insertation and removal}]
+[item modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib {zlib (de)compression}]
+[division_end]
+[division_start Coroutine]
+[item modules/coroutine/tcllib_coroutine.man coroutine {Coroutine based event and IO handling}]
+[item modules/coroutine/coro_auto.man coroutine::auto {Automatic event and IO coroutine awareness}]
+[division_end]
+[division_start {Data structures}]
+[item modules/counter/counter.man counter {Procedures for counters and histograms}]
+[item modules/report/report.man report {Create and manipulate report objects}]
+[item modules/struct/disjointset.man struct::disjointset {Disjoint set data structure}]
+[item modules/struct/graph.man struct::graph {Create and manipulate directed graph objects}]
+[item modules/struct/graphops.man struct::graph::op {Operation for (un)directed graph objects}]
+[item modules/struct/graph1.man struct::graph_v1 {Create and manipulate directed graph objects}]
+[item modules/struct/struct_list.man struct::list {Procedures for manipulating lists}]
+[item modules/struct/matrix.man struct::matrix {Create and manipulate matrix objects}]
+[item modules/struct/matrix1.man struct::matrix_v1 {Create and manipulate matrix objects}]
+[item modules/struct/pool.man struct::pool {Create and manipulate pool objects (of discrete items)}]
+[item modules/struct/prioqueue.man struct::prioqueue {Create and manipulate prioqueue objects}]
+[item modules/struct/queue.man struct::queue {Create and manipulate queue objects}]
+[item modules/struct/record.man struct::record {Define and create records (similar to 'C' structures)}]
+[item modules/struct/struct_set.man struct::set {Procedures for manipulating sets}]
+[item modules/struct/skiplist.man struct::skiplist {Create and manipulate skiplists}]
+[item modules/struct/stack.man struct::stack {Create and manipulate stack objects}]
+[item modules/struct/struct_tree.man struct::tree {Create and manipulate tree objects}]
+[item modules/struct/struct_tree1.man struct::tree_v1 {Create and manipulate tree objects}]
+[item modules/treeql/treeql.man treeql {Query tree objects}]
+[division_end]
+[division_start {debugging, tracing, and logging}]
+[item modules/debug/debug.man debug {debug narrative - core}]
+[item modules/debug/debug_caller.man debug::caller {debug narrative - caller}]
+[item modules/debug/debug_heartbeat.man debug::heartbeat {debug narrative - heartbeat}]
+[item modules/debug/debug_timestamp.man debug::timestamp {debug narrative - timestamping}]
+[division_end]
+[division_start {Documentation tools}]
+[item modules/doctools/docidx_intro.man docidx_intro {docidx introduction}]
+[item modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref {docidx language command reference}]
+[item modules/doctools/docidx_lang_faq.man docidx_lang_faq {docidx language faq}]
+[item modules/doctools/docidx_lang_intro.man docidx_lang_intro {docidx language introduction}]
+[item modules/doctools/docidx_lang_syntax.man docidx_lang_syntax {docidx language syntax}]
+[item modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref {docidx plugin API reference}]
+[item modules/docstrip/docstrip.man docstrip {Docstrip style source code extraction}]
+[item modules/docstrip/docstrip_util.man docstrip_util {Docstrip-related utilities}]
+[item modules/doctools/doctoc_intro.man doctoc_intro {doctoc introduction}]
+[item modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref {doctoc language command reference}]
+[item modules/doctools/doctoc_lang_faq.man doctoc_lang_faq {doctoc language faq}]
+[item modules/doctools/doctoc_lang_intro.man doctoc_lang_intro {doctoc language introduction}]
+[item modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax {doctoc language syntax}]
+[item modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref {doctoc plugin API reference}]
+[item modules/doctools/doctools.man doctools {doctools - Processing documents}]
+[item modules/doctools2idx/idx_introduction.man doctools2idx_introduction {DocTools - Keyword indices}]
+[item modules/doctools2toc/toc_introduction.man doctools2toc_introduction {DocTools - Tables of Contents}]
+[item modules/doctools/changelog.man doctools::changelog {Processing text in Emacs ChangeLog format}]
+[item modules/doctools/cvs.man doctools::cvs {Processing text in 'cvs log' format}]
+[item modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults {Default CSS style for HTML export plugins}]
+[item modules/doctools2idx/idx_container.man doctools::idx {Holding keyword indices}]
+[item modules/doctools/docidx.man doctools::idx {docidx - Processing indices}]
+[item modules/doctools2idx/idx_export.man doctools::idx::export {Exporting keyword indices}]
+[item modules/doctools2idx/idx_import.man doctools::idx::import {Importing keyword indices}]
+[item modules/doctools2idx/idx_parse.man doctools::idx::parse {Parsing text in docidx format}]
+[item modules/doctools2idx/idx_structure.man doctools::idx::structure {Docidx serialization utilities}]
+[item modules/doctools2base/tcllib_msgcat.man doctools::msgcat {Message catalog management for the various document parsers}]
+[item modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c {Message catalog for the docidx parser (C)}]
+[item modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de {Message catalog for the docidx parser (DE)}]
+[item modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en {Message catalog for the docidx parser (EN)}]
+[item modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr {Message catalog for the docidx parser (FR)}]
+[item modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c {Message catalog for the doctoc parser (C)}]
+[item modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de {Message catalog for the doctoc parser (DE)}]
+[item modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en {Message catalog for the doctoc parser (EN)}]
+[item modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr {Message catalog for the doctoc parser (FR)}]
+[item modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros {Default CSS style for NROFF export plugins}]
+[item modules/doctools2base/tcl_parse.man doctools::tcl::parse {Processing text in 'subst -novariables' format}]
+[item modules/doctools2toc/toc_container.man doctools::toc {Holding tables of contents}]
+[item modules/doctools/doctoc.man doctools::toc {doctoc - Processing tables of contents}]
+[item modules/doctools2toc/toc_export.man doctools::toc::export {Exporting tables of contents}]
+[item modules/doctools2toc/toc_import.man doctools::toc::import {Importing keyword indices}]
+[item modules/doctools2toc/toc_parse.man doctools::toc::parse {Parsing text in doctoc format}]
+[item modules/doctools2toc/toc_structure.man doctools::toc::structure {Doctoc serialization utilities}]
+[item modules/doctools/doctools_intro.man doctools_intro {doctools introduction}]
+[item modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref {doctools language command reference}]
+[item modules/doctools/doctools_lang_faq.man doctools_lang_faq {doctools language faq}]
+[item modules/doctools/doctools_lang_intro.man doctools_lang_intro {doctools language introduction}]
+[item modules/doctools/doctools_lang_syntax.man doctools_lang_syntax {doctools language syntax}]
+[item modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref {doctools plugin API reference}]
+[item modules/dtplite/pkg_dtplite.man dtplite {Lightweight DocTools Markup Processor}]
+[item apps/dtplite.man dtplite {Lightweight DocTools Markup Processor}]
+[item modules/doctools/mpexpand.man mpexpand {Markup processor}]
+[item apps/tcldocstrip.man tcldocstrip {Tcl-based Docstrip Processor}]
+[item modules/tepam/tepam_doc_gen.man tepam::doc_gen {TEPAM DOC Generation, reference manual}]
+[item modules/textutil/expander.man textutil::expander {Procedures to process templates and expand text.}]
+[division_end]
+[division_start File]
+[item modules/zip/decode.man zipfile::decode {Access to zip archives}]
+[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
+[item modules/zip/mkzip.man zipfile::mkzip {Build a zip archive}]
+[division_end]
+[division_start {File formats}]
+[item modules/gpx/gpx.man gpx {Extracts waypoints, tracks and routes from GPX files}]
+[item modules/jpeg/jpeg.man jpeg {JPEG querying and manipulation of meta data}]
+[item modules/png/png.man png {PNG querying and manipulation of meta data}]
+[item modules/tar/tar.man tar {Tar file creation, extraction & manipulation}]
+[item modules/tiff/tiff.man tiff {TIFF reading, writing, and querying and manipulation of meta data}]
+[division_end]
+[division_start {Grammars and finite automata}]
+[item modules/grammar_aycock/aycock.man grammar::aycock {Aycock-Horspool-Earley parser generator for Tcl}]
+[item modules/grammar_fa/fa.man grammar::fa {Create and manipulate finite automatons}]
+[item modules/grammar_fa/dacceptor.man grammar::fa::dacceptor {Create and use deterministic acceptors}]
+[item modules/grammar_fa/dexec.man grammar::fa::dexec {Execute deterministic finite automatons}]
+[item modules/grammar_fa/faop.man grammar::fa::op {Operations on finite automatons}]
+[item modules/grammar_me/me_cpu.man grammar::me::cpu {Virtual machine implementation II for parsing token streams}]
+[item modules/grammar_me/me_cpucore.man grammar::me::cpu::core {ME virtual machine state manipulation}]
+[item modules/grammar_me/gasm.man grammar::me::cpu::gasm {ME assembler}]
+[item modules/grammar_me/me_tcl.man grammar::me::tcl {Virtual machine implementation I for parsing token streams}]
+[item modules/grammar_me/me_util.man grammar::me::util {AST utilities}]
+[item modules/grammar_me/me_ast.man grammar::me_ast {Various representations of ASTs}]
+[item modules/grammar_me/me_intro.man grammar::me_intro {Introduction to virtual machines for parsing token streams}]
+[item modules/grammar_me/me_vm.man grammar::me_vm {Virtual machine for parsing token streams}]
+[item modules/grammar_peg/peg.man grammar::peg {Create and manipulate parsing expression grammars}]
+[item modules/grammar_peg/peg_interp.man grammar::peg::interp {Interpreter for parsing expression grammars}]
+[division_end]
+[division_start {Hashes, checksums, and encryption}]
+[item modules/aes/aes.man aes {Implementation of the AES block cipher}]
+[item modules/blowfish/blowfish.man blowfish {Implementation of the Blowfish block cipher}]
+[item modules/crc/cksum.man cksum {Calculate a cksum(1) compatible checksum}]
+[item modules/crc/crc16.man crc16 {Perform a 16bit Cyclic Redundancy Check}]
+[item modules/crc/crc32.man crc32 {Perform a 32bit Cyclic Redundancy Check}]
+[item modules/des/des.man des {Implementation of the DES and triple-DES ciphers}]
+[item modules/md4/md4.man md4 {MD4 Message-Digest Algorithm}]
+[item modules/md5/md5.man md5 {MD5 Message-Digest Algorithm}]
+[item modules/md5crypt/md5crypt.man md5crypt {MD5-based password encryption}]
+[item modules/otp/otp.man otp {One-Time Passwords}]
+[item modules/pki/pki.man pki {Implementation of the public key cipher}]
+[item modules/rc4/rc4.man rc4 {Implementation of the RC4 stream cipher}]
+[item modules/ripemd/ripemd128.man ripemd128 {RIPEMD-128 Message-Digest Algorithm}]
+[item modules/ripemd/ripemd160.man ripemd160 {RIPEMD-160 Message-Digest Algorithm}]
+[item modules/sha1/sha1.man sha1 {SHA1 Message-Digest Algorithm}]
+[item modules/sha1/sha256.man sha256 {SHA256 Message-Digest Algorithm}]
+[item modules/soundex/soundex.man soundex Soundex]
+[item modules/crc/sum.man sum {Calculate a sum(1) compatible checksum}]
+[item modules/des/tcldes.man tclDES {Implementation of the DES and triple-DES ciphers}]
+[item modules/des/tcldesjr.man tclDESjr {Implementation of the DES and triple-DES ciphers}]
+[item modules/uuid/uuid.man uuid {UUID generation and comparison}]
+[division_end]
+[division_start Mathematics]
+[item modules/math/math.man math {Tcl Math Library}]
+[item modules/math/bigfloat.man math::bigfloat {Arbitrary precision floating-point numbers}]
+[item modules/math/bignum.man math::bignum {Arbitrary precision integer numbers}]
+[item modules/math/calculus.man math::calculus {Integration and ordinary differential equations}]
+[item modules/math/romberg.man math::calculus::romberg {Romberg integration}]
+[item modules/math/combinatorics.man math::combinatorics {Combinatorial functions in the Tcl Math Library}]
+[item modules/math/qcomplex.man math::complexnumbers {Straightforward complex number package}]
+[item modules/math/constants.man math::constants {Mathematical and numerical constants}]
+[item modules/math/decimal.man math::decimal {General decimal arithmetic}]
+[item modules/math/exact.man math::exact {Exact Real Arithmetic}]
+[item modules/math/fourier.man math::fourier {Discrete and fast fourier transforms}]
+[item modules/math/fuzzy.man math::fuzzy {Fuzzy comparison of floating-point numbers}]
+[item modules/math/math_geometry.man math::geometry {Geometrical computations}]
+[item modules/math/interpolate.man math::interpolate {Interpolation routines}]
+[item modules/math/linalg.man math::linearalgebra {Linear Algebra}]
+[item modules/math/numtheory.man math::numtheory {Number Theory}]
+[item modules/math/optimize.man math::optimize {Optimisation routines}]
+[item modules/math/pca.man math::PCA {Package for Principal Component Analysis}]
+[item modules/math/polynomials.man math::polynomials {Polynomial functions}]
+[item modules/math/rational_funcs.man math::rationalfunctions {Polynomial functions}]
+[item modules/math/roman.man math::roman {Tools for creating and manipulating roman numerals}]
+[item modules/math/special.man math::special {Special mathematical functions}]
+[item modules/math/statistics.man math::statistics {Basic statistical functions and procedures}]
+[item modules/simulation/annealing.man simulation::annealing {Simulated annealing}]
+[item modules/simulation/montecarlo.man simulation::montecarlo {Monte Carlo simulations}]
+[item modules/simulation/simulation_random.man simulation::random {Pseudo-random number generators}]
+[division_end]
+[division_start Networking]
+[item modules/asn/asn.man asn {ASN.1 BER encoder/decoder}]
+[item modules/http/autoproxy.man autoproxy {Automatic HTTP proxy usage and authentication}]
+[item modules/bee/bee.man bee {BitTorrent Serialization Format Encoder/Decoder}]
+[item modules/dns/tcllib_dns.man dns {Tcl Domain Name Service Client}]
+[item modules/ftp/ftp.man ftp {Client-side tcl implementation of the ftp protocol}]
+[item modules/ftp/ftp_geturl.man ftp::geturl {Uri handler for ftp urls}]
+[item modules/ftpd/ftpd.man ftpd {Tcl FTP server implementation}]
+[item modules/ident/ident.man ident {Ident protocol client}]
+[item modules/irc/irc.man irc {Create IRC connection and interface.}]
+[item modules/ldap/ldap.man ldap {LDAP client}]
+[item modules/ldap/ldapx.man ldapx {LDAP extended object interface}]
+[item modules/nns/nns_client.man nameserv {Name service facility, Client}]
+[item modules/nns/nns_auto.man nameserv::auto {Name service facility, Client Extension}]
+[item modules/nns/nns_common.man nameserv::common {Name service facility, shared definitions}]
+[item modules/nns/nns_protocol.man nameserv::protocol {Name service facility, client/server protocol}]
+[item modules/nns/nns_server.man nameserv::server {Name service facility, Server}]
+[item modules/nmea/nmea.man nmea {Process NMEA data}]
+[item apps/nns.man nns {Name service facility, Commandline Client Application}]
+[item modules/nns/nns_intro.man nns_intro {Name service facility, introduction}]
+[item apps/nnsd.man nnsd {Name service facility, Commandline Server Application}]
+[item apps/nnslog.man nnslog {Name service facility, Commandline Logging Client Application}]
+[item modules/nntp/nntp.man nntp {Tcl client for the NNTP protocol}]
+[item modules/ntp/ntp_time.man ntp_time {Tcl Time Service Client}]
+[item modules/oauth/oauth.man oauth {oauth API base signature}]
+[item modules/irc/picoirc.man picoirc {Small and simple embeddable IRC client.}]
+[item modules/pop3/pop3.man pop3 {Tcl client for POP3 email protocol}]
+[item modules/pop3d/pop3d.man pop3d {Tcl POP3 server implementation}]
+[item modules/pop3d/pop3d_dbox.man pop3d::dbox {Simple mailbox database for pop3d}]
+[item modules/pop3d/pop3d_udb.man pop3d::udb {Simple user database for pop3d}]
+[item modules/amazon-s3/S3.man S3 {Amazon S3 Web Service Interface}]
+[item modules/sasl/sasl.man SASL {Implementation of SASL mechanisms for Tcl}]
+[item modules/sasl/ntlm.man SASL::NTLM {Implementation of SASL NTLM mechanism for Tcl}]
+[item modules/sasl/scram.man SASL::SCRAM {Implementation of SASL SCRAM mechanism for Tcl}]
+[item modules/sasl/gtoken.man SASL::XGoogleToken {Implementation of SASL NTLM mechanism for Tcl}]
+[item modules/mime/smtp.man smtp {Client-side tcl implementation of the smtp protocol}]
+[item modules/smtpd/smtpd.man smtpd {Tcl SMTP server implementation}]
+[item modules/dns/tcllib_ip.man tcllib_ip {IPv4 and IPv6 address manipulation}]
+[item modules/httpd/httpd.man tool {A TclOO and coroutine based web server}]
+[item modules/udpcluster/udpcluster.man udpcluster {UDP Peer-to-Peer cluster}]
+[item modules/uri/uri.man uri {URI utilities}]
+[item modules/uri/urn-scheme.man uri_urn {URI utilities, URN scheme}]
+[item modules/websocket/websocket.man websocket {Tcl implementation of the websocket protocol}]
+[division_end]
+[division_start {Page Parser Generator}]
+[item apps/page.man page {Parser Generator}]
+[item modules/page/page_intro.man page_intro {page introduction}]
+[item modules/page/page_pluginmgr.man page_pluginmgr {page plugin manager}]
+[item modules/page/page_util_flow.man page_util_flow {page dataflow/treewalker utility}]
+[item modules/page/page_util_norm_lemon.man page_util_norm_lemon {page AST normalization, LEMON}]
+[item modules/page/page_util_norm_peg.man page_util_norm_peg {page AST normalization, PEG}]
+[item modules/page/page_util_peg.man page_util_peg {page PEG transformation utilities}]
+[item modules/page/page_util_quote.man page_util_quote {page character quoting utilities}]
+[division_end]
+[division_start {Parsing and Grammars}]
+[item apps/pt.man pt {Parser Tools Application}]
+[item modules/pt/pt_astree.man pt::ast {Abstract Syntax Tree Serialization}]
+[item modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl {C/PARAM, Canned configuration, Critcl}]
+[item modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea {C/PARAM, Canned configuration, TEA}]
+[item modules/pt/pt_json_language.man pt::json_language {The JSON Grammar Exchange Format}]
+[item modules/pt/pt_param.man pt::param {PackRat Machine Specification}]
+[item modules/pt/pt_pexpression.man pt::pe {Parsing Expression Serialization}]
+[item modules/pt/pt_pexpr_op.man pt::pe::op {Parsing Expression Utilities}]
+[item modules/pt/pt_pegrammar.man pt::peg {Parsing Expression Grammar Serialization}]
+[item modules/pt/pt_peg_container.man pt::peg::container {PEG Storage}]
+[item modules/pt/pt_peg_container_peg.man pt::peg::container::peg {PEG Storage. Canned PEG grammar specification}]
+[item modules/pt/pt_peg_export.man pt::peg::export {PEG Export}]
+[item modules/pt/pt_peg_export_container.man pt::peg::export::container {PEG Export Plugin. Write CONTAINER format}]
+[item modules/pt/pt_peg_export_json.man pt::peg::export::json {PEG Export Plugin. Write JSON format}]
+[item modules/pt/pt_peg_export_peg.man pt::peg::export::peg {PEG Export Plugin. Write PEG format}]
+[item modules/pt/pt_peg_from_container.man pt::peg::from::container {PEG Conversion. From CONTAINER format}]
+[item modules/pt/pt_peg_from_json.man pt::peg::from::json {PEG Conversion. Read JSON format}]
+[item modules/pt/pt_peg_from_peg.man pt::peg::from::peg {PEG Conversion. Read PEG format}]
+[item modules/pt/pt_peg_import.man pt::peg::import {PEG Import}]
+[item modules/pt/pt_peg_import_container.man pt::peg::import::container {PEG Import Plugin. From CONTAINER format}]
+[item modules/pt/pt_peg_import_json.man pt::peg::import::json {PEG Import Plugin. Read JSON format}]
+[item modules/pt/pt_peg_import_peg.man pt::peg::import::peg {PEG Import Plugin. Read PEG format}]
+[item modules/pt/pt_peg_interp.man pt::peg::interp {Interpreter for parsing expression grammars}]
+[item modules/pt/pt_peg_to_container.man pt::peg::to::container {PEG Conversion. Write CONTAINER format}]
+[item modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam {PEG Conversion. Write CPARAM format}]
+[item modules/pt/pt_peg_to_json.man pt::peg::to::json {PEG Conversion. Write JSON format}]
+[item modules/pt/pt_peg_to_param.man pt::peg::to::param {PEG Conversion. Write PARAM format}]
+[item modules/pt/pt_peg_to_peg.man pt::peg::to::peg {PEG Conversion. Write PEG format}]
+[item modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam {PEG Conversion. Write TCLPARAM format}]
+[item modules/pt/pt_peg_language.man pt::peg_language {PEG Language Tutorial}]
+[item modules/pt/pt_peg_introduction.man pt::pegrammar {Introduction to Parsing Expression Grammars}]
+[item modules/pt/pt_pgen.man pt::pgen {Parser Generator}]
+[item modules/pt/pt_rdengine.man pt::rde {Parsing Runtime Support, PARAM based}]
+[item modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx {Tcl/PARAM, Canned configuration, NX}]
+[item modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit {Tcl/PARAM, Canned configuration, Snit}]
+[item modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo {Tcl/PARAM, Canned configuration, Tcloo}]
+[item modules/pt/pt_util.man pt::util {General utilities}]
+[item modules/pt/pt_to_api.man pt_export_api {Parser Tools Export API}]
+[item modules/pt/pt_from_api.man pt_import_api {Parser Tools Import API}]
+[item modules/pt/pt_introduction.man pt_introduction {Introduction to Parser Tools}]
+[item modules/pt/pt_parse_peg.man pt_parse_peg {Parser Tools PEG Parser}]
+[item modules/pt/pt_parser_api.man pt_parser_api {Parser API}]
+[item modules/pt/pt_peg_op.man pt_peg_op {Parser Tools PE Grammar Utility Operations}]
+[division_end]
+[division_start {Procedures, arguments, parameters, options}]
+[item modules/tepam/tepam_introduction.man tepam {An introduction into TEPAM, Tcl's Enhanced Procedure and Argument Manager}]
+[item modules/tepam/tepam_procedure.man tepam::procedure {TEPAM procedure, reference manual}]
+[division_end]
+[division_start {Programming tools}]
+[item modules/cmdline/cmdline.man cmdline {Procedures to process command lines and options.}]
+[item modules/comm/comm.man comm {A remote communication facility for Tcl (8.3 and later)}]
+[item modules/comm/comm_wire.man comm_wire {The comm wire protocol}]
+[item modules/control/control.man control {Procedures for control flow structures.}]
+[item modules/interp/deleg_method.man deleg_method {Creation of comm delegates (snit methods)}]
+[item modules/interp/deleg_proc.man deleg_proc {Creation of comm delegates (procedures)}]
+[item modules/fileutil/fileutil.man fileutil {Procedures implementing some file utilities}]
+[item modules/fumagic/cfront.man fileutil::magic::cfront {Generator core for compiler of magic(5) files}]
+[item modules/fumagic/cgen.man fileutil::magic::cgen {Generator core for compiler of magic(5) files}]
+[item modules/fumagic/filetypes.man fileutil::magic::filetype {Procedures implementing file-type recognition}]
+[item modules/fumagic/rtcore.man fileutil::magic::rt {Runtime core for file type recognition engines written in pure Tcl}]
+[item modules/fileutil/multi.man fileutil::multi {Multi-file operation, scatter/gather, standard object}]
+[item modules/fileutil/multiop.man fileutil::multi::op {Multi-file operation, scatter/gather}]
+[item modules/fileutil/traverse.man fileutil_traverse {Iterative directory traversal}]
+[item modules/hook/hook.man hook Hooks]
+[item modules/interp/tcllib_interp.man interp {Interp creation and aliasing}]
+[item modules/log/log.man log {Procedures to log messages of libraries and applications.}]
+[item modules/log/logger.man logger {System to control logging of events.}]
+[item modules/log/loggerAppender.man logger::appender {Collection of predefined appenders for logger}]
+[item modules/log/loggerUtils.man logger::utils {Utilities for logger}]
+[item modules/multiplexer/multiplexer.man multiplexer {One-to-many communication with sockets.}]
+[item modules/pluginmgr/pluginmgr.man pluginmgr {Manage a plugin}]
+[item modules/profiler/profiler.man profiler {Tcl source code profiler}]
+[item modules/snit/snit.man snit {Snit's Not Incr Tcl}]
+[item modules/snit/snitfaq.man snitfaq {Snit Frequently Asked Questions}]
+[item modules/stooop/stooop.man stooop {Object oriented extension.}]
+[item modules/stooop/switched.man switched {switch/option management.}]
+[item modules/tie/tie.man tie {Array persistence}]
+[item modules/tie/tie_std.man tie {Array persistence, standard data sources}]
+[item modules/uev/uevent.man uevent {User events}]
+[item modules/wip/wip.man wip {Word Interpreter}]
+[division_end]
+[division_start System]
+[item modules/cron/cron.man cron {Tool for automating the period callback of commands}]
+[item modules/nettool/nettool.man nettool {Tools for networked applications}]
+[item modules/processman/processman.man processman {Tool for automating the period callback of commands}]
+[division_end]
+[division_start TclOO]
+[item modules/oometa/oometa.man oometa {oo::meta A data registry for classess}]
+[item modules/practcl/practcl.man practcl {The Practcl Module}]
+[item modules/tool/tool.man tool {TclOO Library (TOOL) Framework}]
+[item modules/tool-ui/tool-ui.man tool-ui {Abstractions to allow Tao to express Native Tk, HTML5, and Tao-Layout interfaces}]
+[division_end]
+[division_start {Terminal control}]
+[item modules/term/term.man term {General terminal control}]
+[item modules/term/ansi_code.man term::ansi::code {Helper for control sequences}]
+[item modules/term/ansi_cattr.man term::ansi::code::attr {ANSI attribute sequences}]
+[item modules/term/ansi_cctrl.man term::ansi::code::ctrl {ANSI control sequences}]
+[item modules/term/ansi_cmacros.man term::ansi::code::macros {Macro sequences}]
+[item modules/term/ansi_ctrlu.man term::ansi::ctrl::unix {Control operations and queries}]
+[item modules/term/ansi_send.man term::ansi::send {Output of ANSI control sequences to terminals}]
+[item modules/term/imenu.man term::interact::menu {Terminal widget, menu}]
+[item modules/term/ipager.man term::interact::pager {Terminal widget, paging}]
+[item modules/term/receive.man term::receive {General input from terminals}]
+[item modules/term/term_bind.man term::receive::bind {Keyboard dispatch from terminals}]
+[item modules/term/term_send.man term::send {General output to terminals}]
+[division_end]
+[division_start {Text formatter plugin}]
+[item modules/doctools2idx/export_docidx.man doctools::idx::export::docidx {docidx export plugin}]
+[item modules/doctools2idx/idx_export_html.man doctools::idx::export::html {HTML export plugin}]
+[item modules/doctools2idx/idx_export_json.man doctools::idx::export::json {JSON export plugin}]
+[item modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff {nroff export plugin}]
+[item modules/doctools2idx/idx_export_text.man doctools::idx::export::text {plain text export plugin}]
+[item modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki {wiki export plugin}]
+[item modules/doctools2idx/import_docidx.man doctools::idx::import::docidx {docidx import plugin}]
+[item modules/doctools2idx/idx_import_json.man doctools::idx::import::json {JSON import plugin}]
+[item modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc {doctoc export plugin}]
+[item modules/doctools2toc/toc_export_html.man doctools::toc::export::html {HTML export plugin}]
+[item modules/doctools2toc/toc_export_json.man doctools::toc::export::json {JSON export plugin}]
+[item modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff {nroff export plugin}]
+[item modules/doctools2toc/toc_export_text.man doctools::toc::export::text {plain text export plugin}]
+[item modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki {wiki export plugin}]
+[item modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc {doctoc import plugin}]
+[item modules/doctools2toc/toc_import_json.man doctools::toc::import::json {JSON import plugin}]
+[division_end]
+[division_start {Text processing}]
+[item modules/base64/ascii85.man ascii85 {ascii85-encode/decode binary data}]
+[item modules/base32/base32.man base32 {base32 standard encoding}]
+[item modules/base32/base32core.man base32::core {Expanding basic base32 maps}]
+[item modules/base32/base32hex.man base32::hex {base32 extended hex encoding}]
+[item modules/base64/base64.man base64 {base64-encode/decode binary data}]
+[item modules/bibtex/bibtex.man bibtex {Parse bibtex files}]
+[item modules/clock/iso8601.man clock_iso8601 {Parsing ISO 8601 dates/times}]
+[item modules/clock/rfc2822.man clock_rfc2822 {Parsing ISO 8601 dates/times}]
+[item modules/csv/csv.man csv {Procedures to handle CSV data.}]
+[item modules/htmlparse/htmlparse.man htmlparse {Procedures to parse HTML strings}]
+[item modules/inifile/ini.man inifile {Parsing of Windows INI files}]
+[item modules/markdown/markdown.man markdown {Converts Markdown text to HTML}]
+[item modules/mime/mime.man mime {Manipulation of MIME body parts}]
+[item modules/rcs/rcs.man rcs {RCS low level utilities}]
+[item modules/string/token.man string::token {Regex based iterative lexing}]
+[item modules/string/token_shell.man string::token::shell {Parsing of shell command line}]
+[item modules/textutil/textutil.man textutil {Procedures to manipulate texts and strings.}]
+[item modules/textutil/adjust.man textutil::adjust {Procedures to adjust, indent, and undent paragraphs}]
+[item modules/textutil/repeat.man textutil::repeat {Procedures to repeat strings.}]
+[item modules/textutil/textutil_split.man textutil::split {Procedures to split texts}]
+[item modules/textutil/textutil_string.man textutil::string {Procedures to manipulate texts and strings.}]
+[item modules/textutil/tabify.man textutil::tabify {Procedures to (un)tabify strings}]
+[item modules/textutil/trim.man textutil::trim {Procedures to trim strings}]
+[item modules/base64/uuencode.man uuencode {UU-encode/decode binary data}]
+[item modules/amazon-s3/xsxp.man xsxp {eXtremely Simple Xml Parser}]
+[item modules/base64/yencode.man yencode {Y-encode/decode binary data}]
+[division_end]
+[division_start {Transfer module}]
+[item modules/transfer/connect.man transfer::connect {Connection setup}]
+[item modules/transfer/copyops.man transfer::copy {Data transfer foundation}]
+[item modules/transfer/tqueue.man transfer::copy::queue {Queued transfers}]
+[item modules/transfer/ddest.man transfer::data::destination {Data destination}]
+[item modules/transfer/dsource.man transfer::data::source {Data source}]
+[item modules/transfer/receiver.man transfer::receiver {Data source}]
+[item modules/transfer/transmitter.man transfer::transmitter {Data source}]
+[division_end]
+[division_start Unfiled]
+[item modules/cache/async.man cache::async {Asynchronous in-memory cache}]
+[item modules/generator/generator.man generator {Procedures for creating and using generators.}]
+[item modules/yaml/huddle.man huddle {Create and manipulate huddle object}]
+[item modules/imap4/imap4.man imap4 {imap client-side tcl implementation of imap protocol}]
+[item modules/map/map_geocode_nominatim.man map::geocode::nominatim {Resolving geographical names with a Nominatim service}]
+[item modules/map/map_slippy.man map::slippy {Common code for slippy based map packages}]
+[item modules/map/map_slippy_cache.man map::slippy::cache {Management of a tile cache in the local filesystem}]
+[item modules/map/map_slippy_fetcher.man map::slippy::fetcher {Accessing a server providing tiles for slippy-based maps}]
+[item modules/mapproj/mapproj.man mapproj {Map projection routines}]
+[item modules/math/symdiff.man math::calculus::symdiff {Symbolic differentiation for Tcl}]
+[item modules/namespacex/namespacex.man namespacex {Namespace utility commands}]
+[item modules/rest/rest.man rest {define REST web APIs and call them inline or asychronously}]
+[item modules/stringprep/stringprep.man stringprep {Implementation of stringprep}]
+[item modules/stringprep/stringprep_data.man stringprep::data {stringprep data tables, generated, internal}]
+[item modules/math/machineparameters.man tclrep/machineparameters {Compute double precision machine parameters.}]
+[item modules/uev/uevent_onidle.man uevent::onidle {Request merging and deferal to idle time}]
+[item modules/stringprep/unicode.man unicode {Implementation of Unicode normalization}]
+[item modules/stringprep/unicode_data.man unicode::data {unicode data tables, generated, internal}]
+[item modules/units/units.man units {unit conversion}]
+[item modules/yaml/yaml.man yaml {YAML Format Encoder/Decoder}]
+[division_end]
+[division_start Utilites]
+[item modules/dicttool/dicttool.man dicttool {Dictionary Tools}]
+[division_end]
+[division_start Utility]
+[item modules/defer/defer.man defer {Defered execution}]
+[item modules/lambda/lambda.man lambda {Utility commands for anonymous procedures}]
+[item modules/ooutil/ooutil.man oo::util {Utility commands for TclOO}]
+[item modules/tool/meta.man oo::util {Utility commands for TclOO}]
+[item modules/try/tcllib_throw.man throw {throw - Throw an error exception with a message}]
+[item modules/tool/tool_dict_ensemble.man tool::dict_ensemble {Dictionary Tools}]
+[item modules/try/tcllib_try.man try {try - Trap and process errors and exceptions}]
+[division_end]
+[division_start {Validation, Type checking}]
+[item modules/valtype/valtype_common.man valtype::common {Validation, common code}]
+[item modules/valtype/cc_amex.man valtype::creditcard::amex {Validation for AMEX creditcard number}]
+[item modules/valtype/cc_discover.man valtype::creditcard::discover {Validation for Discover creditcard number}]
+[item modules/valtype/cc_mastercard.man valtype::creditcard::mastercard {Validation for Mastercard creditcard number}]
+[item modules/valtype/cc_visa.man valtype::creditcard::visa {Validation for VISA creditcard number}]
+[item modules/valtype/ean13.man valtype::gs1::ean13 {Validation for EAN13}]
+[item modules/valtype/iban.man valtype::iban {Validation for IBAN}]
+[item modules/valtype/imei.man valtype::imei {Validation for IMEI}]
+[item modules/valtype/isbn.man valtype::isbn {Validation for ISBN}]
+[item modules/valtype/luhn.man valtype::luhn {Validation for plain number with a LUHN checkdigit}]
+[item modules/valtype/luhn5.man valtype::luhn5 {Validation for plain number with a LUHN5 checkdigit}]
+[item modules/valtype/usnpi.man valtype::usnpi {Validation for USNPI}]
+[item modules/valtype/verhoeff.man valtype::verhoeff {Validation for plain number with a VERHOEFF checkdigit}]
+[division_end]
+[division_end]
+[division_start {By Type}]
+[division_start Applications]
+[item apps/dtplite.man dtplite {Lightweight DocTools Markup Processor}]
+[item apps/nns.man nns {Name service facility, Commandline Client Application}]
+[item apps/nnsd.man nnsd {Name service facility, Commandline Server Application}]
+[item apps/nnslog.man nnslog {Name service facility, Commandline Logging Client Application}]
+[item apps/page.man page {Parser Generator}]
+[item apps/pt.man pt {Parser Tools Application}]
+[item apps/tcldocstrip.man tcldocstrip {Tcl-based Docstrip Processor}]
+[division_end]
+[division_start Modules]
+[division_start aes]
+[item modules/aes/aes.man aes {Implementation of the AES block cipher}]
+[division_end]
+[division_start amazon-s3]
+[item modules/amazon-s3/S3.man S3 {Amazon S3 Web Service Interface}]
+[item modules/amazon-s3/xsxp.man xsxp {eXtremely Simple Xml Parser}]
+[division_end]
+[division_start asn]
+[item modules/asn/asn.man asn {ASN.1 BER encoder/decoder}]
+[division_end]
+[division_start base32]
+[item modules/base32/base32.man base32 {base32 standard encoding}]
+[item modules/base32/base32core.man base32::core {Expanding basic base32 maps}]
+[item modules/base32/base32hex.man base32::hex {base32 extended hex encoding}]
+[division_end]
+[division_start base64]
+[item modules/base64/ascii85.man ascii85 {ascii85-encode/decode binary data}]
+[item modules/base64/base64.man base64 {base64-encode/decode binary data}]
+[item modules/base64/uuencode.man uuencode {UU-encode/decode binary data}]
+[item modules/base64/yencode.man yencode {Y-encode/decode binary data}]
+[division_end]
+[division_start bee]
+[item modules/bee/bee.man bee {BitTorrent Serialization Format Encoder/Decoder}]
+[division_end]
+[division_start bench]
+[item modules/bench/bench.man bench {bench - Processing benchmark suites}]
+[item modules/bench/bench_read.man bench::in {bench::in - Reading benchmark results}]
+[item modules/bench/bench_wcsv.man bench::out::csv {bench::out::csv - Formatting benchmark results as CSV}]
+[item modules/bench/bench_wtext.man bench::out::text {bench::out::text - Formatting benchmark results as human readable text}]
+[item modules/bench/bench_intro.man bench_intro {bench introduction}]
+[item modules/bench/bench_lang_intro.man bench_lang_intro {bench language introduction}]
+[item modules/bench/bench_lang_spec.man bench_lang_spec {bench language specification}]
+[division_end]
+[division_start bibtex]
+[item modules/bibtex/bibtex.man bibtex {Parse bibtex files}]
+[division_end]
+[division_start blowfish]
+[item modules/blowfish/blowfish.man blowfish {Implementation of the Blowfish block cipher}]
+[division_end]
+[division_start cache]
+[item modules/cache/async.man cache::async {Asynchronous in-memory cache}]
+[division_end]
+[division_start clock]
+[item modules/clock/iso8601.man clock_iso8601 {Parsing ISO 8601 dates/times}]
+[item modules/clock/rfc2822.man clock_rfc2822 {Parsing ISO 8601 dates/times}]
+[division_end]
+[division_start cmdline]
+[item modules/cmdline/cmdline.man cmdline {Procedures to process command lines and options.}]
+[division_end]
+[division_start comm]
+[item modules/comm/comm.man comm {A remote communication facility for Tcl (8.3 and later)}]
+[item modules/comm/comm_wire.man comm_wire {The comm wire protocol}]
+[division_end]
+[division_start control]
+[item modules/control/control.man control {Procedures for control flow structures.}]
+[division_end]
+[division_start coroutine]
+[item modules/coroutine/tcllib_coroutine.man coroutine {Coroutine based event and IO handling}]
+[item modules/coroutine/coro_auto.man coroutine::auto {Automatic event and IO coroutine awareness}]
+[division_end]
+[division_start counter]
+[item modules/counter/counter.man counter {Procedures for counters and histograms}]
+[division_end]
+[division_start crc]
+[item modules/crc/cksum.man cksum {Calculate a cksum(1) compatible checksum}]
+[item modules/crc/crc16.man crc16 {Perform a 16bit Cyclic Redundancy Check}]
+[item modules/crc/crc32.man crc32 {Perform a 32bit Cyclic Redundancy Check}]
+[item modules/crc/sum.man sum {Calculate a sum(1) compatible checksum}]
+[division_end]
+[division_start cron]
+[item modules/cron/cron.man cron {Tool for automating the period callback of commands}]
+[division_end]
+[division_start csv]
+[item modules/csv/csv.man csv {Procedures to handle CSV data.}]
+[division_end]
+[division_start debug]
+[item modules/debug/debug.man debug {debug narrative - core}]
+[item modules/debug/debug_caller.man debug::caller {debug narrative - caller}]
+[item modules/debug/debug_heartbeat.man debug::heartbeat {debug narrative - heartbeat}]
+[item modules/debug/debug_timestamp.man debug::timestamp {debug narrative - timestamping}]
+[division_end]
+[division_start defer]
+[item modules/defer/defer.man defer {Defered execution}]
+[division_end]
+[division_start des]
+[item modules/des/des.man des {Implementation of the DES and triple-DES ciphers}]
+[item modules/des/tcldes.man tclDES {Implementation of the DES and triple-DES ciphers}]
+[item modules/des/tcldesjr.man tclDESjr {Implementation of the DES and triple-DES ciphers}]
+[division_end]
+[division_start dicttool]
+[item modules/dicttool/dicttool.man dicttool {Dictionary Tools}]
+[division_end]
+[division_start dns]
+[item modules/dns/tcllib_dns.man dns {Tcl Domain Name Service Client}]
+[item modules/dns/tcllib_ip.man tcllib_ip {IPv4 and IPv6 address manipulation}]
+[division_end]
+[division_start docstrip]
+[item modules/docstrip/docstrip.man docstrip {Docstrip style source code extraction}]
+[item modules/docstrip/docstrip_util.man docstrip_util {Docstrip-related utilities}]
+[division_end]
+[division_start doctools]
+[item modules/doctools/docidx_intro.man docidx_intro {docidx introduction}]
+[item modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref {docidx language command reference}]
+[item modules/doctools/docidx_lang_faq.man docidx_lang_faq {docidx language faq}]
+[item modules/doctools/docidx_lang_intro.man docidx_lang_intro {docidx language introduction}]
+[item modules/doctools/docidx_lang_syntax.man docidx_lang_syntax {docidx language syntax}]
+[item modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref {docidx plugin API reference}]
+[item modules/doctools/doctoc_intro.man doctoc_intro {doctoc introduction}]
+[item modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref {doctoc language command reference}]
+[item modules/doctools/doctoc_lang_faq.man doctoc_lang_faq {doctoc language faq}]
+[item modules/doctools/doctoc_lang_intro.man doctoc_lang_intro {doctoc language introduction}]
+[item modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax {doctoc language syntax}]
+[item modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref {doctoc plugin API reference}]
+[item modules/doctools/doctools.man doctools {doctools - Processing documents}]
+[item modules/doctools/changelog.man doctools::changelog {Processing text in Emacs ChangeLog format}]
+[item modules/doctools/cvs.man doctools::cvs {Processing text in 'cvs log' format}]
+[item modules/doctools/docidx.man doctools::idx {docidx - Processing indices}]
+[item modules/doctools/doctoc.man doctools::toc {doctoc - Processing tables of contents}]
+[item modules/doctools/doctools_intro.man doctools_intro {doctools introduction}]
+[item modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref {doctools language command reference}]
+[item modules/doctools/doctools_lang_faq.man doctools_lang_faq {doctools language faq}]
+[item modules/doctools/doctools_lang_intro.man doctools_lang_intro {doctools language introduction}]
+[item modules/doctools/doctools_lang_syntax.man doctools_lang_syntax {doctools language syntax}]
+[item modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref {doctools plugin API reference}]
+[item modules/doctools/mpexpand.man mpexpand {Markup processor}]
+[division_end]
+[division_start doctools2base]
+[item modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults {Default CSS style for HTML export plugins}]
+[item modules/doctools2base/tcllib_msgcat.man doctools::msgcat {Message catalog management for the various document parsers}]
+[item modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros {Default CSS style for NROFF export plugins}]
+[item modules/doctools2base/tcl_parse.man doctools::tcl::parse {Processing text in 'subst -novariables' format}]
+[division_end]
+[division_start doctools2idx]
+[item modules/doctools2idx/idx_introduction.man doctools2idx_introduction {DocTools - Keyword indices}]
+[item modules/doctools2idx/idx_container.man doctools::idx {Holding keyword indices}]
+[item modules/doctools2idx/idx_export.man doctools::idx::export {Exporting keyword indices}]
+[item modules/doctools2idx/export_docidx.man doctools::idx::export::docidx {docidx export plugin}]
+[item modules/doctools2idx/idx_export_html.man doctools::idx::export::html {HTML export plugin}]
+[item modules/doctools2idx/idx_export_json.man doctools::idx::export::json {JSON export plugin}]
+[item modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff {nroff export plugin}]
+[item modules/doctools2idx/idx_export_text.man doctools::idx::export::text {plain text export plugin}]
+[item modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki {wiki export plugin}]
+[item modules/doctools2idx/idx_import.man doctools::idx::import {Importing keyword indices}]
+[item modules/doctools2idx/import_docidx.man doctools::idx::import::docidx {docidx import plugin}]
+[item modules/doctools2idx/idx_import_json.man doctools::idx::import::json {JSON import plugin}]
+[item modules/doctools2idx/idx_parse.man doctools::idx::parse {Parsing text in docidx format}]
+[item modules/doctools2idx/idx_structure.man doctools::idx::structure {Docidx serialization utilities}]
+[item modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c {Message catalog for the docidx parser (C)}]
+[item modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de {Message catalog for the docidx parser (DE)}]
+[item modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en {Message catalog for the docidx parser (EN)}]
+[item modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr {Message catalog for the docidx parser (FR)}]
+[division_end]
+[division_start doctools2toc]
+[item modules/doctools2toc/toc_introduction.man doctools2toc_introduction {DocTools - Tables of Contents}]
+[item modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c {Message catalog for the doctoc parser (C)}]
+[item modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de {Message catalog for the doctoc parser (DE)}]
+[item modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en {Message catalog for the doctoc parser (EN)}]
+[item modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr {Message catalog for the doctoc parser (FR)}]
+[item modules/doctools2toc/toc_container.man doctools::toc {Holding tables of contents}]
+[item modules/doctools2toc/toc_export.man doctools::toc::export {Exporting tables of contents}]
+[item modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc {doctoc export plugin}]
+[item modules/doctools2toc/toc_export_html.man doctools::toc::export::html {HTML export plugin}]
+[item modules/doctools2toc/toc_export_json.man doctools::toc::export::json {JSON export plugin}]
+[item modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff {nroff export plugin}]
+[item modules/doctools2toc/toc_export_text.man doctools::toc::export::text {plain text export plugin}]
+[item modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki {wiki export plugin}]
+[item modules/doctools2toc/toc_import.man doctools::toc::import {Importing keyword indices}]
+[item modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc {doctoc import plugin}]
+[item modules/doctools2toc/toc_import_json.man doctools::toc::import::json {JSON import plugin}]
+[item modules/doctools2toc/toc_parse.man doctools::toc::parse {Parsing text in doctoc format}]
+[item modules/doctools2toc/toc_structure.man doctools::toc::structure {Doctoc serialization utilities}]
+[division_end]
+[division_start dtplite]
+[item modules/dtplite/pkg_dtplite.man dtplite {Lightweight DocTools Markup Processor}]
+[division_end]
+[division_start fileutil]
+[item modules/fileutil/fileutil.man fileutil {Procedures implementing some file utilities}]
+[item modules/fileutil/multi.man fileutil::multi {Multi-file operation, scatter/gather, standard object}]
+[item modules/fileutil/multiop.man fileutil::multi::op {Multi-file operation, scatter/gather}]
+[item modules/fileutil/traverse.man fileutil_traverse {Iterative directory traversal}]
+[division_end]
+[division_start ftp]
+[item modules/ftp/ftp.man ftp {Client-side tcl implementation of the ftp protocol}]
+[item modules/ftp/ftp_geturl.man ftp::geturl {Uri handler for ftp urls}]
+[division_end]
+[division_start ftpd]
+[item modules/ftpd/ftpd.man ftpd {Tcl FTP server implementation}]
+[division_end]
+[division_start fumagic]
+[item modules/fumagic/cfront.man fileutil::magic::cfront {Generator core for compiler of magic(5) files}]
+[item modules/fumagic/cgen.man fileutil::magic::cgen {Generator core for compiler of magic(5) files}]
+[item modules/fumagic/filetypes.man fileutil::magic::filetype {Procedures implementing file-type recognition}]
+[item modules/fumagic/rtcore.man fileutil::magic::rt {Runtime core for file type recognition engines written in pure Tcl}]
+[division_end]
+[division_start generator]
+[item modules/generator/generator.man generator {Procedures for creating and using generators.}]
+[division_end]
+[division_start gpx]
+[item modules/gpx/gpx.man gpx {Extracts waypoints, tracks and routes from GPX files}]
+[division_end]
+[division_start grammar_aycock]
+[item modules/grammar_aycock/aycock.man grammar::aycock {Aycock-Horspool-Earley parser generator for Tcl}]
+[division_end]
+[division_start grammar_fa]
+[item modules/grammar_fa/fa.man grammar::fa {Create and manipulate finite automatons}]
+[item modules/grammar_fa/dacceptor.man grammar::fa::dacceptor {Create and use deterministic acceptors}]
+[item modules/grammar_fa/dexec.man grammar::fa::dexec {Execute deterministic finite automatons}]
+[item modules/grammar_fa/faop.man grammar::fa::op {Operations on finite automatons}]
+[division_end]
+[division_start grammar_me]
+[item modules/grammar_me/me_cpu.man grammar::me::cpu {Virtual machine implementation II for parsing token streams}]
+[item modules/grammar_me/me_cpucore.man grammar::me::cpu::core {ME virtual machine state manipulation}]
+[item modules/grammar_me/gasm.man grammar::me::cpu::gasm {ME assembler}]
+[item modules/grammar_me/me_tcl.man grammar::me::tcl {Virtual machine implementation I for parsing token streams}]
+[item modules/grammar_me/me_util.man grammar::me::util {AST utilities}]
+[item modules/grammar_me/me_ast.man grammar::me_ast {Various representations of ASTs}]
+[item modules/grammar_me/me_intro.man grammar::me_intro {Introduction to virtual machines for parsing token streams}]
+[item modules/grammar_me/me_vm.man grammar::me_vm {Virtual machine for parsing token streams}]
+[division_end]
+[division_start grammar_peg]
+[item modules/grammar_peg/peg.man grammar::peg {Create and manipulate parsing expression grammars}]
+[item modules/grammar_peg/peg_interp.man grammar::peg::interp {Interpreter for parsing expression grammars}]
+[division_end]
+[division_start hook]
+[item modules/hook/hook.man hook Hooks]
+[division_end]
+[division_start html]
+[item modules/html/html.man html {Procedures to generate HTML structures}]
+[division_end]
+[division_start htmlparse]
+[item modules/htmlparse/htmlparse.man htmlparse {Procedures to parse HTML strings}]
+[division_end]
+[division_start http]
+[item modules/http/autoproxy.man autoproxy {Automatic HTTP proxy usage and authentication}]
+[division_end]
+[division_start httpd]
+[item modules/httpd/httpd.man tool {A TclOO and coroutine based web server}]
+[division_end]
+[division_start ident]
+[item modules/ident/ident.man ident {Ident protocol client}]
+[division_end]
+[division_start imap4]
+[item modules/imap4/imap4.man imap4 {imap client-side tcl implementation of imap protocol}]
+[division_end]
+[division_start inifile]
+[item modules/inifile/ini.man inifile {Parsing of Windows INI files}]
+[division_end]
+[division_start interp]
+[item modules/interp/deleg_method.man deleg_method {Creation of comm delegates (snit methods)}]
+[item modules/interp/deleg_proc.man deleg_proc {Creation of comm delegates (procedures)}]
+[item modules/interp/tcllib_interp.man interp {Interp creation and aliasing}]
+[division_end]
+[division_start irc]
+[item modules/irc/irc.man irc {Create IRC connection and interface.}]
+[item modules/irc/picoirc.man picoirc {Small and simple embeddable IRC client.}]
+[division_end]
+[division_start javascript]
+[item modules/javascript/javascript.man javascript {Procedures to generate HTML and Java Script structures.}]
+[division_end]
+[division_start jpeg]
+[item modules/jpeg/jpeg.man jpeg {JPEG querying and manipulation of meta data}]
+[division_end]
+[division_start json]
+[item modules/json/json.man json {JSON parser}]
+[item modules/json/json_write.man json::write {JSON generation}]
+[division_end]
+[division_start lambda]
+[item modules/lambda/lambda.man lambda {Utility commands for anonymous procedures}]
+[division_end]
+[division_start ldap]
+[item modules/ldap/ldap.man ldap {LDAP client}]
+[item modules/ldap/ldapx.man ldapx {LDAP extended object interface}]
+[division_end]
+[division_start log]
+[item modules/log/log.man log {Procedures to log messages of libraries and applications.}]
+[item modules/log/logger.man logger {System to control logging of events.}]
+[item modules/log/loggerAppender.man logger::appender {Collection of predefined appenders for logger}]
+[item modules/log/loggerUtils.man logger::utils {Utilities for logger}]
+[division_end]
+[division_start map]
+[item modules/map/map_geocode_nominatim.man map::geocode::nominatim {Resolving geographical names with a Nominatim service}]
+[item modules/map/map_slippy.man map::slippy {Common code for slippy based map packages}]
+[item modules/map/map_slippy_cache.man map::slippy::cache {Management of a tile cache in the local filesystem}]
+[item modules/map/map_slippy_fetcher.man map::slippy::fetcher {Accessing a server providing tiles for slippy-based maps}]
+[division_end]
+[division_start mapproj]
+[item modules/mapproj/mapproj.man mapproj {Map projection routines}]
+[division_end]
+[division_start markdown]
+[item modules/markdown/markdown.man markdown {Converts Markdown text to HTML}]
+[division_end]
+[division_start math]
+[item modules/math/math.man math {Tcl Math Library}]
+[item modules/math/bigfloat.man math::bigfloat {Arbitrary precision floating-point numbers}]
+[item modules/math/bignum.man math::bignum {Arbitrary precision integer numbers}]
+[item modules/math/calculus.man math::calculus {Integration and ordinary differential equations}]
+[item modules/math/romberg.man math::calculus::romberg {Romberg integration}]
+[item modules/math/symdiff.man math::calculus::symdiff {Symbolic differentiation for Tcl}]
+[item modules/math/combinatorics.man math::combinatorics {Combinatorial functions in the Tcl Math Library}]
+[item modules/math/qcomplex.man math::complexnumbers {Straightforward complex number package}]
+[item modules/math/constants.man math::constants {Mathematical and numerical constants}]
+[item modules/math/decimal.man math::decimal {General decimal arithmetic}]
+[item modules/math/exact.man math::exact {Exact Real Arithmetic}]
+[item modules/math/fourier.man math::fourier {Discrete and fast fourier transforms}]
+[item modules/math/fuzzy.man math::fuzzy {Fuzzy comparison of floating-point numbers}]
+[item modules/math/math_geometry.man math::geometry {Geometrical computations}]
+[item modules/math/interpolate.man math::interpolate {Interpolation routines}]
+[item modules/math/linalg.man math::linearalgebra {Linear Algebra}]
+[item modules/math/numtheory.man math::numtheory {Number Theory}]
+[item modules/math/optimize.man math::optimize {Optimisation routines}]
+[item modules/math/pca.man math::PCA {Package for Principal Component Analysis}]
+[item modules/math/polynomials.man math::polynomials {Polynomial functions}]
+[item modules/math/rational_funcs.man math::rationalfunctions {Polynomial functions}]
+[item modules/math/roman.man math::roman {Tools for creating and manipulating roman numerals}]
+[item modules/math/special.man math::special {Special mathematical functions}]
+[item modules/math/statistics.man math::statistics {Basic statistical functions and procedures}]
+[item modules/math/machineparameters.man tclrep/machineparameters {Compute double precision machine parameters.}]
+[division_end]
+[division_start md4]
+[item modules/md4/md4.man md4 {MD4 Message-Digest Algorithm}]
+[division_end]
+[division_start md5]
+[item modules/md5/md5.man md5 {MD5 Message-Digest Algorithm}]
+[division_end]
+[division_start md5crypt]
+[item modules/md5crypt/md5crypt.man md5crypt {MD5-based password encryption}]
+[division_end]
+[division_start mime]
+[item modules/mime/mime.man mime {Manipulation of MIME body parts}]
+[item modules/mime/smtp.man smtp {Client-side tcl implementation of the smtp protocol}]
+[division_end]
+[division_start multiplexer]
+[item modules/multiplexer/multiplexer.man multiplexer {One-to-many communication with sockets.}]
+[division_end]
+[division_start namespacex]
+[item modules/namespacex/namespacex.man namespacex {Namespace utility commands}]
+[division_end]
+[division_start ncgi]
+[item modules/ncgi/ncgi.man ncgi {Procedures to manipulate CGI values.}]
+[division_end]
+[division_start nettool]
+[item modules/nettool/nettool.man nettool {Tools for networked applications}]
+[division_end]
+[division_start nmea]
+[item modules/nmea/nmea.man nmea {Process NMEA data}]
+[division_end]
+[division_start nns]
+[item modules/nns/nns_client.man nameserv {Name service facility, Client}]
+[item modules/nns/nns_auto.man nameserv::auto {Name service facility, Client Extension}]
+[item modules/nns/nns_common.man nameserv::common {Name service facility, shared definitions}]
+[item modules/nns/nns_protocol.man nameserv::protocol {Name service facility, client/server protocol}]
+[item modules/nns/nns_server.man nameserv::server {Name service facility, Server}]
+[item modules/nns/nns_intro.man nns_intro {Name service facility, introduction}]
+[division_end]
+[division_start nntp]
+[item modules/nntp/nntp.man nntp {Tcl client for the NNTP protocol}]
+[division_end]
+[division_start ntp]
+[item modules/ntp/ntp_time.man ntp_time {Tcl Time Service Client}]
+[division_end]
+[division_start oauth]
+[item modules/oauth/oauth.man oauth {oauth API base signature}]
+[division_end]
+[division_start oometa]
+[item modules/oometa/oometa.man oometa {oo::meta A data registry for classess}]
+[division_end]
+[division_start ooutil]
+[item modules/ooutil/ooutil.man oo::util {Utility commands for TclOO}]
+[division_end]
+[division_start otp]
+[item modules/otp/otp.man otp {One-Time Passwords}]
+[division_end]
+[division_start page]
+[item modules/page/page_intro.man page_intro {page introduction}]
+[item modules/page/page_pluginmgr.man page_pluginmgr {page plugin manager}]
+[item modules/page/page_util_flow.man page_util_flow {page dataflow/treewalker utility}]
+[item modules/page/page_util_norm_lemon.man page_util_norm_lemon {page AST normalization, LEMON}]
+[item modules/page/page_util_norm_peg.man page_util_norm_peg {page AST normalization, PEG}]
+[item modules/page/page_util_peg.man page_util_peg {page PEG transformation utilities}]
+[item modules/page/page_util_quote.man page_util_quote {page character quoting utilities}]
+[division_end]
+[division_start pki]
+[item modules/pki/pki.man pki {Implementation of the public key cipher}]
+[division_end]
+[division_start pluginmgr]
+[item modules/pluginmgr/pluginmgr.man pluginmgr {Manage a plugin}]
+[division_end]
+[division_start png]
+[item modules/png/png.man png {PNG querying and manipulation of meta data}]
+[division_end]
+[division_start pop3]
+[item modules/pop3/pop3.man pop3 {Tcl client for POP3 email protocol}]
+[division_end]
+[division_start pop3d]
+[item modules/pop3d/pop3d.man pop3d {Tcl POP3 server implementation}]
+[item modules/pop3d/pop3d_dbox.man pop3d::dbox {Simple mailbox database for pop3d}]
+[item modules/pop3d/pop3d_udb.man pop3d::udb {Simple user database for pop3d}]
+[division_end]
+[division_start practcl]
+[item modules/practcl/practcl.man practcl {The Practcl Module}]
+[division_end]
+[division_start processman]
+[item modules/processman/processman.man processman {Tool for automating the period callback of commands}]
+[division_end]
+[division_start profiler]
+[item modules/profiler/profiler.man profiler {Tcl source code profiler}]
+[division_end]
+[division_start pt]
+[item modules/pt/pt_astree.man pt::ast {Abstract Syntax Tree Serialization}]
+[item modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl {C/PARAM, Canned configuration, Critcl}]
+[item modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea {C/PARAM, Canned configuration, TEA}]
+[item modules/pt/pt_json_language.man pt::json_language {The JSON Grammar Exchange Format}]
+[item modules/pt/pt_param.man pt::param {PackRat Machine Specification}]
+[item modules/pt/pt_pexpression.man pt::pe {Parsing Expression Serialization}]
+[item modules/pt/pt_pexpr_op.man pt::pe::op {Parsing Expression Utilities}]
+[item modules/pt/pt_pegrammar.man pt::peg {Parsing Expression Grammar Serialization}]
+[item modules/pt/pt_peg_container.man pt::peg::container {PEG Storage}]
+[item modules/pt/pt_peg_container_peg.man pt::peg::container::peg {PEG Storage. Canned PEG grammar specification}]
+[item modules/pt/pt_peg_export.man pt::peg::export {PEG Export}]
+[item modules/pt/pt_peg_export_container.man pt::peg::export::container {PEG Export Plugin. Write CONTAINER format}]
+[item modules/pt/pt_peg_export_json.man pt::peg::export::json {PEG Export Plugin. Write JSON format}]
+[item modules/pt/pt_peg_export_peg.man pt::peg::export::peg {PEG Export Plugin. Write PEG format}]
+[item modules/pt/pt_peg_from_container.man pt::peg::from::container {PEG Conversion. From CONTAINER format}]
+[item modules/pt/pt_peg_from_json.man pt::peg::from::json {PEG Conversion. Read JSON format}]
+[item modules/pt/pt_peg_from_peg.man pt::peg::from::peg {PEG Conversion. Read PEG format}]
+[item modules/pt/pt_peg_import.man pt::peg::import {PEG Import}]
+[item modules/pt/pt_peg_import_container.man pt::peg::import::container {PEG Import Plugin. From CONTAINER format}]
+[item modules/pt/pt_peg_import_json.man pt::peg::import::json {PEG Import Plugin. Read JSON format}]
+[item modules/pt/pt_peg_import_peg.man pt::peg::import::peg {PEG Import Plugin. Read PEG format}]
+[item modules/pt/pt_peg_interp.man pt::peg::interp {Interpreter for parsing expression grammars}]
+[item modules/pt/pt_peg_to_container.man pt::peg::to::container {PEG Conversion. Write CONTAINER format}]
+[item modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam {PEG Conversion. Write CPARAM format}]
+[item modules/pt/pt_peg_to_json.man pt::peg::to::json {PEG Conversion. Write JSON format}]
+[item modules/pt/pt_peg_to_param.man pt::peg::to::param {PEG Conversion. Write PARAM format}]
+[item modules/pt/pt_peg_to_peg.man pt::peg::to::peg {PEG Conversion. Write PEG format}]
+[item modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam {PEG Conversion. Write TCLPARAM format}]
+[item modules/pt/pt_peg_language.man pt::peg_language {PEG Language Tutorial}]
+[item modules/pt/pt_peg_introduction.man pt::pegrammar {Introduction to Parsing Expression Grammars}]
+[item modules/pt/pt_pgen.man pt::pgen {Parser Generator}]
+[item modules/pt/pt_rdengine.man pt::rde {Parsing Runtime Support, PARAM based}]
+[item modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx {Tcl/PARAM, Canned configuration, NX}]
+[item modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit {Tcl/PARAM, Canned configuration, Snit}]
+[item modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo {Tcl/PARAM, Canned configuration, Tcloo}]
+[item modules/pt/pt_util.man pt::util {General utilities}]
+[item modules/pt/pt_to_api.man pt_export_api {Parser Tools Export API}]
+[item modules/pt/pt_from_api.man pt_import_api {Parser Tools Import API}]
+[item modules/pt/pt_introduction.man pt_introduction {Introduction to Parser Tools}]
+[item modules/pt/pt_parse_peg.man pt_parse_peg {Parser Tools PEG Parser}]
+[item modules/pt/pt_parser_api.man pt_parser_api {Parser API}]
+[item modules/pt/pt_peg_op.man pt_peg_op {Parser Tools PE Grammar Utility Operations}]
+[division_end]
+[division_start rc4]
+[item modules/rc4/rc4.man rc4 {Implementation of the RC4 stream cipher}]
+[division_end]
+[division_start rcs]
+[item modules/rcs/rcs.man rcs {RCS low level utilities}]
+[division_end]
+[division_start report]
+[item modules/report/report.man report {Create and manipulate report objects}]
+[division_end]
+[division_start rest]
+[item modules/rest/rest.man rest {define REST web APIs and call them inline or asychronously}]
+[division_end]
+[division_start ripemd]
+[item modules/ripemd/ripemd128.man ripemd128 {RIPEMD-128 Message-Digest Algorithm}]
+[item modules/ripemd/ripemd160.man ripemd160 {RIPEMD-160 Message-Digest Algorithm}]
+[division_end]
+[division_start sasl]
+[item modules/sasl/sasl.man SASL {Implementation of SASL mechanisms for Tcl}]
+[item modules/sasl/ntlm.man SASL::NTLM {Implementation of SASL NTLM mechanism for Tcl}]
+[item modules/sasl/scram.man SASL::SCRAM {Implementation of SASL SCRAM mechanism for Tcl}]
+[item modules/sasl/gtoken.man SASL::XGoogleToken {Implementation of SASL NTLM mechanism for Tcl}]
+[division_end]
+[division_start sha1]
+[item modules/sha1/sha1.man sha1 {SHA1 Message-Digest Algorithm}]
+[item modules/sha1/sha256.man sha256 {SHA256 Message-Digest Algorithm}]
+[division_end]
+[division_start simulation]
+[item modules/simulation/annealing.man simulation::annealing {Simulated annealing}]
+[item modules/simulation/montecarlo.man simulation::montecarlo {Monte Carlo simulations}]
+[item modules/simulation/simulation_random.man simulation::random {Pseudo-random number generators}]
+[division_end]
+[division_start smtpd]
+[item modules/smtpd/smtpd.man smtpd {Tcl SMTP server implementation}]
+[division_end]
+[division_start snit]
+[item modules/snit/snit.man snit {Snit's Not Incr Tcl}]
+[item modules/snit/snitfaq.man snitfaq {Snit Frequently Asked Questions}]
+[division_end]
+[division_start soundex]
+[item modules/soundex/soundex.man soundex Soundex]
+[division_end]
+[division_start stooop]
+[item modules/stooop/stooop.man stooop {Object oriented extension.}]
+[item modules/stooop/switched.man switched {switch/option management.}]
+[division_end]
+[division_start string]
+[item modules/string/token.man string::token {Regex based iterative lexing}]
+[item modules/string/token_shell.man string::token::shell {Parsing of shell command line}]
+[division_end]
+[division_start stringprep]
+[item modules/stringprep/stringprep.man stringprep {Implementation of stringprep}]
+[item modules/stringprep/stringprep_data.man stringprep::data {stringprep data tables, generated, internal}]
+[item modules/stringprep/unicode.man unicode {Implementation of Unicode normalization}]
+[item modules/stringprep/unicode_data.man unicode::data {unicode data tables, generated, internal}]
+[division_end]
+[division_start struct]
+[item modules/struct/disjointset.man struct::disjointset {Disjoint set data structure}]
+[item modules/struct/graph.man struct::graph {Create and manipulate directed graph objects}]
+[item modules/struct/graphops.man struct::graph::op {Operation for (un)directed graph objects}]
+[item modules/struct/graph1.man struct::graph_v1 {Create and manipulate directed graph objects}]
+[item modules/struct/struct_list.man struct::list {Procedures for manipulating lists}]
+[item modules/struct/matrix.man struct::matrix {Create and manipulate matrix objects}]
+[item modules/struct/matrix1.man struct::matrix_v1 {Create and manipulate matrix objects}]
+[item modules/struct/pool.man struct::pool {Create and manipulate pool objects (of discrete items)}]
+[item modules/struct/prioqueue.man struct::prioqueue {Create and manipulate prioqueue objects}]
+[item modules/struct/queue.man struct::queue {Create and manipulate queue objects}]
+[item modules/struct/record.man struct::record {Define and create records (similar to 'C' structures)}]
+[item modules/struct/struct_set.man struct::set {Procedures for manipulating sets}]
+[item modules/struct/skiplist.man struct::skiplist {Create and manipulate skiplists}]
+[item modules/struct/stack.man struct::stack {Create and manipulate stack objects}]
+[item modules/struct/struct_tree.man struct::tree {Create and manipulate tree objects}]
+[item modules/struct/struct_tree1.man struct::tree_v1 {Create and manipulate tree objects}]
+[division_end]
+[division_start tar]
+[item modules/tar/tar.man tar {Tar file creation, extraction & manipulation}]
+[division_end]
+[division_start tepam]
+[item modules/tepam/tepam_introduction.man tepam {An introduction into TEPAM, Tcl's Enhanced Procedure and Argument Manager}]
+[item modules/tepam/tepam_argument_dialogbox.man tepam::argument_dialogbox {TEPAM argument_dialogbox, reference manual}]
+[item modules/tepam/tepam_doc_gen.man tepam::doc_gen {TEPAM DOC Generation, reference manual}]
+[item modules/tepam/tepam_procedure.man tepam::procedure {TEPAM procedure, reference manual}]
+[division_end]
+[division_start term]
+[item modules/term/term.man term {General terminal control}]
+[item modules/term/ansi_code.man term::ansi::code {Helper for control sequences}]
+[item modules/term/ansi_cattr.man term::ansi::code::attr {ANSI attribute sequences}]
+[item modules/term/ansi_cctrl.man term::ansi::code::ctrl {ANSI control sequences}]
+[item modules/term/ansi_cmacros.man term::ansi::code::macros {Macro sequences}]
+[item modules/term/ansi_ctrlu.man term::ansi::ctrl::unix {Control operations and queries}]
+[item modules/term/ansi_send.man term::ansi::send {Output of ANSI control sequences to terminals}]
+[item modules/term/imenu.man term::interact::menu {Terminal widget, menu}]
+[item modules/term/ipager.man term::interact::pager {Terminal widget, paging}]
+[item modules/term/receive.man term::receive {General input from terminals}]
+[item modules/term/term_bind.man term::receive::bind {Keyboard dispatch from terminals}]
+[item modules/term/term_send.man term::send {General output to terminals}]
+[division_end]
+[division_start textutil]
+[item modules/textutil/textutil.man textutil {Procedures to manipulate texts and strings.}]
+[item modules/textutil/adjust.man textutil::adjust {Procedures to adjust, indent, and undent paragraphs}]
+[item modules/textutil/expander.man textutil::expander {Procedures to process templates and expand text.}]
+[item modules/textutil/repeat.man textutil::repeat {Procedures to repeat strings.}]
+[item modules/textutil/textutil_split.man textutil::split {Procedures to split texts}]
+[item modules/textutil/textutil_string.man textutil::string {Procedures to manipulate texts and strings.}]
+[item modules/textutil/tabify.man textutil::tabify {Procedures to (un)tabify strings}]
+[item modules/textutil/trim.man textutil::trim {Procedures to trim strings}]
+[division_end]
+[division_start tie]
+[item modules/tie/tie.man tie {Array persistence}]
+[item modules/tie/tie_std.man tie {Array persistence, standard data sources}]
+[division_end]
+[division_start tiff]
+[item modules/tiff/tiff.man tiff {TIFF reading, writing, and querying and manipulation of meta data}]
+[division_end]
+[division_start tool]
+[item modules/tool/meta.man oo::util {Utility commands for TclOO}]
+[item modules/tool/tool.man tool {TclOO Library (TOOL) Framework}]
+[item modules/tool/tool_dict_ensemble.man tool::dict_ensemble {Dictionary Tools}]
+[division_end]
+[division_start tool-ui]
+[item modules/tool-ui/tool-ui.man tool-ui {Abstractions to allow Tao to express Native Tk, HTML5, and Tao-Layout interfaces}]
+[division_end]
+[division_start transfer]
+[item modules/transfer/connect.man transfer::connect {Connection setup}]
+[item modules/transfer/copyops.man transfer::copy {Data transfer foundation}]
+[item modules/transfer/tqueue.man transfer::copy::queue {Queued transfers}]
+[item modules/transfer/ddest.man transfer::data::destination {Data destination}]
+[item modules/transfer/dsource.man transfer::data::source {Data source}]
+[item modules/transfer/receiver.man transfer::receiver {Data source}]
+[item modules/transfer/transmitter.man transfer::transmitter {Data source}]
+[division_end]
+[division_start treeql]
+[item modules/treeql/treeql.man treeql {Query tree objects}]
+[division_end]
+[division_start try]
+[item modules/try/tcllib_throw.man throw {throw - Throw an error exception with a message}]
+[item modules/try/tcllib_try.man try {try - Trap and process errors and exceptions}]
+[division_end]
+[division_start udpcluster]
+[item modules/udpcluster/udpcluster.man udpcluster {UDP Peer-to-Peer cluster}]
+[division_end]
+[division_start uev]
+[item modules/uev/uevent.man uevent {User events}]
+[item modules/uev/uevent_onidle.man uevent::onidle {Request merging and deferal to idle time}]
+[division_end]
+[division_start units]
+[item modules/units/units.man units {unit conversion}]
+[division_end]
+[division_start uri]
+[item modules/uri/uri.man uri {URI utilities}]
+[item modules/uri/urn-scheme.man uri_urn {URI utilities, URN scheme}]
+[division_end]
+[division_start uuid]
+[item modules/uuid/uuid.man uuid {UUID generation and comparison}]
+[division_end]
+[division_start valtype]
+[item modules/valtype/valtype_common.man valtype::common {Validation, common code}]
+[item modules/valtype/cc_amex.man valtype::creditcard::amex {Validation for AMEX creditcard number}]
+[item modules/valtype/cc_discover.man valtype::creditcard::discover {Validation for Discover creditcard number}]
+[item modules/valtype/cc_mastercard.man valtype::creditcard::mastercard {Validation for Mastercard creditcard number}]
+[item modules/valtype/cc_visa.man valtype::creditcard::visa {Validation for VISA creditcard number}]
+[item modules/valtype/ean13.man valtype::gs1::ean13 {Validation for EAN13}]
+[item modules/valtype/iban.man valtype::iban {Validation for IBAN}]
+[item modules/valtype/imei.man valtype::imei {Validation for IMEI}]
+[item modules/valtype/isbn.man valtype::isbn {Validation for ISBN}]
+[item modules/valtype/luhn.man valtype::luhn {Validation for plain number with a LUHN checkdigit}]
+[item modules/valtype/luhn5.man valtype::luhn5 {Validation for plain number with a LUHN5 checkdigit}]
+[item modules/valtype/usnpi.man valtype::usnpi {Validation for USNPI}]
+[item modules/valtype/verhoeff.man valtype::verhoeff {Validation for plain number with a VERHOEFF checkdigit}]
+[division_end]
+[division_start virtchannel_base]
+[item modules/virtchannel_base/cat.man tcl::chan::cat {Concatenation channel}]
+[item modules/virtchannel_base/facade.man tcl::chan::facade {Facade channel}]
+[item modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo {In-memory fifo channel}]
+[item modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2 {In-memory interconnected fifo channels}]
+[item modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe {In-memory channel, half of a fifo2}]
+[item modules/virtchannel_base/tcllib_memchan.man tcl::chan::memchan {In-memory channel}]
+[item modules/virtchannel_base/tcllib_null.man tcl::chan::null {Null channel}]
+[item modules/virtchannel_base/nullzero.man tcl::chan::nullzero {Null/Zero channel combination}]
+[item modules/virtchannel_base/tcllib_random.man tcl::chan::random {Random channel}]
+[item modules/virtchannel_base/std.man tcl::chan::std {Standard I/O, unification of stdin and stdout}]
+[item modules/virtchannel_base/tcllib_string.man tcl::chan::string {Read-only in-memory channel}]
+[item modules/virtchannel_base/textwindow.man tcl::chan::textwindow {Textwindow channel}]
+[item modules/virtchannel_base/tcllib_variable.man tcl::chan::variable {In-memory channel using variable for storage}]
+[item modules/virtchannel_base/tcllib_zero.man tcl::chan::zero {Zero channel}]
+[item modules/virtchannel_base/randseed.man tcl::randomseed {Utilities for random channels}]
+[division_end]
+[division_start virtchannel_core]
+[item modules/virtchannel_core/core.man tcl::chan::core {Basic reflected/virtual channel support}]
+[item modules/virtchannel_core/events.man tcl::chan::events {Event support for reflected/virtual channels}]
+[item modules/virtchannel_core/transformcore.man tcl::transform::core {Basic reflected/virtual channel transform support}]
+[division_end]
+[division_start virtchannel_transform]
+[item modules/virtchannel_transform/adler32.man tcl::transform::adler32 {Adler32 transformation}]
+[item modules/virtchannel_transform/vt_base64.man tcl::transform::base64 {Base64 encoding transformation}]
+[item modules/virtchannel_transform/vt_counter.man tcl::transform::counter {Counter transformation}]
+[item modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32 {Crc32 transformation}]
+[item modules/virtchannel_transform/hex.man tcl::transform::hex {Hexadecimal encoding transformation}]
+[item modules/virtchannel_transform/identity.man tcl::transform::identity {Identity transformation}]
+[item modules/virtchannel_transform/limitsize.man tcl::transform::limitsize {limiting input}]
+[item modules/virtchannel_transform/observe.man tcl::transform::observe {Observer transformation, stream copy}]
+[item modules/virtchannel_transform/vt_otp.man tcl::transform::otp {Encryption via one-time pad}]
+[item modules/virtchannel_transform/rot.man tcl::transform::rot rot-encryption]
+[item modules/virtchannel_transform/spacer.man tcl::transform::spacer {Space insertation and removal}]
+[item modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib {zlib (de)compression}]
+[division_end]
+[division_start websocket]
+[item modules/websocket/websocket.man websocket {Tcl implementation of the websocket protocol}]
+[division_end]
+[division_start wip]
+[item modules/wip/wip.man wip {Word Interpreter}]
+[division_end]
+[division_start yaml]
+[item modules/yaml/huddle.man huddle {Create and manipulate huddle object}]
+[item modules/yaml/yaml.man yaml {YAML Format Encoder/Decoder}]
+[division_end]
+[division_start zip]
+[item modules/zip/decode.man zipfile::decode {Access to zip archives}]
+[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
+[item modules/zip/mkzip.man zipfile::mkzip {Build a zip archive}]
+[division_end]
+[division_end]
+[division_end]
+[toc_end] \ No newline at end of file
diff --git a/tcllib/support/devel/sak/doc/toc_apps.txt b/tcllib/support/devel/sak/doc/toc_apps.txt
new file mode 100644
index 0000000..cb85b0f
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/toc_apps.txt
@@ -0,0 +1,11 @@
+[toc_begin {Table Of Contents} {}]
+[division_start Applications]
+[item apps/dtplite.man dtplite {Lightweight DocTools Markup Processor}]
+[item apps/nns.man nns {Name service facility, Commandline Client Application}]
+[item apps/nnsd.man nnsd {Name service facility, Commandline Server Application}]
+[item apps/nnslog.man nnslog {Name service facility, Commandline Logging Client Application}]
+[item apps/page.man page {Parser Generator}]
+[item apps/pt.man pt {Parser Tools Application}]
+[item apps/tcldocstrip.man tcldocstrip {Tcl-based Docstrip Processor}]
+[division_end]
+[toc_end] \ No newline at end of file
diff --git a/tcllib/support/devel/sak/doc/toc_cats.txt b/tcllib/support/devel/sak/doc/toc_cats.txt
new file mode 100644
index 0000000..fcf3c76
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/toc_cats.txt
@@ -0,0 +1,488 @@
+[toc_begin {Table Of Contents} {}]
+[division_start {By Categories}]
+[division_start {Argument entry form, mega widget}]
+[item modules/tepam/tepam_argument_dialogbox.man tepam::argument_dialogbox {TEPAM argument_dialogbox, reference manual}]
+[division_end]
+[division_start {Benchmark tools}]
+[item modules/bench/bench.man bench {bench - Processing benchmark suites}]
+[item modules/bench/bench_read.man bench::in {bench::in - Reading benchmark results}]
+[item modules/bench/bench_wcsv.man bench::out::csv {bench::out::csv - Formatting benchmark results as CSV}]
+[item modules/bench/bench_wtext.man bench::out::text {bench::out::text - Formatting benchmark results as human readable text}]
+[item modules/bench/bench_intro.man bench_intro {bench introduction}]
+[item modules/bench/bench_lang_intro.man bench_lang_intro {bench language introduction}]
+[item modules/bench/bench_lang_spec.man bench_lang_spec {bench language specification}]
+[division_end]
+[division_start {CGI programming}]
+[item modules/html/html.man html {Procedures to generate HTML structures}]
+[item modules/javascript/javascript.man javascript {Procedures to generate HTML and Java Script structures.}]
+[item modules/json/json.man json {JSON parser}]
+[item modules/json/json_write.man json::write {JSON generation}]
+[item modules/ncgi/ncgi.man ncgi {Procedures to manipulate CGI values.}]
+[division_end]
+[division_start Channels]
+[item modules/virtchannel_base/cat.man tcl::chan::cat {Concatenation channel}]
+[item modules/virtchannel_core/core.man tcl::chan::core {Basic reflected/virtual channel support}]
+[item modules/virtchannel_core/events.man tcl::chan::events {Event support for reflected/virtual channels}]
+[item modules/virtchannel_base/facade.man tcl::chan::facade {Facade channel}]
+[item modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo {In-memory fifo channel}]
+[item modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2 {In-memory interconnected fifo channels}]
+[item modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe {In-memory channel, half of a fifo2}]
+[item modules/virtchannel_base/tcllib_memchan.man tcl::chan::memchan {In-memory channel}]
+[item modules/virtchannel_base/tcllib_null.man tcl::chan::null {Null channel}]
+[item modules/virtchannel_base/nullzero.man tcl::chan::nullzero {Null/Zero channel combination}]
+[item modules/virtchannel_base/tcllib_random.man tcl::chan::random {Random channel}]
+[item modules/virtchannel_base/std.man tcl::chan::std {Standard I/O, unification of stdin and stdout}]
+[item modules/virtchannel_base/tcllib_string.man tcl::chan::string {Read-only in-memory channel}]
+[item modules/virtchannel_base/textwindow.man tcl::chan::textwindow {Textwindow channel}]
+[item modules/virtchannel_base/tcllib_variable.man tcl::chan::variable {In-memory channel using variable for storage}]
+[item modules/virtchannel_base/tcllib_zero.man tcl::chan::zero {Zero channel}]
+[item modules/virtchannel_base/randseed.man tcl::randomseed {Utilities for random channels}]
+[item modules/virtchannel_transform/adler32.man tcl::transform::adler32 {Adler32 transformation}]
+[item modules/virtchannel_transform/vt_base64.man tcl::transform::base64 {Base64 encoding transformation}]
+[item modules/virtchannel_core/transformcore.man tcl::transform::core {Basic reflected/virtual channel transform support}]
+[item modules/virtchannel_transform/vt_counter.man tcl::transform::counter {Counter transformation}]
+[item modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32 {Crc32 transformation}]
+[item modules/virtchannel_transform/hex.man tcl::transform::hex {Hexadecimal encoding transformation}]
+[item modules/virtchannel_transform/identity.man tcl::transform::identity {Identity transformation}]
+[item modules/virtchannel_transform/limitsize.man tcl::transform::limitsize {limiting input}]
+[item modules/virtchannel_transform/observe.man tcl::transform::observe {Observer transformation, stream copy}]
+[item modules/virtchannel_transform/vt_otp.man tcl::transform::otp {Encryption via one-time pad}]
+[item modules/virtchannel_transform/rot.man tcl::transform::rot rot-encryption]
+[item modules/virtchannel_transform/spacer.man tcl::transform::spacer {Space insertation and removal}]
+[item modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib {zlib (de)compression}]
+[division_end]
+[division_start Coroutine]
+[item modules/coroutine/tcllib_coroutine.man coroutine {Coroutine based event and IO handling}]
+[item modules/coroutine/coro_auto.man coroutine::auto {Automatic event and IO coroutine awareness}]
+[division_end]
+[division_start {Data structures}]
+[item modules/counter/counter.man counter {Procedures for counters and histograms}]
+[item modules/report/report.man report {Create and manipulate report objects}]
+[item modules/struct/disjointset.man struct::disjointset {Disjoint set data structure}]
+[item modules/struct/graph.man struct::graph {Create and manipulate directed graph objects}]
+[item modules/struct/graphops.man struct::graph::op {Operation for (un)directed graph objects}]
+[item modules/struct/graph1.man struct::graph_v1 {Create and manipulate directed graph objects}]
+[item modules/struct/struct_list.man struct::list {Procedures for manipulating lists}]
+[item modules/struct/matrix.man struct::matrix {Create and manipulate matrix objects}]
+[item modules/struct/matrix1.man struct::matrix_v1 {Create and manipulate matrix objects}]
+[item modules/struct/pool.man struct::pool {Create and manipulate pool objects (of discrete items)}]
+[item modules/struct/prioqueue.man struct::prioqueue {Create and manipulate prioqueue objects}]
+[item modules/struct/queue.man struct::queue {Create and manipulate queue objects}]
+[item modules/struct/record.man struct::record {Define and create records (similar to 'C' structures)}]
+[item modules/struct/struct_set.man struct::set {Procedures for manipulating sets}]
+[item modules/struct/skiplist.man struct::skiplist {Create and manipulate skiplists}]
+[item modules/struct/stack.man struct::stack {Create and manipulate stack objects}]
+[item modules/struct/struct_tree.man struct::tree {Create and manipulate tree objects}]
+[item modules/struct/struct_tree1.man struct::tree_v1 {Create and manipulate tree objects}]
+[item modules/treeql/treeql.man treeql {Query tree objects}]
+[division_end]
+[division_start {debugging, tracing, and logging}]
+[item modules/debug/debug.man debug {debug narrative - core}]
+[item modules/debug/debug_caller.man debug::caller {debug narrative - caller}]
+[item modules/debug/debug_heartbeat.man debug::heartbeat {debug narrative - heartbeat}]
+[item modules/debug/debug_timestamp.man debug::timestamp {debug narrative - timestamping}]
+[division_end]
+[division_start {Documentation tools}]
+[item modules/doctools/docidx_intro.man docidx_intro {docidx introduction}]
+[item modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref {docidx language command reference}]
+[item modules/doctools/docidx_lang_faq.man docidx_lang_faq {docidx language faq}]
+[item modules/doctools/docidx_lang_intro.man docidx_lang_intro {docidx language introduction}]
+[item modules/doctools/docidx_lang_syntax.man docidx_lang_syntax {docidx language syntax}]
+[item modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref {docidx plugin API reference}]
+[item modules/docstrip/docstrip.man docstrip {Docstrip style source code extraction}]
+[item modules/docstrip/docstrip_util.man docstrip_util {Docstrip-related utilities}]
+[item modules/doctools/doctoc_intro.man doctoc_intro {doctoc introduction}]
+[item modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref {doctoc language command reference}]
+[item modules/doctools/doctoc_lang_faq.man doctoc_lang_faq {doctoc language faq}]
+[item modules/doctools/doctoc_lang_intro.man doctoc_lang_intro {doctoc language introduction}]
+[item modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax {doctoc language syntax}]
+[item modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref {doctoc plugin API reference}]
+[item modules/doctools/doctools.man doctools {doctools - Processing documents}]
+[item modules/doctools2idx/idx_introduction.man doctools2idx_introduction {DocTools - Keyword indices}]
+[item modules/doctools2toc/toc_introduction.man doctools2toc_introduction {DocTools - Tables of Contents}]
+[item modules/doctools/changelog.man doctools::changelog {Processing text in Emacs ChangeLog format}]
+[item modules/doctools/cvs.man doctools::cvs {Processing text in 'cvs log' format}]
+[item modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults {Default CSS style for HTML export plugins}]
+[item modules/doctools2idx/idx_container.man doctools::idx {Holding keyword indices}]
+[item modules/doctools/docidx.man doctools::idx {docidx - Processing indices}]
+[item modules/doctools2idx/idx_export.man doctools::idx::export {Exporting keyword indices}]
+[item modules/doctools2idx/idx_import.man doctools::idx::import {Importing keyword indices}]
+[item modules/doctools2idx/idx_parse.man doctools::idx::parse {Parsing text in docidx format}]
+[item modules/doctools2idx/idx_structure.man doctools::idx::structure {Docidx serialization utilities}]
+[item modules/doctools2base/tcllib_msgcat.man doctools::msgcat {Message catalog management for the various document parsers}]
+[item modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c {Message catalog for the docidx parser (C)}]
+[item modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de {Message catalog for the docidx parser (DE)}]
+[item modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en {Message catalog for the docidx parser (EN)}]
+[item modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr {Message catalog for the docidx parser (FR)}]
+[item modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c {Message catalog for the doctoc parser (C)}]
+[item modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de {Message catalog for the doctoc parser (DE)}]
+[item modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en {Message catalog for the doctoc parser (EN)}]
+[item modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr {Message catalog for the doctoc parser (FR)}]
+[item modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros {Default CSS style for NROFF export plugins}]
+[item modules/doctools2base/tcl_parse.man doctools::tcl::parse {Processing text in 'subst -novariables' format}]
+[item modules/doctools2toc/toc_container.man doctools::toc {Holding tables of contents}]
+[item modules/doctools/doctoc.man doctools::toc {doctoc - Processing tables of contents}]
+[item modules/doctools2toc/toc_export.man doctools::toc::export {Exporting tables of contents}]
+[item modules/doctools2toc/toc_import.man doctools::toc::import {Importing keyword indices}]
+[item modules/doctools2toc/toc_parse.man doctools::toc::parse {Parsing text in doctoc format}]
+[item modules/doctools2toc/toc_structure.man doctools::toc::structure {Doctoc serialization utilities}]
+[item modules/doctools/doctools_intro.man doctools_intro {doctools introduction}]
+[item modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref {doctools language command reference}]
+[item modules/doctools/doctools_lang_faq.man doctools_lang_faq {doctools language faq}]
+[item modules/doctools/doctools_lang_intro.man doctools_lang_intro {doctools language introduction}]
+[item modules/doctools/doctools_lang_syntax.man doctools_lang_syntax {doctools language syntax}]
+[item modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref {doctools plugin API reference}]
+[item modules/dtplite/pkg_dtplite.man dtplite {Lightweight DocTools Markup Processor}]
+[item apps/dtplite.man dtplite {Lightweight DocTools Markup Processor}]
+[item modules/doctools/mpexpand.man mpexpand {Markup processor}]
+[item apps/tcldocstrip.man tcldocstrip {Tcl-based Docstrip Processor}]
+[item modules/tepam/tepam_doc_gen.man tepam::doc_gen {TEPAM DOC Generation, reference manual}]
+[item modules/textutil/expander.man textutil::expander {Procedures to process templates and expand text.}]
+[division_end]
+[division_start File]
+[item modules/zip/decode.man zipfile::decode {Access to zip archives}]
+[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
+[item modules/zip/mkzip.man zipfile::mkzip {Build a zip archive}]
+[division_end]
+[division_start {File formats}]
+[item modules/gpx/gpx.man gpx {Extracts waypoints, tracks and routes from GPX files}]
+[item modules/jpeg/jpeg.man jpeg {JPEG querying and manipulation of meta data}]
+[item modules/png/png.man png {PNG querying and manipulation of meta data}]
+[item modules/tar/tar.man tar {Tar file creation, extraction & manipulation}]
+[item modules/tiff/tiff.man tiff {TIFF reading, writing, and querying and manipulation of meta data}]
+[division_end]
+[division_start {Grammars and finite automata}]
+[item modules/grammar_aycock/aycock.man grammar::aycock {Aycock-Horspool-Earley parser generator for Tcl}]
+[item modules/grammar_fa/fa.man grammar::fa {Create and manipulate finite automatons}]
+[item modules/grammar_fa/dacceptor.man grammar::fa::dacceptor {Create and use deterministic acceptors}]
+[item modules/grammar_fa/dexec.man grammar::fa::dexec {Execute deterministic finite automatons}]
+[item modules/grammar_fa/faop.man grammar::fa::op {Operations on finite automatons}]
+[item modules/grammar_me/me_cpu.man grammar::me::cpu {Virtual machine implementation II for parsing token streams}]
+[item modules/grammar_me/me_cpucore.man grammar::me::cpu::core {ME virtual machine state manipulation}]
+[item modules/grammar_me/gasm.man grammar::me::cpu::gasm {ME assembler}]
+[item modules/grammar_me/me_tcl.man grammar::me::tcl {Virtual machine implementation I for parsing token streams}]
+[item modules/grammar_me/me_util.man grammar::me::util {AST utilities}]
+[item modules/grammar_me/me_ast.man grammar::me_ast {Various representations of ASTs}]
+[item modules/grammar_me/me_intro.man grammar::me_intro {Introduction to virtual machines for parsing token streams}]
+[item modules/grammar_me/me_vm.man grammar::me_vm {Virtual machine for parsing token streams}]
+[item modules/grammar_peg/peg.man grammar::peg {Create and manipulate parsing expression grammars}]
+[item modules/grammar_peg/peg_interp.man grammar::peg::interp {Interpreter for parsing expression grammars}]
+[division_end]
+[division_start {Hashes, checksums, and encryption}]
+[item modules/aes/aes.man aes {Implementation of the AES block cipher}]
+[item modules/blowfish/blowfish.man blowfish {Implementation of the Blowfish block cipher}]
+[item modules/crc/cksum.man cksum {Calculate a cksum(1) compatible checksum}]
+[item modules/crc/crc16.man crc16 {Perform a 16bit Cyclic Redundancy Check}]
+[item modules/crc/crc32.man crc32 {Perform a 32bit Cyclic Redundancy Check}]
+[item modules/des/des.man des {Implementation of the DES and triple-DES ciphers}]
+[item modules/md4/md4.man md4 {MD4 Message-Digest Algorithm}]
+[item modules/md5/md5.man md5 {MD5 Message-Digest Algorithm}]
+[item modules/md5crypt/md5crypt.man md5crypt {MD5-based password encryption}]
+[item modules/otp/otp.man otp {One-Time Passwords}]
+[item modules/pki/pki.man pki {Implementation of the public key cipher}]
+[item modules/rc4/rc4.man rc4 {Implementation of the RC4 stream cipher}]
+[item modules/ripemd/ripemd128.man ripemd128 {RIPEMD-128 Message-Digest Algorithm}]
+[item modules/ripemd/ripemd160.man ripemd160 {RIPEMD-160 Message-Digest Algorithm}]
+[item modules/sha1/sha1.man sha1 {SHA1 Message-Digest Algorithm}]
+[item modules/sha1/sha256.man sha256 {SHA256 Message-Digest Algorithm}]
+[item modules/soundex/soundex.man soundex Soundex]
+[item modules/crc/sum.man sum {Calculate a sum(1) compatible checksum}]
+[item modules/des/tcldes.man tclDES {Implementation of the DES and triple-DES ciphers}]
+[item modules/des/tcldesjr.man tclDESjr {Implementation of the DES and triple-DES ciphers}]
+[item modules/uuid/uuid.man uuid {UUID generation and comparison}]
+[division_end]
+[division_start Mathematics]
+[item modules/math/math.man math {Tcl Math Library}]
+[item modules/math/bigfloat.man math::bigfloat {Arbitrary precision floating-point numbers}]
+[item modules/math/bignum.man math::bignum {Arbitrary precision integer numbers}]
+[item modules/math/calculus.man math::calculus {Integration and ordinary differential equations}]
+[item modules/math/romberg.man math::calculus::romberg {Romberg integration}]
+[item modules/math/combinatorics.man math::combinatorics {Combinatorial functions in the Tcl Math Library}]
+[item modules/math/qcomplex.man math::complexnumbers {Straightforward complex number package}]
+[item modules/math/constants.man math::constants {Mathematical and numerical constants}]
+[item modules/math/decimal.man math::decimal {General decimal arithmetic}]
+[item modules/math/exact.man math::exact {Exact Real Arithmetic}]
+[item modules/math/fourier.man math::fourier {Discrete and fast fourier transforms}]
+[item modules/math/fuzzy.man math::fuzzy {Fuzzy comparison of floating-point numbers}]
+[item modules/math/math_geometry.man math::geometry {Geometrical computations}]
+[item modules/math/interpolate.man math::interpolate {Interpolation routines}]
+[item modules/math/linalg.man math::linearalgebra {Linear Algebra}]
+[item modules/math/numtheory.man math::numtheory {Number Theory}]
+[item modules/math/optimize.man math::optimize {Optimisation routines}]
+[item modules/math/pca.man math::PCA {Package for Principal Component Analysis}]
+[item modules/math/polynomials.man math::polynomials {Polynomial functions}]
+[item modules/math/rational_funcs.man math::rationalfunctions {Polynomial functions}]
+[item modules/math/roman.man math::roman {Tools for creating and manipulating roman numerals}]
+[item modules/math/special.man math::special {Special mathematical functions}]
+[item modules/math/statistics.man math::statistics {Basic statistical functions and procedures}]
+[item modules/simulation/annealing.man simulation::annealing {Simulated annealing}]
+[item modules/simulation/montecarlo.man simulation::montecarlo {Monte Carlo simulations}]
+[item modules/simulation/simulation_random.man simulation::random {Pseudo-random number generators}]
+[division_end]
+[division_start Networking]
+[item modules/asn/asn.man asn {ASN.1 BER encoder/decoder}]
+[item modules/http/autoproxy.man autoproxy {Automatic HTTP proxy usage and authentication}]
+[item modules/bee/bee.man bee {BitTorrent Serialization Format Encoder/Decoder}]
+[item modules/dns/tcllib_dns.man dns {Tcl Domain Name Service Client}]
+[item modules/ftp/ftp.man ftp {Client-side tcl implementation of the ftp protocol}]
+[item modules/ftp/ftp_geturl.man ftp::geturl {Uri handler for ftp urls}]
+[item modules/ftpd/ftpd.man ftpd {Tcl FTP server implementation}]
+[item modules/ident/ident.man ident {Ident protocol client}]
+[item modules/irc/irc.man irc {Create IRC connection and interface.}]
+[item modules/ldap/ldap.man ldap {LDAP client}]
+[item modules/ldap/ldapx.man ldapx {LDAP extended object interface}]
+[item modules/nns/nns_client.man nameserv {Name service facility, Client}]
+[item modules/nns/nns_auto.man nameserv::auto {Name service facility, Client Extension}]
+[item modules/nns/nns_common.man nameserv::common {Name service facility, shared definitions}]
+[item modules/nns/nns_protocol.man nameserv::protocol {Name service facility, client/server protocol}]
+[item modules/nns/nns_server.man nameserv::server {Name service facility, Server}]
+[item modules/nmea/nmea.man nmea {Process NMEA data}]
+[item apps/nns.man nns {Name service facility, Commandline Client Application}]
+[item modules/nns/nns_intro.man nns_intro {Name service facility, introduction}]
+[item apps/nnsd.man nnsd {Name service facility, Commandline Server Application}]
+[item apps/nnslog.man nnslog {Name service facility, Commandline Logging Client Application}]
+[item modules/nntp/nntp.man nntp {Tcl client for the NNTP protocol}]
+[item modules/ntp/ntp_time.man ntp_time {Tcl Time Service Client}]
+[item modules/oauth/oauth.man oauth {oauth API base signature}]
+[item modules/irc/picoirc.man picoirc {Small and simple embeddable IRC client.}]
+[item modules/pop3/pop3.man pop3 {Tcl client for POP3 email protocol}]
+[item modules/pop3d/pop3d.man pop3d {Tcl POP3 server implementation}]
+[item modules/pop3d/pop3d_dbox.man pop3d::dbox {Simple mailbox database for pop3d}]
+[item modules/pop3d/pop3d_udb.man pop3d::udb {Simple user database for pop3d}]
+[item modules/amazon-s3/S3.man S3 {Amazon S3 Web Service Interface}]
+[item modules/sasl/sasl.man SASL {Implementation of SASL mechanisms for Tcl}]
+[item modules/sasl/ntlm.man SASL::NTLM {Implementation of SASL NTLM mechanism for Tcl}]
+[item modules/sasl/scram.man SASL::SCRAM {Implementation of SASL SCRAM mechanism for Tcl}]
+[item modules/sasl/gtoken.man SASL::XGoogleToken {Implementation of SASL NTLM mechanism for Tcl}]
+[item modules/mime/smtp.man smtp {Client-side tcl implementation of the smtp protocol}]
+[item modules/smtpd/smtpd.man smtpd {Tcl SMTP server implementation}]
+[item modules/dns/tcllib_ip.man tcllib_ip {IPv4 and IPv6 address manipulation}]
+[item modules/httpd/httpd.man tool {A TclOO and coroutine based web server}]
+[item modules/udpcluster/udpcluster.man udpcluster {UDP Peer-to-Peer cluster}]
+[item modules/uri/uri.man uri {URI utilities}]
+[item modules/uri/urn-scheme.man uri_urn {URI utilities, URN scheme}]
+[item modules/websocket/websocket.man websocket {Tcl implementation of the websocket protocol}]
+[division_end]
+[division_start {Page Parser Generator}]
+[item apps/page.man page {Parser Generator}]
+[item modules/page/page_intro.man page_intro {page introduction}]
+[item modules/page/page_pluginmgr.man page_pluginmgr {page plugin manager}]
+[item modules/page/page_util_flow.man page_util_flow {page dataflow/treewalker utility}]
+[item modules/page/page_util_norm_lemon.man page_util_norm_lemon {page AST normalization, LEMON}]
+[item modules/page/page_util_norm_peg.man page_util_norm_peg {page AST normalization, PEG}]
+[item modules/page/page_util_peg.man page_util_peg {page PEG transformation utilities}]
+[item modules/page/page_util_quote.man page_util_quote {page character quoting utilities}]
+[division_end]
+[division_start {Parsing and Grammars}]
+[item apps/pt.man pt {Parser Tools Application}]
+[item modules/pt/pt_astree.man pt::ast {Abstract Syntax Tree Serialization}]
+[item modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl {C/PARAM, Canned configuration, Critcl}]
+[item modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea {C/PARAM, Canned configuration, TEA}]
+[item modules/pt/pt_json_language.man pt::json_language {The JSON Grammar Exchange Format}]
+[item modules/pt/pt_param.man pt::param {PackRat Machine Specification}]
+[item modules/pt/pt_pexpression.man pt::pe {Parsing Expression Serialization}]
+[item modules/pt/pt_pexpr_op.man pt::pe::op {Parsing Expression Utilities}]
+[item modules/pt/pt_pegrammar.man pt::peg {Parsing Expression Grammar Serialization}]
+[item modules/pt/pt_peg_container.man pt::peg::container {PEG Storage}]
+[item modules/pt/pt_peg_container_peg.man pt::peg::container::peg {PEG Storage. Canned PEG grammar specification}]
+[item modules/pt/pt_peg_export.man pt::peg::export {PEG Export}]
+[item modules/pt/pt_peg_export_container.man pt::peg::export::container {PEG Export Plugin. Write CONTAINER format}]
+[item modules/pt/pt_peg_export_json.man pt::peg::export::json {PEG Export Plugin. Write JSON format}]
+[item modules/pt/pt_peg_export_peg.man pt::peg::export::peg {PEG Export Plugin. Write PEG format}]
+[item modules/pt/pt_peg_from_container.man pt::peg::from::container {PEG Conversion. From CONTAINER format}]
+[item modules/pt/pt_peg_from_json.man pt::peg::from::json {PEG Conversion. Read JSON format}]
+[item modules/pt/pt_peg_from_peg.man pt::peg::from::peg {PEG Conversion. Read PEG format}]
+[item modules/pt/pt_peg_import.man pt::peg::import {PEG Import}]
+[item modules/pt/pt_peg_import_container.man pt::peg::import::container {PEG Import Plugin. From CONTAINER format}]
+[item modules/pt/pt_peg_import_json.man pt::peg::import::json {PEG Import Plugin. Read JSON format}]
+[item modules/pt/pt_peg_import_peg.man pt::peg::import::peg {PEG Import Plugin. Read PEG format}]
+[item modules/pt/pt_peg_interp.man pt::peg::interp {Interpreter for parsing expression grammars}]
+[item modules/pt/pt_peg_to_container.man pt::peg::to::container {PEG Conversion. Write CONTAINER format}]
+[item modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam {PEG Conversion. Write CPARAM format}]
+[item modules/pt/pt_peg_to_json.man pt::peg::to::json {PEG Conversion. Write JSON format}]
+[item modules/pt/pt_peg_to_param.man pt::peg::to::param {PEG Conversion. Write PARAM format}]
+[item modules/pt/pt_peg_to_peg.man pt::peg::to::peg {PEG Conversion. Write PEG format}]
+[item modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam {PEG Conversion. Write TCLPARAM format}]
+[item modules/pt/pt_peg_language.man pt::peg_language {PEG Language Tutorial}]
+[item modules/pt/pt_peg_introduction.man pt::pegrammar {Introduction to Parsing Expression Grammars}]
+[item modules/pt/pt_pgen.man pt::pgen {Parser Generator}]
+[item modules/pt/pt_rdengine.man pt::rde {Parsing Runtime Support, PARAM based}]
+[item modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx {Tcl/PARAM, Canned configuration, NX}]
+[item modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit {Tcl/PARAM, Canned configuration, Snit}]
+[item modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo {Tcl/PARAM, Canned configuration, Tcloo}]
+[item modules/pt/pt_util.man pt::util {General utilities}]
+[item modules/pt/pt_to_api.man pt_export_api {Parser Tools Export API}]
+[item modules/pt/pt_from_api.man pt_import_api {Parser Tools Import API}]
+[item modules/pt/pt_introduction.man pt_introduction {Introduction to Parser Tools}]
+[item modules/pt/pt_parse_peg.man pt_parse_peg {Parser Tools PEG Parser}]
+[item modules/pt/pt_parser_api.man pt_parser_api {Parser API}]
+[item modules/pt/pt_peg_op.man pt_peg_op {Parser Tools PE Grammar Utility Operations}]
+[division_end]
+[division_start {Procedures, arguments, parameters, options}]
+[item modules/tepam/tepam_introduction.man tepam {An introduction into TEPAM, Tcl's Enhanced Procedure and Argument Manager}]
+[item modules/tepam/tepam_procedure.man tepam::procedure {TEPAM procedure, reference manual}]
+[division_end]
+[division_start {Programming tools}]
+[item modules/cmdline/cmdline.man cmdline {Procedures to process command lines and options.}]
+[item modules/comm/comm.man comm {A remote communication facility for Tcl (8.3 and later)}]
+[item modules/comm/comm_wire.man comm_wire {The comm wire protocol}]
+[item modules/control/control.man control {Procedures for control flow structures.}]
+[item modules/interp/deleg_method.man deleg_method {Creation of comm delegates (snit methods)}]
+[item modules/interp/deleg_proc.man deleg_proc {Creation of comm delegates (procedures)}]
+[item modules/fileutil/fileutil.man fileutil {Procedures implementing some file utilities}]
+[item modules/fumagic/cfront.man fileutil::magic::cfront {Generator core for compiler of magic(5) files}]
+[item modules/fumagic/cgen.man fileutil::magic::cgen {Generator core for compiler of magic(5) files}]
+[item modules/fumagic/filetypes.man fileutil::magic::filetype {Procedures implementing file-type recognition}]
+[item modules/fumagic/rtcore.man fileutil::magic::rt {Runtime core for file type recognition engines written in pure Tcl}]
+[item modules/fileutil/multi.man fileutil::multi {Multi-file operation, scatter/gather, standard object}]
+[item modules/fileutil/multiop.man fileutil::multi::op {Multi-file operation, scatter/gather}]
+[item modules/fileutil/traverse.man fileutil_traverse {Iterative directory traversal}]
+[item modules/hook/hook.man hook Hooks]
+[item modules/interp/tcllib_interp.man interp {Interp creation and aliasing}]
+[item modules/log/log.man log {Procedures to log messages of libraries and applications.}]
+[item modules/log/logger.man logger {System to control logging of events.}]
+[item modules/log/loggerAppender.man logger::appender {Collection of predefined appenders for logger}]
+[item modules/log/loggerUtils.man logger::utils {Utilities for logger}]
+[item modules/multiplexer/multiplexer.man multiplexer {One-to-many communication with sockets.}]
+[item modules/pluginmgr/pluginmgr.man pluginmgr {Manage a plugin}]
+[item modules/profiler/profiler.man profiler {Tcl source code profiler}]
+[item modules/snit/snit.man snit {Snit's Not Incr Tcl}]
+[item modules/snit/snitfaq.man snitfaq {Snit Frequently Asked Questions}]
+[item modules/stooop/stooop.man stooop {Object oriented extension.}]
+[item modules/stooop/switched.man switched {switch/option management.}]
+[item modules/tie/tie.man tie {Array persistence}]
+[item modules/tie/tie_std.man tie {Array persistence, standard data sources}]
+[item modules/uev/uevent.man uevent {User events}]
+[item modules/wip/wip.man wip {Word Interpreter}]
+[division_end]
+[division_start System]
+[item modules/cron/cron.man cron {Tool for automating the period callback of commands}]
+[item modules/nettool/nettool.man nettool {Tools for networked applications}]
+[item modules/processman/processman.man processman {Tool for automating the period callback of commands}]
+[division_end]
+[division_start TclOO]
+[item modules/oometa/oometa.man oometa {oo::meta A data registry for classess}]
+[item modules/practcl/practcl.man practcl {The Practcl Module}]
+[item modules/tool/tool.man tool {TclOO Library (TOOL) Framework}]
+[item modules/tool-ui/tool-ui.man tool-ui {Abstractions to allow Tao to express Native Tk, HTML5, and Tao-Layout interfaces}]
+[division_end]
+[division_start {Terminal control}]
+[item modules/term/term.man term {General terminal control}]
+[item modules/term/ansi_code.man term::ansi::code {Helper for control sequences}]
+[item modules/term/ansi_cattr.man term::ansi::code::attr {ANSI attribute sequences}]
+[item modules/term/ansi_cctrl.man term::ansi::code::ctrl {ANSI control sequences}]
+[item modules/term/ansi_cmacros.man term::ansi::code::macros {Macro sequences}]
+[item modules/term/ansi_ctrlu.man term::ansi::ctrl::unix {Control operations and queries}]
+[item modules/term/ansi_send.man term::ansi::send {Output of ANSI control sequences to terminals}]
+[item modules/term/imenu.man term::interact::menu {Terminal widget, menu}]
+[item modules/term/ipager.man term::interact::pager {Terminal widget, paging}]
+[item modules/term/receive.man term::receive {General input from terminals}]
+[item modules/term/term_bind.man term::receive::bind {Keyboard dispatch from terminals}]
+[item modules/term/term_send.man term::send {General output to terminals}]
+[division_end]
+[division_start {Text formatter plugin}]
+[item modules/doctools2idx/export_docidx.man doctools::idx::export::docidx {docidx export plugin}]
+[item modules/doctools2idx/idx_export_html.man doctools::idx::export::html {HTML export plugin}]
+[item modules/doctools2idx/idx_export_json.man doctools::idx::export::json {JSON export plugin}]
+[item modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff {nroff export plugin}]
+[item modules/doctools2idx/idx_export_text.man doctools::idx::export::text {plain text export plugin}]
+[item modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki {wiki export plugin}]
+[item modules/doctools2idx/import_docidx.man doctools::idx::import::docidx {docidx import plugin}]
+[item modules/doctools2idx/idx_import_json.man doctools::idx::import::json {JSON import plugin}]
+[item modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc {doctoc export plugin}]
+[item modules/doctools2toc/toc_export_html.man doctools::toc::export::html {HTML export plugin}]
+[item modules/doctools2toc/toc_export_json.man doctools::toc::export::json {JSON export plugin}]
+[item modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff {nroff export plugin}]
+[item modules/doctools2toc/toc_export_text.man doctools::toc::export::text {plain text export plugin}]
+[item modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki {wiki export plugin}]
+[item modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc {doctoc import plugin}]
+[item modules/doctools2toc/toc_import_json.man doctools::toc::import::json {JSON import plugin}]
+[division_end]
+[division_start {Text processing}]
+[item modules/base64/ascii85.man ascii85 {ascii85-encode/decode binary data}]
+[item modules/base32/base32.man base32 {base32 standard encoding}]
+[item modules/base32/base32core.man base32::core {Expanding basic base32 maps}]
+[item modules/base32/base32hex.man base32::hex {base32 extended hex encoding}]
+[item modules/base64/base64.man base64 {base64-encode/decode binary data}]
+[item modules/bibtex/bibtex.man bibtex {Parse bibtex files}]
+[item modules/clock/iso8601.man clock_iso8601 {Parsing ISO 8601 dates/times}]
+[item modules/clock/rfc2822.man clock_rfc2822 {Parsing ISO 8601 dates/times}]
+[item modules/csv/csv.man csv {Procedures to handle CSV data.}]
+[item modules/htmlparse/htmlparse.man htmlparse {Procedures to parse HTML strings}]
+[item modules/inifile/ini.man inifile {Parsing of Windows INI files}]
+[item modules/markdown/markdown.man markdown {Converts Markdown text to HTML}]
+[item modules/mime/mime.man mime {Manipulation of MIME body parts}]
+[item modules/rcs/rcs.man rcs {RCS low level utilities}]
+[item modules/string/token.man string::token {Regex based iterative lexing}]
+[item modules/string/token_shell.man string::token::shell {Parsing of shell command line}]
+[item modules/textutil/textutil.man textutil {Procedures to manipulate texts and strings.}]
+[item modules/textutil/adjust.man textutil::adjust {Procedures to adjust, indent, and undent paragraphs}]
+[item modules/textutil/repeat.man textutil::repeat {Procedures to repeat strings.}]
+[item modules/textutil/textutil_split.man textutil::split {Procedures to split texts}]
+[item modules/textutil/textutil_string.man textutil::string {Procedures to manipulate texts and strings.}]
+[item modules/textutil/tabify.man textutil::tabify {Procedures to (un)tabify strings}]
+[item modules/textutil/trim.man textutil::trim {Procedures to trim strings}]
+[item modules/base64/uuencode.man uuencode {UU-encode/decode binary data}]
+[item modules/amazon-s3/xsxp.man xsxp {eXtremely Simple Xml Parser}]
+[item modules/base64/yencode.man yencode {Y-encode/decode binary data}]
+[division_end]
+[division_start {Transfer module}]
+[item modules/transfer/connect.man transfer::connect {Connection setup}]
+[item modules/transfer/copyops.man transfer::copy {Data transfer foundation}]
+[item modules/transfer/tqueue.man transfer::copy::queue {Queued transfers}]
+[item modules/transfer/ddest.man transfer::data::destination {Data destination}]
+[item modules/transfer/dsource.man transfer::data::source {Data source}]
+[item modules/transfer/receiver.man transfer::receiver {Data source}]
+[item modules/transfer/transmitter.man transfer::transmitter {Data source}]
+[division_end]
+[division_start Unfiled]
+[item modules/cache/async.man cache::async {Asynchronous in-memory cache}]
+[item modules/generator/generator.man generator {Procedures for creating and using generators.}]
+[item modules/yaml/huddle.man huddle {Create and manipulate huddle object}]
+[item modules/imap4/imap4.man imap4 {imap client-side tcl implementation of imap protocol}]
+[item modules/map/map_geocode_nominatim.man map::geocode::nominatim {Resolving geographical names with a Nominatim service}]
+[item modules/map/map_slippy.man map::slippy {Common code for slippy based map packages}]
+[item modules/map/map_slippy_cache.man map::slippy::cache {Management of a tile cache in the local filesystem}]
+[item modules/map/map_slippy_fetcher.man map::slippy::fetcher {Accessing a server providing tiles for slippy-based maps}]
+[item modules/mapproj/mapproj.man mapproj {Map projection routines}]
+[item modules/math/symdiff.man math::calculus::symdiff {Symbolic differentiation for Tcl}]
+[item modules/namespacex/namespacex.man namespacex {Namespace utility commands}]
+[item modules/rest/rest.man rest {define REST web APIs and call them inline or asychronously}]
+[item modules/stringprep/stringprep.man stringprep {Implementation of stringprep}]
+[item modules/stringprep/stringprep_data.man stringprep::data {stringprep data tables, generated, internal}]
+[item modules/math/machineparameters.man tclrep/machineparameters {Compute double precision machine parameters.}]
+[item modules/uev/uevent_onidle.man uevent::onidle {Request merging and deferal to idle time}]
+[item modules/stringprep/unicode.man unicode {Implementation of Unicode normalization}]
+[item modules/stringprep/unicode_data.man unicode::data {unicode data tables, generated, internal}]
+[item modules/units/units.man units {unit conversion}]
+[item modules/yaml/yaml.man yaml {YAML Format Encoder/Decoder}]
+[division_end]
+[division_start Utilites]
+[item modules/dicttool/dicttool.man dicttool {Dictionary Tools}]
+[division_end]
+[division_start Utility]
+[item modules/defer/defer.man defer {Defered execution}]
+[item modules/lambda/lambda.man lambda {Utility commands for anonymous procedures}]
+[item modules/ooutil/ooutil.man oo::util {Utility commands for TclOO}]
+[item modules/tool/meta.man oo::util {Utility commands for TclOO}]
+[item modules/try/tcllib_throw.man throw {throw - Throw an error exception with a message}]
+[item modules/tool/tool_dict_ensemble.man tool::dict_ensemble {Dictionary Tools}]
+[item modules/try/tcllib_try.man try {try - Trap and process errors and exceptions}]
+[division_end]
+[division_start {Validation, Type checking}]
+[item modules/valtype/valtype_common.man valtype::common {Validation, common code}]
+[item modules/valtype/cc_amex.man valtype::creditcard::amex {Validation for AMEX creditcard number}]
+[item modules/valtype/cc_discover.man valtype::creditcard::discover {Validation for Discover creditcard number}]
+[item modules/valtype/cc_mastercard.man valtype::creditcard::mastercard {Validation for Mastercard creditcard number}]
+[item modules/valtype/cc_visa.man valtype::creditcard::visa {Validation for VISA creditcard number}]
+[item modules/valtype/ean13.man valtype::gs1::ean13 {Validation for EAN13}]
+[item modules/valtype/iban.man valtype::iban {Validation for IBAN}]
+[item modules/valtype/imei.man valtype::imei {Validation for IMEI}]
+[item modules/valtype/isbn.man valtype::isbn {Validation for ISBN}]
+[item modules/valtype/luhn.man valtype::luhn {Validation for plain number with a LUHN checkdigit}]
+[item modules/valtype/luhn5.man valtype::luhn5 {Validation for plain number with a LUHN5 checkdigit}]
+[item modules/valtype/usnpi.man valtype::usnpi {Validation for USNPI}]
+[item modules/valtype/verhoeff.man valtype::verhoeff {Validation for plain number with a VERHOEFF checkdigit}]
+[division_end]
+[division_end]
+[toc_end] \ No newline at end of file
diff --git a/tcllib/support/devel/sak/doc/toc_mods.txt b/tcllib/support/devel/sak/doc/toc_mods.txt
new file mode 100644
index 0000000..b54d598
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/toc_mods.txt
@@ -0,0 +1,675 @@
+[toc_begin {Table Of Contents} {}]
+[division_start Modules]
+[division_start aes]
+[item modules/aes/aes.man aes {Implementation of the AES block cipher}]
+[division_end]
+[division_start amazon-s3]
+[item modules/amazon-s3/S3.man S3 {Amazon S3 Web Service Interface}]
+[item modules/amazon-s3/xsxp.man xsxp {eXtremely Simple Xml Parser}]
+[division_end]
+[division_start asn]
+[item modules/asn/asn.man asn {ASN.1 BER encoder/decoder}]
+[division_end]
+[division_start base32]
+[item modules/base32/base32.man base32 {base32 standard encoding}]
+[item modules/base32/base32core.man base32::core {Expanding basic base32 maps}]
+[item modules/base32/base32hex.man base32::hex {base32 extended hex encoding}]
+[division_end]
+[division_start base64]
+[item modules/base64/ascii85.man ascii85 {ascii85-encode/decode binary data}]
+[item modules/base64/base64.man base64 {base64-encode/decode binary data}]
+[item modules/base64/uuencode.man uuencode {UU-encode/decode binary data}]
+[item modules/base64/yencode.man yencode {Y-encode/decode binary data}]
+[division_end]
+[division_start bee]
+[item modules/bee/bee.man bee {BitTorrent Serialization Format Encoder/Decoder}]
+[division_end]
+[division_start bench]
+[item modules/bench/bench.man bench {bench - Processing benchmark suites}]
+[item modules/bench/bench_read.man bench::in {bench::in - Reading benchmark results}]
+[item modules/bench/bench_wcsv.man bench::out::csv {bench::out::csv - Formatting benchmark results as CSV}]
+[item modules/bench/bench_wtext.man bench::out::text {bench::out::text - Formatting benchmark results as human readable text}]
+[item modules/bench/bench_intro.man bench_intro {bench introduction}]
+[item modules/bench/bench_lang_intro.man bench_lang_intro {bench language introduction}]
+[item modules/bench/bench_lang_spec.man bench_lang_spec {bench language specification}]
+[division_end]
+[division_start bibtex]
+[item modules/bibtex/bibtex.man bibtex {Parse bibtex files}]
+[division_end]
+[division_start blowfish]
+[item modules/blowfish/blowfish.man blowfish {Implementation of the Blowfish block cipher}]
+[division_end]
+[division_start cache]
+[item modules/cache/async.man cache::async {Asynchronous in-memory cache}]
+[division_end]
+[division_start clock]
+[item modules/clock/iso8601.man clock_iso8601 {Parsing ISO 8601 dates/times}]
+[item modules/clock/rfc2822.man clock_rfc2822 {Parsing ISO 8601 dates/times}]
+[division_end]
+[division_start cmdline]
+[item modules/cmdline/cmdline.man cmdline {Procedures to process command lines and options.}]
+[division_end]
+[division_start comm]
+[item modules/comm/comm.man comm {A remote communication facility for Tcl (8.3 and later)}]
+[item modules/comm/comm_wire.man comm_wire {The comm wire protocol}]
+[division_end]
+[division_start control]
+[item modules/control/control.man control {Procedures for control flow structures.}]
+[division_end]
+[division_start coroutine]
+[item modules/coroutine/tcllib_coroutine.man coroutine {Coroutine based event and IO handling}]
+[item modules/coroutine/coro_auto.man coroutine::auto {Automatic event and IO coroutine awareness}]
+[division_end]
+[division_start counter]
+[item modules/counter/counter.man counter {Procedures for counters and histograms}]
+[division_end]
+[division_start crc]
+[item modules/crc/cksum.man cksum {Calculate a cksum(1) compatible checksum}]
+[item modules/crc/crc16.man crc16 {Perform a 16bit Cyclic Redundancy Check}]
+[item modules/crc/crc32.man crc32 {Perform a 32bit Cyclic Redundancy Check}]
+[item modules/crc/sum.man sum {Calculate a sum(1) compatible checksum}]
+[division_end]
+[division_start cron]
+[item modules/cron/cron.man cron {Tool for automating the period callback of commands}]
+[division_end]
+[division_start csv]
+[item modules/csv/csv.man csv {Procedures to handle CSV data.}]
+[division_end]
+[division_start debug]
+[item modules/debug/debug.man debug {debug narrative - core}]
+[item modules/debug/debug_caller.man debug::caller {debug narrative - caller}]
+[item modules/debug/debug_heartbeat.man debug::heartbeat {debug narrative - heartbeat}]
+[item modules/debug/debug_timestamp.man debug::timestamp {debug narrative - timestamping}]
+[division_end]
+[division_start defer]
+[item modules/defer/defer.man defer {Defered execution}]
+[division_end]
+[division_start des]
+[item modules/des/des.man des {Implementation of the DES and triple-DES ciphers}]
+[item modules/des/tcldes.man tclDES {Implementation of the DES and triple-DES ciphers}]
+[item modules/des/tcldesjr.man tclDESjr {Implementation of the DES and triple-DES ciphers}]
+[division_end]
+[division_start dicttool]
+[item modules/dicttool/dicttool.man dicttool {Dictionary Tools}]
+[division_end]
+[division_start dns]
+[item modules/dns/tcllib_dns.man dns {Tcl Domain Name Service Client}]
+[item modules/dns/tcllib_ip.man tcllib_ip {IPv4 and IPv6 address manipulation}]
+[division_end]
+[division_start docstrip]
+[item modules/docstrip/docstrip.man docstrip {Docstrip style source code extraction}]
+[item modules/docstrip/docstrip_util.man docstrip_util {Docstrip-related utilities}]
+[division_end]
+[division_start doctools]
+[item modules/doctools/docidx_intro.man docidx_intro {docidx introduction}]
+[item modules/doctools/docidx_lang_cmdref.man docidx_lang_cmdref {docidx language command reference}]
+[item modules/doctools/docidx_lang_faq.man docidx_lang_faq {docidx language faq}]
+[item modules/doctools/docidx_lang_intro.man docidx_lang_intro {docidx language introduction}]
+[item modules/doctools/docidx_lang_syntax.man docidx_lang_syntax {docidx language syntax}]
+[item modules/doctools/docidx_plugin_apiref.man docidx_plugin_apiref {docidx plugin API reference}]
+[item modules/doctools/doctoc_intro.man doctoc_intro {doctoc introduction}]
+[item modules/doctools/doctoc_lang_cmdref.man doctoc_lang_cmdref {doctoc language command reference}]
+[item modules/doctools/doctoc_lang_faq.man doctoc_lang_faq {doctoc language faq}]
+[item modules/doctools/doctoc_lang_intro.man doctoc_lang_intro {doctoc language introduction}]
+[item modules/doctools/doctoc_lang_syntax.man doctoc_lang_syntax {doctoc language syntax}]
+[item modules/doctools/doctoc_plugin_apiref.man doctoc_plugin_apiref {doctoc plugin API reference}]
+[item modules/doctools/doctools.man doctools {doctools - Processing documents}]
+[item modules/doctools/changelog.man doctools::changelog {Processing text in Emacs ChangeLog format}]
+[item modules/doctools/cvs.man doctools::cvs {Processing text in 'cvs log' format}]
+[item modules/doctools/docidx.man doctools::idx {docidx - Processing indices}]
+[item modules/doctools/doctoc.man doctools::toc {doctoc - Processing tables of contents}]
+[item modules/doctools/doctools_intro.man doctools_intro {doctools introduction}]
+[item modules/doctools/doctools_lang_cmdref.man doctools_lang_cmdref {doctools language command reference}]
+[item modules/doctools/doctools_lang_faq.man doctools_lang_faq {doctools language faq}]
+[item modules/doctools/doctools_lang_intro.man doctools_lang_intro {doctools language introduction}]
+[item modules/doctools/doctools_lang_syntax.man doctools_lang_syntax {doctools language syntax}]
+[item modules/doctools/doctools_plugin_apiref.man doctools_plugin_apiref {doctools plugin API reference}]
+[item modules/doctools/mpexpand.man mpexpand {Markup processor}]
+[division_end]
+[division_start doctools2base]
+[item modules/doctools2base/html_cssdefaults.man doctools::html::cssdefaults {Default CSS style for HTML export plugins}]
+[item modules/doctools2base/tcllib_msgcat.man doctools::msgcat {Message catalog management for the various document parsers}]
+[item modules/doctools2base/nroff_manmacros.man doctools::nroff::man_macros {Default CSS style for NROFF export plugins}]
+[item modules/doctools2base/tcl_parse.man doctools::tcl::parse {Processing text in 'subst -novariables' format}]
+[division_end]
+[division_start doctools2idx]
+[item modules/doctools2idx/idx_introduction.man doctools2idx_introduction {DocTools - Keyword indices}]
+[item modules/doctools2idx/idx_container.man doctools::idx {Holding keyword indices}]
+[item modules/doctools2idx/idx_export.man doctools::idx::export {Exporting keyword indices}]
+[item modules/doctools2idx/export_docidx.man doctools::idx::export::docidx {docidx export plugin}]
+[item modules/doctools2idx/idx_export_html.man doctools::idx::export::html {HTML export plugin}]
+[item modules/doctools2idx/idx_export_json.man doctools::idx::export::json {JSON export plugin}]
+[item modules/doctools2idx/idx_export_nroff.man doctools::idx::export::nroff {nroff export plugin}]
+[item modules/doctools2idx/idx_export_text.man doctools::idx::export::text {plain text export plugin}]
+[item modules/doctools2idx/idx_export_wiki.man doctools::idx::export::wiki {wiki export plugin}]
+[item modules/doctools2idx/idx_import.man doctools::idx::import {Importing keyword indices}]
+[item modules/doctools2idx/import_docidx.man doctools::idx::import::docidx {docidx import plugin}]
+[item modules/doctools2idx/idx_import_json.man doctools::idx::import::json {JSON import plugin}]
+[item modules/doctools2idx/idx_parse.man doctools::idx::parse {Parsing text in docidx format}]
+[item modules/doctools2idx/idx_structure.man doctools::idx::structure {Docidx serialization utilities}]
+[item modules/doctools2idx/idx_msgcat_c.man doctools::msgcat::idx::c {Message catalog for the docidx parser (C)}]
+[item modules/doctools2idx/idx_msgcat_de.man doctools::msgcat::idx::de {Message catalog for the docidx parser (DE)}]
+[item modules/doctools2idx/idx_msgcat_en.man doctools::msgcat::idx::en {Message catalog for the docidx parser (EN)}]
+[item modules/doctools2idx/idx_msgcat_fr.man doctools::msgcat::idx::fr {Message catalog for the docidx parser (FR)}]
+[division_end]
+[division_start doctools2toc]
+[item modules/doctools2toc/toc_introduction.man doctools2toc_introduction {DocTools - Tables of Contents}]
+[item modules/doctools2toc/toc_msgcat_c.man doctools::msgcat::toc::c {Message catalog for the doctoc parser (C)}]
+[item modules/doctools2toc/toc_msgcat_de.man doctools::msgcat::toc::de {Message catalog for the doctoc parser (DE)}]
+[item modules/doctools2toc/toc_msgcat_en.man doctools::msgcat::toc::en {Message catalog for the doctoc parser (EN)}]
+[item modules/doctools2toc/toc_msgcat_fr.man doctools::msgcat::toc::fr {Message catalog for the doctoc parser (FR)}]
+[item modules/doctools2toc/toc_container.man doctools::toc {Holding tables of contents}]
+[item modules/doctools2toc/toc_export.man doctools::toc::export {Exporting tables of contents}]
+[item modules/doctools2toc/export_doctoc.man doctools::toc::export::doctoc {doctoc export plugin}]
+[item modules/doctools2toc/toc_export_html.man doctools::toc::export::html {HTML export plugin}]
+[item modules/doctools2toc/toc_export_json.man doctools::toc::export::json {JSON export plugin}]
+[item modules/doctools2toc/toc_export_nroff.man doctools::toc::export::nroff {nroff export plugin}]
+[item modules/doctools2toc/toc_export_text.man doctools::toc::export::text {plain text export plugin}]
+[item modules/doctools2toc/toc_export_wiki.man doctools::toc::export::wiki {wiki export plugin}]
+[item modules/doctools2toc/toc_import.man doctools::toc::import {Importing keyword indices}]
+[item modules/doctools2toc/import_doctoc.man doctools::toc::import::doctoc {doctoc import plugin}]
+[item modules/doctools2toc/toc_import_json.man doctools::toc::import::json {JSON import plugin}]
+[item modules/doctools2toc/toc_parse.man doctools::toc::parse {Parsing text in doctoc format}]
+[item modules/doctools2toc/toc_structure.man doctools::toc::structure {Doctoc serialization utilities}]
+[division_end]
+[division_start dtplite]
+[item modules/dtplite/pkg_dtplite.man dtplite {Lightweight DocTools Markup Processor}]
+[division_end]
+[division_start fileutil]
+[item modules/fileutil/fileutil.man fileutil {Procedures implementing some file utilities}]
+[item modules/fileutil/multi.man fileutil::multi {Multi-file operation, scatter/gather, standard object}]
+[item modules/fileutil/multiop.man fileutil::multi::op {Multi-file operation, scatter/gather}]
+[item modules/fileutil/traverse.man fileutil_traverse {Iterative directory traversal}]
+[division_end]
+[division_start ftp]
+[item modules/ftp/ftp.man ftp {Client-side tcl implementation of the ftp protocol}]
+[item modules/ftp/ftp_geturl.man ftp::geturl {Uri handler for ftp urls}]
+[division_end]
+[division_start ftpd]
+[item modules/ftpd/ftpd.man ftpd {Tcl FTP server implementation}]
+[division_end]
+[division_start fumagic]
+[item modules/fumagic/cfront.man fileutil::magic::cfront {Generator core for compiler of magic(5) files}]
+[item modules/fumagic/cgen.man fileutil::magic::cgen {Generator core for compiler of magic(5) files}]
+[item modules/fumagic/filetypes.man fileutil::magic::filetype {Procedures implementing file-type recognition}]
+[item modules/fumagic/rtcore.man fileutil::magic::rt {Runtime core for file type recognition engines written in pure Tcl}]
+[division_end]
+[division_start generator]
+[item modules/generator/generator.man generator {Procedures for creating and using generators.}]
+[division_end]
+[division_start gpx]
+[item modules/gpx/gpx.man gpx {Extracts waypoints, tracks and routes from GPX files}]
+[division_end]
+[division_start grammar_aycock]
+[item modules/grammar_aycock/aycock.man grammar::aycock {Aycock-Horspool-Earley parser generator for Tcl}]
+[division_end]
+[division_start grammar_fa]
+[item modules/grammar_fa/fa.man grammar::fa {Create and manipulate finite automatons}]
+[item modules/grammar_fa/dacceptor.man grammar::fa::dacceptor {Create and use deterministic acceptors}]
+[item modules/grammar_fa/dexec.man grammar::fa::dexec {Execute deterministic finite automatons}]
+[item modules/grammar_fa/faop.man grammar::fa::op {Operations on finite automatons}]
+[division_end]
+[division_start grammar_me]
+[item modules/grammar_me/me_cpu.man grammar::me::cpu {Virtual machine implementation II for parsing token streams}]
+[item modules/grammar_me/me_cpucore.man grammar::me::cpu::core {ME virtual machine state manipulation}]
+[item modules/grammar_me/gasm.man grammar::me::cpu::gasm {ME assembler}]
+[item modules/grammar_me/me_tcl.man grammar::me::tcl {Virtual machine implementation I for parsing token streams}]
+[item modules/grammar_me/me_util.man grammar::me::util {AST utilities}]
+[item modules/grammar_me/me_ast.man grammar::me_ast {Various representations of ASTs}]
+[item modules/grammar_me/me_intro.man grammar::me_intro {Introduction to virtual machines for parsing token streams}]
+[item modules/grammar_me/me_vm.man grammar::me_vm {Virtual machine for parsing token streams}]
+[division_end]
+[division_start grammar_peg]
+[item modules/grammar_peg/peg.man grammar::peg {Create and manipulate parsing expression grammars}]
+[item modules/grammar_peg/peg_interp.man grammar::peg::interp {Interpreter for parsing expression grammars}]
+[division_end]
+[division_start hook]
+[item modules/hook/hook.man hook Hooks]
+[division_end]
+[division_start html]
+[item modules/html/html.man html {Procedures to generate HTML structures}]
+[division_end]
+[division_start htmlparse]
+[item modules/htmlparse/htmlparse.man htmlparse {Procedures to parse HTML strings}]
+[division_end]
+[division_start http]
+[item modules/http/autoproxy.man autoproxy {Automatic HTTP proxy usage and authentication}]
+[division_end]
+[division_start httpd]
+[item modules/httpd/httpd.man tool {A TclOO and coroutine based web server}]
+[division_end]
+[division_start ident]
+[item modules/ident/ident.man ident {Ident protocol client}]
+[division_end]
+[division_start imap4]
+[item modules/imap4/imap4.man imap4 {imap client-side tcl implementation of imap protocol}]
+[division_end]
+[division_start inifile]
+[item modules/inifile/ini.man inifile {Parsing of Windows INI files}]
+[division_end]
+[division_start interp]
+[item modules/interp/deleg_method.man deleg_method {Creation of comm delegates (snit methods)}]
+[item modules/interp/deleg_proc.man deleg_proc {Creation of comm delegates (procedures)}]
+[item modules/interp/tcllib_interp.man interp {Interp creation and aliasing}]
+[division_end]
+[division_start irc]
+[item modules/irc/irc.man irc {Create IRC connection and interface.}]
+[item modules/irc/picoirc.man picoirc {Small and simple embeddable IRC client.}]
+[division_end]
+[division_start javascript]
+[item modules/javascript/javascript.man javascript {Procedures to generate HTML and Java Script structures.}]
+[division_end]
+[division_start jpeg]
+[item modules/jpeg/jpeg.man jpeg {JPEG querying and manipulation of meta data}]
+[division_end]
+[division_start json]
+[item modules/json/json.man json {JSON parser}]
+[item modules/json/json_write.man json::write {JSON generation}]
+[division_end]
+[division_start lambda]
+[item modules/lambda/lambda.man lambda {Utility commands for anonymous procedures}]
+[division_end]
+[division_start ldap]
+[item modules/ldap/ldap.man ldap {LDAP client}]
+[item modules/ldap/ldapx.man ldapx {LDAP extended object interface}]
+[division_end]
+[division_start log]
+[item modules/log/log.man log {Procedures to log messages of libraries and applications.}]
+[item modules/log/logger.man logger {System to control logging of events.}]
+[item modules/log/loggerAppender.man logger::appender {Collection of predefined appenders for logger}]
+[item modules/log/loggerUtils.man logger::utils {Utilities for logger}]
+[division_end]
+[division_start map]
+[item modules/map/map_geocode_nominatim.man map::geocode::nominatim {Resolving geographical names with a Nominatim service}]
+[item modules/map/map_slippy.man map::slippy {Common code for slippy based map packages}]
+[item modules/map/map_slippy_cache.man map::slippy::cache {Management of a tile cache in the local filesystem}]
+[item modules/map/map_slippy_fetcher.man map::slippy::fetcher {Accessing a server providing tiles for slippy-based maps}]
+[division_end]
+[division_start mapproj]
+[item modules/mapproj/mapproj.man mapproj {Map projection routines}]
+[division_end]
+[division_start markdown]
+[item modules/markdown/markdown.man markdown {Converts Markdown text to HTML}]
+[division_end]
+[division_start math]
+[item modules/math/math.man math {Tcl Math Library}]
+[item modules/math/bigfloat.man math::bigfloat {Arbitrary precision floating-point numbers}]
+[item modules/math/bignum.man math::bignum {Arbitrary precision integer numbers}]
+[item modules/math/calculus.man math::calculus {Integration and ordinary differential equations}]
+[item modules/math/romberg.man math::calculus::romberg {Romberg integration}]
+[item modules/math/symdiff.man math::calculus::symdiff {Symbolic differentiation for Tcl}]
+[item modules/math/combinatorics.man math::combinatorics {Combinatorial functions in the Tcl Math Library}]
+[item modules/math/qcomplex.man math::complexnumbers {Straightforward complex number package}]
+[item modules/math/constants.man math::constants {Mathematical and numerical constants}]
+[item modules/math/decimal.man math::decimal {General decimal arithmetic}]
+[item modules/math/exact.man math::exact {Exact Real Arithmetic}]
+[item modules/math/fourier.man math::fourier {Discrete and fast fourier transforms}]
+[item modules/math/fuzzy.man math::fuzzy {Fuzzy comparison of floating-point numbers}]
+[item modules/math/math_geometry.man math::geometry {Geometrical computations}]
+[item modules/math/interpolate.man math::interpolate {Interpolation routines}]
+[item modules/math/linalg.man math::linearalgebra {Linear Algebra}]
+[item modules/math/numtheory.man math::numtheory {Number Theory}]
+[item modules/math/optimize.man math::optimize {Optimisation routines}]
+[item modules/math/pca.man math::PCA {Package for Principal Component Analysis}]
+[item modules/math/polynomials.man math::polynomials {Polynomial functions}]
+[item modules/math/rational_funcs.man math::rationalfunctions {Polynomial functions}]
+[item modules/math/roman.man math::roman {Tools for creating and manipulating roman numerals}]
+[item modules/math/special.man math::special {Special mathematical functions}]
+[item modules/math/statistics.man math::statistics {Basic statistical functions and procedures}]
+[item modules/math/machineparameters.man tclrep/machineparameters {Compute double precision machine parameters.}]
+[division_end]
+[division_start md4]
+[item modules/md4/md4.man md4 {MD4 Message-Digest Algorithm}]
+[division_end]
+[division_start md5]
+[item modules/md5/md5.man md5 {MD5 Message-Digest Algorithm}]
+[division_end]
+[division_start md5crypt]
+[item modules/md5crypt/md5crypt.man md5crypt {MD5-based password encryption}]
+[division_end]
+[division_start mime]
+[item modules/mime/mime.man mime {Manipulation of MIME body parts}]
+[item modules/mime/smtp.man smtp {Client-side tcl implementation of the smtp protocol}]
+[division_end]
+[division_start multiplexer]
+[item modules/multiplexer/multiplexer.man multiplexer {One-to-many communication with sockets.}]
+[division_end]
+[division_start namespacex]
+[item modules/namespacex/namespacex.man namespacex {Namespace utility commands}]
+[division_end]
+[division_start ncgi]
+[item modules/ncgi/ncgi.man ncgi {Procedures to manipulate CGI values.}]
+[division_end]
+[division_start nettool]
+[item modules/nettool/nettool.man nettool {Tools for networked applications}]
+[division_end]
+[division_start nmea]
+[item modules/nmea/nmea.man nmea {Process NMEA data}]
+[division_end]
+[division_start nns]
+[item modules/nns/nns_client.man nameserv {Name service facility, Client}]
+[item modules/nns/nns_auto.man nameserv::auto {Name service facility, Client Extension}]
+[item modules/nns/nns_common.man nameserv::common {Name service facility, shared definitions}]
+[item modules/nns/nns_protocol.man nameserv::protocol {Name service facility, client/server protocol}]
+[item modules/nns/nns_server.man nameserv::server {Name service facility, Server}]
+[item modules/nns/nns_intro.man nns_intro {Name service facility, introduction}]
+[division_end]
+[division_start nntp]
+[item modules/nntp/nntp.man nntp {Tcl client for the NNTP protocol}]
+[division_end]
+[division_start ntp]
+[item modules/ntp/ntp_time.man ntp_time {Tcl Time Service Client}]
+[division_end]
+[division_start oauth]
+[item modules/oauth/oauth.man oauth {oauth API base signature}]
+[division_end]
+[division_start oometa]
+[item modules/oometa/oometa.man oometa {oo::meta A data registry for classess}]
+[division_end]
+[division_start ooutil]
+[item modules/ooutil/ooutil.man oo::util {Utility commands for TclOO}]
+[division_end]
+[division_start otp]
+[item modules/otp/otp.man otp {One-Time Passwords}]
+[division_end]
+[division_start page]
+[item modules/page/page_intro.man page_intro {page introduction}]
+[item modules/page/page_pluginmgr.man page_pluginmgr {page plugin manager}]
+[item modules/page/page_util_flow.man page_util_flow {page dataflow/treewalker utility}]
+[item modules/page/page_util_norm_lemon.man page_util_norm_lemon {page AST normalization, LEMON}]
+[item modules/page/page_util_norm_peg.man page_util_norm_peg {page AST normalization, PEG}]
+[item modules/page/page_util_peg.man page_util_peg {page PEG transformation utilities}]
+[item modules/page/page_util_quote.man page_util_quote {page character quoting utilities}]
+[division_end]
+[division_start pki]
+[item modules/pki/pki.man pki {Implementation of the public key cipher}]
+[division_end]
+[division_start pluginmgr]
+[item modules/pluginmgr/pluginmgr.man pluginmgr {Manage a plugin}]
+[division_end]
+[division_start png]
+[item modules/png/png.man png {PNG querying and manipulation of meta data}]
+[division_end]
+[division_start pop3]
+[item modules/pop3/pop3.man pop3 {Tcl client for POP3 email protocol}]
+[division_end]
+[division_start pop3d]
+[item modules/pop3d/pop3d.man pop3d {Tcl POP3 server implementation}]
+[item modules/pop3d/pop3d_dbox.man pop3d::dbox {Simple mailbox database for pop3d}]
+[item modules/pop3d/pop3d_udb.man pop3d::udb {Simple user database for pop3d}]
+[division_end]
+[division_start practcl]
+[item modules/practcl/practcl.man practcl {The Practcl Module}]
+[division_end]
+[division_start processman]
+[item modules/processman/processman.man processman {Tool for automating the period callback of commands}]
+[division_end]
+[division_start profiler]
+[item modules/profiler/profiler.man profiler {Tcl source code profiler}]
+[division_end]
+[division_start pt]
+[item modules/pt/pt_astree.man pt::ast {Abstract Syntax Tree Serialization}]
+[item modules/pt/pt_cparam_config_critcl.man pt::cparam::configuration::critcl {C/PARAM, Canned configuration, Critcl}]
+[item modules/pt/pt_cparam_config_tea.man pt::cparam::configuration::tea {C/PARAM, Canned configuration, TEA}]
+[item modules/pt/pt_json_language.man pt::json_language {The JSON Grammar Exchange Format}]
+[item modules/pt/pt_param.man pt::param {PackRat Machine Specification}]
+[item modules/pt/pt_pexpression.man pt::pe {Parsing Expression Serialization}]
+[item modules/pt/pt_pexpr_op.man pt::pe::op {Parsing Expression Utilities}]
+[item modules/pt/pt_pegrammar.man pt::peg {Parsing Expression Grammar Serialization}]
+[item modules/pt/pt_peg_container.man pt::peg::container {PEG Storage}]
+[item modules/pt/pt_peg_container_peg.man pt::peg::container::peg {PEG Storage. Canned PEG grammar specification}]
+[item modules/pt/pt_peg_export.man pt::peg::export {PEG Export}]
+[item modules/pt/pt_peg_export_container.man pt::peg::export::container {PEG Export Plugin. Write CONTAINER format}]
+[item modules/pt/pt_peg_export_json.man pt::peg::export::json {PEG Export Plugin. Write JSON format}]
+[item modules/pt/pt_peg_export_peg.man pt::peg::export::peg {PEG Export Plugin. Write PEG format}]
+[item modules/pt/pt_peg_from_container.man pt::peg::from::container {PEG Conversion. From CONTAINER format}]
+[item modules/pt/pt_peg_from_json.man pt::peg::from::json {PEG Conversion. Read JSON format}]
+[item modules/pt/pt_peg_from_peg.man pt::peg::from::peg {PEG Conversion. Read PEG format}]
+[item modules/pt/pt_peg_import.man pt::peg::import {PEG Import}]
+[item modules/pt/pt_peg_import_container.man pt::peg::import::container {PEG Import Plugin. From CONTAINER format}]
+[item modules/pt/pt_peg_import_json.man pt::peg::import::json {PEG Import Plugin. Read JSON format}]
+[item modules/pt/pt_peg_import_peg.man pt::peg::import::peg {PEG Import Plugin. Read PEG format}]
+[item modules/pt/pt_peg_interp.man pt::peg::interp {Interpreter for parsing expression grammars}]
+[item modules/pt/pt_peg_to_container.man pt::peg::to::container {PEG Conversion. Write CONTAINER format}]
+[item modules/pt/pt_peg_to_cparam.man pt::peg::to::cparam {PEG Conversion. Write CPARAM format}]
+[item modules/pt/pt_peg_to_json.man pt::peg::to::json {PEG Conversion. Write JSON format}]
+[item modules/pt/pt_peg_to_param.man pt::peg::to::param {PEG Conversion. Write PARAM format}]
+[item modules/pt/pt_peg_to_peg.man pt::peg::to::peg {PEG Conversion. Write PEG format}]
+[item modules/pt/pt_peg_to_tclparam.man pt::peg::to::tclparam {PEG Conversion. Write TCLPARAM format}]
+[item modules/pt/pt_peg_language.man pt::peg_language {PEG Language Tutorial}]
+[item modules/pt/pt_peg_introduction.man pt::pegrammar {Introduction to Parsing Expression Grammars}]
+[item modules/pt/pt_pgen.man pt::pgen {Parser Generator}]
+[item modules/pt/pt_rdengine.man pt::rde {Parsing Runtime Support, PARAM based}]
+[item modules/pt/pt_tclparam_config_nx.man pt::tclparam::configuration::nx {Tcl/PARAM, Canned configuration, NX}]
+[item modules/pt/pt_tclparam_config_snit.man pt::tclparam::configuration::snit {Tcl/PARAM, Canned configuration, Snit}]
+[item modules/pt/pt_tclparam_config_tcloo.man pt::tclparam::configuration::tcloo {Tcl/PARAM, Canned configuration, Tcloo}]
+[item modules/pt/pt_util.man pt::util {General utilities}]
+[item modules/pt/pt_to_api.man pt_export_api {Parser Tools Export API}]
+[item modules/pt/pt_from_api.man pt_import_api {Parser Tools Import API}]
+[item modules/pt/pt_introduction.man pt_introduction {Introduction to Parser Tools}]
+[item modules/pt/pt_parse_peg.man pt_parse_peg {Parser Tools PEG Parser}]
+[item modules/pt/pt_parser_api.man pt_parser_api {Parser API}]
+[item modules/pt/pt_peg_op.man pt_peg_op {Parser Tools PE Grammar Utility Operations}]
+[division_end]
+[division_start rc4]
+[item modules/rc4/rc4.man rc4 {Implementation of the RC4 stream cipher}]
+[division_end]
+[division_start rcs]
+[item modules/rcs/rcs.man rcs {RCS low level utilities}]
+[division_end]
+[division_start report]
+[item modules/report/report.man report {Create and manipulate report objects}]
+[division_end]
+[division_start rest]
+[item modules/rest/rest.man rest {define REST web APIs and call them inline or asychronously}]
+[division_end]
+[division_start ripemd]
+[item modules/ripemd/ripemd128.man ripemd128 {RIPEMD-128 Message-Digest Algorithm}]
+[item modules/ripemd/ripemd160.man ripemd160 {RIPEMD-160 Message-Digest Algorithm}]
+[division_end]
+[division_start sasl]
+[item modules/sasl/sasl.man SASL {Implementation of SASL mechanisms for Tcl}]
+[item modules/sasl/ntlm.man SASL::NTLM {Implementation of SASL NTLM mechanism for Tcl}]
+[item modules/sasl/scram.man SASL::SCRAM {Implementation of SASL SCRAM mechanism for Tcl}]
+[item modules/sasl/gtoken.man SASL::XGoogleToken {Implementation of SASL NTLM mechanism for Tcl}]
+[division_end]
+[division_start sha1]
+[item modules/sha1/sha1.man sha1 {SHA1 Message-Digest Algorithm}]
+[item modules/sha1/sha256.man sha256 {SHA256 Message-Digest Algorithm}]
+[division_end]
+[division_start simulation]
+[item modules/simulation/annealing.man simulation::annealing {Simulated annealing}]
+[item modules/simulation/montecarlo.man simulation::montecarlo {Monte Carlo simulations}]
+[item modules/simulation/simulation_random.man simulation::random {Pseudo-random number generators}]
+[division_end]
+[division_start smtpd]
+[item modules/smtpd/smtpd.man smtpd {Tcl SMTP server implementation}]
+[division_end]
+[division_start snit]
+[item modules/snit/snit.man snit {Snit's Not Incr Tcl}]
+[item modules/snit/snitfaq.man snitfaq {Snit Frequently Asked Questions}]
+[division_end]
+[division_start soundex]
+[item modules/soundex/soundex.man soundex Soundex]
+[division_end]
+[division_start stooop]
+[item modules/stooop/stooop.man stooop {Object oriented extension.}]
+[item modules/stooop/switched.man switched {switch/option management.}]
+[division_end]
+[division_start string]
+[item modules/string/token.man string::token {Regex based iterative lexing}]
+[item modules/string/token_shell.man string::token::shell {Parsing of shell command line}]
+[division_end]
+[division_start stringprep]
+[item modules/stringprep/stringprep.man stringprep {Implementation of stringprep}]
+[item modules/stringprep/stringprep_data.man stringprep::data {stringprep data tables, generated, internal}]
+[item modules/stringprep/unicode.man unicode {Implementation of Unicode normalization}]
+[item modules/stringprep/unicode_data.man unicode::data {unicode data tables, generated, internal}]
+[division_end]
+[division_start struct]
+[item modules/struct/disjointset.man struct::disjointset {Disjoint set data structure}]
+[item modules/struct/graph.man struct::graph {Create and manipulate directed graph objects}]
+[item modules/struct/graphops.man struct::graph::op {Operation for (un)directed graph objects}]
+[item modules/struct/graph1.man struct::graph_v1 {Create and manipulate directed graph objects}]
+[item modules/struct/struct_list.man struct::list {Procedures for manipulating lists}]
+[item modules/struct/matrix.man struct::matrix {Create and manipulate matrix objects}]
+[item modules/struct/matrix1.man struct::matrix_v1 {Create and manipulate matrix objects}]
+[item modules/struct/pool.man struct::pool {Create and manipulate pool objects (of discrete items)}]
+[item modules/struct/prioqueue.man struct::prioqueue {Create and manipulate prioqueue objects}]
+[item modules/struct/queue.man struct::queue {Create and manipulate queue objects}]
+[item modules/struct/record.man struct::record {Define and create records (similar to 'C' structures)}]
+[item modules/struct/struct_set.man struct::set {Procedures for manipulating sets}]
+[item modules/struct/skiplist.man struct::skiplist {Create and manipulate skiplists}]
+[item modules/struct/stack.man struct::stack {Create and manipulate stack objects}]
+[item modules/struct/struct_tree.man struct::tree {Create and manipulate tree objects}]
+[item modules/struct/struct_tree1.man struct::tree_v1 {Create and manipulate tree objects}]
+[division_end]
+[division_start tar]
+[item modules/tar/tar.man tar {Tar file creation, extraction & manipulation}]
+[division_end]
+[division_start tepam]
+[item modules/tepam/tepam_introduction.man tepam {An introduction into TEPAM, Tcl's Enhanced Procedure and Argument Manager}]
+[item modules/tepam/tepam_argument_dialogbox.man tepam::argument_dialogbox {TEPAM argument_dialogbox, reference manual}]
+[item modules/tepam/tepam_doc_gen.man tepam::doc_gen {TEPAM DOC Generation, reference manual}]
+[item modules/tepam/tepam_procedure.man tepam::procedure {TEPAM procedure, reference manual}]
+[division_end]
+[division_start term]
+[item modules/term/term.man term {General terminal control}]
+[item modules/term/ansi_code.man term::ansi::code {Helper for control sequences}]
+[item modules/term/ansi_cattr.man term::ansi::code::attr {ANSI attribute sequences}]
+[item modules/term/ansi_cctrl.man term::ansi::code::ctrl {ANSI control sequences}]
+[item modules/term/ansi_cmacros.man term::ansi::code::macros {Macro sequences}]
+[item modules/term/ansi_ctrlu.man term::ansi::ctrl::unix {Control operations and queries}]
+[item modules/term/ansi_send.man term::ansi::send {Output of ANSI control sequences to terminals}]
+[item modules/term/imenu.man term::interact::menu {Terminal widget, menu}]
+[item modules/term/ipager.man term::interact::pager {Terminal widget, paging}]
+[item modules/term/receive.man term::receive {General input from terminals}]
+[item modules/term/term_bind.man term::receive::bind {Keyboard dispatch from terminals}]
+[item modules/term/term_send.man term::send {General output to terminals}]
+[division_end]
+[division_start textutil]
+[item modules/textutil/textutil.man textutil {Procedures to manipulate texts and strings.}]
+[item modules/textutil/adjust.man textutil::adjust {Procedures to adjust, indent, and undent paragraphs}]
+[item modules/textutil/expander.man textutil::expander {Procedures to process templates and expand text.}]
+[item modules/textutil/repeat.man textutil::repeat {Procedures to repeat strings.}]
+[item modules/textutil/textutil_split.man textutil::split {Procedures to split texts}]
+[item modules/textutil/textutil_string.man textutil::string {Procedures to manipulate texts and strings.}]
+[item modules/textutil/tabify.man textutil::tabify {Procedures to (un)tabify strings}]
+[item modules/textutil/trim.man textutil::trim {Procedures to trim strings}]
+[division_end]
+[division_start tie]
+[item modules/tie/tie.man tie {Array persistence}]
+[item modules/tie/tie_std.man tie {Array persistence, standard data sources}]
+[division_end]
+[division_start tiff]
+[item modules/tiff/tiff.man tiff {TIFF reading, writing, and querying and manipulation of meta data}]
+[division_end]
+[division_start tool]
+[item modules/tool/meta.man oo::util {Utility commands for TclOO}]
+[item modules/tool/tool.man tool {TclOO Library (TOOL) Framework}]
+[item modules/tool/tool_dict_ensemble.man tool::dict_ensemble {Dictionary Tools}]
+[division_end]
+[division_start tool-ui]
+[item modules/tool-ui/tool-ui.man tool-ui {Abstractions to allow Tao to express Native Tk, HTML5, and Tao-Layout interfaces}]
+[division_end]
+[division_start transfer]
+[item modules/transfer/connect.man transfer::connect {Connection setup}]
+[item modules/transfer/copyops.man transfer::copy {Data transfer foundation}]
+[item modules/transfer/tqueue.man transfer::copy::queue {Queued transfers}]
+[item modules/transfer/ddest.man transfer::data::destination {Data destination}]
+[item modules/transfer/dsource.man transfer::data::source {Data source}]
+[item modules/transfer/receiver.man transfer::receiver {Data source}]
+[item modules/transfer/transmitter.man transfer::transmitter {Data source}]
+[division_end]
+[division_start treeql]
+[item modules/treeql/treeql.man treeql {Query tree objects}]
+[division_end]
+[division_start try]
+[item modules/try/tcllib_throw.man throw {throw - Throw an error exception with a message}]
+[item modules/try/tcllib_try.man try {try - Trap and process errors and exceptions}]
+[division_end]
+[division_start udpcluster]
+[item modules/udpcluster/udpcluster.man udpcluster {UDP Peer-to-Peer cluster}]
+[division_end]
+[division_start uev]
+[item modules/uev/uevent.man uevent {User events}]
+[item modules/uev/uevent_onidle.man uevent::onidle {Request merging and deferal to idle time}]
+[division_end]
+[division_start units]
+[item modules/units/units.man units {unit conversion}]
+[division_end]
+[division_start uri]
+[item modules/uri/uri.man uri {URI utilities}]
+[item modules/uri/urn-scheme.man uri_urn {URI utilities, URN scheme}]
+[division_end]
+[division_start uuid]
+[item modules/uuid/uuid.man uuid {UUID generation and comparison}]
+[division_end]
+[division_start valtype]
+[item modules/valtype/valtype_common.man valtype::common {Validation, common code}]
+[item modules/valtype/cc_amex.man valtype::creditcard::amex {Validation for AMEX creditcard number}]
+[item modules/valtype/cc_discover.man valtype::creditcard::discover {Validation for Discover creditcard number}]
+[item modules/valtype/cc_mastercard.man valtype::creditcard::mastercard {Validation for Mastercard creditcard number}]
+[item modules/valtype/cc_visa.man valtype::creditcard::visa {Validation for VISA creditcard number}]
+[item modules/valtype/ean13.man valtype::gs1::ean13 {Validation for EAN13}]
+[item modules/valtype/iban.man valtype::iban {Validation for IBAN}]
+[item modules/valtype/imei.man valtype::imei {Validation for IMEI}]
+[item modules/valtype/isbn.man valtype::isbn {Validation for ISBN}]
+[item modules/valtype/luhn.man valtype::luhn {Validation for plain number with a LUHN checkdigit}]
+[item modules/valtype/luhn5.man valtype::luhn5 {Validation for plain number with a LUHN5 checkdigit}]
+[item modules/valtype/usnpi.man valtype::usnpi {Validation for USNPI}]
+[item modules/valtype/verhoeff.man valtype::verhoeff {Validation for plain number with a VERHOEFF checkdigit}]
+[division_end]
+[division_start virtchannel_base]
+[item modules/virtchannel_base/cat.man tcl::chan::cat {Concatenation channel}]
+[item modules/virtchannel_base/facade.man tcl::chan::facade {Facade channel}]
+[item modules/virtchannel_base/tcllib_fifo.man tcl::chan::fifo {In-memory fifo channel}]
+[item modules/virtchannel_base/tcllib_fifo2.man tcl::chan::fifo2 {In-memory interconnected fifo channels}]
+[item modules/virtchannel_base/halfpipe.man tcl::chan::halfpipe {In-memory channel, half of a fifo2}]
+[item modules/virtchannel_base/tcllib_memchan.man tcl::chan::memchan {In-memory channel}]
+[item modules/virtchannel_base/tcllib_null.man tcl::chan::null {Null channel}]
+[item modules/virtchannel_base/nullzero.man tcl::chan::nullzero {Null/Zero channel combination}]
+[item modules/virtchannel_base/tcllib_random.man tcl::chan::random {Random channel}]
+[item modules/virtchannel_base/std.man tcl::chan::std {Standard I/O, unification of stdin and stdout}]
+[item modules/virtchannel_base/tcllib_string.man tcl::chan::string {Read-only in-memory channel}]
+[item modules/virtchannel_base/textwindow.man tcl::chan::textwindow {Textwindow channel}]
+[item modules/virtchannel_base/tcllib_variable.man tcl::chan::variable {In-memory channel using variable for storage}]
+[item modules/virtchannel_base/tcllib_zero.man tcl::chan::zero {Zero channel}]
+[item modules/virtchannel_base/randseed.man tcl::randomseed {Utilities for random channels}]
+[division_end]
+[division_start virtchannel_core]
+[item modules/virtchannel_core/core.man tcl::chan::core {Basic reflected/virtual channel support}]
+[item modules/virtchannel_core/events.man tcl::chan::events {Event support for reflected/virtual channels}]
+[item modules/virtchannel_core/transformcore.man tcl::transform::core {Basic reflected/virtual channel transform support}]
+[division_end]
+[division_start virtchannel_transform]
+[item modules/virtchannel_transform/adler32.man tcl::transform::adler32 {Adler32 transformation}]
+[item modules/virtchannel_transform/vt_base64.man tcl::transform::base64 {Base64 encoding transformation}]
+[item modules/virtchannel_transform/vt_counter.man tcl::transform::counter {Counter transformation}]
+[item modules/virtchannel_transform/vt_crc32.man tcl::transform::crc32 {Crc32 transformation}]
+[item modules/virtchannel_transform/hex.man tcl::transform::hex {Hexadecimal encoding transformation}]
+[item modules/virtchannel_transform/identity.man tcl::transform::identity {Identity transformation}]
+[item modules/virtchannel_transform/limitsize.man tcl::transform::limitsize {limiting input}]
+[item modules/virtchannel_transform/observe.man tcl::transform::observe {Observer transformation, stream copy}]
+[item modules/virtchannel_transform/vt_otp.man tcl::transform::otp {Encryption via one-time pad}]
+[item modules/virtchannel_transform/rot.man tcl::transform::rot rot-encryption]
+[item modules/virtchannel_transform/spacer.man tcl::transform::spacer {Space insertation and removal}]
+[item modules/virtchannel_transform/tcllib_zlib.man tcl::transform::zlib {zlib (de)compression}]
+[division_end]
+[division_start websocket]
+[item modules/websocket/websocket.man websocket {Tcl implementation of the websocket protocol}]
+[division_end]
+[division_start wip]
+[item modules/wip/wip.man wip {Word Interpreter}]
+[division_end]
+[division_start yaml]
+[item modules/yaml/huddle.man huddle {Create and manipulate huddle object}]
+[item modules/yaml/yaml.man yaml {YAML Format Encoder/Decoder}]
+[division_end]
+[division_start zip]
+[item modules/zip/decode.man zipfile::decode {Access to zip archives}]
+[item modules/zip/encode.man zipfile::encode {Generation of zip archives}]
+[item modules/zip/mkzip.man zipfile::mkzip {Build a zip archive}]
+[division_end]
+[division_end]
+[toc_end] \ No newline at end of file
diff --git a/tcllib/support/devel/sak/doc/topic.txt b/tcllib/support/devel/sak/doc/topic.txt
new file mode 100644
index 0000000..294c097
--- /dev/null
+++ b/tcllib/support/devel/sak/doc/topic.txt
@@ -0,0 +1 @@
+doc Generate documentation in various formats, and/or validate it.
diff --git a/tcllib/support/devel/sak/help/cmd.tcl b/tcllib/support/devel/sak/help/cmd.tcl
new file mode 100644
index 0000000..8fe5f8e
--- /dev/null
+++ b/tcllib/support/devel/sak/help/cmd.tcl
@@ -0,0 +1,25 @@
+# -*- tcl -*-
+# Implementation of 'help'.
+
+# Available variables
+# * argv - Cmdline arguments
+
+if {[llength $argv] > 2} {
+ puts stderr "Usage: $argv0 help ?topic?"
+ exit 1
+}
+
+package require sak::help
+
+if {[llength $argv] == 1} {
+ # Argument is a topic.
+ # Locate text for the topic.
+
+ sak::help::print [sak::help::on [lindex $argv 0]]
+ return
+}
+
+sak::help::print [sak::help::alltopics]
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/help/help.tcl b/tcllib/support/devel/sak/help/help.tcl
new file mode 100644
index 0000000..7e00f1e
--- /dev/null
+++ b/tcllib/support/devel/sak/help/help.tcl
@@ -0,0 +1,75 @@
+# -*- tcl -*-
+# (C) 2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+namespace eval ::sak::help {}
+
+# ###
+
+proc ::sak::help::print {text} {
+ global critcldefault
+ puts stdout [string map \
+ [list @@ $critcldefault] $text]
+ return
+}
+
+proc ::sak::help::on {topic} {
+ variable base
+
+ # Look for static text and dynamic, i.e. generated help.
+ # Static is prefered.
+
+ set ht [file join $base $topic help.txt]
+ if {[file exists $ht]} {
+ return [get_input $ht]
+ }
+
+ set ht [file join $base $topic help.tcl]
+ if {[file exists $ht]} {
+ source $ht
+ return [sak::help::on::$topic]
+ }
+
+ set help ""
+ append help \n
+ append help " The topic \"$topic\" is not known." \n
+ append help " The known topics are:" \n\n
+
+ append help [topics]
+
+ return $help
+}
+
+proc ::sak::help::alltopics {} {
+ # Locate the quick-help for all topics and combine it with a
+ # general header.
+
+ set help "\n"
+ append help " SAK - Swiss Army Knife\n\n"
+ append help " sak is a tool to ease the work"
+ append help " of developers and release managers. Try:\n\n"
+ append help [topics]
+
+ return $help
+}
+
+proc ::sak::help::topics {} {
+ variable base
+ set help ""
+ foreach f [lsort [glob -nocomplain -directory $base */topic.txt]] {
+ append help \tsak\ help\ [get_input $f]
+ }
+ return $help
+}
+
+# ###
+
+namespace eval ::sak::help {
+ variable base [file join $::distribution support devel sak]
+}
+
+##
+# ###
+
+package provide sak::help 1.0
diff --git a/tcllib/support/devel/sak/help/help.txt b/tcllib/support/devel/sak/help/help.txt
new file mode 100644
index 0000000..bca8f35
--- /dev/null
+++ b/tcllib/support/devel/sak/help/help.txt
@@ -0,0 +1,8 @@
+
+ help -- Print help message
+
+ sak help ?topic?
+
+ Print a help message about the specified topic. If no topic
+ was given then print a general help message about SAK itself,
+ and provide a list of the available topics.
diff --git a/tcllib/support/devel/sak/help/pkgIndex.tcl b/tcllib/support/devel/sak/help/pkgIndex.tcl
new file mode 100644
index 0000000..609a59a
--- /dev/null
+++ b/tcllib/support/devel/sak/help/pkgIndex.tcl
@@ -0,0 +1,4 @@
+if {![package vsatisfies [package provide Tcl] 8.2]} return
+package ifneeded sak::help 1.0 [list source [file join $dir help.tcl]]
+
+
diff --git a/tcllib/support/devel/sak/help/topic.txt b/tcllib/support/devel/sak/help/topic.txt
new file mode 100644
index 0000000..9d1eaca
--- /dev/null
+++ b/tcllib/support/devel/sak/help/topic.txt
@@ -0,0 +1 @@
+help How to use help.
diff --git a/tcllib/support/devel/sak/localdoc/cmd.tcl b/tcllib/support/devel/sak/localdoc/cmd.tcl
new file mode 100644
index 0000000..e32fce7
--- /dev/null
+++ b/tcllib/support/devel/sak/localdoc/cmd.tcl
@@ -0,0 +1,21 @@
+# -*- tcl -*-
+# Implementation of 'localdoc'.
+
+# Available variables
+# * argv - Cmdline arguments
+# * base - Location of sak.tcl = Top directory of Tcllib distribution
+# * cbase - Location of all files relevant to this command.
+# * sbase - Location of all files supporting the SAK.
+
+# ###
+
+package require sak::localdoc
+
+if {[llength $argv]} {
+ sak::localdoc::usage
+}
+
+sak::localdoc::run
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/localdoc/help.txt b/tcllib/support/devel/sak/localdoc/help.txt
new file mode 100644
index 0000000..256c8ec
--- /dev/null
+++ b/tcllib/support/devel/sak/localdoc/help.txt
@@ -0,0 +1,8 @@
+
+ localdoc -- Generate documentation for website and installer.
+
+ sak localdoc
+
+ Convert all documentation into html and nroff, for use by the
+ installer, and the website. For the latter the results of the
+ conversion are stored in the repository itself.
diff --git a/tcllib/support/devel/sak/localdoc/localdoc.tcl b/tcllib/support/devel/sak/localdoc/localdoc.tcl
new file mode 100644
index 0000000..1b30fc0
--- /dev/null
+++ b/tcllib/support/devel/sak/localdoc/localdoc.tcl
@@ -0,0 +1,129 @@
+# -*- tcl -*-
+# sak::doc - Documentation facilities
+
+package require sak::util
+package require sak::doc
+
+namespace eval ::sak::localdoc {}
+
+# ###
+# API commands
+
+## ### ### ### ######### ######### #########
+
+proc ::sak::localdoc::usage {} {
+ package require sak::help
+ puts stdout \n[sak::help::on localdoc]
+ exit 1
+}
+
+proc ::sak::localdoc::run {} {
+ getpackage cmdline cmdline/cmdline.tcl
+ getpackage fileutil fileutil/fileutil.tcl
+ getpackage textutil::repeat textutil/repeat.tcl
+ getpackage doctools doctools/doctools.tcl
+ getpackage doctools::toc doctools/doctoc.tcl
+ getpackage doctools::idx doctools/docidx.tcl
+ getpackage dtplite dtplite/dtplite.tcl
+
+ # Read installation information. Need the list of excluded
+ # modules to suppress them here in the doc generation as well.
+ global excluded modules apps guide
+ source support/installation/modules.tcl
+
+ lappend baseconfig -module tcllib
+ foreach e $excluded {
+ puts "Excluding $e ..."
+ lappend baseconfig -exclude */modules/$e/*
+ }
+
+ set nav ../../../../home
+
+ puts "Reindex the documentation..."
+ sak::doc::imake __dummy__ $excluded
+ sak::doc::index __dummy__ $excluded
+
+ puts "Removing old documentation..."
+ # but keep the main index around, manually created, edited, not to be touched
+ # TODO: catch errors and restore automatically
+ file rename embedded/index.html e_index.html
+
+ file delete -force embedded
+ file mkdir embedded/www
+
+ # Put the saved main page back into place, early.
+ file rename e_index.html embedded/index.html
+
+ file delete -force idoc
+ file mkdir idoc/man
+ file mkdir idoc/www
+
+ puts "Generating manpages (installation)..."
+ set config $baseconfig
+ lappend config -exclude {*/doctools/tests/*}
+ lappend config -exclude {*/support/*}
+ lappend config -ext n
+ lappend config -o idoc/man
+ lappend config nroff .
+
+ dtplite::do $config
+
+ # Note: Might be better to run them separately.
+ # Note @: Or we shuffle the results a bit more in the post processing stage.
+
+ set map {
+ .man .html
+ modules/ tcllib/files/modules/
+ apps/ tcllib/files/apps/
+ }
+
+ set toc [string map $map [fileutil::cat support/devel/sak/doc/toc.txt]]
+ set apps [string map $map [fileutil::cat support/devel/sak/doc/toc_apps.txt]]
+ set mods [string map $map [fileutil::cat support/devel/sak/doc/toc_mods.txt]]
+ set cats [string map $map [fileutil::cat support/devel/sak/doc/toc_cats.txt]]
+
+ puts "Generating HTML (installation)... Pass 1, draft..."
+ set config $baseconfig
+ lappend config -exclude {*/doctools/tests/*}
+ lappend config -exclude {*/support/*}
+ lappend config -toc $toc
+ lappend config -nav {Tcllib Home} $nav
+ lappend config -post+toc Categories $cats
+ lappend config -post+toc Modules $mods
+ lappend config -post+toc Applications $apps
+ lappend config -merge
+ lappend config -o idoc/www
+ lappend config html .
+
+ dtplite::do $config
+
+ puts "Generating HTML (installation)... Pass 2, resolving cross-references..."
+ dtplite::do $config
+
+ puts "Generating HTML (online)... Pass 1, draft..."
+ set config $baseconfig
+ lappend config -exclude {*/doctools/tests/*}
+ lappend config -exclude {*/support/*}
+ lappend config -toc $toc
+ lappend config -post+toc Categories $cats
+ lappend config -post+toc Modules $mods
+ lappend config -post+toc Applications $apps
+ lappend config -merge
+ lappend config -raw
+ lappend config -o embedded/www
+ lappend config -header support/fossil-nav-integration.html
+ lappend config html .
+
+ dtplite::do $config
+
+ puts "Generating HTML (online)... Pass 2, resolving cross-references..."
+ dtplite::do $config
+ return
+}
+
+# ### ### ### ######### ######### #########
+
+package provide sak::localdoc 1.0
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/localdoc/pkgIndex.tcl b/tcllib/support/devel/sak/localdoc/pkgIndex.tcl
new file mode 100644
index 0000000..560504b
--- /dev/null
+++ b/tcllib/support/devel/sak/localdoc/pkgIndex.tcl
@@ -0,0 +1,2 @@
+if {![package vsatisfies [package provide Tcl] 8.2]} return
+package ifneeded sak::localdoc 1.0 [list source [file join $dir localdoc.tcl]]
diff --git a/tcllib/support/devel/sak/localdoc/topic.txt b/tcllib/support/devel/sak/localdoc/topic.txt
new file mode 100644
index 0000000..4c1f934
--- /dev/null
+++ b/tcllib/support/devel/sak/localdoc/topic.txt
@@ -0,0 +1,2 @@
+localdoc Generate html & nroff documentation for display
+ from the website, and the installer.
diff --git a/tcllib/support/devel/sak/old/help.txt b/tcllib/support/devel/sak/old/help.txt
new file mode 100644
index 0000000..bc9ed95
--- /dev/null
+++ b/tcllib/support/devel/sak/old/help.txt
@@ -0,0 +1,102 @@
+ Commands available through the swiss army knife aka SAK:
+
+ help - This help
+
+ /Configuration
+ /===========================================================
+
+ version - Return the bundle's version number
+ major - Return the bundle's major version number
+ minor - Return the bundle's minor version number
+ name - Return the bundle's package name
+
+ /Development
+ /===========================================================
+
+ modules - Return list of modules.
+ contributors - Print a list of contributors to the bundle.
+ lmodules - See above, however one module per line
+ imodules - Return list of modules known to the installer.
+ critcl-modules - Return a list of modules with critcl enhancements.
+
+ packages - Return indexed packages in the bundle, plus versions,
+ one package per line. Extracted from the
+ package indices found in the modules.
+
+ provided - Return list and versions of provided packages
+ (in contrast to indexed).
+
+ critcl ?module? - Build a critcl module [default is @@].
+
+ bench ?opt? ?module..?
+ - Run benchmark scripts (*.bench).
+
+ Options: -throwerrors 0|1 Propagate errors if set.
+ -match pattern Exclude benchmarks not matching the
+ glob pattern.
+ -rmatch pattern S.a, but a regexp pattern.
+ -iters integer Max #iterations for all benchmarks.
+ -threads integer #Threads to use for threaded shells.
+ -o path File to write the results too.
+ -format text|csv|raw Format to use for the results.
+ -norm column Normalize results using the specified
+ column as reference.
+ -verbose Informational output during the run.
+ -debug Internal output during the run.
+
+ bench/show ?-o path? ?-format f? ?-norm col? file...
+
+ Reads the files, merges the data, then
+ writes the result back in the specified
+ format, to the specified file, possibly
+ normalizing to a column. Without a file
+ the result is written to stdout.
+
+ bench/edit ?-o path? ?-format f? file col newvalue
+
+ Reads the file, changes the interpreter
+ path in the column to a new value. For
+ merging of data from the same interpreter,
+ but possibly different versions of the
+ benchmarked package, like Tcllib.
+
+ bench/del ?-o path? ?-format f? file col...
+
+ Reads the file and removes the specified
+ columns. To delete unnecessary data in merged
+ results.
+
+ oldvalidate ?module..? - Check listed modules for problems.
+ For all modules if none specified.
+
+ oldvalidate_v ?module..? - Check listed modules for for version
+ problems. For all modules if none
+ specified.
+
+ test ?module...? - Run testsuite for listed modules.
+ For all modules if none specified.
+
+ docstrip/users - List modules using docstrip
+ docstrip/regen ?module...? - Regenerate the sources of all
+ or the listed modules from their
+ docstrip sources.
+
+ /Documentation
+ /===========================================================
+
+ desc ?module...? - Module/Package descriptions
+ desc/2 ?module...? - Module/Package descriptions, alternate format.
+
+ /Release engineering
+ /===========================================================
+
+ gendist - Generate distribution from CVS snapshot
+
+ rpmspec - Generate a RPM spec file for the bundle.
+ gentip55 - Generate a TIP55-style DESCRIPTION.txt file.
+ yml - Generate a YAML description file.
+
+ release name sf-user-id
+ - Marks the current state of all files as a new
+ release. This updates all ChangeLog's, and
+ regenerates the contents of PACKAGES
diff --git a/tcllib/support/devel/sak/old/topic.txt b/tcllib/support/devel/sak/old/topic.txt
new file mode 100644
index 0000000..4b94c29
--- /dev/null
+++ b/tcllib/support/devel/sak/old/topic.txt
@@ -0,0 +1 @@
+old Help for the existing command set.
diff --git a/tcllib/support/devel/sak/readme/cmd.tcl b/tcllib/support/devel/sak/readme/cmd.tcl
new file mode 100644
index 0000000..21315d2
--- /dev/null
+++ b/tcllib/support/devel/sak/readme/cmd.tcl
@@ -0,0 +1,38 @@
+# -*- tcl -*-
+# Implementation of 'readme'.
+
+# Available variables
+# * argv - Cmdline arguments
+# * base - Location of sak.tcl = Top directory of Tcllib distribution
+# * cbase - Location of all files relevant to this command.
+# * sbase - Location of all files supporting the SAK.
+
+package require sak::util
+package require sak::readme
+
+set raw 0
+set log 0
+set stem {}
+set tclv {}
+set format txt
+
+while {[llength $argv]} {
+ switch -exact -- [set o [lindex $argv 0]] {
+ -md {
+ set argv [lrange $argv 1 end]
+ set format md
+ }
+ default {
+ sak::readme::usage
+ }
+ }
+}
+
+if {[llength $argv]} {
+ sak::readme::usage
+}
+
+sak::readme::run $format
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/readme/help.txt b/tcllib/support/devel/sak/readme/help.txt
new file mode 100644
index 0000000..855a5ed
--- /dev/null
+++ b/tcllib/support/devel/sak/readme/help.txt
@@ -0,0 +1,14 @@
+
+ readme -- Generate a readme listing changes to modules and packages.
+
+ sak readme ?-md?
+
+ This command compares the current state of the modules and
+ packages and against information from the last release
+ (support/releases/PACKAGES) and generates a README.txt listing
+ the relevant changes (new modules/packages, package version
+ changes, unchanged packages).
+
+ The generated README is written to stdout.
+
+ This is a support command for the release manager.
diff --git a/tcllib/support/devel/sak/readme/pkgIndex.tcl b/tcllib/support/devel/sak/readme/pkgIndex.tcl
new file mode 100644
index 0000000..adbce09
--- /dev/null
+++ b/tcllib/support/devel/sak/readme/pkgIndex.tcl
@@ -0,0 +1,2 @@
+if {![package vsatisfies [package provide Tcl] 8.2]} return
+package ifneeded sak::readme 1.0 [list source [file join $dir readme.tcl]]
diff --git a/tcllib/support/devel/sak/readme/readme.tcl b/tcllib/support/devel/sak/readme/readme.tcl
new file mode 100644
index 0000000..0466aa8
--- /dev/null
+++ b/tcllib/support/devel/sak/readme/readme.tcl
@@ -0,0 +1,480 @@
+# -*- tcl -*-
+# (C) 2009 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require sak::color
+package require sak::review
+
+namespace eval ::sak::readme {
+ namespace import ::sak::color::*
+}
+
+# ###
+
+proc ::sak::readme::usage {} {
+ package require sak::help
+ puts stdout \n[sak::help::on readme]
+ exit 1
+}
+
+proc ::sak::readme::run {theformat} {
+ global package_name package_version
+
+ set pname [string totitle $package_name]
+
+ getpackage struct::set struct/sets.tcl
+ getpackage struct::matrix struct/matrix.tcl
+ getpackage textutil::adjust textutil/adjust.tcl
+
+ # Future: Consolidate with ... review ...
+ # Determine which packages are potentially changed, from the set
+ # of modules touched since the last release, as per the fossil
+ # repository's commit log.
+
+ foreach {trunk tuid} [sak::review::Leaf trunk] break ;# rid + uuid
+ foreach {release ruid} [sak::review::YoungestOfTag release] break ;# datetime+uuid
+
+ sak::review::AllParentsAfter $trunk $tuid $release $ruid -> rid uuid numparents {
+ if {$numparents < 2} {
+ sak::review::FileSet $rid -> path action {
+ lappend modifiedm [lindex [file split $path] 1]
+ }
+ }
+ }
+ set modifiedm [lsort -unique $modifiedm]
+
+ set issues {}
+
+ # package -> list(version)
+ set old_version [loadoldv [location_PACKAGES]]
+ array set releasep [loadpkglist [location_PACKAGES]]
+ array set currentp [ipackages]
+
+ array set changed {}
+ foreach p [array names currentp] {
+ foreach {vlist module} $currentp($p) break
+ set currentp($p) $vlist
+ set changed($p) [struct::set contains $modifiedm $module]
+ }
+
+ LoadNotes
+
+ # Containers for results
+ struct::matrix NEW ; NEW add columns 4 ; # module, package, version, notes
+ struct::matrix CHG ; CHG add columns 5 ; # module, package, old/new version, notes
+ struct::matrix ICH ; ICH add columns 5 ; # module, package, old/new version, notes
+ struct::matrix CNT ; CNT add columns 5 ; # overview, counters
+ struct::matrix LEG ; LEG add columns 3 ; # legend, fixed
+
+ LEG add row {Change Details Comments}
+ LEG add row {Major API {__incompatible__ API changes}}
+ LEG add row {Minor EF {Extended functionality, API}}
+ LEG add row {{} I {Major rewrite, but no API change}}
+ LEG add row {Patch B {Bug fixes}}
+ LEG add row {{} EX {New examples}}
+ LEG add row {{} P {Performance enhancement}}
+ LEG add row {None T {Testsuite changes}}
+ LEG add row {{} D {Documentation updates}}
+
+ set UCH {}
+
+ NEW add row {Module Package {New Version} Comments}
+ CHG add row [list Module Package "From $old_version" "To $package_version" Comments]
+ ICH add row [list Module Package "From $old_version" "To $package_version" Comments]
+
+ set newp {} ; set chgp {} ; set ichp {}
+ set newm {} ; set chgm {} ; set ichm {} ; set uchm {}
+ set nm 0
+ set np 0
+
+ # Process all packages in all modules ...
+ foreach m [lsort -dict [modules]] {
+ puts stderr ...$m
+ incr nm
+
+ foreach name [lsort -dict [Provided $m]] {
+ #puts stderr ......$p
+ incr np
+
+ # Define list of versions, if undefined so far.
+ if {![info exists currentp($name)]} {
+ set currentp($name) {}
+ }
+
+ # Detect and process new packages.
+
+ if {![info exists releasep($name)]} {
+ # New package.
+ foreach v $currentp($name) {
+ puts stderr .........NEW
+ NEW add row [list $m $name $v [Note $m $name]]
+ lappend newm $m
+ lappend newp $name
+ }
+ continue
+ }
+
+ # The package is not new, but possibly changed. And even
+ # if the version has not changed it may have been, this is
+ # indicated by changed(), which is based on the ChangeLog.
+
+ set vequal [struct::set equal $releasep($name) $currentp($name)]
+ set note [Note $m $name]
+
+ if {$vequal && ($note ne {})} {
+ if {$note eq "---"} {
+ # The note declares the package as unchanged.
+ puts stderr .........UNCHANGED/1
+ lappend uchm $m
+ lappend UCH $name
+ } else {
+ # Note for package without version changes => must be invisible
+ puts stderr .........INVISIBLE-CHANGE
+ Enter $m $name $note ICH
+ lappend ichm $m
+ lappend ichp $name
+ }
+ continue
+ }
+
+ if {!$changed($name) && $vequal} {
+ # Versions are unchanged, changelog also indicates no
+ # change. No particular attention here.
+
+ puts stderr .........UNCHANGED/2
+ lappend uchm $m
+ lappend UCH $name
+ continue
+ }
+
+ if {$changed($name) && !$vequal} {
+ # Both changelog and version number indicate a
+ # change. Small alert, have to classify the order of
+ # changes. But not if there is a note, this is assumed
+ # to be the classification.
+
+ if {$note eq {}} {
+ set note "\t=== Classify changes."
+ lappend issues [list $m $name "Classify changes"]
+ }
+ Enter $m $name $note
+
+ lappend chgm $m
+ lappend chgp $name
+ continue
+ }
+
+ # Changed according to ChangeLog, Version is not. ALERT.
+ # or: Versions changed, but according to changelog nothing
+ # in the code. ALERT.
+
+ # Suppress the alert if we have a note, and dispatch per
+ # the note's contents (some tags are special, instructions
+ # to us here).
+
+ if {($note eq {})} {
+ if {$changed($name)} {
+ # Changed according to ChangeLog, Version is not. ALERT.
+ set note "\t<<< MISMATCH. Version ==, ChangeLog ++"
+ } else {
+ set note "\t<<< MISMATCH. ChangeLog ==, Version ++"
+ }
+
+ lappend issues [list $m $name [string range $note 5 end]]
+ }
+
+ Enter $m $name $note
+ lappend chgm $m
+ lappend chgp $name
+ }
+ }
+
+ # .... process the matrices and others results, make them presentable ...
+
+ CNT add row {{} {} {} {} {}}
+
+ set newp [llength [lsort -uniq $newp]]
+ set newm [llength [lsort -uniq $newm]]
+ if {$newp} {
+ CNT add row [list $newp {new packages} in $newm modules]
+ }
+
+ set chgp [llength [lsort -uniq $chgp]]
+ set chgm [llength [lsort -uniq $chgm]]
+ if {$chgp} {
+ CNT add row [list $chgp {changed packages} in $chgm modules]
+ }
+
+ set ichp [llength [lsort -uniq $ichp]]
+ set ichm [llength [lsort -uniq $ichm]]
+ if {$ichp} {
+ CNT add row [list $ichp {internally changed packages} in $ichm modules]
+ }
+
+ set uchp [llength [lsort -uniq $UCH]]
+ set uchm [llength [lsort -uniq $uchm]]
+ if {$uchp} {
+ CNT add row [list $uchp {unchanged packages} in $uchm modules]
+ }
+
+ CNT add row [list $np {packages, total} in $nm {modules, total}]
+
+ Table CNT Overview {
+ CNT delete row 0 ; # strip title row
+ } {}
+
+ Table LEG Legend {
+ Sep LEG - 1
+ } {
+ }
+
+ Table NEW "New in $pname $package_version" {
+ Sep NEW - [Clean NEW 1 0]
+ } {
+ SepMD NEW {} [lrange [Clean NEW 1 0] 1 end-1]
+ }
+
+ Table CHG "Changes from $pname $old_version to $package_version" {
+ Sep CHG - [Clean CHG 1 0]
+ } {
+ SepMD CHG {} [lrange [Clean CHG 1 0] 1 end-1]
+ }
+
+ Table ICH "Invisible changes (documentation, testsuites)" {
+ Sep ICH - [Clean ICH 1 0]
+ } {
+ SepMD ICH {} [lrange [Clean ICH 1 0] 1 end-1]
+ }
+
+ if {[llength $UCH]} {
+ Header Unchanged
+ puts ""
+ puts [Indent " " [textutil::adjust::adjust \
+ [join [lsort -dict $UCH] {, }] -length 64]]
+ }
+
+ if {![llength $issues]} return
+
+ puts stderr [=red "Issues found ([llength $issues])"]
+ puts stderr " Please run \"./sak.tcl review\" to resolve,"
+ puts stderr " then run \"./sak.tcl readme\" again."
+ puts stderr Details:
+
+ struct::matrix ISS ; ISS add columns 3
+ foreach issue $issues {
+ foreach {m p w} $issue break
+ set m " $m"
+ ISS add row [list $m $p $w]
+ }
+
+ puts stderr [ISS format 2string]
+
+
+ puts stderr [=red "Issues found ([llength $issues])"]
+ puts stderr " Please run \"./sak.tcl review\" to resolve,"
+ puts stderr " then run \"./sak.tcl readme\" again."
+ return
+}
+
+proc ::sak::readme::Table {obj title {pretxt {}} {premd {}}} {
+ upvar 1 theformat theformat
+ if {[$obj rows] < 2} return
+ Header $title
+
+ puts ""
+ switch -exact -- $theformat {
+ txt {
+ uplevel 1 $pretxt
+ puts [Indent " " [Detrail [$obj format 2string]]]
+ }
+ md {
+ uplevel 1 $premd
+ # Header row, then separator, then the remainder.
+ puts |[join [$obj get row 0] |]|
+ puts |[join [lrepeat [$obj columns] ---] |]|
+ set n [$obj rows]
+ for {set i 1} {$i < $n} {incr i} {
+ puts |[join [$obj get row $i] |]|
+ }
+ }
+ default {
+ error "Bad format"
+ exit 1
+ }
+ }
+ puts ""
+ return
+}
+
+proc ::sak::readme::Header {s {sep =}} {
+ puts $s
+ puts [string repeat $sep [string length $s]]
+ return
+}
+
+proc ::sak::readme::Enter {m name note {mat CHG}} {
+ upvar 1 currentp currentp releasep releasep
+
+ # To handle multiple versions we match the found versions up by
+ # major version. We assume that we have only one version per major
+ # version. This allows us to detect changes within each major
+ # version, new major versions, etc.
+
+ array set om {} ; foreach v $releasep($name) {set om([lindex [split $v .] 0]) $v}
+ array set cm {} ; foreach v $currentp($name) {set cm([lindex [split $v .] 0]) $v}
+
+ set all [lsort -dict [struct::set union [array names om] [array names cm]]]
+
+ sakdebug {
+ puts @@@@@@@@@@@@@@@@
+ parray om
+ parray cm
+ puts all\ $all
+ puts @@@@@@@@@@@@@@@@
+ }
+
+ foreach v $all {
+ if {[info exists om($v)]} {set ov $om($v)} else {set ov ""}
+ if {[info exists cm($v)]} {set cv $cm($v)} else {set cv ""}
+ $mat add row [list $m $name $ov $cv $note]
+ }
+ return
+}
+
+proc ::sak::readme::Clean {m start col} {
+ set n [$m rows]
+ set marks [list $start]
+ set last {}
+ set lastm -1
+ set sq 0
+
+ for {set i $start} {$i < $n} {incr i} {
+ set str [$m get cell $col $i]
+
+ if {$str eq $last} {
+ set sq 1
+ $m set cell $col $i {}
+ if {$lastm >= 0} {
+ #puts stderr "@ $i / <$last> / <$str> / ++ $lastm"
+ lappend marks $lastm
+ set lastm -1
+ } else {
+ #puts stderr "@ $i / <$last> / <$str> /"
+ }
+ } else {
+ set last $str
+ set lastm $i
+ if {$sq} {
+ #puts stderr "@ $i / <$last> / <$str> / ++ $i /saved"
+ lappend marks $i
+ set sq 0
+ } else {
+ #puts stderr "@ $i / <$last> / <$str> / saved"
+ }
+ }
+ }
+ return [lsort -uniq -increasing -integer $marks]
+}
+
+proc ::sak::readme::Sep {m char marks} {
+ #puts stderr "$m = $marks"
+
+ set n [$m columns]
+ set sep {}
+ for {set i 0} {$i < $n} {incr i} {
+ lappend sep [string repeat $char [expr {2+[$m columnwidth $i]}]]
+ }
+
+ foreach k [linsert [lsort -decreasing -integer -uniq $marks] 0 end] {
+ $m insert row $k $sep
+ }
+ return
+}
+
+proc ::sak::readme::SepMD {m char marks} {
+ #puts stderr "$m = $marks"
+
+ set n [$m columns]
+ set sep [lreplace [lrepeat $n {}] end end $char]
+
+ foreach k [linsert [lsort -decreasing -integer -uniq $marks] 0 end] {
+ $m insert row $k $sep
+ }
+ return
+}
+
+proc ::sak::readme::Indent {pfx text} {
+ return ${pfx}[join [split $text \n] \n$pfx]
+}
+
+proc ::sak::readme::Detrail {text} {
+ set res {}
+ foreach line [split $text \n] {
+ lappend res [string trimright $line]
+ }
+ return [join $res \n]
+}
+
+proc ::sak::readme::Note {m p} {
+ # Look for a note, and present to caller, if any.
+ variable notes
+ #parray notes
+ set k [list $m $p]
+ #puts <$k>
+ if {[info exists notes($k)]} {
+ return [join $notes($k) { }]
+ }
+ return ""
+}
+
+proc ::sak::readme::Provided {m} {
+ set result {}
+ foreach {p ___} [ppackages $m] {
+ lappend result $p
+ }
+ return $result
+}
+
+proc ::sak::readme::LoadNotes {} {
+ global distribution
+ variable notes
+ array set notes {}
+
+ catch {
+ set f [file join $distribution .NOTE]
+ set f [open $f r]
+ while {![eof $f]} {
+ if {[gets $f line] < 0} continue
+ set line [string trim $line]
+ if {$line == {}} continue
+ foreach {k t} $line break
+ set notes($k) $t
+ }
+ close $f
+ } msg
+ return
+}
+
+proc ::sak::readme::loadoldv {fname} {
+ set f [open $fname r]
+ foreach line [split [read $f] \n] {
+ set line [string trim $line]
+ if {[string match @* $line]} {
+ foreach {__ __ v} $line break
+ close $f
+ return $v
+ }
+ }
+ close $f
+ return -code error {Version not found}
+}
+
+##
+# ###
+
+namespace eval ::sak::readme {
+ variable review {}
+}
+
+package provide sak::readme 1.0
diff --git a/tcllib/support/devel/sak/readme/topic.txt b/tcllib/support/devel/sak/readme/topic.txt
new file mode 100644
index 0000000..938361f
--- /dev/null
+++ b/tcllib/support/devel/sak/readme/topic.txt
@@ -0,0 +1,2 @@
+readme Generate a README listing the changes to modules and packages
+ since the last release.
diff --git a/tcllib/support/devel/sak/registry/pkgIndex.tcl b/tcllib/support/devel/sak/registry/pkgIndex.tcl
new file mode 100644
index 0000000..0e6116b
--- /dev/null
+++ b/tcllib/support/devel/sak/registry/pkgIndex.tcl
@@ -0,0 +1,2 @@
+if {![package vsatisfies [package provide Tcl] 8.3]} return
+package ifneeded pregistry 0.1 [list source [file join $dir registry.tcl]]
diff --git a/tcllib/support/devel/sak/registry/registry.man b/tcllib/support/devel/sak/registry/registry.man
new file mode 100644
index 0000000..d895164
--- /dev/null
+++ b/tcllib/support/devel/sak/registry/registry.man
@@ -0,0 +1,171 @@
+[comment {-*- tcl -*- doctools manpage}]
+[manpage_begin pregistry n 0.1]
+[copyright {2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>}]
+[moddesc {Registry like data store}]
+[titledesc {Registry like data store}]
+[require Tcl 8.3]
+[require pregistry [opt 0.1]]
+[description]
+[para]
+
+This package provides a class for the creation of registry-like data
+storage objects. The contents of each storage are organized in a tree,
+with each node managing a set of children and attributes, each
+possibly empty. Stores are not persistent by default, but can be made
+so through configuring them with a tie backend to talk to.
+
+
+[section {Class API}]
+
+The package exports a single command, the class command, enabling the
+creation of registry instances. Its API is:
+
+[list_begin definitions]
+
+[call [cmd ::pregistry] [arg object] [arg options]...]
+
+This command creates a new registry object with the name [arg object],
+initializes it, and returns the fully qualified name of the object
+command as its result.
+
+[para]
+
+The recognized options are explained in section [sectref OPTIONS].
+
+[list_end]
+
+[section {Object API}]
+
+The objects created by the class command provide the methods listed below:
+
+[list_begin definitions]
+[call [arg object] [method delete] [arg key] [opt [arg attr]]]
+
+If the optional [arg attr] argument is present, the specified
+attribute under [arg key] will be deleted from the object.
+
+If the optional [arg attr] is omitted, the specified [arg key] and any
+subkeys or attributes beneath it in the hierarchy will be deleted. If
+the key could not be deleted then an error is generated. If the key
+did not exist, the command has no effect.
+
+The command returns the empty string as its result.
+
+
+[call [arg object] [method mtime] [arg key] [opt [arg attr]]]
+
+If the optional [arg attr] argument is present, the time of the last
+modification of the specified attribute under [arg key] will be
+returned, in seconds since the epoch.
+
+If the optional [arg attr] is omitted, the time of the last
+modification of the specified [arg key] will be returned.
+
+If the key did not exist, the command will generate an error.
+
+
+[call [arg object] [method exists] [arg key] [opt [arg attr]]]
+
+If the optional [arg attr] argument is present, the method checks
+whether the specified attribute under [arg key] is present or not.
+
+If the optional [arg attr] is omitted, the method checks whether the
+specified [arg key] is present or not.
+
+In both cases the result returned is boolean value, [const True] if
+the checked entity exists, and [const False] otherwise.
+
+
+[call [arg object] [method get] [arg key] [arg attr]]
+
+Returns the data associated with the attribute [arg attr] under the
+[arg key]. If either the key or the attribute does not exist, then an
+error is generated.
+
+
+[call [arg object] [method get||default] [arg key] [arg attr] [arg default]]
+
+Like method [method get], except that the [arg default] is returned if
+either the key or the attribute does not exist, instead of generating
+an error.
+
+
+[call [arg object] [method keys] [arg key] [opt [arg pattern]]]
+
+If [arg pattern] isn't specified, the command returns a list of names
+of all the subkeys of [arg key]. If [arg pattern] is specified, only
+those names matching the pattern are returned. Matching is determined
+using the same rules as for [cmd {string match}]. If the specified
+[arg key] does not exist, then an error is generated.
+
+
+[call [arg object] [method set] [arg key] [opt "[arg attr] [arg value]"]]
+
+If [arg attr] isn't specified, creates the [arg key] if it doesn't
+already exist. If [arg attr] is specified, creates the [arg key]
+keyName and attribute [arg attr] if necessary.
+
+The contents of [arg attr] are set to [arg value]. The command returns
+the [arg value] as its result.
+
+
+[call [arg object] [method attrs] [arg key] [opt [arg pattern]]]
+
+If [arg pattern] isn't specified, returns a list of names of all the
+attributes of [arg key]. If [arg pattern] is specified, only those
+names matching the pattern are returned. Matching is determined using
+the same rules as for [cmd {string match}].
+
+
+
+[call [arg object] [method configure]]
+
+Returns a dictionary mapping the option of the object to their
+currently configured values.
+
+[call [arg object] [method configure] [arg option] [arg newvalue]...]
+
+This invokation sets the configured value of option [arg option] to
+[arg newvalue]. Nothing will be done if current and new value are
+identical. Returns the empty string.
+
+[call [arg object] [method configure] [arg option]]
+[call [arg object] [method cget] [arg option]]
+
+Returns the value configured for the specified option [arg option].
+
+[list_end]
+
+
+[section KEYS]
+
+All elements in the registry are identified by a unique key, which is
+a list of strings. This identifies the path from the root of the tree
+to the requested element. The root itself is identified by the empty
+list. Each child C of an element E have to have unique name, which
+will be the last element of the key identifying this child. The head
+of the key will be the key of E.
+
+
+[section OPTIONS]
+
+The registry object recognize a single option,
+
+[list_begin options]
+[opt_def -tie tiedefinition]
+
+See the documentation of command [cmd ::tie::tie], in the package
+[package tie]. The value of the option is a list of words equivalent
+to the arguments "[arg dstype] [arg dsname]..." of [cmd ::tie::tie].
+I.e. the identity of the tie backend to use, followed by the
+specification of the location to use, per the chosen backend.
+
+Example:
+[example {
+ set r [pregistry %AUTO% -tie [list file $path]]
+}]
+
+[list_end]
+
+[keywords registry {data store} tree]
+[manpage_end]
diff --git a/tcllib/support/devel/sak/registry/registry.tcl b/tcllib/support/devel/sak/registry/registry.tcl
new file mode 100644
index 0000000..2fc4639
--- /dev/null
+++ b/tcllib/support/devel/sak/registry/registry.tcl
@@ -0,0 +1,287 @@
+# -*- tcl -*-
+# (C) 2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require Tcl 8.3
+package require snit
+package require tie
+
+# ###
+
+snit::type pregistry {
+
+ # API
+ # delete key ?attribute?
+ # mtime key ?attribute?
+ # get key attribute
+ # keys key ?pattern?/*
+ # set key ?attribute value?
+ # attrs key ?pattern?
+
+ option -tie -default {} -configuremethod TIE ; # Persistence
+
+ constructor {args} {
+ $self configurelist $args
+ $self INIT
+ return
+ }
+
+ # ###
+
+ method delete {key args} {
+ #puts DEL|$key|
+
+ if {[llength $args] > 1} {return -code error "wrong\#args"}
+
+ if {[catch {NODE $key} n]} return
+ if {[llength $args]} {
+ # Delete attribute
+
+ set attr [lindex $args 0]
+ set pattern [list A $n $attr *]
+ set km [list N $n M]
+
+ array unset data $pattern
+ set data($km) [clock seconds]
+ } else {
+ # Delete key and children.
+ #puts N|$n|
+
+ if {![llength $key]} {
+ return -code error "cannot delete root"
+ }
+
+ # Children first
+ foreach c [array names data [list C $n *]] {
+ set c [lindex $c end]
+ #puts _|$c|
+ $self delete [linsert $key end $c]
+ }
+
+ # And now the node itself. Modify the parent as well,
+ # remove this node as a child.
+
+ set self [lindex $key end]
+ set pidx [list N $n P]
+ set npat [list N $n *]
+ set apat [list A $n * *]
+
+ set pid $data($pidx)
+ set cidx [list C $pid $self]
+ set midx [list N $pid M]
+
+ array unset data $apat
+ array unset data $npat
+ unset -nocomplain data($cidx)
+ set data($midx) [clock seconds]
+
+ unset -nocomplain ncache($key)
+ }
+ return
+ }
+
+ method mtime {key args} {
+ if {[llength $args] > 1} {return -code error "wrong\#args"}
+ set n [NODE $key]
+ if {[llength $args]} {
+ set attr [lindex $args 0]
+ set idx [list A $n $attr M]
+ if {![info exists data($idx)]} {
+ return -code error "Unknown attribute \"$attr\" in key \"$key\""
+ }
+ } else {
+ set idx [list N $n M]
+ }
+ return $data($idx)
+ }
+
+ method exists {key args} {
+ if {[llength $args] > 1} {
+ return -code error "wrong\#args"
+ } elseif {[catch {NODE $key} n]} {
+ return 0
+ } elseif {![llength $args]} {
+ return 1
+ }
+
+ set attr [lindex $args 0]
+ set idx [list A $n $attr V]
+ return [info exist data($idx)]
+ }
+
+ method get {key attr} {
+ set n [NODE $key]
+ set idx [list A $n $attr V]
+ if {![info exists data($idx)]} {
+ return -code error "Unknown attribute \"$attr\" in key \"$key\""
+ }
+ return $data($idx)
+ }
+
+ method get||default {key attr default} {
+ if {[catch {NODE $key} n]} {
+ return $default
+ }
+ set idx [list A $n $attr V]
+ if {![info exists data($idx)]} {
+ return $default
+ }
+ return $data($idx)
+ }
+
+ method keys {key {pattern *}} {
+ set n [NODE $key]
+ set pattern [list C $n $pattern]
+ set res {}
+ foreach c [array names data $pattern] {
+ lappend res [linsert $key end $c]
+ }
+ return $res
+ }
+
+ method attrs {key {pattern *}} {
+ set n [NODE $key]
+ set pattern [list A $n $pattern V]
+ set res {}
+ foreach c [array names data $pattern] {
+ lappend res [lindex $c end-1]
+ }
+ return $res
+ }
+
+ method lappend {key attr value} {
+ set list [$self get||default $key $attr {}]
+ lappend list $value
+ $self set $key $attr $list
+ return
+ }
+
+ method set {key args} {
+ set n [NODE $key 1]
+ if {![llength $args]} return
+ if {[llength $args] != 2} {return -code error "wrong\#args"}
+ foreach {attr value} $args break
+
+ # Ignore calls which do not change the contents of the
+ # database.
+
+ set aidx [list A $n $attr V]
+ if {
+ [info exists data($aidx)] &&
+ [string equal $data($aidx) $value]
+ } return ; # {}
+
+ #puts stderr "$n $attr | $key | ($value)"
+
+ set aids [list A $n $attr M]
+ set data($aidx) $value
+ set data($aids) [clock seconds]
+ return
+ }
+
+ # ### state
+
+ variable data -array {}
+
+ # Tree of keys. Each keys can have multiple attributes.
+ # Each key, and attribute, have a modification timestamp.
+
+ # Each node in the tree is identified by a numeric id. Children
+ # refer to their parents. Parent id + name refers to unique child.
+
+ # Array contents
+
+ # (I) -> number id counter
+ # (C id name) -> id parent id x name => child id
+ # (N id P) -> id node id => parent id, empty for root
+ # (N id M) -> timestamp node id => last modification
+ # (A id name V) -> string node id x attribute name => value
+ # (A id name M) -> timestamp s.a => last modification
+
+ # This structure is less memory/space intensive than the setup of
+ # 1registry. It is also more difficult to query as it is less
+ # tabular, less redundant.
+
+ # Another thing becoming more complex is the deletion of a
+ # subtree. It is now necessary to walk the the tree, instead of
+ # just deleting all keys in the array matching a certain
+ # pattern. That at least can be done at the C level (array unset).
+
+ # The conversion from key list to node is also linear in key
+ # length, and an operation done often. Better cache it. However
+ # only internally, or the space savingsare gone too as the space
+ # is then taken by the conversion cache. Hm. Still less than
+ # before, as each key is listed at most once. In 1registry it was
+ # repeated for each of its attributes as well. This would regain
+ # speed for searches, as the conversion cache now is a tabular
+ # representation of the tree, and easily globbed.
+
+ # ### configure -tie (persistence)
+
+ method TIE {option value} {
+ if {[string equal $options(-tie) $value]} return
+ tie::untie [myvar data]
+ # 8.5 - tie::tie [myvar data] {expand}$value
+ eval [linsert $value 0 tie::tie [myvar data]]
+ set options(-tie) $value
+ return
+ }
+
+ method INIT {} {
+ if {![info exists data(I)]} {
+ set anchor {C {} {}}
+ set rootp {N 0 P}
+ set roots {N 0 M}
+
+ set data(I) 0
+ set data($anchor) 0
+ set data($rootp) {}
+ set data($roots) [clock seconds]
+ }
+ return
+ }
+
+ variable ncache -array {}
+
+ proc NODE {key {create 0}} {
+ upvar 1 ncache ncache data data
+ if {[info exist ncache($key)]} {
+ # Cached, shortcut
+ return $ncache($key)
+ }
+ if {![llength $key]} {
+ # Root, shortcut
+ set id 0
+ } else {
+ # Recursively convert, possibly create
+ set parent [lrange $key 0 end-1]
+ set self [lindex $key end]
+ set pid [NODE $parent $create]
+ set idx [list C $pid $self]
+
+ if {[info exists data($idx)]} {
+ set id $data($idx)
+ } elseif {!$create} {
+ return -code error "Unknown key \"$key\""
+ } else {
+ set id [incr data(I)]
+ set idxp [list N $id P]
+ set idxm [list N $id M]
+
+ set data($idx) $id
+ set data($idxp) $pid
+ set data($idxm) [clock seconds]
+ }
+ }
+ set ncache($key) $id
+ return $id
+ }
+
+ # ###
+}
+
+##
+# ###
+
+package provide pregistry 0.1
diff --git a/tcllib/support/devel/sak/registry/registry.test b/tcllib/support/devel/sak/registry/registry.test
new file mode 100644
index 0000000..4dead0c
--- /dev/null
+++ b/tcllib/support/devel/sak/registry/registry.test
@@ -0,0 +1,450 @@
+# -*- tcl -*-
+# registry.test: tests for the registry structure.
+#
+# Copyright (c) 2006 by Andreas Kupries <a.kupries@westend.com>
+# All rights reserved.
+#
+# RCS: @(#) $Id: registry.test,v 1.1 2006/09/06 06:07:09 andreas_kupries Exp $
+
+# -------------------------------------------------------------------------
+
+source [file join \
+ [file dirname [file dirname [file join [pwd] [info script]]]] \
+ devtools testutilities.tcl]
+
+testsNeedTcl 8.3
+testsNeedTcltest 2.2
+
+support {
+ use snit/snit.tcl snit
+ use tie/tie.tcl tie
+}
+testing {
+ useLocal registry.tcl pregistry
+}
+
+# -------------------------------------------------------------------------
+
+proc dump/ {r {root {}} {rv {}}} {
+ if {$rv != {}} {upvar 1 $rv res} else {set res {}}
+ lappend res $root/
+ foreach a [$r attrs $root] {
+ lappend res [list $root/ :$a [$r get $root $a]]
+ }
+ foreach c [$r keys $root] {
+ dump/ $r $c res
+ }
+ return $res
+}
+
+proc dump {r root} {
+ lappend res $root/
+ foreach a [$r attrs $root] {
+ lappend res [list $root/ :$a [$r get $root $a]]
+ }
+ return $res
+}
+
+# -------------------------------------------------------------------------
+
+test registry-1.0 {base state} {
+ pregistry myreg
+ set res [dump/ myreg]
+ myreg destroy
+ set res
+} /
+
+# -------------------------------------------------------------------------
+# Attribute manipulation, root, in-tree, and leaf
+
+set n 0
+foreach {key prekey structure} {
+ {} {} /
+ {sub tree leaf} {} {/ sub/ {sub tree/} {sub tree leaf/}}
+ {sub tree} {sub tree leaf} {/ sub/ {sub tree/} {sub tree leaf/}}
+} {
+ test registry-2.$n {structure} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key
+ set res [dump/ myreg]
+ myreg destroy
+ set res
+ } $structure
+
+ test registry-3.1.$n {no attributes, node creation} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key
+ set res [dump myreg $key]
+ myreg destroy
+ set res
+ } [list $key/]
+
+ test registry-3.2.$n {bad node creation} {
+ pregistry myreg
+ catch {myreg set} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodset type selfns win self key args"}
+
+ test registry-3.3.$n {bad node creation} {
+ pregistry myreg
+ catch {myreg set a b c d} res
+ myreg destroy
+ set res
+ } {wrong#args}
+
+ test registry-3.4.$n {bad node creation} {
+ pregistry myreg
+ catch {myreg set a b} res
+ myreg destroy
+ set res
+ } {wrong#args}
+
+ test registry-4.1.$n {set attribute, ok} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [dump myreg $key]
+ myreg destroy
+ set res
+ } [list $key/ [list $key/ :foo bar]]
+
+ test registry-4.2.$n {set attribute, change} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg get $key foo]
+ myreg set $key foo bold
+ lappend res [myreg get $key foo]
+ myreg destroy
+ set res
+ } {bar bold}
+
+ test registry-5.1.$n {get attribute, ok} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg get $key foo]
+ myreg destroy
+ set res
+ } bar
+
+ test registry-5.2.$n {get attribute, missing attribute} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get $key alpha} res
+ myreg destroy
+ set res
+ } "Unknown attribute \"alpha\" in key \"$key\""
+
+ test registry-5.3.$n {get attribute, missing key} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get TEST x} res
+ myreg destroy
+ set res
+ } {Unknown key "TEST"}
+
+ test registry-5.4.$n {get attribute, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodget type selfns win self key attr"}
+
+ test registry-5.5.$n {get attribute, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get x} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodget type selfns win self key attr"}
+
+ test registry-5.6.$n {get attribute, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get x y z} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodget type selfns win self key attr"}
+
+ test registry-6.1.$n {get||default, ok} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg get||default $key foo DEF]
+ myreg destroy
+ set res
+ } bar
+
+ test registry-6.2.$n {get||default, missing attribute} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg get||default $key alpha DEF]
+ myreg destroy
+ set res
+ } DEF
+
+ test registry-6.3.$n {get||default, missing key} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg get||default TEST x DEF]
+ myreg destroy
+ set res
+ } DEF
+
+ test registry-6.4.$n {get||default, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get||default} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodget||default type selfns win self key attr default"}
+
+ test registry-6.5.$n {get||default, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get||default x} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodget||default type selfns win self key attr default"}
+
+ test registry-6.6.$n {get||default, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get||default x y} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodget||default type selfns win self key attr default"}
+
+ test registry-6.7.$n {get||default, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg get||default x y z a} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodget||default type selfns win self key attr default"}
+
+ test registry-7.1.$n {attribute matching, total} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ myreg set $key alpha omega
+ set res [lsort [myreg attrs $key]]
+ myreg destroy
+ set res
+ } {alpha foo}
+
+ test registry-7.2.$n {attribute matching, partial} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ myreg set $key alpha omega
+ set res [lsort [myreg attrs $key a*]]
+ myreg destroy
+ set res
+ } alpha
+
+ test registry-7.3.$n {attribute matching, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg attrs} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodattrs type selfns win self key ?pattern?"}
+
+ test registry-7.4.$n {attribute matching, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg attrs x y z} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodattrs type selfns win self key ?pattern?"}
+
+ test registry-8.1.$n {attribute existence, ok} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg exists $key foo]
+ myreg destroy
+ set res
+ } 1
+
+ test registry-8.2.$n {attribute existence, missing} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg exists $key alpha]
+ myreg destroy
+ set res
+ } 0
+
+ test registry-8.3.$n {attribute existence, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg exists} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodexists type selfns win self key args"}
+
+ test registry-8.4.$n {attribute existence, wrong#args} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ catch {myreg exists x y z} res
+ myreg destroy
+ set res
+ } {wrong#args}
+
+ test registry-9.1.$n {key existence, ok} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg exists $key]
+ myreg destroy
+ set res
+ } 1
+
+ test registry-9.2.$n {key existence, missing} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ set res [myreg exists alpha]
+ myreg destroy
+ set res
+ } 0
+
+ # key existence, wrong args, see attribute existence
+
+ test registry-10.1.$n {key matching, total} {
+ pregistry myreg
+ myreg set $key
+ myreg set [linsert $key end alpha]
+ myreg set [linsert $key end omega]
+ set res [lsort [myreg keys $key]]
+ myreg destroy
+ set res
+ } [list [linsert $key end alpha] [linsert $key end omega]]
+
+ test registry-10.2.$n {key matching, partial} {
+ pregistry myreg
+ myreg set $key
+ myreg set [linsert $key end alpha]
+ myreg set [linsert $key end omega]
+ set res [lsort [myreg keys $key a*]]
+ myreg destroy
+ set res
+ } [list [linsert $key end alpha]]
+
+ test registry-10.3.$n {key matching, wrong#args} {
+ pregistry myreg
+ myreg set $key
+ catch {myreg keys} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodkeys type selfns win self key ?pattern?"}
+
+ test registry-10.4.$n {key matching, wrong#args} {
+ pregistry myreg
+ myreg set $key
+ catch {myreg keys x y z} res
+ myreg destroy
+ set res
+ } {wrong # args: should be "::pregistry::Snit_methodkeys type selfns win self key ?pattern?"}
+
+ test registry-11.1.$n {attribute deletion, ok} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ myreg set $key alpha omega
+ myreg delete $key foo
+ set res [dump myreg $key]
+ myreg destroy
+ set res
+ } [list $key/ [list $key/ :alpha omega]]
+
+ test registry-11.2.$n {attribute deletion, missing} {
+ pregistry myreg
+ myreg set $prekey
+ myreg set $key foo bar
+ myreg set $key alpha omega
+ set code [catch {myreg delete $key fox} res]
+ myreg destroy
+ list $code $res
+ } {0 {}}
+
+ incr n
+}
+
+set n 0
+foreach {par key structure} {
+ {foo fox fool} {foo fox fool bar soom}
+ {{/ foo/ {foo fox/} {foo fox fool/} {foo fox fool bar/} {foo fox fool bar soom/} {{foo fox fool bar soom/} :foo bar}} {/ foo/ {foo fox/}}}
+
+ foo foo
+ {{/ foo/ {foo/ :foo bar}} /}
+} {
+ test registry-12.1.$n {deletion} {
+ set res {}
+ pregistry myreg
+ myreg set $par
+ myreg set $key foo bar
+ lappend res [dump/ myreg]
+ myreg delete $par
+ lappend res [dump/ myreg]
+ myreg destroy
+ set res
+ } $structure
+
+ test registry-12.2.$n {deletion of non-existing key} {
+ pregistry myreg
+ myreg set $par
+ catch {myreg delete FOO} res
+ myreg destroy
+ set res
+ } {}
+
+ incr n
+}
+
+test registry-13.1 {deletion of root} {
+ pregistry myreg
+ catch {myreg delete {}} res
+ myreg destroy
+ set res
+} {cannot delete root}
+
+test registry-13.2 {wrong#args} {
+ pregistry myreg
+ catch {myreg delete} res
+ myreg destroy
+ set res
+} {wrong # args: should be "::pregistry::Snit_methoddelete type selfns win self key args"}
+
+test registry-13.3 {wrong#args} {
+ pregistry myreg
+ catch {myreg delete a b c} res
+ myreg destroy
+ set res
+} {wrong#args}
+
+# -------------------------------------------------------------------------
+
+::tcltest::cleanupTests
diff --git a/tcllib/support/devel/sak/review/cmd.tcl b/tcllib/support/devel/sak/review/cmd.tcl
new file mode 100644
index 0000000..420b53f
--- /dev/null
+++ b/tcllib/support/devel/sak/review/cmd.tcl
@@ -0,0 +1,25 @@
+# -*- tcl -*-
+# Implementation of 'review'.
+
+# Available variables
+# * argv - Cmdline arguments
+# * base - Location of sak.tcl = Top directory of Tcllib distribution
+# * cbase - Location of all files relevant to this command.
+# * sbase - Location of all files supporting the SAK.
+
+package require sak::util
+package require sak::review
+
+set raw 0
+set log 0
+set stem {}
+set tclv {}
+
+if {[llength $argv]} {
+ sak::review::usage
+}
+
+sak::review::run
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/review/help.txt b/tcllib/support/devel/sak/review/help.txt
new file mode 100644
index 0000000..ff789a5
--- /dev/null
+++ b/tcllib/support/devel/sak/review/help.txt
@@ -0,0 +1,10 @@
+
+ review -- Interactively review changed modules and packages
+
+ sak review
+
+ This command scans the system for changes and then enters
+ a sub-shell where the caller can interactively review and
+ tag these changes.
+
+ This is a support command for the release manager.
diff --git a/tcllib/support/devel/sak/review/pkgIndex.tcl b/tcllib/support/devel/sak/review/pkgIndex.tcl
new file mode 100644
index 0000000..4fe595a
--- /dev/null
+++ b/tcllib/support/devel/sak/review/pkgIndex.tcl
@@ -0,0 +1,2 @@
+if {![package vsatisfies [package provide Tcl] 8.2]} return
+package ifneeded sak::review 1.0 [list source [file join $dir review.tcl]]
diff --git a/tcllib/support/devel/sak/review/review.tcl b/tcllib/support/devel/sak/review/review.tcl
new file mode 100644
index 0000000..93bb59e
--- /dev/null
+++ b/tcllib/support/devel/sak/review/review.tcl
@@ -0,0 +1,985 @@
+# -*- tcl -*-
+# # ## ### ##### ######## ############# #####################
+# (C) 2013 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require linenoise
+package require sak::color
+
+getpackage fileutil fileutil/fileutil.tcl
+getpackage doctools::changelog doctools/changelog.tcl
+getpackage struct::set struct/sets.tcl
+getpackage term::ansi::send term/ansi/send.tcl
+
+namespace eval ::sak::review {
+ namespace import ::sak::color::*
+}
+
+# ###
+
+proc ::sak::review::usage {} {
+ package require sak::help
+ puts stdout \n[sak::help::on review]
+ exit 1
+}
+
+proc ::sak::review::run {} {
+ Scan ; Review
+ return
+}
+
+# # ## ### ##### ######## ############# #####################
+## Phase I. Determine which modules require a review.
+## A derivative of the code in ::sak::readme.
+
+proc ::sak::review::Scan {} {
+ global distribution
+ variable review
+ variable rm
+
+ Banner "Scan for modules and packages to review..."
+
+ # Future: Consolidate with ... readme ...
+ # Determine which packages are potentially changed and therefore
+ # in need of review, from the set of modules touched since the
+ # last release, as per the fossil repository's commit log.
+
+ # list of modified modules.
+ set modifiedm {}
+
+ # database of commit messages per changed module.
+ # cm: module -> list(string)
+ array set cm {}
+
+ # pt: database of files per changed module.
+ # module -> list(path)
+
+ # rm: module -> list (revs); rev = uuid+desc+files (string)
+ array set rm {}
+
+ foreach {trunk tuid} [Leaf trunk] break ;# rid + uuid
+ foreach {release ruid} [YoungestOfTag release] break ;# datetime + uuid
+ AllParentsAfter $trunk $tuid $release $ruid -> rid uuid numparents {
+ Next ; Progress " $rid"
+
+ if {$numparents > 1} {
+ Progress " SKIP"
+ } else {
+ # Consider only commits with one parent, i.e. non-merges,
+ # as possible contributors to modules and packages.
+
+ set d [Description $rid]
+ Progress " D"
+
+ # Determine file set, split by modules, then generate a package of
+ # uuid, description and filtered files per modules touched.
+
+ array set fs {}
+
+ FileSet $rid -> path action {
+ Progress .
+
+ set px [file split $path]
+ set themodule [lindex $px 1]
+ lappend modifiedm $themodule
+ lappend cm($themodule) $d
+
+ # ignore files in modules/
+ if {[llength $px] < 3} continue
+
+ #puts $themodule||$rid||$action|$px|
+
+ lappend fs($themodule) [file join {*}[lrange $px 2 end]]
+ lappend pt($themodule) [file join {*}[lrange $px 2 end]]
+ }
+
+ foreach {m files} [array get fs] {
+ set str \[htts://core.tcl.tk/tcllib/info/$uuid\]\n$d\n\n[join [lsort -dict $files] \n]
+ lappend rm($m) $str
+ }
+ unset fs
+ }
+ }
+
+ Next
+
+ # cleanup module list, may have duplicates
+ set modifiedm [lsort -unique $modifiedm]
+
+ array set review {}
+
+ # package -> list(version)
+ set old_version [loadoldv [location_PACKAGES]]
+ array set releasep [loadpkglist [location_PACKAGES]]
+ array set currentp [ipackages]
+
+ array set changed {}
+ foreach p [array names currentp] {
+ foreach {vlist module} $currentp($p) break
+ set currentp($p) $vlist
+ set changed($p) [struct::set contains $modifiedm $module]
+ }
+
+ LoadNotes
+
+ set np 0
+ # Process all packages in all modules ...
+ foreach m [lsort -dict [modules]] {
+ Next ; Progress " $m"
+ foreach name [lsort -dict [Provided $m]] {
+ #Next ; Progress "... $m/$name"
+ # Define list of versions, if undefined so far.
+ if {![info exists currentp($name)]} {
+ set currentp($name) {}
+ }
+
+ # Detect new packages. Ignore them.
+
+ if {![info exists releasep($name)]} {
+ #Progress " /new"
+ continue
+ }
+
+ # The package is not new, but possibly changed. And even
+ # if the version has not changed it may have been, this is
+ # indicated by changed(), which is based on the ChangeLog.
+
+ set vequal [struct::set equal $releasep($name) $currentp($name)]
+ set note [Note $m $name]
+
+ # Detect packages whose versions are unchanged, and whose
+ # changelog also indicates no change. Ignore these too.
+
+ if {!$changed($name) && $vequal} {
+ #Progress " /not changed"
+ continue
+ }
+
+ # Now look for packages where both changelog and version
+ # number indicate a change. These we have to review.
+
+ if {$changed($name) && !$vequal} {
+ lappend review($m) [list $name classify $note]
+ #Progress " [=cya classify]"
+ incr np
+ continue
+ }
+
+ # What remains are packages which are changed according to
+ # their changelog, but their version disagrees. Or the
+ # reverse. These need a big review to see who is right.
+ # We may have to bump their version information, not just
+ # classify changes. Of course, in modules with multiple
+ # packages it is quite possible to be unchanged and the
+ # changelog refers to the siblings.
+
+ lappend review($m) [list $name mismatch $note]
+ #Progress " [=cya mismatch]"
+ incr np
+ }
+ }
+
+ Close
+
+ # Postprocessing phase, pull in all relevant commit messages of the module.
+
+ foreach m [array names review] {
+ # commit messages
+ if {[info exists cm($m)]} {
+ set entries [lsort -unique $cm($m)]
+ } else {
+ set entries {}
+ }
+ # and affected files
+ if {[info exists pt($m)]} {
+ lappend entries [join [lsort -dict [lsort -unique $pt($m)]] \n]
+ }
+
+ set review($m) [list $review($m) [join $entries \n\n]]
+ }
+
+ # review: module -> list (notes, desc+files)
+ set review() $np
+ return
+}
+
+# see also readme
+proc ::sak::review::Provided {m} {
+ set result {}
+ foreach {p ___} [ppackages $m] {
+ lappend result $p
+ }
+ return $result
+}
+
+# see also readme
+proc ::sak::review::loadoldv {fname} {
+ set f [open $fname r]
+ foreach line [split [read $f] \n] {
+ set line [string trim $line]
+ if {[string match @* $line]} {
+ foreach {__ __ v} $line break
+ close $f
+ return $v
+ }
+ }
+ close $f
+ return -code error {Version not found}
+}
+
+proc ::sak::review::Progress {text} {
+ puts -nonewline stdout $text
+ flush stdout
+ return
+}
+
+proc ::sak::review::Next {} {
+ # erase to end of line, then move back to start of line.
+ term::ansi::send::eeol
+ puts -nonewline stdout \r
+ flush stdout
+ return
+}
+
+proc ::sak::review::Close {} {
+ puts stdout ""
+ return
+}
+
+proc ::sak::review::Clear {} {
+ term::ansi::send::clear
+ return
+}
+
+proc ::sak::review::Banner {text} {
+ Clear
+ puts stdout "\n <<SAK Tcllib: $text>>\n"
+ return
+}
+
+proc ::sak::review::Note {m p} {
+ # Look for a note, and present to caller, if any.
+ variable notes
+ #parray notes
+ set k [list $m $p]
+ #puts <$k>
+ if {[info exists notes($k)]} {
+ return $notes($k)
+ }
+ return ""
+}
+
+proc ::sak::review::SaveNote {at t} {
+ global distribution
+ set f [open [file join $distribution .NOTE] a]
+ puts $f [list $at $t]
+ close $f
+ return
+}
+
+proc ::sak::review::LoadNotes {} {
+ global distribution
+ variable notes
+ array set notes {}
+
+ catch {
+ set f [file join $distribution .NOTE]
+ set f [open $f r]
+ while {![eof $f]} {
+ if {[gets $f line] < 0} continue
+ set line [string trim $line]
+ if {$line == {}} continue
+ foreach {k t} $line break
+ set notes($k) $t
+ }
+ close $f
+ }
+
+ return
+}
+
+proc ::sak::review::FileSet {rid _ pv av script} {
+ upvar 1 $pv thepath $av theaction
+
+ lappend map @rid@ $rid
+ foreach line [split [string trim [F [string map $map {
+ SELECT filename.name,
+ CASE WHEN nullif(mlink.pid,0) is null THEN 'added'
+ WHEN nullif(mlink.fid,0) is null THEN 'deleted'
+ ELSE 'edited'
+ END
+ FROM mlink, filename
+ WHERE mlink.mid = @rid@
+ AND mlink.fnid = filename.fnid
+ ORDER BY filename.name;
+ }]]] \n] {
+ foreach {thepath theaction} [split $line |] break
+ # ignore all changes not in modules
+ if {![string match modules* $thepath]} continue
+ uplevel 1 $script
+ }
+ return
+}
+
+proc ::sak::review::Description {rid} {
+ lappend map @rid@ $rid
+ string trim [F [string map $map {
+ SELECT coalesce(event.ecomment,event.comment)
+ FROM event
+ WHERE event.objid = @rid@
+ ;
+ }]]
+}
+
+proc ::sak::review::AllParentsAfter {rid ruid cut cutuid _ rv uv nv script} {
+ upvar 1 $rv therev $uv theuid $nv thenump
+
+ array set rev {}
+ set rev($rid) .
+ lappend front $rid
+
+ # Initial run, for the starting revision.
+ set thenump [llength [AllParents $rid]]
+ set therev $rid
+ set theuid $ruid
+ uplevel 1 $script
+
+ # Standard iterative incremental transitive-closure. We have a
+ # front of revisions whose parents we take, which become the new
+ # front to follow, until no parents are delivered anymore due to
+ # the cutoff condition (timestamp, only the revisions coming after
+ # are accepted).
+
+ while {1} {
+ set new {}
+ foreach cid $front {
+ foreach pid [Parents $cid $cut] {
+ foreach {pid uuid mtraw mtime} [split [string trim $pid |] |] break
+ if {$uuid eq $cutuid} continue
+
+ lappend new $pid $mtime $uuid
+ if {$mtraw <= $cut} {
+ puts "Overshot: $rid $mtime $uuid"
+ }
+ }
+ }
+ if {![llength $new]} break
+
+ # record new parents, and make them the new starting points
+ set front {}
+ foreach {pid mtime uuid} $new {
+ if {[info exists rev($pid)]} continue
+ set rev($pid) .
+ lappend front $pid
+
+ set thenump [llength [AllParents $pid]]
+ set therev $pid
+ set theuid $uuid
+ uplevel 1 $script
+ }
+ }
+}
+
+proc ::sak::review::Parents {rid cut} {
+ lappend map @rid@ $rid
+ lappend map @cutoff@ $cut
+ split [F [string map $map {
+ SELECT pid, blob.uuid, event.mtime, datetime(event.mtime)
+ FROM plink, blob, event
+ WHERE plink.cid = @rid@
+ AND plink.pid = blob.rid
+ AND plink.pid = event.objid
+ AND event.mtime > @cutoff@
+ ;
+ }]] \n
+}
+
+proc ::sak::review::AllParents {rid} {
+ lappend map @rid@ $rid
+ split [F [string map $map {
+ SELECT pid, blob.uuid, event.mtime, datetime(event.mtime)
+ FROM plink, blob, event
+ WHERE plink.cid = @rid@
+ AND plink.pid = blob.rid
+ AND plink.pid = event.objid
+ ;
+ }]] \n
+}
+
+proc ::sak::review::YoungestOfTag {tag} {
+ lappend map @tag@ $tag
+ puts stderr "last $tag = [F [string map $map {
+ SELECT datetime (event.mtime)
+ FROM tag, tagxref, event
+ WHERE tag.tagname = 'sym-' || '@tag@'
+ AND tagxref.tagid = tag.tagid
+ AND tagxref.tagtype > 0
+ AND tagxref.rid = event.objid
+ AND event.type = 'ci'
+ ORDER BY event.mtime DESC
+ LIMIT 1
+ ;
+ }]]"
+ split [F [string map $map {
+ SELECT event.mtime, blob.uuid
+ FROM tag, tagxref, event, blob
+ WHERE tag.tagname = 'sym-' || '@tag@'
+ AND tagxref.tagid = tag.tagid
+ AND tagxref.tagtype > 0
+ AND tagxref.rid = event.objid
+ AND event.type = 'ci'
+ AND blob.rid = event.objid
+ ORDER BY event.mtime DESC
+ LIMIT 1
+ ;
+ }]] |
+}
+
+proc ::sak::review::Leaf {branch} {
+ lappend map @branch@ $branch
+ split [F [string map $map {
+ SELECT blob.rid, blob.uuid
+ FROM leaf, blob, tag, tagxref
+ WHERE blob.rid = leaf.rid
+ AND tag.tagname = 'sym-' || '@branch@'
+ AND tagxref.tagid = tag.tagid
+ AND tagxref.tagtype > 0
+ AND tagxref.rid = leaf.rid
+ ;
+ }]] |
+}
+
+proc ::sak::review::F {script} {
+ #puts |$script|
+ set r [exec fossil sqlite3 << $script]
+ #puts ($r)
+ return $r
+}
+
+
+
+# # ## ### ##### ######## ############# #####################
+## Phase II. Interactively review the changes packages.
+
+# Namespace variables
+#
+# review : array, database of all modules, keyed by name
+# nm : number of modules
+# modules : list of module names, keys to --> review
+# current : index in -> modules, current module
+# np : number of packages in current module
+# packages : list of packages in current module
+# currentp : index in --> packages
+# im : 1+current | indices for display
+# ip : 1+currentp |
+# ir : 1+currentr |
+# end : array : module (name) --> index of last package
+# stop : repl exit flag
+# map : array : text -> module/package index
+# commands : proper commands
+# allcommands : commands + namesof(map)
+#
+
+proc ::sak::review::Review {} {
+ variable review ;# table of everything to review
+ variable rm ;# Alt structure, rev (desc, files) by module.
+ variable nm ;# number of modules
+ variable modules ;# list of module names, sorted
+ variable stop 0 ;# repl exit flag
+ variable end ;# last module/package index.
+ variable smode rev ;# standard display per revision.
+
+ variable navcommands
+ variable allcommands ;# list of all commands, sorted
+ variable commands ;# list of proper commands, sorted
+ variable map ;# map from package names to module/package indices.
+ variable prefix
+
+ Banner "Packages to review: $review()"
+ unset review()
+
+ set nm [array size review]
+ if {!$nm} return
+
+ set modules [lsort -dict [array names review]]
+
+ # Map package name --> module/package index.
+ set im 0
+ foreach m $modules {
+ foreach {packages clog} $review($m) break
+ set ip 0
+ foreach p $packages {
+ set end($im) $ip
+ set end($m) $ip
+ set end() [list $im $ip]
+ foreach {name what tags} $p break
+ lappend map(@$name) [list $im $ip]
+ lappend map(@$name/$m) [list $im $ip]
+ incr ip
+ }
+ incr im
+ }
+
+ # Drop amibigous mappings, and fill the list of commands.
+ foreach k [array names map] {
+ # Skip already dropped keys (extended forms).
+ if {![info exists map($k)]} continue
+ if {[llength $map($k)] < 2} {
+ set map($k) [lindex $map($k) 0]
+ # Drop extended form, not needed.
+ array unset map $k/*
+ } else {
+ unset map($k)
+ }
+ }
+
+ # Map module name --> module/package index
+ # If not preempted by package mapping.
+ set im -1
+ foreach m $modules {
+ incr im
+ if {[info exists map(@$m)]} continue
+ set map(@$m) [list $im 0]
+ }
+
+ # Map command prefix -> full command.
+
+ array set prefix {}
+ foreach c [info commands ::sak::review::C_*] {
+ set c [string range [namespace tail $c] 2 end]
+ lappend commands $c
+ lappend allcommands $c
+ set buf {}
+ foreach ch [split $c {}] {
+ append buf $ch
+ lappend prefix($buf) $c
+ }
+ }
+
+ foreach c [array names map] {
+ lappend allcommands $c
+ set buf {}
+ foreach ch [split $c {}] {
+ append buf $ch
+ lappend prefix($buf) $c
+ }
+ }
+
+ set commands [lsort -dict $commands]
+ set allcommands [lsort -dict $allcommands]
+ set navcommands [lsort -dict [array names map]]
+
+ # Enter the REPL
+ Goto {0 0} 1
+ linenoise::cmdloop \
+ -history 1 \
+ -exit ::sak::review::Exit \
+ -continued ::sak::review::Continued \
+ -prompt1 ::sak::review::Prompt \
+ -complete ::sak::review::Complete \
+ -dispatch ::sak::review::Dispatch
+ return
+}
+
+# # ## ### ##### ######## ############# #####################
+
+proc ::sak::review::RefreshDisplay {} {
+ variable m
+ variable im
+ variable ir
+ variable nm
+ variable nr
+ variable clog
+ variable rlog
+ variable what
+ variable smode
+
+ if {$smode eq "rev"} {
+ set text $rlog
+ } else {
+ set text $clog
+ }
+
+ if {$smode eq "rev"} {
+ Banner "($ir/$nr) \[$im/$nm\] [=cya [string totitle $what]] [=green $m]"
+ } else {
+ Banner "\[$im/$nm\] [=cya [string totitle $what]] [=green $m]"
+ }
+ puts "| [join [split $text \n] "\n| "]\n"
+ return
+}
+
+proc ::sak::review::Exit {} {
+ variable stop
+ return $stop
+}
+
+proc ::sak::review::Continued {buffer} {
+ return 0
+}
+
+proc ::sak::review::Prompt {} {
+ variable ip
+ variable np
+ variable name
+ variable tags
+ variable smode
+ variable im
+ variable ir
+ variable nm
+ variable nr
+ variable what
+ variable m
+
+ if {$smode eq "rev"} {
+ append p "($ir/$nr) "
+ }
+
+ append p "\[$im/$nm\] [=green $m] [=cya [string totitle $what]] "
+ append p "\[$ip/$np\] [=whi $name] ($tags): "
+ return $p
+}
+
+proc ::sak::review::Complete {line} {
+ variable allcommands
+ if {$line eq {}} {
+ return $allcommands
+ } elseif {[llength $line] == 1} {
+ set r {}
+ foreach c $allcommands {
+ if {![string match ${line}* $c]} continue
+ lappend r $c
+ }
+ return $r
+ } else {
+ return {}
+ }
+}
+
+proc ::sak::review::Dispatch {line} {
+ variable prefix
+ variable map
+
+ if {$line == ""} { set line next }
+
+ set cmd [lindex $line 0]
+
+ if {![info exists prefix($cmd)]} {
+ return -code error "Unknown command $cmd, use help or ? to list them"
+ } elseif {[llength $prefix($cmd)] > 1} {
+ return -code error "Ambigous prefix \"$cmd\", expected [join $prefix($cmd) {, }]"
+ }
+
+ # Map prefix to actual command
+ set line [lreplace $line 0 0 $prefix($cmd)]
+
+ # Run command.
+ if {[info exists map($cmd)]} {
+ Goto $map($cmd)
+ return
+ }
+ eval C_$line
+}
+
+proc ::sak::review::Goto {loc {skip 0}} {
+ variable review
+ variable rm
+ variable modules
+ variable packages
+ variable clog
+ variable rlog
+ variable rloga
+ variable current
+ variable currentp
+ variable currentr
+ variable nm
+ variable np
+ variable nr
+ variable at
+ variable tags
+ variable what
+ variable name
+
+ variable m
+ variable p
+ variable ip
+ variable im
+ variable ir
+
+ foreach {current currentp} $loc break
+ set currentr 0
+
+ puts "Goto ($current/$currentp)"
+
+ set m [lindex $modules $current]
+ foreach {packages clog} $review($m) break
+ if {[catch {
+ set nr [llength $rm($m)]
+ set rloga $rm($m)
+ set rlog [lindex $rloga $currentr]
+ }]} {
+ set nr 0
+ set currentr 0
+ set rloga {}
+ set rlog {}
+ }
+
+ set np [llength $packages]
+ set p [lindex $packages $currentp]
+
+ foreach {name what tags} $p break
+ set at [list $m $name]
+
+ set im [expr {1+$current}]
+ set ip [expr {1+$currentp}]
+ set ir [expr {1+$currentr}]
+
+ if {$skip && ([llength $tags] ||
+ ($tags == "---"))} {
+ C_next
+ } else {
+ RefreshDisplay
+ }
+ return
+}
+
+proc ::sak::review::C_* {} {
+ variable smode
+ variable currentr
+ if {$smode eq "all"} {
+ set smode rev
+ set currentr 0
+ } else {
+ set smode all
+ }
+ RefreshDisplay
+ return
+}
+proc ::sak::review::C_, {} {
+ # next revision
+ variable smode
+ variable rlog
+ variable rloga
+ variable currentr
+ if {$smode eq "all"} {
+ set smode rev
+ set currentr 0
+ } else {
+ variable nr
+ incr currentr
+ if {$currentr >= $nr} { set currentr 0 }
+ }
+ variable ir [expr {1+$currentr}]
+ set rlog [lindex $rloga $currentr]
+ RefreshDisplay
+ return
+}
+proc ::sak::review::C_' {} {
+ # previous revision
+ variable smode
+ variable rlog
+ variable rloga
+ variable nr
+ variable currentr
+ if {$smode eq "all"} {
+ set smode rev
+ set currentr $nr
+ }
+ incr currentr -1
+ if {$currentr <= 0} {
+ set currentr $nr
+ incr currentr -1
+ }
+ variable ir [expr {1+$currentr}]
+ set rlog [lindex $rloga $currentr]
+ RefreshDisplay
+ return
+}
+
+proc ::sak::review::C_exit {} { variable stop 1 }
+proc ::sak::review::C_quit {} { variable stop 1 }
+
+proc ::sak::review::C_? {} { C_help }
+proc ::sak::review::C_help {} {
+ variable commands
+ return [join $commands {, }]
+}
+
+proc ::sak::review::C_@? {} { C_@help }
+proc ::sak::review::C_@help {} {
+ variable navcommands
+ return [join $navcommands {, }]
+}
+
+proc ::sak::review::C_@start {} { Goto {0 0} }
+proc ::sak::review::C_@0 {} { Goto {0 0} }
+proc ::sak::review::C_@end {} { variable end ; Goto $end() }
+
+proc ::sak::review::C_>> {} { C_next 1 }
+proc ::sak::review::C_next {{skiprev 0}} {
+ variable tags
+ variable current
+ variable currentp
+ variable smode
+
+ if {!($skiprev) && ($smode eq "rev")} {
+ variable ir
+ variable nr
+ if {$ir < $nr} {
+ C_,
+ return
+ }
+ }
+
+ C_step 0
+
+ set stop @$current/$currentp
+ while {[llength $tags] ||
+ ($tags == "---")} {
+ C_step 0
+ if {"@$current/$currentp" == "$stop"} break
+ }
+
+ RefreshDisplay
+ return
+}
+
+proc ::sak::review::C_step {{refresh 1}} {
+ variable nm
+ variable np
+ variable current
+ variable currentp
+ variable packages
+
+ incr currentp
+ if {$currentp >= $np} {
+ # skip to next module, first package
+ incr current
+ if {$current >= $nm} {
+ # skip to first module
+ set current 0
+ }
+ set currentp 0
+
+ }
+ Goto [list $current $currentp]
+ return
+}
+
+proc ::sak::review::C_<< {} { C_prev 1 }
+proc ::sak::review::C_prev {{skiprev 0}} {
+ variable end
+ variable nm
+ variable np
+ variable current
+ variable currentp
+ variable packages
+ variable smode
+
+ if {!$skiprev && ($smode eq "rev")} {
+ variable ir
+ if {$ir > 1} {
+ C_'
+ return
+ }
+ }
+
+ incr currentp -1
+ if {$currentp < 0} {
+ # skip to previous module, last package
+ incr current -1
+ if {$current < 0} {
+ # skip to back to last module
+ set current [expr {$nm - 1}]
+ }
+ set currentp $end($current)
+ }
+ Goto [list $current $currentp]
+ return
+}
+
+# Commands to add/remove tags, clear set, replace set
+
+proc ::sak::review::C_feature {} { +T EF }
+proc ::sak::review::C_test {} { +T T }
+proc ::sak::review::C_doc {} { +T D }
+proc ::sak::review::C_bug {} { +T B }
+proc ::sak::review::C_perf {} { +T P }
+proc ::sak::review::C_example {} { +T EX }
+proc ::sak::review::C_api {} { +T API }
+proc ::sak::review::C_impl {} { +T I }
+
+proc ::sak::review::C_-feature {} { -T EF }
+proc ::sak::review::C_-test {} { -T T }
+proc ::sak::review::C_-doc {} { -T D }
+proc ::sak::review::C_-bug {} { -T B }
+proc ::sak::review::C_-perf {} { -T P }
+proc ::sak::review::C_-example {} { -T EX }
+proc ::sak::review::C_-api {} { -T API }
+proc ::sak::review::C_-impl {} { -T I }
+
+proc ::sak::review::C_--- {} { =T --- }
+proc ::sak::review::C_clear {} { =T --- }
+#proc ::sak::review::C_cn {} { C_clear ; C_next }
+
+proc ::sak::review::+T {tag} {
+ variable tags
+ if {[lsearch -exact $tags $tag] >= 0} {
+ RefreshDisplay
+ return
+ }
+ =T [linsert $tags end $tag]
+ return
+}
+
+proc ::sak::review::-T {tag} {
+ variable tags
+ set pos [lsearch -exact $tags $tag]
+ if {$pos < 0} {
+ RefreshDisplay
+ return
+ }
+ =T [lreplace $tags $pos $pos]
+ return
+}
+
+proc ::sak::review::=T {newtags} {
+ variable review
+ variable clog
+ variable packages
+ variable currentp
+ variable p
+ variable m
+ variable at
+ variable name
+ variable what
+ variable tags
+
+ if {([llength $newtags] > 1) &&
+ ([set pos [lsearch -exact $newtags ---]] >= 0)} {
+ # Drop --- if there are other tags.
+ set newtags [lreplace $newtags $pos $pos]
+ }
+
+ set tags [lsort -dict $newtags]
+ set p [list $name $what $newtags]
+ set packages [lreplace $packages $currentp $currentp $p]
+ set review($m) [list $packages $clog]
+
+ SaveNote $at $tags
+ RefreshDisplay
+ return
+}
+
+proc ::sak::review::?T {} {
+ variable tags
+ return $tags
+}
+
+##
+# ###
+
+namespace eval ::sak::review {}
+
+package provide sak::review 1.0
diff --git a/tcllib/support/devel/sak/review/topic.txt b/tcllib/support/devel/sak/review/topic.txt
new file mode 100644
index 0000000..d2f7446
--- /dev/null
+++ b/tcllib/support/devel/sak/review/topic.txt
@@ -0,0 +1 @@
+review Interactively review changes since the last release.
diff --git a/tcllib/support/devel/sak/test/cmd.tcl b/tcllib/support/devel/sak/test/cmd.tcl
new file mode 100644
index 0000000..5622a16
--- /dev/null
+++ b/tcllib/support/devel/sak/test/cmd.tcl
@@ -0,0 +1,28 @@
+# -*- tcl -*-
+# Implementation of 'doc'.
+
+# Available variables
+# * argv - Cmdline arguments
+# * base - Location of sak.tcl = Top directory of Tcllib distribution
+# * cbase - Location of all files relevant to this command.
+# * sbase - Location of all files supporting the SAK.
+
+package require sak::util
+package require sak::test
+
+if {![llength $argv]} {
+ sak::test::usage Command missing
+}
+
+set cmd [lindex $argv 0]
+set argv [lrange $argv 1 end]
+
+if {[catch {package require sak::test::$cmd} msg]} {
+ sak::test::usage Unknown command \"$cmd\" : \
+ \n $::errorInfo
+}
+
+sak::test::$cmd $argv
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/test/help.txt b/tcllib/support/devel/sak/test/help.txt
new file mode 100644
index 0000000..4d2762c
--- /dev/null
+++ b/tcllib/support/devel/sak/test/help.txt
@@ -0,0 +1,46 @@
+
+ test -- Execute testsuites
+
+ sak test run ?-s|--shell PATH? ?-l|--log STEM? ?-g|--valgrind? ?-v? ?MODULE ...?
+
+ Run the testsuites of the specified modules, using the shell
+ running SAK for the testsuites as well. If no modules are
+ specified the testsuites of all modules are run.
+
+ If --valgrind is specified the testsuites are run under the
+ valgrind memory checker. NOTE. This feature is not available
+ on the windows platform. Requests for it will be ignored.
+
+ If one or more --shell's are specified the testsuites are run
+ against them. If none are specified the shells registered with
+ 'shell add' (see below) are used instead. If none are
+ specified the shell executing the sak is used instead.
+
+ By default the output from a run is animated feedback of the
+ progress made. If -v is specified the actual log is returned
+ instead.
+
+ If a log STEM is specified the extended log normally activated
+ via -v is written to STEM.log while the user is provided with
+ the regular feedback during execution. In addition the
+ summaries from the feedback are written to STEM.summary as
+ well, and also sorted into STEM.failures, STEM.skipped, and
+ STEM.none. The -l switch overides -v.
+
+ sak test shells
+
+ Returns a list of the registered shells, one per line, used to
+ execute the testsuites.
+
+ sak test shell add PATH...
+
+ Adds the specified paths to the list of shells to use when
+ executing testsuites.
+
+ sak test shell delete PATH...
+
+ Removes the specified paths from the list of shells to use
+ when executing testsuites.
+
+ NOTE: The list of registered shells is a per-user configuration
+ setting and is saved in the file "$HOME/.Tcllib/Registry".
diff --git a/tcllib/support/devel/sak/test/pkgIndex.tcl b/tcllib/support/devel/sak/test/pkgIndex.tcl
new file mode 100644
index 0000000..9522c76
--- /dev/null
+++ b/tcllib/support/devel/sak/test/pkgIndex.tcl
@@ -0,0 +1,5 @@
+if {![package vsatisfies [package provide Tcl] 8.2]} return
+package ifneeded sak::test 1.0 [list source [file join $dir test.tcl]]
+package ifneeded sak::test::run 1.0 [list source [file join $dir run.tcl]]
+package ifneeded sak::test::shells 1.0 [list source [file join $dir shells.tcl]]
+package ifneeded sak::test::shell 1.0 [list source [file join $dir shell.tcl]]
diff --git a/tcllib/support/devel/sak/test/run.tcl b/tcllib/support/devel/sak/test/run.tcl
new file mode 100644
index 0000000..9e0942f
--- /dev/null
+++ b/tcllib/support/devel/sak/test/run.tcl
@@ -0,0 +1,880 @@
+# -*- tcl -*-
+# (C) 2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require sak::test::shell
+package require sak::registry
+package require sak::animate
+package require sak::color
+# TODO: Rework this package to use the sak::feedback package
+
+getpackage textutil::repeat textutil/repeat.tcl
+getpackage fileutil fileutil/fileutil.tcl
+getpackage struct::matrix struct/matrix.tcl
+
+namespace eval ::sak::test::run {
+ namespace import ::textutil::repeat::blank
+ namespace import ::sak::color::*
+}
+
+# ###
+
+proc ::sak::test::run {argv} {
+ variable run::valgrind
+ array set config {
+ valgrind 0 raw 0 shells {} stem {} log 0
+ }
+
+ while {[string match -* [set opt [lindex $argv 0]]]} {
+ switch -exact -- $opt {
+ -s - --shell {
+ set sh [lindex $argv 1]
+ if {![fileutil::test $sh efrx msg "Shell"]} {
+ sak::test::usage $msg
+ }
+ lappend config(shells) $sh
+ set argv [lrange $argv 2 end]
+ }
+ -g - --valgrind {
+ if {![llength $valgrind]} {
+ sak::test::usage valgrind not found in the PATH
+ }
+ incr config(valgrind)
+ set argv [lrange $argv 1 end]
+ }
+ -v {
+ set config(raw) 1
+ set argv [lrange $argv 1 end]
+ }
+ -l - --log {
+ set config(log) 1
+ set config(stem) [lindex $argv 1]
+ set argv [lrange $argv 2 end]
+ }
+ default {
+ sak::test::usage Unknown option "\"$opt\""
+ }
+ }
+ }
+
+ if {$config(log)} {set config(raw) 0}
+
+ if {![sak::util::checkModules argv]} return
+
+ run::Do config $argv
+ return
+}
+
+# ###
+
+proc ::sak::test::run::Do {cv modules} {
+ upvar 1 $cv config
+ variable valgrind
+ variable araw $config(raw)
+ variable alog $config(log)
+ # alog => !araw
+
+ set shells $config(shells)
+ if {![llength $shells]} {
+ catch {set shells [sak::test::shell::list]}
+ }
+ if {![llength $shells]} {
+ set shells [list [info nameofexecutable]]
+ }
+
+ if {$alog} {
+ variable logext [open $config(stem).log w]
+ variable logsum [open $config(stem).summary w]
+ variable logfai [open $config(stem).failures w]
+ variable logski [open $config(stem).skipped w]
+ variable lognon [open $config(stem).none w]
+ variable logerd [open $config(stem).errdetails w]
+ variable logfad [open $config(stem).faildetails w]
+ variable logtim [open $config(stem).timings w]
+ } else {
+ variable logext stdout
+ }
+
+ # Preprocessing of module names and shell versions to allows
+ # better formatting of the progress output, i.e. vertically
+ # aligned columns
+
+ if {!$araw} {
+ variable maxml 0
+ variable maxvl 0
+ sak::animate::init
+ foreach m $modules {
+ = "M $m"
+ set l [string length $m]
+ if {$l > $maxml} {set maxml $l}
+ }
+ foreach sh $shells {
+ = "SH $sh"
+ set v [exec $sh << {puts [info patchlevel]; exit}]
+ set l [string length $v]
+ if {$l > $maxvl} {set maxvl $l}
+ }
+ =| "Starting ..."
+ }
+
+ set total 0
+ set pass 0
+ set fail 0
+ set skip 0
+ set err 0
+
+ foreach sh $shells {
+ foreach m $modules {
+ set cmd [Command config $m $sh]
+ sak::animate::init
+ if {$alog || $araw} {
+ puts $logext ============================================================
+ flush $logext
+ }
+ if {[catch {Close [Process [open |$cmd r+]]} msg]} {
+ incr err
+ =| "~~ [mag]ERR ${msg}[rst]"
+ if {$alog || $araw} {
+ puts $logext [mag]$msg[rst]
+ flush $logext
+ }
+ }
+ #sak::animate::last Ok
+ }
+ }
+
+ puts $logext "Passed [format %6d $pass] of [format %6d $total]"
+ puts $logext "Skipped [format %6d $skip] of [format %6d $total]"
+
+ if {$fail} {
+ puts $logext "Failed [red][format %6d $fail][rst] of [format %6d $total]"
+ } else {
+ puts $logext "Failed [format %6d $fail] of [format %6d $total]"
+ }
+ if {$err} {
+ puts $logext "#Errors [mag][format %6d $err][rst]"
+ } else {
+ puts $logext "#Errors [format %6d $err]"
+ }
+
+ if {$alog} {
+ variable xtimes
+ array set times $xtimes
+
+ struct::matrix M
+ M add columns 6
+ foreach k [lsort -dict [array names times]] {
+ #foreach {shell module testfile} $k break
+ foreach {testnum delta score} $times($k) break
+ M add row [linsert $k end $testnum $delta $score]
+ }
+ M sort rows -decreasing 5
+
+ M insert row 0 {Shell Module Testsuite Tests Seconds uSec/Test}
+ M insert row 1 {===== ====== ========= ===== ======= =========}
+ M add row {===== ====== ========= ===== ======= =========}
+
+ puts $logsum \nTimings...
+ puts $logsum [M format 2string]
+ }
+
+ exit [expr {($err || $fail) ? 1 : 0}]
+ return
+}
+
+# ###
+
+if {$::tcl_platform(platform) == "windows"} {
+
+ proc ::sak::test::run::Command {cv m sh} {
+ variable valgrind
+ upvar 1 $cv config
+
+ # Windows. Construction of the pipe to run a specific
+ # testsuite against a single shell. There is no valgrind to
+ # accomodate, and neither can we expect to have unix commands
+ # like 'echo' and 'cat' available. 'echo' we can go without. A
+ # 'cat' however is needed to merge stdout and stderr of the
+ # testsuite for processing here. We use an emuluation written
+ # in Tcl.
+
+ set catfile cat[pid].tcl
+ fileutil::writeFile $catfile {
+ catch {wm withdraw .}
+ while {![eof stdin]} {puts stdout [gets stdin]}
+ exit
+ }
+
+ set cmd ""
+ lappend cmd $sh
+ lappend cmd [Driver] -modules [list $m]
+ lappend cmd |& $sh $catfile
+ #puts <<$cmd>>
+
+ return $cmd
+ }
+
+ proc ::sak::test::run::Close {pipe} {
+ close $pipe
+ file delete cat[pid].tcl
+ return
+ }
+} else {
+ proc ::sak::test::run::Command {cv m sh} {
+ variable valgrind
+ upvar 1 $cv config
+
+ # Unix. Construction of the pipe to run a specific testsuite
+ # against a single shell. The command is constructed to work
+ # when using valgrind, and works when not using it as well.
+
+ set script {}
+ lappend script [list set argv [list -modules [list $m]]]
+ lappend script {set argc 2}
+ lappend script [list source [Driver]]
+ lappend script exit
+
+ set cmd ""
+ lappend cmd echo [join $script \n]
+ lappend cmd |
+
+ if {$config(valgrind)} {
+ foreach e $valgrind {lappend cmd $e}
+ if {$config(valgrind) > 1} {
+ lappend cmd --num-callers=8
+ lappend cmd --leak-resolution=high
+ lappend cmd -v --leak-check=yes
+ lappend cmd --show-reachable=yes
+ }
+ }
+ lappend cmd $sh
+ #lappend cmd >@ stdout 2>@ stderr
+ lappend cmd |& cat
+ #puts <<$cmd>>
+
+ return $cmd
+ }
+
+ proc ::sak::test::run::Close {pipe} {
+ close $pipe
+ return
+ }
+}
+
+# ###
+
+proc ::sak::test::run::Process {pipe} {
+ variable araw
+ variable alog
+ variable logext
+ while {1} {
+ if {[eof $pipe]} break
+ if {[gets $pipe line] < 0} break
+ if {$alog || $araw} {puts $logext $line ; flush $logext}
+ set rline $line
+ set line [string trim $line]
+ if {[string equal $line ""]} continue
+ Host; Platform
+ Cwd; Shell
+ Tcl
+ Start; End ; StartFile ; EndFile
+ Module; Testsuite
+ NoTestsuite
+ Support;Testing;Other
+ Summary
+ CaptureFailureSync ; # xcollect 1 => 2
+ CaptureFailureCollectBody ; # xcollect 2 => 3 => 5
+ CaptureFailureCollectActual ; # xcollect 3 => 4
+ CaptureFailureCollectExpected ; # xcollect 4 => 0
+ CaptureFailureCollectError ; # xcollect 5 => 0
+ CaptureStackStart
+ CaptureStack
+
+ TestStart
+ TestSkipped
+ TestPassed
+ TestFailed ; # xcollect => 1
+
+ SetupError
+ Aborted
+ AbortCause
+
+ Match||Skip||Sourced
+ # Unknown lines are printed
+ if {!$araw} {puts !$line}
+ }
+ return $pipe
+}
+
+# ###
+
+proc ::sak::test::run::Driver {} {
+ variable base
+ return [file join $base all.tcl]
+}
+
+# ###
+
+proc ::sak::test::run::Host {} {
+ upvar 1 line line ; variable xhost
+ if {![regexp "^@@ Host (.*)$" $line -> xhost]} return
+ # += $xhost
+ set xhost [list Tests Results $xhost]
+ #sak::registry::local set $xhost
+ return -code continue
+}
+
+proc ::sak::test::run::Platform {} {
+ upvar 1 line line ; variable xplatform
+ if {![regexp "^@@ Platform (.*)$" $line -> xplatform]} return
+ # += ($xplatform)
+ variable xhost
+ #sak::registry::local set $xhost Platform $xplatform
+ return -code continue
+}
+
+proc ::sak::test::run::Cwd {} {
+ upvar 1 line line ; variable xcwd
+ if {![regexp "^@@ CWD (.*)$" $line -> xcwd]} return
+ variable xhost
+ set xcwd [linsert $xhost end $xcwd]
+ #sak::registry::local set $xcwd
+ return -code continue
+}
+
+proc ::sak::test::run::Shell {} {
+ upvar 1 line line ; variable xshell
+ if {![regexp "^@@ Shell (.*)$" $line -> xshell]} return
+ # += [file tail $xshell]
+ variable xcwd
+ set xshell [linsert $xcwd end $xshell]
+ #sak::registry::local set $xshell
+ return -code continue
+}
+
+proc ::sak::test::run::Tcl {} {
+ upvar 1 line line ; variable xtcl
+ if {![regexp "^@@ Tcl (.*)$" $line -> xtcl]} return
+ variable xshell
+ variable maxvl
+ += \[$xtcl\][blank [expr {$maxvl - [string length $xtcl]}]]
+ #sak::registry::local set $xshell Tcl $xtcl
+ return -code continue
+}
+
+proc ::sak::test::run::Match||Skip||Sourced {} {
+ upvar 1 line line
+ if {[string match "@@ Skip*" $line]} {return -code continue}
+ if {[string match "@@ Match*" $line]} {return -code continue}
+ if {[string match "Sourced * Test Files." $line]} {return -code continue}
+ if {[string match "Files with failing tests*" $line]} {return -code continue}
+ if {[string match "Number of tests skipped*" $line]} {return -code continue}
+ if {[string match "\[0-9\]*" $line]} {return -code continue}
+ return
+}
+
+proc ::sak::test::run::Start {} {
+ upvar 1 line line
+ if {![regexp "^@@ Start (.*)$" $line -> start]} return
+ variable xshell
+ #sak::registry::local set $xshell Start $start
+ return -code continue
+}
+
+proc ::sak::test::run::End {} {
+ upvar 1 line line
+ if {![regexp "^@@ End (.*)$" $line -> end]} return
+ variable xshell
+ #sak::registry::local set $xshell End $end
+ return -code continue
+}
+
+proc ::sak::test::run::StartFile {} {
+ upvar 1 line line
+ if {![regexp "^@@ StartFile (.*)$" $line -> start]} return
+ variable xstartfile $start
+ variable xtestnum 0
+ #sak::registry::local set $xshell Start $start
+ return -code continue
+}
+
+proc ::sak::test::run::EndFile {} {
+ upvar 1 line line
+ if {![regexp "^@@ EndFile (.*)$" $line -> end]} return
+ variable xfile
+ variable xstartfile
+ variable xtimes
+ variable xtestnum
+
+ set k [lreplace $xfile 0 3]
+ set k [lreplace $k 2 2 [file tail [lindex $k 2]]]
+ set delta [expr {$end - $xstartfile}]
+
+ if {$xtestnum == 0} {
+ set score $delta
+ } else {
+ # average number of microseconds per test.
+ set score [expr {int(($delta/double($xtestnum))*1000000)}]
+ #set score [expr {$delta/double($xtestnum)}]
+ }
+
+ lappend xtimes $k [list $xtestnum $delta $score]
+
+ variable alog
+ if {$alog} {
+ variable logtim
+ puts $logtim [linsert [linsert $k end $xtestnum $delta $score] 0 TIME]
+ }
+
+ #sak::registry::local set $xshell End $end
+ return -code continue
+}
+
+proc ::sak::test::run::Module {} {
+ upvar 1 line line ; variable xmodule
+ if {![regexp "^@@ Module (.*)$" $line -> xmodule]} return
+ variable xshell
+ variable xstatus ok
+ variable maxml
+ += ${xmodule}[blank [expr {$maxml - [string length $xmodule]}]]
+ set xmodule [linsert $xshell end $xmodule]
+ #sak::registry::local set $xmodule
+ return -code continue
+}
+
+proc ::sak::test::run::Testsuite {} {
+ upvar 1 line line ; variable xfile
+ if {![regexp "^@@ Testsuite (.*)$" $line -> xfile]} return
+ = <[file tail $xfile]>
+ variable xmodule
+ set xfile [linsert $xmodule end $xfile]
+ #sak::registry::local set $xfile Aborted 0
+ return -code continue
+}
+
+proc ::sak::test::run::NoTestsuite {} {
+ upvar 1 line line
+ if {![string match "Error: No test files remain after*" $line]} return
+ variable xstatus none
+ = {No tests}
+ return -code continue
+}
+
+proc ::sak::test::run::Support {} {
+ upvar 1 line line
+ if {![regexp "^- (.*)$" $line -> package]} return
+ #= "S $package"
+ foreach {pn pv} $package break
+ variable xfile
+ #sak::registry::local set [linsert $xfile end Support] $pn $pv
+ return -code continue
+}
+
+proc ::sak::test::run::Testing {} {
+ upvar 1 line line
+ if {![regexp "^\\* (.*)$" $line -> package]} return
+ #= "T $package"
+ foreach {pn pv} $package break
+ variable xfile
+ #sak::registry::local set [linsert $xfile end Testing] $pn $pv
+ return -code continue
+}
+
+proc ::sak::test::run::Other {} {
+ upvar 1 line line
+ if {![string match ">*" $line]} return
+ return -code continue
+}
+
+proc ::sak::test::run::Summary {} {
+ upvar 1 line line
+ if {![regexp "^all\\.tcl:(.*)$" $line -> line]} return
+ variable xmodule
+ variable xstatus
+ variable xvstatus
+ foreach {_ t _ p _ s _ f} [split [string trim $line]] break
+ #sak::registry::local set $xmodule Total $t ; set t [format %5d $t]
+ #sak::registry::local set $xmodule Passed $p ; set p [format %5d $p]
+ #sak::registry::local set $xmodule Skipped $s ; set s [format %5d $s]
+ #sak::registry::local set $xmodule Failed $f ; set f [format %5d $f]
+
+ upvar 2 total _total ; incr _total $t
+ upvar 2 pass _pass ; incr _pass $p
+ upvar 2 skip _skip ; incr _skip $s
+ upvar 2 fail _fail ; incr _fail $f
+ upvar 2 err _err
+
+ set t [format %5d $t]
+ set p [format %5d $p]
+ set s [format %5d $s]
+ set f [format %5d $f]
+
+ if {$xstatus == "ok" && $t == 0} {
+ set xstatus none
+ }
+
+ set st $xvstatus($xstatus)
+
+ if {$xstatus == "ok"} {
+ # Quick return for ok suite.
+ =| "~~ $st T $t P $p S $s F $f"
+ return -code continue
+ }
+
+ # Clean out progress display using a non-highlighted
+ # string. Prevents the char couint from being off. This is
+ # followed by construction and display of the highlighted version.
+
+ = " $st T $t P $p S $s F $f"
+ switch -exact -- $xstatus {
+ none {=| "~~ [yel]$st T $t[rst] P $p S $s F $f"}
+ aborted {=| "~~ [whi]$st[rst] T $t P $p S $s F $f"}
+ error {
+ =| "~~ [mag]$st[rst] T $t P $p S $s F $f"
+ incr _err
+ }
+ fail {=| "~~ [red]$st[rst] T $t P $p S $s [red]F $f[rst]"}
+ }
+ return -code continue
+}
+
+proc ::sak::test::run::TestStart {} {
+ upvar 1 line line
+ if {![string match {---- * start} $line]} return
+ set testname [string range $line 5 end-6]
+ = "---- $testname"
+ variable xfile
+ variable xtest [linsert $xfile end $testname]
+ variable xtestnum
+ incr xtestnum
+ return -code continue
+}
+
+proc ::sak::test::run::TestSkipped {} {
+ upvar 1 line line
+ if {![string match {++++ * SKIPPED:*} $line]} return
+ regexp {^[^ ]* (.*)SKIPPED:.*$} $line -> testname
+ set testname [string trim $testname]
+ variable xtest
+ = "SKIP $testname"
+ if {$xtest == {}} {
+ variable xfile
+ set xtest [linsert $xfile end $testname]
+ }
+ #sak::registry::local set $xtest Status Skip
+ set xtest {}
+ return -code continue
+}
+
+proc ::sak::test::run::TestPassed {} {
+ upvar 1 line line
+ if {![string match {++++ * PASSED} $line]} return
+ set testname [string range $line 5 end-7]
+ variable xtest
+ = "PASS $testname"
+ if {$xtest == {}} {
+ variable xfile
+ set xtest [linsert $xfile end $testname]
+ }
+ #sak::registry::local set $xtest Status Pass
+ set xtest {}
+ return -code continue
+}
+
+proc ::sak::test::run::TestFailed {} {
+ upvar 1 line line
+ if {![string match {==== * FAILED} $line]} return
+ set testname [lindex [split [string range $line 5 end-7]] 0]
+ = "FAIL $testname"
+ variable xtest
+ if {$xtest == {}} {
+ variable xfile
+ set xtest [linsert $xfile end $testname]
+ }
+ #sak::registry::local set $xtest Status Fail
+ ## CAPTURE INIT
+ variable xcollect 1
+ variable xbody ""
+ variable xactual ""
+ variable xexpected ""
+ variable xstatus fail
+ # Ignore failed status if we already have it, or an error
+ # status. The latter is more important to show. We do override
+ # status 'aborted'.
+ if {$xstatus == "ok"} {set xstatus fail}
+ if {$xstatus == "aborted"} {set xstatus fail}
+ return -code continue
+}
+
+proc ::sak::test::run::CaptureFailureSync {} {
+ variable xcollect
+ if {$xcollect != 1} return
+ upvar 1 line line
+ if {![string match {==== Contents*} $line]} return
+ set xcollect 2
+ return -code continue
+}
+
+proc ::sak::test::run::CaptureFailureCollectBody {} {
+ variable xcollect
+ if {$xcollect != 2} return
+ upvar 1 rline line
+ variable xbody
+ if {[string match {---- Result was*} $line]} {
+ set xcollect 3
+ return -code continue
+ } elseif {[string match {---- Test generated error*} $line]} {
+ set xcollect 5
+ return -code continue
+ }
+
+ variable xbody
+ append xbody $line \n
+ return -code continue
+}
+
+proc ::sak::test::run::CaptureFailureCollectActual {} {
+ variable xcollect
+ if {$xcollect != 3} return
+ upvar 1 rline line
+ if {![string match {---- Result should*} $line]} {
+ variable xactual
+ append xactual $line \n
+ } else {
+ set xcollect 4
+ }
+ return -code continue
+}
+
+proc ::sak::test::run::CaptureFailureCollectExpected {} {
+ variable xcollect
+ if {$xcollect != 4} return
+ upvar 1 rline line
+ if {![string match {==== *} $line]} {
+ variable xexpected
+ append xexpected $line \n
+ } else {
+ variable alog
+ if {$alog} {
+ variable logfad
+ variable xtest
+ variable xbody
+ variable xactual
+ variable xexpected
+
+ puts $logfad "==== [lrange $xtest end-1 end] FAILED ========="
+ puts $logfad "==== Contents of test case:\n"
+ puts $logfad $xbody
+
+ puts $logfad "---- Result was:"
+ puts $logfad [string range $xactual 0 end-1]
+
+ puts $logfad "---- Result should have been:"
+ puts $logfad [string range $xexpected 0 end-1]
+
+ puts $logfad "==== [lrange $xtest end-1 end] ====\n\n"
+ flush $logfad
+ }
+ set xcollect 0
+ #sak::registry::local set $xtest Body $xbody
+ #sak::registry::local set $xtest Actual $xactual
+ #sak::registry::local set $xtest Expected $xexpected
+ set xtest {}
+ }
+ return -code continue
+}
+
+proc ::sak::test::run::CaptureFailureCollectError {} {
+ variable xcollect
+ if {$xcollect != 5} return
+ upvar 1 rline line
+ variable xbody
+ if {[string match {---- errorCode*} $line]} {
+ set xcollect 4
+ return -code continue
+ }
+
+ variable xactual
+ append xactual $line \n
+ return -code continue
+}
+
+proc ::sak::test::run::Aborted {} {
+ upvar 1 line line
+ if {![string match {Aborting the tests found *} $line]} return
+ variable xfile
+ variable xstatus
+ # Ignore aborted status if we already have it, or some other error
+ # status (like error, or fail). These are more important to show.
+ if {$xstatus == "ok"} {set xstatus aborted}
+ = Aborted
+ #sak::registry::local set $xfile Aborted {}
+ return -code continue
+}
+
+proc ::sak::test::run::AbortCause {} {
+ upvar 1 line line
+ if {
+ ![string match {Requiring *} $line] &&
+ ![string match {Error in *} $line]
+ } return ; # {}
+ variable xfile
+ = $line
+ #sak::registry::local set $xfile Aborted $line
+ return -code continue
+}
+
+proc ::sak::test::run::CaptureStackStart {} {
+ upvar 1 line line
+ if {![string match {@+*} $line]} return
+ variable xstackcollect 1
+ variable xstack {}
+ variable xstatus error
+ = {Error, capturing stacktrace}
+ return -code continue
+}
+
+proc ::sak::test::run::CaptureStack {} {
+ variable xstackcollect
+ if {!$xstackcollect} return
+ upvar 1 line line
+ variable xstack
+ if {![string match {@-*} $line]} {
+ append xstack [string range $line 2 end] \n
+ } else {
+ set xstackcollect 0
+ variable xfile
+ variable alog
+ #sak::registry::local set $xfile Stacktrace $xstack
+ if {$alog} {
+ variable logerd
+ puts $logerd "[lindex $xfile end] StackTrace"
+ puts $logerd "========================================"
+ puts $logerd $xstack
+ puts $logerd "========================================\n\n"
+ flush $logerd
+ }
+ }
+ return -code continue
+}
+
+proc ::sak::test::run::SetupError {} {
+ upvar 1 line line
+ if {![string match {SETUP Error*} $line]} return
+ variable xstatus error
+ = {Setup error}
+ return -code continue
+}
+
+# ###
+
+proc ::sak::test::run::+= {string} {
+ variable araw
+ if {$araw} return
+ variable aprefix
+ append aprefix " " $string
+ sak::animate::next $aprefix
+ return
+}
+
+proc ::sak::test::run::= {string} {
+ variable araw
+ if {$araw} return
+ variable aprefix
+ sak::animate::next "$aprefix $string"
+ return
+}
+
+proc ::sak::test::run::=| {string} {
+ variable araw
+ if {$araw} return
+ variable aprefix
+ sak::animate::last "$aprefix $string"
+ variable alog
+ if {$alog} {
+ variable logsum
+ variable logfai
+ variable logski
+ variable lognon
+ variable xstatus
+ puts $logsum "$aprefix $string" ; flush $logsum
+ switch -exact -- $xstatus {
+ error -
+ fail {puts $logfai "$aprefix $string" ; flush $logfai}
+ none {puts $lognon "$aprefix $string" ; flush $lognon}
+ aborted {puts $logski "$aprefix $string" ; flush $logski}
+ }
+ }
+ set aprefix ""
+ return
+}
+
+# ###
+
+namespace eval ::sak::test::run {
+ variable base [file join $::distribution support devel]
+ variable valgrind [auto_execok valgrind]
+
+ # State of test processing.
+
+ variable xstackcollect 0
+ variable xstack {}
+ variable xcollect 0
+ variable xbody {}
+ variable xactual {}
+ variable xexpected {}
+ variable xhost {}
+ variable xplatform {}
+ variable xcwd {}
+ variable xshell {}
+ variable xmodule {}
+ variable xfile {}
+ variable xtest {}
+ variable xstartfile {}
+ variable xtimes {}
+
+ variable xstatus ok
+
+ # Animation prefix of test processing, and flag controlling the
+ # nature of logging (raw vs animation).
+
+ variable aprefix {}
+ variable araw 0
+
+ # Max length of module names and patchlevel information.
+
+ variable maxml 0
+ variable maxvl 0
+
+ # Map from internal stati to the displayed human readable
+ # strings. This includes the trailing whitespace needed for
+ # vertical alignment.
+
+ variable xvstatus
+ array set xvstatus {
+ ok { }
+ none {None }
+ aborted {Skip }
+ error {ERR }
+ fail {FAILS}
+ }
+}
+
+##
+# ###
+
+package provide sak::test::run 1.0
+
+if 0 {
+ # Bad valgrind, ok no valgrind
+ if {$config(valgrind)} {
+ foreach e $valgrind {lappend cmd $e}
+ lappend cmd --num-callers=8
+ lappend cmd --leak-resolution=high
+ lappend cmd -v --leak-check=yes
+ lappend cmd --show-reachable=yes
+ }
+ lappend cmd $sh
+ lappend cmd [Driver] -modules $modules
+}
diff --git a/tcllib/support/devel/sak/test/shell.tcl b/tcllib/support/devel/sak/test/shell.tcl
new file mode 100644
index 0000000..f0f0e5d
--- /dev/null
+++ b/tcllib/support/devel/sak/test/shell.tcl
@@ -0,0 +1,94 @@
+# -*- tcl -*-
+# (C) 2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+getpackage fileutil fileutil/fileutil.tcl
+
+package require sak::test
+package require sak::registry
+namespace eval ::sak::test::shell {}
+
+# ###
+
+proc ::sak::test::shell {argv} {
+ if {![llength $argv]} {Usage Sub command missing}
+
+ set cmd [lindex $argv 0]
+ set argv [lrange $argv 1 end]
+
+ switch -exact -- $cmd {
+ add {
+ sak::test::shell::add $argv
+ }
+ delete {
+ sak::test::shell::delete $argv
+ }
+ default {
+ sak::test::usage Unknown command "\"shell $cmd\""
+ }
+ }
+ return
+}
+
+proc ::sak::test::shell::list {} {
+ return [sak::registry::local \
+ get||default Tests Shells {}]
+}
+
+proc ::sak::test::shell::add {paths} {
+ foreach p $paths {
+ if {![fileutil::test $p efrx msg "Shell"]} {
+ sak::test::usage $msg
+ }
+ }
+
+ set shells [sak::registry::local \
+ get||default Tests Shells {}]
+ array set known {}
+ foreach sh $shells {set known($sh) .}
+
+ set changed 0
+ foreach p $paths {
+ if {[info exists known($p)]} continue
+ lappend shells $p
+ set changed 1
+ }
+
+ if {$changed} {
+ sak::registry::local \
+ set Tests Shells [lsort -dict $shells]
+ }
+ return
+}
+
+proc ::sak::test::shell::delete {paths} {
+ set shells [sak::registry::local \
+ get||default Tests Shells {}]
+ array set known {}
+ foreach sh $shells {set known($sh) .}
+
+ set changed 0
+ foreach p $paths {
+ if {![info exists known($p)]} continue
+ unset known($p)
+ set changed 1
+ }
+
+ if {$changed} {
+ sak::registry::local \
+ set Tests Shells [lsort -dict \
+ [array names known]]
+ }
+ return
+}
+
+# ###
+
+namespace eval ::sak::test::shell {
+}
+
+##
+# ###
+
+package provide sak::test::shell 1.0
diff --git a/tcllib/support/devel/sak/test/shells.tcl b/tcllib/support/devel/sak/test/shells.tcl
new file mode 100644
index 0000000..09a1bc6
--- /dev/null
+++ b/tcllib/support/devel/sak/test/shells.tcl
@@ -0,0 +1,24 @@
+# -*- tcl -*-
+# (C) 2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require sak::test
+package require sak::test::shell
+namespace eval ::sak::test::shells {}
+
+# ###
+
+proc ::sak::test::shells {argv} {
+ if {[llength $argv]} {
+ sak::test::usage Wrong # args
+ }
+
+ puts stdout [join [sak::test::shell::list] \n]
+ return
+}
+
+##
+# ###
+
+package provide sak::test::shells 1.0
diff --git a/tcllib/support/devel/sak/test/test.tcl b/tcllib/support/devel/sak/test/test.tcl
new file mode 100644
index 0000000..c31d974
--- /dev/null
+++ b/tcllib/support/devel/sak/test/test.tcl
@@ -0,0 +1,19 @@
+# -*- tcl -*-
+# (C) 2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+namespace eval ::sak::test {}
+
+# ###
+
+proc ::sak::test::usage {args} {
+ package require sak::help
+ puts stdout [join $args { }]\n[sak::help::on test]
+ exit 1
+}
+
+##
+# ###
+
+package provide sak::test 1.0
diff --git a/tcllib/support/devel/sak/test/topic.txt b/tcllib/support/devel/sak/test/topic.txt
new file mode 100644
index 0000000..31d0be5
--- /dev/null
+++ b/tcllib/support/devel/sak/test/topic.txt
@@ -0,0 +1 @@
+test Execute testsuites
diff --git a/tcllib/support/devel/sak/util/anim.tcl b/tcllib/support/devel/sak/util/anim.tcl
new file mode 100644
index 0000000..302ff04
--- /dev/null
+++ b/tcllib/support/devel/sak/util/anim.tcl
@@ -0,0 +1,64 @@
+# -*- tcl -*-
+# (C) 2006-2013 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+namespace eval ::sak::animate {
+ # EL (Erase Line)
+ # Sequence: ESC [ n K
+ # ** Effect: if n is 0 or missing, clear from cursor to end of line
+ # Effect: if n is 1, clear from beginning of line to cursor
+ # Effect: if n is 2, clear entire line
+
+ variable eeol \033\[K
+}
+
+# ###
+
+proc ::sak::animate::init {} {
+ variable prefix
+ variable n 0
+ variable max [llength $prefix]
+}
+
+proc ::sak::animate::next {string} {
+ variable prefix
+ variable n
+ variable max
+ variable eeol
+
+ puts -nonewline stdout \r\[[lindex $prefix $n]\]\ $string$eeol
+ flush stdout
+
+ incr n ; if {$n >= $max} {set n 0}
+ return
+}
+
+proc ::sak::animate::last {string} {
+ variable clear
+
+ puts stdout \r\[$clear\]\ $string
+ flush stdout
+ return
+}
+
+# ###
+
+namespace eval ::sak::animate {
+ namespace export init next last
+
+ variable prefix {
+ {* } {* } {* } {* } {* }
+ { * } { * } { * } { * } { * }
+ { * } { * } { * } { * } { * }
+ { *} { *} { *} { *} { *}
+ { * } { * } { * } { * } { * }
+ { * } { * } { * } { * } { * }
+ }
+ variable clear { }
+}
+
+##
+# ###
+
+package provide sak::animate 1.0
diff --git a/tcllib/support/devel/sak/util/color.tcl b/tcllib/support/devel/sak/util/color.tcl
new file mode 100644
index 0000000..76a475e
--- /dev/null
+++ b/tcllib/support/devel/sak/util/color.tcl
@@ -0,0 +1,54 @@
+# -*- tcl -*-
+# (C) 2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+namespace eval ::sak::color {}
+
+# ###
+
+if {$::tcl_platform(platform) == "windows"} {
+ # No ansi colorization on windows
+ namespace eval ::sak::color {
+ variable n
+ foreach n {cya yel whi mag red green rst} {
+ proc $n {} {return ""}
+ namespace export $n
+
+ proc =$n {s} {return $s}
+ namespace export =$n
+ }
+ unset n
+ }
+} else {
+ getpackage term::ansi::code::attr term/ansi/code/attr.tcl
+ getpackage term::ansi::code::ctrl term/ansi/code/ctrl.tcl
+
+ ::term::ansi::code::ctrl::import ::sak::color sda_bg* sda_reset
+
+ namespace eval ::sak::color {
+ variable s
+ variable n
+ foreach {s n} {
+ sda_bgcyan cya
+ sda_bgyellow yel
+ sda_bgwhite whi
+ sda_bgmagenta mag
+ sda_bgred red
+ sda_bggreen green
+ sda_reset rst
+ } {
+ rename $s $n
+ namespace export $n
+
+ proc =$n {s} "return \[$n\]\$s\[rst\]"
+ namespace export =$n
+ }
+ unset s n
+ }
+}
+
+##
+# ###
+
+package provide sak::color 1.0
diff --git a/tcllib/support/devel/sak/util/feedback.tcl b/tcllib/support/devel/sak/util/feedback.tcl
new file mode 100644
index 0000000..557ea50
--- /dev/null
+++ b/tcllib/support/devel/sak/util/feedback.tcl
@@ -0,0 +1,182 @@
+# -*- tcl -*-
+# (C) 2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+# Feedback modes
+#
+# [short] Animated short feedback on stdout, no logging
+# [log] Animated short feedback on stdout, logging to multiple files.
+# [verbose] Logging to stdout
+#
+# Output commands for various destinations:
+#
+# <v> Verbose Log
+# <s> Short Log
+#
+# Handling of the destinations per mode
+#
+# <s> <v>
+# [short] stdout, /dev/null
+# [log] stdout, file
+# [verbose] /dev/null, stdout
+
+# Log files for different things are opened on demand, i.e. on the
+# first write to them. We can configure (per possible log) a string to
+# be written before the first write. Reconfiguring that string for a
+# log clears the flag for that log and causes the string to be
+# rewritten on the next write.
+
+package require sak::animate
+
+namespace eval ::sak::feedback {
+ namespace import ::sak::animate::next ; rename next aNext
+ namespace import ::sak::animate::last ; rename last aLast
+}
+
+# ###
+
+proc ::sak::feedback::init {mode stem} {
+ variable prefix ""
+ variable short [expr {$mode ne "verbose"}]
+ variable verbose [expr {$mode ne "short"}]
+ variable tofile [expr {$mode eq "log"}]
+ variable lstem $stem
+ variable dst ""
+ variable lfirst
+ unset lfirst
+ array set lfirst {}
+ # Note: lchan is _not_ reset. We keep channels, allowing us to
+ # merge output from different modules, if they are run as
+ # one unit (Example: validate and its various parts, which
+ # can be run separately, and together).
+ return
+}
+
+proc ::sak::feedback::first {dst string} {
+ variable lfirst
+ set lfirst($dst) $string
+ return
+}
+
+###
+
+proc ::sak::feedback::summary {text} {
+ #=| $text
+ #log $text
+
+ variable short
+ variable verbose
+ if {$short} { puts $text }
+ if {$verbose} { puts [_channel log] $text }
+ return
+}
+
+
+proc ::sak::feedback::log {text {ext log}} {
+ variable verbose
+ if {!$verbose} return
+ set c [_channel $ext]
+ puts $c $text
+ flush $c
+ return
+}
+
+###
+
+proc ::sak::feedback::! {} {
+ variable short
+ if {!$short} return
+ variable prefix ""
+ sak::animate::init
+ return
+}
+
+proc ::sak::feedback::+= {string} {
+ variable short
+ if {!$short} return
+ variable prefix
+ append prefix " " $string
+ aNext $prefix
+ return
+}
+
+proc ::sak::feedback::= {string} {
+ variable short
+ if {!$short} return
+ variable prefix
+ aNext "$prefix $string"
+ return
+}
+
+proc ::sak::feedback::=| {string} {
+ variable short
+ if {!$short} return
+
+ variable prefix
+ aLast "$prefix $string"
+
+ variable verbose
+ if {$verbose} {
+ variable dst
+ if {[string length $dst]} {
+ # inlined 'log'
+ set c [_channel $dst]
+ puts $c "$prefix $string"
+ flush $c
+ set dst ""
+ }
+ }
+
+ set prefix ""
+ return
+}
+
+proc ::sak::feedback::>> {string} {
+ variable dst $string
+ return
+}
+
+# ###
+
+proc ::sak::feedback::_channel {dst} {
+ variable tofile
+ if {!$tofile} { return stdout }
+ variable lchan
+ if {[info exists lchan($dst)]} {
+ set c $lchan($dst)
+ } else {
+ variable lstem
+ set c [open ${lstem}.$dst w]
+ set lchan($dst) $c
+ }
+ variable lfirst
+ if {[info exists lfirst($dst)]} {
+ puts $c $lfirst($dst)
+ unset lfirst($dst)
+ }
+ return $c
+}
+
+# ###
+
+namespace eval ::sak::feedback {
+ namespace export >> ! += = =| init log summary
+
+ variable dst ""
+ variable prefix ""
+ variable short ""
+ variable verbose ""
+ variable tofile ""
+ variable lstem ""
+ variable lchan
+ array set lchan {}
+
+ variable lfirst
+ array set lfirst {}
+}
+
+##
+# ###
+
+package provide sak::feedback 1.0
diff --git a/tcllib/support/devel/sak/util/pkgIndex.tcl b/tcllib/support/devel/sak/util/pkgIndex.tcl
new file mode 100644
index 0000000..0042019
--- /dev/null
+++ b/tcllib/support/devel/sak/util/pkgIndex.tcl
@@ -0,0 +1,6 @@
+if {![package vsatisfies [package provide Tcl] 8.2]} return
+package ifneeded sak::util 1.0 [list source [file join $dir util.tcl]]
+package ifneeded sak::registry 1.0 [list source [file join $dir registry.tcl]]
+package ifneeded sak::animate 1.0 [list source [file join $dir anim.tcl]]
+package ifneeded sak::color 1.0 [list source [file join $dir color.tcl]]
+package ifneeded sak::feedback 1.0 [list source [file join $dir feedback.tcl]]
diff --git a/tcllib/support/devel/sak/util/registry.tcl b/tcllib/support/devel/sak/util/registry.tcl
new file mode 100644
index 0000000..933fcad
--- /dev/null
+++ b/tcllib/support/devel/sak/util/registry.tcl
@@ -0,0 +1,59 @@
+# -*- tcl -*-
+# (C) 2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+getpackage pregistry registry/registry.tcl
+
+namespace eval ::sak::registry {}
+
+proc ::sak::registry::local {args} {
+ return [uplevel 1 [linsert $args 0 [Setup]]]
+ # return <$_local {expand}$args>
+}
+
+proc ::sak::registry::Setup {} {
+ variable _local
+ variable state
+ variable statedir
+
+ if {![file exists $statedir]} {
+ file mkdir $statedir
+ }
+
+ if {$_local == {}} {
+ set _local [pregistry %AUTO% \
+ -tie [list file $state]]
+ }
+
+ return $_local
+}
+
+proc ::sak::registry::Refresh {} {
+ variable _local
+ $_local destroy
+ set _local {}
+ Setup
+ return
+}
+
+namespace eval ::sak::registry {
+ variable _here [file dirname [info script]]
+
+ variable statedir [file join ~ .Tcllib]
+ variable state [file join $statedir Registry]
+ variable _local {}
+}
+
+##
+# ###
+
+package provide sak::registry 1.0
+
+# ###
+## Data structures
+#
+## Core is a tree (struct::tree), keys are lists, mapping to a node,
+## starting from the root. Attributes are node attributes. A prefix is
+## used to distinguish them from the attributes used for internal
+## purposes.
diff --git a/tcllib/support/devel/sak/util/util.tcl b/tcllib/support/devel/sak/util/util.tcl
new file mode 100644
index 0000000..cca192e
--- /dev/null
+++ b/tcllib/support/devel/sak/util/util.tcl
@@ -0,0 +1,72 @@
+# -*- tcl -*-
+# (C) 2006 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+namespace eval ::sak::util {}
+
+# ###
+
+proc ::sak::util::path2modules {paths} {
+ set modules {}
+ foreach p $paths {
+ if {[file exists $p]} {set p [file tail $p]}
+ lappend modules $p
+ }
+ return $modules
+}
+
+proc ::sak::util::modules2path {modules} {
+ global distribution
+ set modbase [file join $distribution modules]
+
+ set paths {}
+ foreach m $modules {
+ lappend paths [file join $modbase $m]
+ }
+ return $paths
+}
+
+proc ::sak::util::module2path {module} {
+ global distribution
+ set modbase [file join $distribution modules]
+ return [file join $modbase $module]
+}
+
+proc ::sak::util::checkModules {modvar} {
+ upvar 1 $modvar modules
+
+ if {![llength $modules]} {
+ # Default to all if none are specified. This information does
+ # not require validation.
+
+ set modules [modules]
+ return 1
+ }
+
+ set modules [path2modules $modules]
+
+ set fail 0
+ foreach m $modules {
+ if {[modules_mod $m]} {
+ lappend results $m
+ continue
+ }
+
+ puts " Unknown module: $m"
+ set fail 1
+ }
+
+ if {$fail} {
+ puts " Stop."
+ return 0
+ }
+
+ set modules $results
+ return 1
+}
+
+##
+# ###
+
+package provide sak::util 1.0
diff --git a/tcllib/support/devel/sak/validate/cmd.tcl b/tcllib/support/devel/sak/validate/cmd.tcl
new file mode 100644
index 0000000..ca2ddc9
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/cmd.tcl
@@ -0,0 +1,70 @@
+# -*- tcl -*-
+# Implementation of 'validate'.
+
+# Available variables
+# * argv - Cmdline arguments
+# * base - Location of sak.tcl = Top directory of Tcllib distribution
+# * cbase - Location of all files relevant to this command.
+# * sbase - Location of all files supporting the SAK.
+
+package require sak::util
+package require sak::validate
+
+set raw 0
+set log 0
+set stem {}
+set tclv {}
+
+if {[llength $argv]} {
+ # First argument may be a command.
+ set cmd [lindex $argv 0]
+ if {![catch {
+ package require sak::validate::$cmd
+ } msg]} {
+ set argv [lrange $argv 1 end]
+ } else {
+ set cmd all
+ }
+
+ # Now process any possible options (-v, -l, --log).
+
+ while {[string match -* [set opt [lindex $argv 0]]]} {
+ switch -exact -- $opt {
+ -v {
+ set raw 1
+ set argv [lrange $argv 1 end]
+ }
+ -l - --log {
+ set log 1
+ set stem [lindex $argv 1]
+ set argv [lrange $argv 2 end]
+ }
+ -t - --tcl {
+ set tclv [lindex $argv 1]
+ set argv [lrange $argv 2 end]
+ }
+ default {
+ sak::validate::usage Unknown option "\"$opt\""
+ }
+ }
+ }
+} else {
+ set cmd all
+}
+
+# At last now handle all remaining arguments as module specifications.
+if {![sak::util::checkModules argv]} return
+
+if {$log} { set raw 0 }
+
+array set mode {
+ 00 short
+ 01 log
+ 10 verbose
+ 11 _impossible_
+}
+
+sak::validate::$cmd $argv $mode($raw$log) $stem $tclv
+
+##
+# ###
diff --git a/tcllib/support/devel/sak/validate/help.txt b/tcllib/support/devel/sak/validate/help.txt
new file mode 100644
index 0000000..6ded891
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/help.txt
@@ -0,0 +1,53 @@
+
+ validate -- Validate modules and packages
+
+ sak validate ?-v? ?-l|--log STEM? ?MODULE ...?
+ sak validate manpages ?-v? ?-l|--log STEM? ?MODULE ...?
+ sak validate versions ?-v? ?-l|--log STEM? ?MODULE ...?
+ sak validate testsuites ?-v? ?-l|--log STEM? ?MODULE ...?
+ sak validate syntax ?-v? ?-l|--log STEM? ?MODULE ...?
+
+ Validate one or more aspects of the specified modules and the
+ packages they contain. If no module is specified all modules
+ are validated. If no aspect was specified all possible aspects
+ are validated.
+
+ By default the output from a validation run is animated
+ feedback of the progress made, plus summarized color-coded
+ results. If -v is specified the actual log is returned
+ instead.
+
+ If a log STEM is specified the extended log normally activated
+ via -v is written to STEM.log while the user is provided with
+ the regular feedback during execution. Usage of the -l switch
+ overides -v.
+
+ The system is currently able to validate the following aspects
+ of the module and package sources:
+
+ manpages
+ Reports modules/packages without documentation, and
+ modules/packages which have syntactically flawed
+ documentation. The second part is identical to
+
+ sak doc validate
+
+ versions
+ Reports modules and packages with mismatches between
+ 'package ifneeded' and 'package provided' commands.
+
+ testsuites
+ Report modules and packages without testsuites.
+
+ Note that this command is _not_ actually executing the
+ testsuites. That is done via
+
+ sak test run ...
+
+ See its documentation (sak help test) for more
+ information.
+
+ syntax
+ Scan modules and packages using various tools
+ statically checking Tcl syntax, and report their
+ outputs.
diff --git a/tcllib/support/devel/sak/validate/manpages.tcl b/tcllib/support/devel/sak/validate/manpages.tcl
new file mode 100644
index 0000000..fbb0e86
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/manpages.tcl
@@ -0,0 +1,464 @@
+# -*- tcl -*-
+# (C) 2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require sak::animate
+package require sak::feedback
+package require sak::color
+
+getpackage textutil::repeat textutil/repeat.tcl
+getpackage doctools doctools/doctools.tcl
+
+namespace eval ::sak::validate::manpages {
+ namespace import ::textutil::repeat::blank
+ namespace import ::sak::color::*
+ namespace import ::sak::feedback::!
+ namespace import ::sak::feedback::>>
+ namespace import ::sak::feedback::+=
+ namespace import ::sak::feedback::=
+ namespace import ::sak::feedback::=|
+ namespace import ::sak::feedback::log
+ namespace import ::sak::feedback::summary
+ rename summary sum
+}
+
+# ###
+
+proc ::sak::validate::manpages {modules mode stem tclv} {
+ manpages::run $modules $mode $stem $tclv
+ manpages::summary
+ return
+}
+
+proc ::sak::validate::manpages::run {modules mode stem tclv} {
+ sak::feedback::init $mode $stem
+ sak::feedback::first log "\[ Documentation \] ==============================================="
+ sak::feedback::first unc "\[ Documentation \] ==============================================="
+ sak::feedback::first fail "\[ Documentation \] ==============================================="
+ sak::feedback::first warn "\[ Documentation \] ==============================================="
+ sak::feedback::first miss "\[ Documentation \] ==============================================="
+ sak::feedback::first none "\[ Documentation \] ==============================================="
+
+ # Preprocessing of module names to allow better formatting of the
+ # progress output, i.e. vertically aligned columns
+
+ # Per module we can distinguish the following levels of
+ # documentation completeness and validity
+
+ # Completeness:
+ # - No package has documentation
+ # - Some, but not all packages have documentation
+ # - All packages have documentation.
+ #
+ # Validity, restricted to the set packages which have documentation:
+ # - Documentation has errors and warnings
+ # - Documentation has errors, but no warnings.
+ # - Documentation has no errors, but warnings.
+ # - Documentation has neither errors nor warnings.
+
+ # Progress report per module: Packages it is working on.
+ # Summary at module level:
+ # - Number of packages, number of packages with documentation,
+ # - Number of errors, number of warnings.
+
+ # Full log:
+ # - Lists packages without documentation.
+ # - Lists packages with errors/warnings.
+ # - Lists the exact errors/warnings per package, and location.
+
+ # Global preparation: Pull information about all packages and the
+ # modules they belong to.
+
+ ::doctools::new dt -format desc -deprecated 1
+
+ Count $modules
+ MapPackages
+
+ InitCounters
+ foreach m $modules {
+ # Skip tcllibc shared library, not a module.
+ if {[string equal $m tcllibc]} continue
+
+ InitModuleCounters
+ !
+ log "@@ Module $m"
+ Head $m
+
+ # Per module: Find all doctools manpages inside and process
+ # them. We get errors, warnings, and determine the package(s)
+ # they may belong to.
+
+ # Per package: Have they doc files claiming them? After that,
+ # are doc files left over (i.e. without a package)?
+
+ ProcessPages $m
+ ProcessPackages $m
+ ProcessUnclaimed
+ ModuleSummary
+ }
+
+ dt destroy
+ return
+}
+
+proc ::sak::validate::manpages::summary {} {
+ Summary
+ return
+}
+
+# ###
+
+proc ::sak::validate::manpages::ProcessPages {m} {
+ !claims
+ dt configure -module $m
+ foreach f [glob -nocomplain [file join [At $m] *.man]] {
+ ProcessManpage $f
+ }
+ return
+}
+
+proc ::sak::validate::manpages::ProcessManpage {f} {
+ =file $f
+ dt configure -file $f
+
+ if {[catch {
+ dt format [get_input $f]
+ } msg]} {
+ +e $msg
+ } else {
+ foreach {pkg _ _} $msg { +claim $pkg }
+ }
+
+ set warnings [dt warnings]
+ if {![llength $warnings]} return
+
+ foreach msg $warnings { +w $msg }
+ return
+}
+
+proc ::sak::validate::manpages::ProcessPackages {m} {
+ !used
+ if {![HasPackages $m]} return
+
+ foreach p [ThePackages $m] {
+ +pkg $p
+ if {[claimants $p]} {
+ +doc $p
+ } else {
+ nodoc $p
+ }
+ }
+ return
+}
+
+proc ::sak::validate::manpages::ProcessUnclaimed {} {
+ variable claims
+ if {![array size claims]} return
+ foreach p [lsort -dict [array names claims]] {
+ foreach fx $claims($p) { +u $fx }
+ }
+ return
+}
+
+###
+
+proc ::sak::validate::manpages::=file {f} {
+ variable current [file tail $f]
+ = "$current ..."
+ return
+}
+
+###
+
+proc ::sak::validate::manpages::!claims {} {
+ variable claims
+ array unset claims *
+ return
+}
+
+proc ::sak::validate::manpages::+claim {pkg} {
+ variable current
+ variable claims
+ lappend claims($pkg) $current
+ return
+}
+
+proc ::sak::validate::manpages::claimants {pkg} {
+ variable claims
+ expr { [info exists claims($pkg)] && [llength $claims($pkg)] }
+}
+
+
+###
+
+proc ::sak::validate::manpages::!used {} {
+ variable used
+ array unset used *
+ return
+}
+
+proc ::sak::validate::manpages::+use {pkg} {
+ variable used
+ variable claims
+ foreach fx $claims($pkg) { set used($fx) . }
+ unset claims($pkg)
+ return
+}
+
+###
+
+proc ::sak::validate::manpages::MapPackages {} {
+ variable pkg
+ array unset pkg *
+
+ !
+ += Package
+ foreach {pname pdata} [ipackages] {
+ = "$pname ..."
+ foreach {pver pmodule} $pdata break
+ lappend pkg($pmodule) $pname
+ }
+ !
+ =| {Packages mapped ...}
+ return
+}
+
+proc ::sak::validate::manpages::HasPackages {m} {
+ variable pkg
+ expr { [info exists pkg($m)] && [llength $pkg($m)] }
+}
+
+proc ::sak::validate::manpages::ThePackages {m} {
+ variable pkg
+ return [lsort -dict $pkg($m)]
+}
+
+###
+
+proc ::sak::validate::manpages::+pkg {pkg} {
+ variable mtotal ; incr mtotal
+ variable total ; incr total
+ return
+}
+
+proc ::sak::validate::manpages::+doc {pkg} {
+ variable mhavedoc ; incr mhavedoc
+ variable havedoc ; incr havedoc
+ = "$pkg Ok"
+ +use $pkg
+ return
+}
+
+proc ::sak::validate::manpages::nodoc {pkg} {
+ = "$pkg Bad"
+ log "@@ WARN No documentation: $pkg"
+ return
+}
+
+###
+
+proc ::sak::validate::manpages::+w {msg} {
+ variable mwarnings ; incr mwarnings
+ variable warnings ; incr warnings
+ variable current
+ foreach {a b c} [split $msg \n] break
+ log "@@ WARN $current: [Trim $a] [Trim $b] [Trim $c]"
+ return
+}
+
+proc ::sak::validate::manpages::+e {msg} {
+ variable merrors ; incr merrors
+ variable errors ; incr errors
+ variable current
+ log "@@ ERROR $current $msg"
+ return
+}
+
+proc ::sak::validate::manpages::+u {f} {
+ variable used
+ if {[info exists used($f)]} return
+ variable munclaimed ; incr munclaimed
+ variable unclaimed ; incr unclaimed
+ set used($f) .
+ log "@@ WARN Unclaimed documentation file: $f"
+ return
+}
+
+###
+
+proc ::sak::validate::manpages::Count {modules} {
+ variable maxml 0
+ !
+ foreach m [linsert $modules 0 Module] {
+ = "M $m"
+ set l [string length $m]
+ if {$l > $maxml} {set maxml $l}
+ }
+ =| "Validate documentation (existence, errors, warnings) ..."
+ return
+}
+
+proc ::sak::validate::manpages::Head {m} {
+ variable maxml
+ += ${m}[blank [expr {$maxml - [string length $m]}]]
+ return
+}
+
+###
+
+proc ::sak::validate::manpages::InitModuleCounters {} {
+ variable mtotal 0
+ variable mhavedoc 0
+ variable munclaimed 0
+ variable merrors 0
+ variable mwarnings 0
+ return
+}
+
+proc ::sak::validate::manpages::ModuleSummary {} {
+ variable mtotal
+ variable mhavedoc
+ variable munclaimed
+ variable merrors
+ variable mwarnings
+
+ set complete [F $mhavedoc]/[F $mtotal]
+ set not "! [F [expr {$mtotal - $mhavedoc}]]"
+ set err "E [F $merrors]"
+ set warn "W [F $mwarnings]"
+ set unc "U [F $munclaimed]"
+
+ if {$munclaimed} {
+ set unc [=cya $unc]
+ >> unc
+ }
+ if {!$mhavedoc && $mtotal} {
+ set complete [=red $complete]
+ set not [=red $not]
+ >> none
+ } elseif {$mhavedoc < $mtotal} {
+ set complete [=yel $complete]
+ set not [=yel $not]
+ >> miss
+ }
+ if {$merrors} {
+ set err [=red $err]
+ set warn [=yel $warn]
+ >> fail
+ } elseif {$mwarnings} {
+ set warn [=yel $warn]
+ >> warn
+ }
+
+ =| "~~ $complete $not $unc $err $warn"
+ return
+}
+
+###
+
+proc ::sak::validate::manpages::InitCounters {} {
+ variable total 0
+ variable havedoc 0
+ variable unclaimed 0
+ variable errors 0
+ variable warnings 0
+ return
+}
+
+proc ::sak::validate::manpages::Summary {} {
+ variable total
+ variable havedoc
+ variable unclaimed
+ variable errors
+ variable warnings
+
+ set tot [F $total]
+ set doc [F $havedoc]
+ set udc [F [expr {$total - $havedoc}]]
+
+ set unc [F $unclaimed]
+ set per [format %6.2f [expr {$havedoc*100./$total}]]
+ set uper [format %6.2f [expr {($total - $havedoc)*100./$total}]]
+ set err [F $errors]
+ set wrn [F $warnings]
+
+ if {$errors} { set err [=red $err] }
+ if {$warnings} { set wrn [=yel $wrn] }
+ if {$unclaimed} { set unc [=cya $unc] }
+
+ if {!$havedoc && $total} {
+ set doc [=red $doc]
+ set udc [=red $udc]
+ } elseif {$havedoc < $total} {
+ set doc [=yel $doc]
+ set udc [=yel $udc]
+ }
+
+ sum ""
+ sum "Documentation statistics"
+ sum "#Packages: $tot"
+ sum "#Documented: $doc (${per}%)"
+ sum "#Undocumented: $udc (${uper}%)"
+ sum "#Unclaimed: $unc"
+ sum "#Errors: $err"
+ sum "#Warnings: $wrn"
+ return
+}
+
+###
+
+proc ::sak::validate::manpages::F {n} { format %6d $n }
+
+proc ::sak::validate::manpages::Trim {text} {
+ regsub {^[^:]*:} $text {} text
+ return [string trim $text]
+}
+
+###
+
+proc ::sak::validate::manpages::At {m} {
+ global distribution
+ return [file join $distribution modules $m]
+}
+
+# ###
+
+namespace eval ::sak::validate::manpages {
+ # Max length of module names and patchlevel information.
+ variable maxml 0
+
+ # Counters across all modules
+ variable total 0 ; # Number of packages overall.
+ variable havedoc 0 ; # Number of packages with documentation.
+ variable unclaimed 0 ; # Number of manpages not claimed by a specific package.
+ variable errors 0 ; # Number of errors found in all documentation.
+ variable warnings 0 ; # Number of warnings found in all documentation.
+
+ # Same counters, per module.
+ variable mtotal 0
+ variable mhavedoc 0
+ variable munclaimed 0
+ variable merrors 0
+ variable mwarnings 0
+
+ # Name of currently processed manpage
+ variable current ""
+
+ # Map from packages to files claiming to document them.
+ variable claims
+ array set claims {}
+
+ # Set of files taken by packages, as array
+ variable used
+ array set used {}
+
+ # Map from modules to packages contained in them
+ variable pkg
+ array set pkg {}
+}
+
+##
+# ###
+
+package provide sak::validate::manpages 1.0
diff --git a/tcllib/support/devel/sak/validate/pkgIndex.tcl b/tcllib/support/devel/sak/validate/pkgIndex.tcl
new file mode 100644
index 0000000..d6ad128
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/pkgIndex.tcl
@@ -0,0 +1,6 @@
+if {![package vsatisfies [package provide Tcl] 8.2]} return
+package ifneeded sak::validate 1.0 [list source [file join $dir validate.tcl]]
+package ifneeded sak::validate::manpages 1.0 [list source [file join $dir manpages.tcl]]
+package ifneeded sak::validate::versions 1.0 [list source [file join $dir versions.tcl]]
+package ifneeded sak::validate::testsuites 1.0 [list source [file join $dir testsuites.tcl]]
+package ifneeded sak::validate::syntax 1.0 [list source [file join $dir syntax.tcl]]
diff --git a/tcllib/support/devel/sak/validate/syntax.tcl b/tcllib/support/devel/sak/validate/syntax.tcl
new file mode 100644
index 0000000..24e06d2
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/syntax.tcl
@@ -0,0 +1,668 @@
+# -*- tcl -*-
+# (C) 2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require sak::animate
+package require sak::feedback
+package require sak::color
+
+getpackage textutil::repeat textutil/repeat.tcl
+getpackage doctools doctools/doctools.tcl
+
+namespace eval ::sak::validate::syntax {
+ namespace import ::textutil::repeat::blank
+ namespace import ::sak::color::*
+ namespace import ::sak::feedback::!
+ namespace import ::sak::feedback::>>
+ namespace import ::sak::feedback::+=
+ namespace import ::sak::feedback::=
+ namespace import ::sak::feedback::=|
+ namespace import ::sak::feedback::log
+ namespace import ::sak::feedback::summary
+ rename summary sum
+}
+
+# ###
+
+proc ::sak::validate::syntax {modules mode stem tclv} {
+ syntax::run $modules $mode $stem $tclv
+ syntax::summary
+ return
+}
+
+proc ::sak::validate::syntax::run {modules mode stem tclv} {
+ sak::feedback::init $mode $stem
+ sak::feedback::first log "\[ Syntax \] ======================================================"
+ sak::feedback::first unc "\[ Syntax \] ======================================================"
+ sak::feedback::first fail "\[ Syntax \] ======================================================"
+ sak::feedback::first warn "\[ Syntax \] ======================================================"
+ sak::feedback::first miss "\[ Syntax \] ======================================================"
+ sak::feedback::first none "\[ Syntax \] ======================================================"
+
+ # Preprocessing of module names to allow better formatting of the
+ # progress output, i.e. vertically aligned columns
+
+ # Per module we can distinguish the following levels of
+ # syntactic completeness and validity.
+
+ # Rule completeness
+ # - No package has pcx rules
+ # - Some, but not all packages have pcx rules
+ # - All packages have pcx rules
+ #
+ # Validity. Not of the pcx rules, but of the files in the
+ # packages.
+ # - Package has errors and warnings
+ # - Package has errors, but no warnings.
+ # - Package has no errors, but warnings.
+ # - Package has neither errors nor warnings.
+
+ # Progress report per module: Modules and packages it is working on.
+ # Summary at module level:
+ # - Number of packages, number of packages with pcx rules
+ # - Number of errors, number of warnings.
+
+ # Full log:
+ # - Lists packages without pcx rules.
+ # - Lists packages with errors/warnings.
+ # - Lists the exact errors/warnings per package, and location.
+
+ # Global preparation: Pull information about all packages and the
+ # modules they belong to.
+
+ Setup
+ Count $modules
+ MapPackages
+
+ InitCounters
+ foreach m $modules {
+ # Skip tcllibc shared library, not a module.
+ if {[string equal $m tcllibc]} continue
+
+ InitModuleCounters
+ !
+ log "@@ Module $m"
+ Head $m
+
+ # Per module: Find all syntax definition (pcx) files inside
+ # and process them. Further find all the Tcl files and process
+ # them as well. We get errors, warnings, and determine the
+ # package(s) they may belong to.
+
+ # Per package: Have they pcx files claiming them? After that,
+ # are pcx files left over (i.e. without a package)?
+
+ ProcessAllPCX $m
+ ProcessPackages $m
+ ProcessUnclaimed
+ ProcessTclSources $m $tclv
+ ModuleSummary
+ }
+
+ Shutdown
+ return
+}
+
+proc ::sak::validate::syntax::summary {} {
+ Summary
+ return
+}
+
+# ###
+
+proc ::sak::validate::syntax::ProcessAllPCX {m} {
+ !claims
+ foreach f [glob -nocomplain [file join [At $m] *.pcx]] {
+ ProcessOnePCX $f
+ }
+ return
+}
+
+proc ::sak::validate::syntax::ProcessOnePCX {f} {
+ =file $f
+
+ if {[catch {
+ Scan [get_input $f]
+ } msg]} {
+ +e $msg
+ } else {
+ +claim $msg
+ }
+
+ return
+}
+
+proc ::sak::validate::syntax::ProcessPackages {m} {
+ !used
+ if {![HasPackages $m]} return
+
+ foreach p [ThePackages $m] {
+ +pkg $p
+ if {[claimants $p]} {
+ +pcx $p
+ } else {
+ nopcx $p
+ }
+ }
+ return
+}
+
+proc ::sak::validate::syntax::ProcessUnclaimed {} {
+ variable claims
+ if {![array size claims]} return
+ foreach p [lsort -dict [array names claims]] {
+ foreach fx $claims($p) { +u $fx }
+ }
+ return
+}
+
+proc ::sak::validate::syntax::ProcessTclSources {m tclv} {
+ variable tclchecker
+ if {![llength $tclchecker]} return
+
+ foreach t [modtclfiles $m] {
+ # Ignore TeX files.
+ if {[string equal [file extension $t] .tex]} continue
+
+ =file $t
+ set cmd [Command $t $tclv]
+ if {[catch {Close [Process [open |$cmd r+]]} msg]} {
+ if {[string match {*child process exited abnormally*} $msg]} continue
+ +e $msg
+ }
+ }
+ return
+}
+
+###
+
+proc ::sak::validate::syntax::Setup {} {
+ variable ip [interp create]
+
+ # Make it mostly empty (We keep the 'set' command).
+
+ foreach n [interp eval $ip [list ::namespace children ::]] {
+ if {[string equal $n ::tcl]} continue
+ interp eval $ip [list namespace delete $n]
+ }
+ foreach c [interp eval $ip [list ::info commands]] {
+ if {[string equal $c set]} continue
+ if {[string equal $c if]} continue
+ if {[string equal $c rename]} continue
+ if {[string equal $c namespace]} continue
+ interp eval $ip [list ::rename $c {}]
+ }
+
+ if {![package vsatisfies [package present Tcl] 8.6]} {
+ interp eval $ip [list ::namespace delete ::tcl]
+ }
+ interp eval $ip [list ::rename namespace {}]
+ interp eval $ip [list ::rename rename {}]
+
+ foreach m {
+ pcx::register unknown
+ } {
+ interp alias $ip $m {} ::sak::validate::syntax::PCX/[string map {:: _} $m] $ip
+ }
+ return
+}
+
+proc ::sak::validate::syntax::Shutdown {} {
+ variable ip
+ interp delete $ip
+ return
+}
+
+proc ::sak::validate::syntax::Scan {data} {
+ variable ip
+ variable pcxpackage
+ while {1} {
+ if {[catch {
+ $ip eval $data
+ } msg]} {
+ if {[string match {can't read "*": no such variable} $msg]} {
+ regexp {can't read "(.*)": no such variable} $msg -> var
+ log "@@ + variable \"$var\""
+ $ip eval [list set $var {}]
+ continue
+ }
+ return -code error $msg
+ }
+ break
+ }
+ return $pcxpackage
+}
+
+proc ::sak::validate::syntax::PCX/pcx_register {ip pkg} {
+ variable pcxpackage $pkg
+ return
+}
+
+proc ::sak::validate::syntax::PCX/unknown {ip args} {
+ return 0
+}
+
+###
+
+proc ::sak::validate::syntax::Process {pipe} {
+ variable current
+ set dst log
+ while {1} {
+ if {[eof $pipe]} break
+ if {[gets $pipe line] < 0} break
+
+ set tline [string trim $line]
+ if {[string equal $tline ""]} continue
+
+ if {[string match scanning:* $tline]} {
+ log $line
+ continue
+ }
+ if {[string match checking:* $tline]} {
+ log $line
+ continue
+ }
+ if {[regexp {^([^:]*):(\d+) \(([^)]*)\) (.*)$} $tline -> path at code detail]} {
+ = "$current $at $code"
+ set dst code,$code
+ if {[IsError $code]} {
+ +e $line
+ } else {
+ +w $line
+ }
+ }
+ log $line $dst
+ }
+ return $pipe
+}
+
+proc ::sak::validate::syntax::IsError {code} {
+ variable codetype
+ variable codec
+ if {[info exists codec($code)]} {
+ return $codec($code)
+ }
+
+ foreach {p t} $codetype {
+ if {![string match $p $code]} continue
+ set codec($code) $t
+ return $t
+ }
+
+ # We assume that codetype contains a default * pattern as the last
+ # entry, capturing all unknown codes.
+ +e INTERNAL
+ exit
+}
+
+proc ::sak::validate::syntax::Command {t tclv} {
+ # Unix. Construction of the pipe to run the tclchecker against a
+ # single tcl file.
+
+ set cmd [Driver $tclv]
+ lappend cmd $t
+
+ #lappend cmd >@ stdout 2>@ stderr
+ #puts <<$cmd>>
+
+ return $cmd
+}
+
+proc ::sak::validate::syntax::Close {pipe} {
+ close $pipe
+ return
+}
+
+proc ::sak::validate::syntax::Driver {tclv} {
+ variable tclchecker
+ set cmd $tclchecker
+
+ if {$tclv ne {}} { lappend cmd -use Tcl-$tclv }
+
+ # Make all syntax definition files we may have available to the
+ # checker for higher accuracy of its output.
+ foreach m [modules] { lappend cmd -pcx [At $m] }
+
+ # Memoize
+ proc ::sak::validate::syntax::Driver {tclv} [list return $cmd]
+ return $cmd
+}
+
+###
+
+proc ::sak::validate::syntax::=file {f} {
+ variable current [file tail $f]
+ = "$current ..."
+ return
+}
+
+###
+
+proc ::sak::validate::syntax::!claims {} {
+ variable claims
+ array unset claims *
+ return
+}
+
+proc ::sak::validate::syntax::+claim {pkg} {
+ variable current
+ variable claims
+ lappend claims($pkg) $current
+ return
+}
+
+proc ::sak::validate::syntax::claimants {pkg} {
+ variable claims
+ expr { [info exists claims($pkg)] && [llength $claims($pkg)] }
+}
+
+
+###
+
+proc ::sak::validate::syntax::!used {} {
+ variable used
+ array unset used *
+ return
+}
+
+proc ::sak::validate::syntax::+use {pkg} {
+ variable used
+ variable claims
+ foreach fx $claims($pkg) { set used($fx) . }
+ unset claims($pkg)
+ return
+}
+
+###
+
+proc ::sak::validate::syntax::MapPackages {} {
+ variable pkg
+ array unset pkg *
+
+ !
+ += Package
+ foreach {pname pdata} [ipackages] {
+ = "$pname ..."
+ foreach {pver pmodule} $pdata break
+ lappend pkg($pmodule) $pname
+ }
+ !
+ =| {Packages mapped ...}
+ return
+}
+
+proc ::sak::validate::syntax::HasPackages {m} {
+ variable pkg
+ expr { [info exists pkg($m)] && [llength $pkg($m)] }
+}
+
+proc ::sak::validate::syntax::ThePackages {m} {
+ variable pkg
+ return [lsort -dict $pkg($m)]
+}
+
+###
+
+proc ::sak::validate::syntax::+pkg {pkg} {
+ variable mtotal ; incr mtotal
+ variable total ; incr total
+ return
+}
+
+proc ::sak::validate::syntax::+pcx {pkg} {
+ variable mhavepcx ; incr mhavepcx
+ variable havepcx ; incr havepcx
+ = "$pkg Ok"
+ +use $pkg
+ return
+}
+
+proc ::sak::validate::syntax::nopcx {pkg} {
+ = "$pkg Bad"
+ log "@@ WARN No syntax definition: $pkg"
+ return
+}
+
+###
+
+proc ::sak::validate::syntax::+w {msg} {
+ variable mwarnings ; incr mwarnings
+ variable warnings ; incr warnings
+ variable current
+ foreach {a b c} [split $msg \n] break
+ log "@@ WARN $current: [Trim $a] [Trim $b] [Trim $c]"
+ return
+}
+
+proc ::sak::validate::syntax::+e {msg} {
+ variable merrors ; incr merrors
+ variable errors ; incr errors
+ variable current
+ log "@@ ERROR $current $msg"
+ return
+}
+
+proc ::sak::validate::syntax::+u {f} {
+ variable used
+ if {[info exists used($f)]} return
+ variable munclaimed ; incr munclaimed
+ variable unclaimed ; incr unclaimed
+ set used($f) .
+ log "@@ WARN Unclaimed syntax definition file: $f"
+ return
+}
+
+###
+
+proc ::sak::validate::syntax::Count {modules} {
+ variable maxml 0
+ !
+ foreach m [linsert $modules 0 Module] {
+ = "M $m"
+ set l [string length $m]
+ if {$l > $maxml} {set maxml $l}
+ }
+ =| "Validate syntax (code, and API definitions) ..."
+ return
+}
+
+proc ::sak::validate::syntax::Head {m} {
+ variable maxml
+ += ${m}[blank [expr {$maxml - [string length $m]}]]
+ return
+}
+
+###
+
+proc ::sak::validate::syntax::InitModuleCounters {} {
+ variable mtotal 0
+ variable mhavepcx 0
+ variable munclaimed 0
+ variable merrors 0
+ variable mwarnings 0
+ return
+}
+
+proc ::sak::validate::syntax::ModuleSummary {} {
+ variable mtotal
+ variable mhavepcx
+ variable munclaimed
+ variable merrors
+ variable mwarnings
+ variable tclchecker
+
+ set complete [F $mhavepcx]/[F $mtotal]
+ set not "! [F [expr {$mtotal - $mhavepcx}]]"
+ set err "E [F $merrors]"
+ set warn "W [F $mwarnings]"
+ set unc "U [F $munclaimed]"
+
+ if {$munclaimed} {
+ set unc [=cya $unc]
+ >> unc
+ }
+ if {!$mhavepcx && $mtotal} {
+ set complete [=red $complete]
+ set not [=red $not]
+ >> none
+ } elseif {$mhavepcx < $mtotal} {
+ set complete [=yel $complete]
+ set not [=yel $not]
+ >> miss
+ }
+ if {[llength $tclchecker]} {
+ if {$merrors} {
+ set err " [=red $err]"
+ set warn " [=yel $warn]"
+ >> fail
+ } elseif {$mwarnings} {
+ set err " $err"
+ set warn " [=yel $warn]"
+ >> warn
+ } else {
+ set err " $err"
+ set warn " $warn"
+ }
+ } else {
+ set err ""
+ set warn ""
+ }
+
+ =| "~~ $complete $not $unc$err$warn"
+ return
+}
+
+###
+
+proc ::sak::validate::syntax::InitCounters {} {
+ variable total 0
+ variable havepcx 0
+ variable unclaimed 0
+ variable errors 0
+ variable warnings 0
+ return
+}
+
+proc ::sak::validate::syntax::Summary {} {
+ variable total
+ variable havepcx
+ variable unclaimed
+ variable errors
+ variable warnings
+ variable tclchecker
+
+ set tot [F $total]
+ set doc [F $havepcx]
+ set udc [F [expr {$total - $havepcx}]]
+
+ set unc [F $unclaimed]
+ set per [format %6.2f [expr {$havepcx*100./$total}]]
+ set uper [format %6.2f [expr {($total - $havepcx)*100./$total}]]
+ set err [F $errors]
+ set wrn [F $warnings]
+
+ if {$errors} { set err [=red $err] }
+ if {$warnings} { set wrn [=yel $wrn] }
+ if {$unclaimed} { set unc [=cya $unc] }
+
+ if {!$havepcx && $total} {
+ set doc [=red $doc]
+ set udc [=red $udc]
+ } elseif {$havepcx < $total} {
+ set doc [=yel $doc]
+ set udc [=yel $udc]
+ }
+
+ if {[llength $tclchecker]} {
+ set sfx " ($tclchecker)"
+ } else {
+ set sfx " ([=cya {No tclchecker available}])"
+ }
+
+ sum ""
+ sum "Syntax statistics$sfx"
+ sum "#Packages: $tot"
+ sum "#Syntax def: $doc (${per}%)"
+ sum "#No syntax: $udc (${uper}%)"
+ sum "#Unclaimed: $unc"
+ if {[llength $tclchecker]} {
+ sum "#Errors: $err"
+ sum "#Warnings: $wrn"
+ }
+ return
+}
+
+###
+
+proc ::sak::validate::syntax::F {n} { format %6d $n }
+
+proc ::sak::validate::syntax::Trim {text} {
+ regsub {^[^:]*:} $text {} text
+ return [string trim $text]
+}
+
+###
+
+proc ::sak::validate::syntax::At {m} {
+ global distribution
+ return [file join $distribution modules $m]
+}
+
+# ###
+
+namespace eval ::sak::validate::syntax {
+ # Max length of module names and patchlevel information.
+ variable maxml 0
+
+ # Counters across all modules
+ variable total 0 ; # Number of packages overall.
+ variable havepcx 0 ; # Number of packages with syntax definition (pcx) files.
+ variable unclaimed 0 ; # Number of PCX files not claimed by a specific package.
+ variable errors 0 ; # Number of errors found in all code.
+ variable warnings 0 ; # Number of warnings found in all code.
+
+ # Same counters, per module.
+ variable mtotal 0
+ variable mhavepcx 0
+ variable munclaimed 0
+ variable merrors 0
+ variable mwarnings 0
+
+ # Name of currently processed syntax definition or code file
+ variable current ""
+
+ # Map from packages to files claiming to define the syntax of their API.
+ variable claims
+ array set claims {}
+
+ # Set of files taken by packages, as array
+ variable used
+ array set used {}
+
+ # Map from modules to packages contained in them
+ variable pkg
+ array set pkg {}
+
+ # Transient storage used while collecting packages per syntax definition.
+ variable pcxpackage {}
+ variable ip {}
+
+ # Location of the tclchecker used to perform syntactic validation.
+ variable tclchecker [auto_execok tclchecker]
+
+ # Patterns for separation of errors from warnings
+ variable codetype {
+ warn* 0
+ nonPort* 0
+ pkgUnchecked 0
+ pkgVConflict 0
+ * 1
+ }
+ variable codec ; array set codec {}
+}
+
+##
+# ###
+
+package provide sak::validate::syntax 1.0
diff --git a/tcllib/support/devel/sak/validate/testsuites.tcl b/tcllib/support/devel/sak/validate/testsuites.tcl
new file mode 100644
index 0000000..71ea694
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/testsuites.tcl
@@ -0,0 +1,512 @@
+# -*- tcl -*-
+# (C) 2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require sak::animate
+package require sak::feedback
+package require sak::color
+
+getpackage textutil::repeat textutil/repeat.tcl
+getpackage interp interp/interp.tcl
+
+namespace eval ::sak::validate::testsuites {
+ namespace import ::textutil::repeat::blank
+ namespace import ::sak::color::*
+ namespace import ::sak::feedback::!
+ namespace import ::sak::feedback::>>
+ namespace import ::sak::feedback::+=
+ namespace import ::sak::feedback::=
+ namespace import ::sak::feedback::=|
+ namespace import ::sak::feedback::log
+ namespace import ::sak::feedback::summary
+ rename summary sum
+}
+
+# ###
+
+proc ::sak::validate::testsuites {modules mode stem tclv} {
+ testsuites::run $modules $mode $stem $tclv
+ testsuites::summary
+ return
+}
+
+proc ::sak::validate::testsuites::run {modules mode stem tclv} {
+ sak::feedback::init $mode $stem
+ sak::feedback::first log "\[ Testsuites \] =================================================="
+ sak::feedback::first unc "\[ Testsuites \] =================================================="
+ sak::feedback::first fail "\[ Testsuites \] =================================================="
+ sak::feedback::first miss "\[ Testsuites \] =================================================="
+ sak::feedback::first none "\[ Testsuites \] =================================================="
+
+ # Preprocessing of module names to allow better formatting of the
+ # progress output, i.e. vertically aligned columns
+
+ # Per module we can distinguish the following levels of
+ # testsuite completeness:
+ # - No package has a testsuite
+ # - Some, but not all packages have a testsuite
+ # - All packages have a testsuite.
+ #
+ # Validity of the testsuites is not done here. It requires
+ # execution, see 'sak test run ...'.
+
+ # Progress report per module: Packages it is working on.
+ # Summary at module level:
+ # - Number of packages, number of packages with testsuites,
+
+ # Full log:
+ # - Lists packages without testsuites.
+
+ # Global preparation: Pull information about all packages and the
+ # modules they belong to.
+
+ Setup
+ Count $modules
+ MapPackages
+
+ InitCounters
+ foreach m $modules {
+ # Skip tcllibc shared library, not a module.
+ if {[string equal $m tcllibc]} continue
+
+ InitModuleCounters
+ !
+ log "@@ Module $m"
+ Head $m
+
+ # Per module: Find all testsuites in the module and process
+ # them. We determine the package(s) they may belong to.
+
+ # Per package: Have they .test files claiming them? After
+ # that, are .test files left over (i.e. without a package)?
+
+ ProcessTestsuites $m
+ ProcessPackages $m
+ ProcessUnclaimed
+ ModuleSummary
+ }
+
+ Shutdown
+ return
+}
+
+proc ::sak::validate::testsuites::summary {} {
+ Summary
+ return
+}
+
+# ###
+
+proc ::sak::validate::testsuites::ProcessTestsuites {m} {
+ !claims
+ foreach f [glob -nocomplain [file join [At $m] *.test]] {
+ ProcessTestsuite $f
+ }
+ return
+}
+
+proc ::sak::validate::testsuites::ProcessTestsuite {f} {
+ variable testing
+ =file $f
+
+ if {[catch {
+ Scan [get_input $f]
+ } msg]} {
+ +e $msg
+ } else {
+ foreach p $testing { +claim $p }
+ }
+
+
+ return
+}
+
+proc ::sak::validate::testsuites::Setup {} {
+ variable ip [interp create]
+
+ # Make it mostly empty (We keep the 'set' command).
+
+ foreach n [interp eval $ip [list ::namespace children ::]] {
+ if {[string equal $n ::tcl]} continue
+ interp eval $ip [list namespace delete $n]
+ }
+ foreach c [interp eval $ip [list ::info commands]] {
+ if {[string equal $c set]} continue
+ if {[string equal $c if]} continue
+ if {[string equal $c rename]} continue
+ if {[string equal $c namespace]} continue
+ interp eval $ip [list ::rename $c {}]
+ }
+
+ if {![package vsatisfies [package present Tcl] 8.6]} {
+ interp eval $ip [list ::namespace delete ::tcl]
+ }
+ interp eval $ip [list ::rename namespace {}]
+ interp eval $ip [list ::rename rename {}]
+
+ foreach m {
+ testing unknown useLocal useLocalKeep useAccel
+ } {
+ interp alias $ip $m {} ::sak::validate::testsuites::Process/$m $ip
+ }
+ return
+}
+
+proc ::sak::validate::testsuites::Shutdown {} {
+ variable ip
+ interp delete $ip
+ return
+}
+
+proc ::sak::validate::testsuites::Scan {data} {
+ variable ip
+ while {1} {
+ if {[catch {
+ $ip eval $data
+ } msg]} {
+ if {[string match {can't read "*": no such variable} $msg]} {
+ regexp {can't read "(.*)": no such variable} $msg -> var
+ log "@@ + variable \"$var\""
+ $ip eval [list set $var {}]
+ continue
+ }
+ return -code error $msg
+ }
+ break
+ }
+ return
+}
+
+proc ::sak::validate::testsuites::Process/useTcllibC {ip args} {
+ return 0
+}
+
+proc ::sak::validate::testsuites::Process/unknown {ip args} {
+ return 0
+}
+
+proc ::sak::validate::testsuites::Process/testing {ip script} {
+ variable testing {}
+ $ip eval $script
+ return -code return
+}
+
+proc ::sak::validate::testsuites::Process/useLocal {ip f p args} {
+ variable testing
+ lappend testing $p
+ return
+}
+
+proc ::sak::validate::testsuites::Process/useLocalKeep {ip f p args} {
+ variable testing
+ lappend testing $p
+ return
+}
+
+proc ::sak::validate::testsuites::Process/useAccel {ip _ f p} {
+ variable testing
+ lappend testing $p
+ return
+}
+
+proc ::sak::validate::testsuites::ProcessPackages {m} {
+ !used
+ if {![HasPackages $m]} return
+
+ foreach p [ThePackages $m] {
+ +pkg $p
+ if {[claimants $p]} {
+ +tests $p
+ } else {
+ notests $p
+ }
+ }
+ return
+}
+
+proc ::sak::validate::testsuites::ProcessUnclaimed {} {
+ variable claims
+ if {![array size claims]} return
+ foreach p [lsort -dict [array names claims]] {
+ foreach fx $claims($p) { +u $fx }
+ }
+ return
+}
+
+###
+
+proc ::sak::validate::testsuites::=file {f} {
+ variable current [file tail $f]
+ = "$current ..."
+ return
+}
+
+###
+
+proc ::sak::validate::testsuites::!claims {} {
+ variable claims
+ array unset claims *
+ return
+}
+
+proc ::sak::validate::testsuites::+claim {pkg} {
+ variable current
+ variable claims
+ lappend claims($pkg) $current
+ return
+}
+
+proc ::sak::validate::testsuites::claimants {pkg} {
+ variable claims
+ expr { [info exists claims($pkg)] && [llength $claims($pkg)] }
+}
+
+
+###
+
+proc ::sak::validate::testsuites::!used {} {
+ variable used
+ array unset used *
+ return
+}
+
+proc ::sak::validate::testsuites::+use {pkg} {
+ variable used
+ variable claims
+ foreach fx $claims($pkg) { set used($fx) . }
+ unset claims($pkg)
+ return
+}
+
+###
+
+proc ::sak::validate::testsuites::MapPackages {} {
+ variable pkg
+ array unset pkg *
+
+ !
+ += Package
+ foreach {pname pdata} [ipackages] {
+ = "$pname ..."
+ foreach {pver pmodule} $pdata break
+ lappend pkg($pmodule) $pname
+ }
+ !
+ =| {Packages mapped ...}
+ return
+}
+
+proc ::sak::validate::testsuites::HasPackages {m} {
+ variable pkg
+ expr { [info exists pkg($m)] && [llength $pkg($m)] }
+}
+
+proc ::sak::validate::testsuites::ThePackages {m} {
+ variable pkg
+ return [lsort -dict $pkg($m)]
+}
+
+###
+
+proc ::sak::validate::testsuites::+pkg {pkg} {
+ variable mtotal ; incr mtotal
+ variable total ; incr total
+ return
+}
+
+proc ::sak::validate::testsuites::+tests {pkg} {
+ variable mhavetests ; incr mhavetests
+ variable havetests ; incr havetests
+ = "$pkg Ok"
+ +use $pkg
+ return
+}
+
+proc ::sak::validate::testsuites::notests {pkg} {
+ = "$pkg Bad"
+ log "@@ WARN No testsuite: $pkg"
+ return
+}
+
+###
+
+proc ::sak::validate::testsuites::+e {msg} {
+ variable merrors ; incr merrors
+ variable errors ; incr errors
+ variable current
+ log "@@ ERROR $current $msg"
+ return
+}
+
+proc ::sak::validate::testsuites::+u {f} {
+ variable used
+ if {[info exists used($f)]} return
+ variable munclaimed ; incr munclaimed
+ variable unclaimed ; incr unclaimed
+ set used($f) .
+ log "@@ NOTE Unclaimed testsuite $f"
+ return
+}
+
+###
+
+proc ::sak::validate::testsuites::Count {modules} {
+ variable maxml 0
+ !
+ foreach m [linsert $modules 0 Module] {
+ = "M $m"
+ set l [string length $m]
+ if {$l > $maxml} {set maxml $l}
+ }
+ =| "Validate testsuites (existence) ..."
+ return
+}
+
+proc ::sak::validate::testsuites::Head {m} {
+ variable maxml
+ += ${m}[blank [expr {$maxml - [string length $m]}]]
+ return
+}
+
+###
+
+proc ::sak::validate::testsuites::InitModuleCounters {} {
+ variable mtotal 0
+ variable mhavetests 0
+ variable munclaimed 0
+ variable merrors 0
+ return
+}
+
+proc ::sak::validate::testsuites::ModuleSummary {} {
+ variable mtotal
+ variable mhavetests
+ variable munclaimed
+ variable merrors
+
+ set complete [F $mhavetests]/[F $mtotal]
+ set not "! [F [expr {$mtotal - $mhavetests}]]"
+ set err "E [F $merrors]"
+ set unc "U [F $munclaimed]"
+
+ if {$munclaimed} {
+ set unc [=cya $unc]
+ >> unc
+ }
+ if {!$mhavetests && $mtotal} {
+ set complete [=red $complete]
+ set not [=red $not]
+ >> none
+ } elseif {$mhavetests < $mtotal} {
+ set complete [=yel $complete]
+ set not [=yel $not]
+ >> miss
+ }
+ if {$merrors} {
+ set err [red]$err[rst]
+ >> fail
+ }
+
+ =| "~~ $complete $not $unc $err"
+ return
+}
+
+###
+
+proc ::sak::validate::testsuites::InitCounters {} {
+ variable total 0
+ variable havetests 0
+ variable unclaimed 0
+ variable errors 0
+ return
+}
+
+proc ::sak::validate::testsuites::Summary {} {
+ variable total
+ variable havetests
+ variable unclaimed
+ variable errors
+
+ set tot [F $total]
+ set tst [F $havetests]
+ set uts [F [expr {$total - $havetests}]]
+ set unc [F $unclaimed]
+ set per [format %6.2f [expr {$havetests*100./$total}]]
+ set uper [format %6.2f [expr {($total - $havetests)*100./$total}]]
+ set err [F $errors]
+
+ if {$errors} { set err [=red $err] }
+ if {$unclaimed} { set unc [=cya $unc] }
+
+ if {!$havetests && $total} {
+ set tst [=red $tst]
+ set uts [=red $uts]
+ } elseif {$havetests < $total} {
+ set tst [=yel $tst]
+ set uts [=yel $uts]
+ }
+
+ sum ""
+ sum "Testsuite statistics"
+ sum "#Packages: $tot"
+ sum "#Tested: $tst (${per}%)"
+ sum "#Untested: $uts (${uper}%)"
+ sum "#Unclaimed: $unc"
+ sum "#Errors: $err"
+ return
+}
+
+###
+
+proc ::sak::validate::testsuites::F {n} { format %6d $n }
+
+###
+
+proc ::sak::validate::testsuites::At {m} {
+ global distribution
+ return [file join $distribution modules $m]
+}
+
+# ###
+
+namespace eval ::sak::validate::testsuites {
+ # Max length of module names and patchlevel information.
+ variable maxml 0
+
+ # Counters across all modules
+ variable total 0 ; # Number of packages overall.
+ variable havetests 0 ; # Number of packages with testsuites.
+ variable unclaimed 0 ; # Number of testsuites not claimed by a specific package.
+ variable errors 0 ; # Number of errors found with all testsuites.
+
+ # Same counters, per module.
+ variable mtotal 0
+ variable mhavetests 0
+ variable munclaimed 0
+ variable merrors 0
+
+ # Name of currently processed testsuite
+ variable current ""
+
+ # Map from packages to files claiming to test them.
+ variable claims
+ array set claims {}
+
+ # Set of files taken by packages, as array
+ variable used
+ array set used {}
+
+ # Map from modules to packages contained in them
+ variable pkg
+ array set pkg {}
+
+ # Transient storage used while collecting packages per testsuite.
+ variable testing {}
+ variable ip {}
+}
+
+##
+# ###
+
+package provide sak::validate::testsuites 1.0
diff --git a/tcllib/support/devel/sak/validate/topic.txt b/tcllib/support/devel/sak/validate/topic.txt
new file mode 100644
index 0000000..1ddc79b
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/topic.txt
@@ -0,0 +1 @@
+validate Validate modules and packages
diff --git a/tcllib/support/devel/sak/validate/validate.tcl b/tcllib/support/devel/sak/validate/validate.tcl
new file mode 100644
index 0000000..1901deb
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/validate.tcl
@@ -0,0 +1,37 @@
+# -*- tcl -*-
+# (C) 2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+namespace eval ::sak::validate {}
+
+# ###
+
+proc ::sak::validate::usage {args} {
+ package require sak::help
+ puts stdout [join $args { }]\n[sak::help::on validate]
+ exit 1
+}
+
+proc ::sak::validate::all {modules mode stem tclv} {
+ package require sak::validate::versions
+ package require sak::validate::manpages
+ package require sak::validate::testsuites
+ package require sak::validate::syntax
+
+ sak::validate::versions::run $modules $mode $stem $tclv
+ sak::validate::manpages::run $modules $mode $stem $tclv
+ sak::validate::testsuites::run $modules $mode $stem $tclv
+ sak::validate::syntax::run $modules $mode $stem $tclv
+
+ sak::validate::versions::summary
+ sak::validate::manpages::summary
+ sak::validate::testsuites::summary
+ sak::validate::syntax::summary
+ return
+}
+
+##
+# ###
+
+package provide sak::validate 1.0
diff --git a/tcllib/support/devel/sak/validate/versions.tcl b/tcllib/support/devel/sak/validate/versions.tcl
new file mode 100644
index 0000000..4d622ae
--- /dev/null
+++ b/tcllib/support/devel/sak/validate/versions.tcl
@@ -0,0 +1,258 @@
+# -*- tcl -*-
+# (C) 2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
+##
+# ###
+
+package require sak::animate
+package require sak::feedback
+package require sak::color
+
+getpackage textutil::repeat textutil/repeat.tcl
+getpackage interp interp/interp.tcl
+getpackage struct::set struct/sets.tcl
+getpackage struct::list struct/list.tcl
+
+namespace eval ::sak::validate::versions {
+ namespace import ::textutil::repeat::blank
+ namespace import ::sak::color::*
+ namespace import ::sak::feedback::!
+ namespace import ::sak::feedback::>>
+ namespace import ::sak::feedback::+=
+ namespace import ::sak::feedback::=
+ namespace import ::sak::feedback::=|
+ namespace import ::sak::feedback::log
+ namespace import ::sak::feedback::summary
+ rename summary sum
+}
+
+# ###
+
+proc ::sak::validate::versions {modules mode stem tclv} {
+ versions::run $modules $mode $stem $tclv
+ versions::summary
+ return
+}
+
+proc ::sak::validate::versions::run {modules mode stem tclv} {
+ sak::feedback::init $mode $stem
+ sak::feedback::first log "\[ Versions \] ===================================================="
+ sak::feedback::first warn "\[ Versions \] ===================================================="
+ sak::feedback::first fail "\[ Versions \] ===================================================="
+
+ # Preprocessing of module names to allow better formatting of the
+ # progress output, i.e. vertically aligned columns
+
+ # Per module
+ # - List modules without package index (error)
+ # - List packages provided missing from pkgIndex.tcl
+ # - List packages in the pkgIndex.tcl, but not provided.
+ # - List packages where provided and indexed versions differ.
+
+ Count $modules
+ MapPackages
+
+ InitCounters
+ foreach m $modules {
+ # Skip tcllibc shared library, not a module.
+ if {[string equal $m tcllibc]} continue
+
+ InitModuleCounters
+ !
+ log "@@ Module $m"
+ Head $m
+
+ if {![llength [glob -nocomplain [file join [At $m] pkgIndex.tcl]]]} {
+ +e "No package index"
+ } else {
+ # Compare package provided to ifneeded.
+
+ struct::list assign \
+ [struct::set intersect3 [Indexed $m] [Provided $m]] \
+ compare only_indexed only_provided
+
+ foreach p [lsort -dict $only_indexed ] { +w "Indexed/No Provider: $p" }
+ foreach p [lsort -dict $only_provided] { +w "Provided/Not Indexed: $p" }
+
+ foreach p [lsort -dict $compare] {
+ set iv [IndexedVersions $m $p]
+ set pv [ProvidedVersions $m $p]
+ if {[struct::set equal $iv $pv]} continue
+
+ struct::list assign \
+ [struct::set intersect3 $pv $iv] \
+ __ pmi imp
+
+ +w "Indexed </> Provided: $p \[<$imp </> $pmi\]"
+ }
+ }
+ ModuleSummary
+ }
+ return
+}
+
+proc ::sak::validate::versions::summary {} {
+ Summary
+ return
+}
+
+# ###
+
+proc ::sak::validate::versions::MapPackages {} {
+ variable pkg
+ array unset pkg *
+
+ !
+ += Package
+ foreach {pname pdata} [ipackages] {
+ = "$pname ..."
+ foreach {pvlist pmodule} $pdata break
+ lappend pkg(mi,$pmodule) $pname
+ lappend pkg(vi,$pmodule,$pname) $pvlist
+
+ foreach {pname pvlist} [ppackages $pmodule] {
+ lappend pkg(mp,$pmodule) $pname
+ lappend pkg(vp,$pmodule,$pname) $pvlist
+ }
+ }
+ !
+ =| {Packages mapped ...}
+ return
+}
+
+proc ::sak::validate::versions::Provided {m} {
+ variable pkg
+ if {![info exists pkg(mp,$m)]} { return {} }
+ return [lsort -dict $pkg(mp,$m)]
+}
+
+proc ::sak::validate::versions::Indexed {m} {
+ variable pkg
+ if {![info exists pkg(mi,$m)]} { return {} }
+ return [lsort -dict $pkg(mi,$m)]
+}
+
+proc ::sak::validate::versions::ProvidedVersions {m p} {
+ variable pkg
+ return [lsort -dict $pkg(vp,$m,$p)]
+}
+
+proc ::sak::validate::versions::IndexedVersions {m p} {
+ variable pkg
+ return [lsort -dict $pkg(vi,$m,$p)]
+}
+
+###
+
+proc ::sak::validate::versions::+e {msg} {
+ variable merrors ; incr merrors
+ variable errors ; incr errors
+ log "@@ ERROR $msg"
+ return
+}
+
+proc ::sak::validate::versions::+w {msg} {
+ variable mwarnings ; incr mwarnings
+ variable warnings ; incr warnings
+ log "@@ WARN $msg"
+ return
+}
+
+proc ::sak::validate::versions::Count {modules} {
+ variable maxml 0
+ !
+ foreach m [linsert $modules 0 Module] {
+ = "M $m"
+ set l [string length $m]
+ if {$l > $maxml} {set maxml $l}
+ }
+ =| "Validate versions (indexed vs. provided) ..."
+ return
+}
+
+proc ::sak::validate::versions::Head {m} {
+ variable maxml
+ += ${m}[blank [expr {$maxml - [string length $m]}]]
+ return
+}
+
+###
+
+proc ::sak::validate::versions::InitModuleCounters {} {
+ variable merrors 0
+ variable mwarnings 0
+ return
+}
+
+proc ::sak::validate::versions::ModuleSummary {} {
+ variable merrors
+ variable mwarnings
+
+ set err "E [F $merrors]"
+ set wrn "W [F $mwarnings]"
+
+ if {$mwarnings} { set wrn [=yel $wrn] ; >> warn }
+ if {$merrors} { set err [=red $err] ; >> fail }
+
+ =| "~~ $err $wrn"
+ return
+}
+
+###
+
+proc ::sak::validate::versions::InitCounters {} {
+ variable errors 0
+ variable warnings 0
+ return
+}
+
+proc ::sak::validate::versions::Summary {} {
+ variable errors
+ variable warnings
+
+ set err [F $errors]
+ set wrn [F $warnings]
+
+ if {$errors} { set err [=red $err] }
+ if {$warnings} { set wrn [=yel $wrn] }
+
+ sum ""
+ sum "Versions statistics"
+ sum "#Errors: $err"
+ sum "#Warnings: $wrn"
+ return
+}
+
+###
+
+proc ::sak::validate::versions::F {n} { format %6d $n }
+
+###
+
+proc ::sak::validate::versions::At {m} {
+ global distribution
+ return [file join $distribution modules $m]
+}
+
+# ###
+
+namespace eval ::sak::validate::versions {
+ # Max length of module names and patchlevel information.
+ variable maxml 0
+
+ # Counters across all modules
+ variable errors 0 ; # Number of errors found (= modules without pkg index)
+ variable warnings 0 ; # Number of warings
+
+ # Same counters, per module.
+ variable merrors 0
+ variable mwarnings 0
+
+ # Map from modules to packages and their versions.
+ variable pkg
+ array set pkg {}
+}
+
+##
+# ###
+
+package provide sak::validate::versions 1.0