ADDED embedded/index.md
Index: embedded/index.md
==================================================================
--- /dev/null
+++ embedded/index.md
@@ -0,0 +1,59 @@
+
+
+
Tcl Library Source Code
+
+
+Packages
+- [Table Of Contents](md/toc.md)
+- [Keyword Index](md/index.md)
+
+
+
+
+
+
+## Discussion & Contact
+
+Tcllib has two
+[mailing lists](https://sourceforge.net/p/tcllib/mailman/).
+
+One for notifications (commits, ticket changes), the other for general
+discussion. These are managed at SourceForge, at the aforementioned
+link. A few direct links for various topics:
+
+|tcllib-bugs| : |[Subscribe](https://lists.sourceforge.net/lists/listinfo/tcllib-bugs) [Archive](https://sourceforge.net/p/tcllib/mailman/tcllib-bugs) [Search](https://sourceforge.net/p/tcllib/mailman/search/?mail_list=tcllib-bugs)|
+|tcllib-devel| : |[Subscribe](https://lists.sourceforge.net/lists/listinfo/tcllib-devel) [Archive](https://sourceforge.net/p/tcllib/mailman/tcllib-devel) [Search](https://sourceforge.net/p/tcllib/mailman/search/?mail_list=tcllib-devel)|
+
+## Feedback
+
+Please go to and use our
+[Local Trackers](../../../reportlist).
+They are for
+
+ * Bugs,
+ * Patches, and
+ * Ideas & Feature Requests.
+
+## Releases
+
+ * [Current](../../../technote/0b2528ed32f54c4a8f08951aaa11ff60b3843630) __1.19 (Feb 16, 2018)__
+ * [Past Releases](../../../wiki?name=Past+Releases)
+ * [Development Snapshots](../../../wiki?name=Development+Snapshots)
+ * [@ SourceForge](https://sourceforge.net/projects/tcllib/files/)
+
+## Related Repositories
+
+ * [Tklib](../../../../tklib)
+ * [Tcl Apps](../../../../tclapps)
+ * [Tcl Bench](../../../../tclbench)
+ * [Multicolumn Listbox](../../../../mclistbox)
+ * [Widget](../../../../widget)
+ * [BWidget](../../../../bwidget)
+
+
+## See also
+
+ * [Landing page for this package at the Tcl Developer eXchange](http://www.tcl.tk/software/tcllib/)
ADDED embedded/md/image/arch_core_container.png
Index: embedded/md/image/arch_core_container.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_core_container.png
cannot compute difference between binary files
ADDED embedded/md/image/arch_core_eplugins.png
Index: embedded/md/image/arch_core_eplugins.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_core_eplugins.png
cannot compute difference between binary files
ADDED embedded/md/image/arch_core_export.png
Index: embedded/md/image/arch_core_export.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_core_export.png
cannot compute difference between binary files
ADDED embedded/md/image/arch_core_import.png
Index: embedded/md/image/arch_core_import.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_core_import.png
cannot compute difference between binary files
ADDED embedded/md/image/arch_core_iplugins.png
Index: embedded/md/image/arch_core_iplugins.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_core_iplugins.png
cannot compute difference between binary files
ADDED embedded/md/image/arch_core_support.png
Index: embedded/md/image/arch_core_support.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_core_support.png
cannot compute difference between binary files
ADDED embedded/md/image/arch_core_transform.png
Index: embedded/md/image/arch_core_transform.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_core_transform.png
cannot compute difference between binary files
ADDED embedded/md/image/arch_user_app.png
Index: embedded/md/image/arch_user_app.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_user_app.png
cannot compute difference between binary files
ADDED embedded/md/image/arch_user_pkg.png
Index: embedded/md/image/arch_user_pkg.png
==================================================================
--- /dev/null
+++ embedded/md/image/arch_user_pkg.png
cannot compute difference between binary files
ADDED embedded/md/image/architecture.png
Index: embedded/md/image/architecture.png
==================================================================
--- /dev/null
+++ embedded/md/image/architecture.png
cannot compute difference between binary files
ADDED embedded/md/image/expr_ast.png
Index: embedded/md/image/expr_ast.png
==================================================================
--- /dev/null
+++ embedded/md/image/expr_ast.png
cannot compute difference between binary files
ADDED embedded/md/image/flow.png
Index: embedded/md/image/flow.png
==================================================================
--- /dev/null
+++ embedded/md/image/flow.png
cannot compute difference between binary files
ADDED embedded/md/image/gen_options.png
Index: embedded/md/image/gen_options.png
==================================================================
--- /dev/null
+++ embedded/md/image/gen_options.png
cannot compute difference between binary files
ADDED embedded/md/index.md
Index: embedded/md/index.md
==================================================================
--- /dev/null
+++ embedded/md/index.md
@@ -0,0 +1,1023 @@
+
+[//000000001]: # (Index generated by tcllib/doctools/idx with format 'markdown')
+
+# Keyword Index
+
+----
+
+[3](#c3) · [A](#cA) · [B](#cB) · [C](#cC) · [D](#cD) · [E](#cE) · [F](#cF) · [G](#cG) · [H](#cH) · [I](#cI) · [J](#cJ) · [K](#cK) · [L](#cL) · [M](#cM) · [N](#cN) · [O](#cO) · [P](#cP) · [Q](#cQ) · [R](#cR) · [S](#cS) · [T](#cT) · [U](#cU) · [V](#cV) · [W](#cW) · [X](#cX) · [Y](#cY) · [Z](#cZ)
+
+----
+
+####
Keywords: 3
+
+|||
+|---|---|
+|
3DES|[des](tcllib/files/modules/des/des\.md) · [tclDES](tcllib/files/modules/des/tcldes\.md) · [tclDESjr](tcllib/files/modules/des/tcldesjr\.md)|
+
+
+####
Keywords: A
+
+|||
+|---|---|
+|
abstract syntax tree|[grammar::me::util](tcllib/files/modules/grammar\_me/me\_util\.md) · [grammar::me\_ast](tcllib/files/modules/grammar\_me/me\_ast\.md)|
+|
acceptance|[grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md)|
+|
acceptor|[grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md)|
+|
active|[transfer::connect](tcllib/files/modules/transfer/connect\.md)|
+|
adaptors|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md)|
+|
adjacency list|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
adjacency matrix|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
adjacent|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
adjusting|[textutil::adjust](tcllib/files/modules/textutil/adjust\.md)|
+|
adler32|[tcl::transform::adler32](tcllib/files/modules/virtchannel\_transform/adler32\.md)|
+|
aes|[aes](tcllib/files/modules/aes/aes\.md)|
+|
after|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
alias|[interp](tcllib/files/modules/interp/tcllib\_interp\.md)|
+|
amazon|[S3](tcllib/files/modules/amazon\-s3/S3\.md)|
+|
ambiguous|[grammar::aycock](tcllib/files/modules/grammar\_aycock/aycock\.md)|
+|
American Express|[valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md)|
+|
AMEX|[valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md)|
+|
angle|[math::geometry](tcllib/files/modules/math/math\_geometry\.md) · [units](tcllib/files/modules/units/units\.md)|
+|
anonymous procedure|[lambda](tcllib/files/modules/lambda/lambda\.md)|
+|
ansi|[term::ansi::code::attr](tcllib/files/modules/term/ansi\_cattr\.md) · [term::ansi::code::ctrl](tcllib/files/modules/term/ansi\_cctrl\.md) · [term::ansi::code::macros](tcllib/files/modules/term/ansi\_cmacros\.md) · [term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md)|
+|
appender|[logger::appender](tcllib/files/modules/log/loggerAppender\.md) · [logger::utils](tcllib/files/modules/log/loggerUtils\.md)|
+|
application|[nns](tcllib/files/apps/nns\.md) · [nnsd](tcllib/files/apps/nnsd\.md) · [nnslog](tcllib/files/apps/nnslog\.md)|
+|
approximation algorithm|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
arc|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
arcfour|[rc4](tcllib/files/modules/rc4/rc4\.md)|
+|
archive|[tar](tcllib/files/modules/tar/tar\.md)|
+|
argument integrity|[tepam](tcllib/files/modules/tepam/tepam\_introduction\.md) · [tepam::procedure](tcllib/files/modules/tepam/tepam\_procedure\.md)|
+|
argument processing|[cmdline](tcllib/files/modules/cmdline/cmdline\.md)|
+|
argument validation|[tepam](tcllib/files/modules/tepam/tepam\_introduction\.md) · [tepam::procedure](tcllib/files/modules/tepam/tepam\_procedure\.md)|
+|
arguments|[tepam](tcllib/files/modules/tepam/tepam\_introduction\.md) · [tepam::procedure](tcllib/files/modules/tepam/tepam\_procedure\.md)|
+|
argv|[cmdline](tcllib/files/modules/cmdline/cmdline\.md)|
+|
argv0|[cmdline](tcllib/files/modules/cmdline/cmdline\.md)|
+|
array|[tie](tcllib/files/modules/tie/tie\_std\.md) · [tie](tcllib/files/modules/tie/tie\.md)|
+|
articulation point|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
ascii85|[ascii85](tcllib/files/modules/base64/ascii85\.md)|
+|
asn|[asn](tcllib/files/modules/asn/asn\.md)|
+|
assembler|[grammar::me::cpu::gasm](tcllib/files/modules/grammar\_me/gasm\.md)|
+|
assert|[control](tcllib/files/modules/control/control\.md)|
+|
assign|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
AST|[grammar::me\_ast](tcllib/files/modules/grammar\_me/me\_ast\.md)|
+|
asynchronous|[cache::async](tcllib/files/modules/cache/async\.md)|
+|
attribute control|[term::ansi::code::attr](tcllib/files/modules/term/ansi\_cattr\.md) · [term::ansi::code::ctrl](tcllib/files/modules/term/ansi\_cctrl\.md)|
+|
augmenting network|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
augmenting path|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
authentication|[autoproxy](tcllib/files/modules/http/autoproxy\.md) · [SASL](tcllib/files/modules/sasl/sasl\.md) · [SASL::NTLM](tcllib/files/modules/sasl/ntlm\.md) · [SASL::SCRAM](tcllib/files/modules/sasl/scram\.md) · [SASL::XGoogleToken](tcllib/files/modules/sasl/gtoken\.md)|
+|
automatic|[nameserv::auto](tcllib/files/modules/nns/nns\_auto\.md)|
+|
automatic documentation|[tepam::doc\_gen](tcllib/files/modules/tepam/tepam\_doc\_gen\.md)|
+|
automaton|[grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md)|
+|
aycock|[grammar::aycock](tcllib/files/modules/grammar\_aycock/aycock\.md)|
+
+
+####
Keywords: B
+
+|||
+|---|---|
+|
bank|[valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md) · [valtype::iban](tcllib/files/modules/valtype/iban\.md)|
+|
base32|[base32](tcllib/files/modules/base32/base32\.md) · [base32::core](tcllib/files/modules/base32/base32core\.md) · [base32::hex](tcllib/files/modules/base32/base32hex\.md)|
+|
base64|[base64](tcllib/files/modules/base64/base64\.md) · [tcl::transform::base64](tcllib/files/modules/virtchannel\_transform/vt\_base64\.md)|
+|
bash|[string::token::shell](tcllib/files/modules/string/token\_shell\.md)|
+|
bee|[bee](tcllib/files/modules/bee/bee\.md)|
+|
bench language|[bench\_intro](tcllib/files/modules/bench/bench\_intro\.md) · [bench\_lang\_intro](tcllib/files/modules/bench/bench\_lang\_intro\.md) · [bench\_lang\_spec](tcllib/files/modules/bench/bench\_lang\_spec\.md)|
+|
benchmark|[bench](tcllib/files/modules/bench/bench\.md) · [bench::in](tcllib/files/modules/bench/bench\_read\.md) · [bench::out::csv](tcllib/files/modules/bench/bench\_wcsv\.md) · [bench::out::text](tcllib/files/modules/bench/bench\_wtext\.md) · [bench\_intro](tcllib/files/modules/bench/bench\_intro\.md) · [bench\_lang\_intro](tcllib/files/modules/bench/bench\_lang\_intro\.md) · [bench\_lang\_spec](tcllib/files/modules/bench/bench\_lang\_spec\.md)|
+|
ber|[asn](tcllib/files/modules/asn/asn\.md)|
+|
Bessel functions|[math::special](tcllib/files/modules/math/special\.md)|
+|
bfs|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
bibliography|[bibtex](tcllib/files/modules/bibtex/bibtex\.md)|
+|
bibtex|[bibtex](tcllib/files/modules/bibtex/bibtex\.md)|
+|
bignums|[math::bignum](tcllib/files/modules/math/bignum\.md)|
+|
bind|[uevent](tcllib/files/modules/uev/uevent\.md)|
+|
bipartite|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
BitTorrent|[bee](tcllib/files/modules/bee/bee\.md)|
+|
bittorrent|[bee](tcllib/files/modules/bee/bee\.md)|
+|
blanks|[textutil::repeat](tcllib/files/modules/textutil/repeat\.md)|
+|
block cipher|[aes](tcllib/files/modules/aes/aes\.md) · [blowfish](tcllib/files/modules/blowfish/blowfish\.md) · [des](tcllib/files/modules/des/des\.md) · [tclDES](tcllib/files/modules/des/tcldes\.md) · [tclDESjr](tcllib/files/modules/des/tcldesjr\.md)|
+|
blocking flow|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
blowfish|[blowfish](tcllib/files/modules/blowfish/blowfish\.md)|
+|
Book Number|[valtype::isbn](tcllib/files/modules/valtype/isbn\.md)|
+|
breadth\-first|[struct::tree](tcllib/files/modules/struct/struct\_tree\.md)|
+|
bridge|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
BWidget|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md)|
+
+
+####
Keywords: C
+
+|||
+|---|---|
+|
C|[doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md)|
+|
C\+\+|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md) · [stooop](tcllib/files/modules/stooop/stooop\.md) · [switched](tcllib/files/modules/stooop/switched\.md)|
+|
cache|[cache::async](tcllib/files/modules/cache/async\.md) · [map::slippy::cache](tcllib/files/modules/map/map\_slippy\_cache\.md)|
+|
caesar cipher|[tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md)|
+|
calculus|[math::calculus](tcllib/files/modules/math/calculus\.md)|
+|
callback|[cache::async](tcllib/files/modules/cache/async\.md) · [hook](tcllib/files/modules/hook/hook\.md) · [lambda](tcllib/files/modules/lambda/lambda\.md) · [oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md) · [uevent::onidle](tcllib/files/modules/uev/uevent\_onidle\.md)|
+|
callbacks|[tcl::chan::halfpipe](tcllib/files/modules/virtchannel\_base/halfpipe\.md)|
+|
capitalize|[textutil::string](tcllib/files/modules/textutil/textutil\_string\.md)|
+|
card for credit|[valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md)|
+|
cardinality|[struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
cat|[fileutil](tcllib/files/modules/fileutil/fileutil\.md)|
+|
catalog package|[doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md)|
+|
catalogue|[docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md)|
+|
cell\-phone|[valtype::imei](tcllib/files/modules/valtype/imei\.md)|
+|
cer|[asn](tcllib/files/modules/asn/asn\.md)|
+|
CFG|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md)|
+|
CFL|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md)|
+|
CGI|[ncgi](tcllib/files/modules/ncgi/ncgi\.md)|
+|
cgraph|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph\_v1](tcllib/files/modules/struct/graph1\.md)|
+|
changelog|[doctools::changelog](tcllib/files/modules/doctools/changelog\.md) · [doctools::cvs](tcllib/files/modules/doctools/cvs\.md)|
+|
channel|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md) · [transfer::connect](tcllib/files/modules/transfer/connect\.md) · [transfer::copy](tcllib/files/modules/transfer/copyops\.md) · [transfer::copy::queue](tcllib/files/modules/transfer/tqueue\.md) · [transfer::data::destination](tcllib/files/modules/transfer/ddest\.md) · [transfer::data::source](tcllib/files/modules/transfer/dsource\.md) · [transfer::receiver](tcllib/files/modules/transfer/receiver\.md) · [transfer::transmitter](tcllib/files/modules/transfer/transmitter\.md)|
+|
channel transformation|[tcl::transform::adler32](tcllib/files/modules/virtchannel\_transform/adler32\.md) · [tcl::transform::base64](tcllib/files/modules/virtchannel\_transform/vt\_base64\.md) · [tcl::transform::counter](tcllib/files/modules/virtchannel\_transform/vt\_counter\.md) · [tcl::transform::crc32](tcllib/files/modules/virtchannel\_transform/vt\_crc32\.md) · [tcl::transform::hex](tcllib/files/modules/virtchannel\_transform/hex\.md) · [tcl::transform::identity](tcllib/files/modules/virtchannel\_transform/identity\.md) · [tcl::transform::limitsize](tcllib/files/modules/virtchannel\_transform/limitsize\.md) · [tcl::transform::observe](tcllib/files/modules/virtchannel\_transform/observe\.md) · [tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md) · [tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md) · [tcl::transform::spacer](tcllib/files/modules/virtchannel\_transform/spacer\.md) · [tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md)|
+|
character input|[term::receive](tcllib/files/modules/term/receive\.md) · [term::receive::bind](tcllib/files/modules/term/term\_bind\.md)|
+|
character output|[term::ansi::send](tcllib/files/modules/term/ansi\_send\.md) · [term::send](tcllib/files/modules/term/term\_send\.md)|
+|
chat|[irc](tcllib/files/modules/irc/irc\.md) · [multiplexer](tcllib/files/modules/multiplexer/multiplexer\.md) · [picoirc](tcllib/files/modules/irc/picoirc\.md)|
+|
checkbox|[html](tcllib/files/modules/html/html\.md) · [javascript](tcllib/files/modules/javascript/javascript\.md)|
+|
checkbutton|[html](tcllib/files/modules/html/html\.md)|
+|
Checking|[valtype::common](tcllib/files/modules/valtype/valtype\_common\.md) · [valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md) · [valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::iban](tcllib/files/modules/valtype/iban\.md) · [valtype::imei](tcllib/files/modules/valtype/imei\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md) · [valtype::luhn](tcllib/files/modules/valtype/luhn\.md) · [valtype::luhn5](tcllib/files/modules/valtype/luhn5\.md) · [valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md) · [valtype::verhoeff](tcllib/files/modules/valtype/verhoeff\.md)|
+|
checksum|[cksum](tcllib/files/modules/crc/cksum\.md) · [crc16](tcllib/files/modules/crc/crc16\.md) · [crc32](tcllib/files/modules/crc/crc32\.md) · [sum](tcllib/files/modules/crc/sum\.md) · [tcl::transform::adler32](tcllib/files/modules/virtchannel\_transform/adler32\.md) · [tcl::transform::crc32](tcllib/files/modules/virtchannel\_transform/vt\_crc32\.md)|
+|
chop|[textutil::string](tcllib/files/modules/textutil/textutil\_string\.md)|
+|
cipher|[pki](tcllib/files/modules/pki/pki\.md) · [tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md) · [tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md)|
+|
cksum|[cksum](tcllib/files/modules/crc/cksum\.md) · [crc16](tcllib/files/modules/crc/crc16\.md) · [crc32](tcllib/files/modules/crc/crc32\.md) · [sum](tcllib/files/modules/crc/sum\.md)|
+|
class|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md) · [stooop](tcllib/files/modules/stooop/stooop\.md) · [switched](tcllib/files/modules/stooop/switched\.md)|
+|
class methods|[oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md)|
+|
class variables|[oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md)|
+|
cleanup|[defer](tcllib/files/modules/defer/defer\.md) · [try](tcllib/files/modules/try/tcllib\_try\.md)|
+|
client|[nameserv](tcllib/files/modules/nns/nns\_client\.md) · [nameserv::auto](tcllib/files/modules/nns/nns\_auto\.md) · [nameserv::common](tcllib/files/modules/nns/nns\_common\.md) · [nns](tcllib/files/apps/nns\.md) · [nns\_intro](tcllib/files/modules/nns/nns\_intro\.md) · [nnslog](tcllib/files/apps/nnslog\.md)|
+|
cloud|[S3](tcllib/files/modules/amazon\-s3/S3\.md)|
+|
cmdline processing|[cmdline](tcllib/files/modules/cmdline/cmdline\.md)|
+|
color control|[term::ansi::code::attr](tcllib/files/modules/term/ansi\_cattr\.md) · [term::ansi::code::ctrl](tcllib/files/modules/term/ansi\_cctrl\.md)|
+|
columns|[term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md)|
+|
comm|[comm](tcllib/files/modules/comm/comm\.md) · [comm\_wire](tcllib/files/modules/comm/comm\_wire\.md) · [deleg\_method](tcllib/files/modules/interp/deleg\_method\.md) · [deleg\_proc](tcllib/files/modules/interp/deleg\_proc\.md) · [nameserv::protocol](tcllib/files/modules/nns/nns\_protocol\.md)|
+|
command|[doctools::tcl::parse](tcllib/files/modules/doctools2base/tcl\_parse\.md)|
+|
command line processing|[cmdline](tcllib/files/modules/cmdline/cmdline\.md)|
+|
command prefix|[lambda](tcllib/files/modules/lambda/lambda\.md) · [oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md)|
+|
comment|[jpeg](tcllib/files/modules/jpeg/jpeg\.md) · [png](tcllib/files/modules/png/png\.md)|
+|
common|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
common prefix|[textutil::string](tcllib/files/modules/textutil/textutil\_string\.md)|
+|
communication|[comm](tcllib/files/modules/comm/comm\.md) · [comm\_wire](tcllib/files/modules/comm/comm\_wire\.md)|
+|
comparison|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
complete graph|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
complex numbers|[math::complexnumbers](tcllib/files/modules/math/qcomplex\.md) · [math::fourier](tcllib/files/modules/math/fourier\.md)|
+|
compression|[tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md) · [zipfile::encode](tcllib/files/modules/zip/encode\.md)|
+|
computations|[math::bigfloat](tcllib/files/modules/math/bigfloat\.md)|
+|
concatenation channel|[tcl::chan::cat](tcllib/files/modules/virtchannel\_base/cat\.md) · [tcl::chan::facade](tcllib/files/modules/virtchannel\_base/facade\.md)|
+|
connected component|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
connected fifos|[tcl::chan::fifo2](tcllib/files/modules/virtchannel\_base/tcllib\_fifo2\.md)|
+|
connection|[transfer::connect](tcllib/files/modules/transfer/connect\.md)|
+|
constants|[math::constants](tcllib/files/modules/math/constants\.md) · [units](tcllib/files/modules/units/units\.md)|
+|
CONTAINER|[pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md)|
+|
contents|[doctools2toc\_introduction](tcllib/files/modules/doctools2toc/toc\_introduction\.md)|
+|
context\-free grammar|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md)|
+|
context\-free languages|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
control|[control](tcllib/files/modules/control/control\.md) · [term](tcllib/files/modules/term/term\.md) · [term::ansi::code](tcllib/files/modules/term/ansi\_code\.md) · [term::ansi::code::attr](tcllib/files/modules/term/ansi\_cattr\.md) · [term::ansi::code::ctrl](tcllib/files/modules/term/ansi\_cctrl\.md) · [term::ansi::code::macros](tcllib/files/modules/term/ansi\_cmacros\.md) · [term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md) · [term::ansi::send](tcllib/files/modules/term/ansi\_send\.md) · [term::interact::menu](tcllib/files/modules/term/imenu\.md) · [term::interact::pager](tcllib/files/modules/term/ipager\.md) · [term::receive](tcllib/files/modules/term/receive\.md) · [term::receive::bind](tcllib/files/modules/term/term\_bind\.md) · [term::send](tcllib/files/modules/term/term\_send\.md)|
+|
control structure|[generator](tcllib/files/modules/generator/generator\.md)|
+|
conversion|[doctools](tcllib/files/modules/doctools/doctools\.md) · [doctools2idx\_introduction](tcllib/files/modules/doctools2idx/idx\_introduction\.md) · [doctools2toc\_introduction](tcllib/files/modules/doctools2toc/toc\_introduction\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md) · [math::roman](tcllib/files/modules/math/roman\.md) · [mpexpand](tcllib/files/modules/doctools/mpexpand\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [tcldocstrip](tcllib/files/apps/tcldocstrip\.md) · [units](tcllib/files/modules/units/units\.md)|
+|
cooked|[term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md)|
+|
cookie|[ncgi](tcllib/files/modules/ncgi/ncgi\.md)|
+|
copy|[fileutil::multi](tcllib/files/modules/fileutil/multi\.md) · [fileutil::multi::op](tcllib/files/modules/fileutil/multiop\.md) · [transfer::copy](tcllib/files/modules/transfer/copyops\.md) · [transfer::copy::queue](tcllib/files/modules/transfer/tqueue\.md) · [transfer::data::destination](tcllib/files/modules/transfer/ddest\.md) · [transfer::data::source](tcllib/files/modules/transfer/dsource\.md) · [transfer::receiver](tcllib/files/modules/transfer/receiver\.md) · [transfer::transmitter](tcllib/files/modules/transfer/transmitter\.md)|
+|
coroutine|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md) · [generator](tcllib/files/modules/generator/generator\.md)|
+|
Cost|[treeql](tcllib/files/modules/treeql/treeql\.md)|
+|
counter|[tcl::transform::counter](tcllib/files/modules/virtchannel\_transform/vt\_counter\.md)|
+|
counting|[counter](tcllib/files/modules/counter/counter\.md)|
+|
CPARAM|[pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md)|
+|
crc|[cksum](tcllib/files/modules/crc/cksum\.md) · [crc16](tcllib/files/modules/crc/crc16\.md) · [crc32](tcllib/files/modules/crc/crc32\.md) · [sum](tcllib/files/modules/crc/sum\.md)|
+|
crc16|[crc16](tcllib/files/modules/crc/crc16\.md)|
+|
crc32|[cksum](tcllib/files/modules/crc/cksum\.md) · [crc16](tcllib/files/modules/crc/crc16\.md) · [crc32](tcllib/files/modules/crc/crc32\.md) · [sum](tcllib/files/modules/crc/sum\.md) · [tcl::transform::crc32](tcllib/files/modules/virtchannel\_transform/vt\_crc32\.md)|
+|
credit card|[valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md)|
+|
cron|[cron](tcllib/files/modules/cron/cron\.md)|
+|
cryptography|[blowfish](tcllib/files/modules/blowfish/blowfish\.md)|
+|
CSS|[doctools::html::cssdefaults](tcllib/files/modules/doctools2base/html\_cssdefaults\.md)|
+|
csv|[bench::in](tcllib/files/modules/bench/bench\_read\.md) · [bench::out::csv](tcllib/files/modules/bench/bench\_wcsv\.md) · [csv](tcllib/files/modules/csv/csv\.md)|
+|
currying|[lambda](tcllib/files/modules/lambda/lambda\.md) · [oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md)|
+|
cut edge|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
cut vertex|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
CVS|[rcs](tcllib/files/modules/rcs/rcs\.md)|
+|
cvs|[doctools::cvs](tcllib/files/modules/doctools/cvs\.md)|
+|
cvs log|[doctools::cvs](tcllib/files/modules/doctools/cvs\.md)|
+|
cyclic redundancy check|[cksum](tcllib/files/modules/crc/cksum\.md) · [crc16](tcllib/files/modules/crc/crc16\.md) · [crc32](tcllib/files/modules/crc/crc32\.md) · [sum](tcllib/files/modules/crc/sum\.md)|
+
+
+####
Keywords: D
+
+|||
+|---|---|
+|
data analysis|[math::statistics](tcllib/files/modules/math/statistics\.md)|
+|
data destination|[transfer::data::destination](tcllib/files/modules/transfer/ddest\.md) · [transfer::receiver](tcllib/files/modules/transfer/receiver\.md)|
+|
data entry form|[tepam::argument\_dialogbox](tcllib/files/modules/tepam/tepam\_argument\_dialogbox\.md)|
+|
data exchange|[huddle](tcllib/files/modules/yaml/huddle\.md) · [json](tcllib/files/modules/json/json\.md) · [json::write](tcllib/files/modules/json/json\_write\.md) · [yaml](tcllib/files/modules/yaml/yaml\.md)|
+|
data integrity|[aes](tcllib/files/modules/aes/aes\.md) · [cksum](tcllib/files/modules/crc/cksum\.md) · [crc16](tcllib/files/modules/crc/crc16\.md) · [crc32](tcllib/files/modules/crc/crc32\.md) · [des](tcllib/files/modules/des/des\.md) · [pki](tcllib/files/modules/pki/pki\.md) · [rc4](tcllib/files/modules/rc4/rc4\.md) · [sum](tcllib/files/modules/crc/sum\.md) · [tclDES](tcllib/files/modules/des/tcldes\.md) · [tclDESjr](tcllib/files/modules/des/tcldesjr\.md)|
+|
data source|[transfer::data::source](tcllib/files/modules/transfer/dsource\.md) · [transfer::transmitter](tcllib/files/modules/transfer/transmitter\.md)|
+|
data structures|[struct::record](tcllib/files/modules/struct/record\.md)|
+|
database|[tie](tcllib/files/modules/tie/tie\_std\.md) · [tie](tcllib/files/modules/tie/tie\.md)|
+|
dataflow|[page\_util\_flow](tcllib/files/modules/page/page\_util\_flow\.md)|
+|
\.ddt|[docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md)|
+|
DE|[doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md)|
+|
debug|[debug](tcllib/files/modules/debug/debug\.md) · [debug::caller](tcllib/files/modules/debug/debug\_caller\.md) · [debug::heartbeat](tcllib/files/modules/debug/debug\_heartbeat\.md) · [debug::timestamp](tcllib/files/modules/debug/debug\_timestamp\.md)|
+|
decimal|[math::decimal](tcllib/files/modules/math/decimal\.md)|
+|
declare|[term::ansi::code](tcllib/files/modules/term/ansi\_code\.md)|
+|
decompression|[tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md) · [zipfile::decode](tcllib/files/modules/zip/decode\.md) · [zipfile::mkzip](tcllib/files/modules/zip/mkzip\.md)|
+|
decryption|[tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md) · [tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md)|
+|
deferal|[uevent::onidle](tcllib/files/modules/uev/uevent\_onidle\.md)|
+|
define|[term::ansi::code](tcllib/files/modules/term/ansi\_code\.md)|
+|
degree|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
degree constrained spanning tree|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
degrees|[math::constants](tcllib/files/modules/math/constants\.md)|
+|
delegation|[deleg\_method](tcllib/files/modules/interp/deleg\_method\.md) · [deleg\_proc](tcllib/files/modules/interp/deleg\_proc\.md)|
+|
depth\-first|[struct::tree](tcllib/files/modules/struct/struct\_tree\.md)|
+|
der|[asn](tcllib/files/modules/asn/asn\.md)|
+|
DES|[des](tcllib/files/modules/des/des\.md) · [tclDES](tcllib/files/modules/des/tcldes\.md) · [tclDESjr](tcllib/files/modules/des/tcldesjr\.md)|
+|
deserialization|[doctools::idx::import::docidx](tcllib/files/modules/doctools2idx/import\_docidx\.md) · [doctools::idx::import::json](tcllib/files/modules/doctools2idx/idx\_import\_json\.md) · [doctools::idx::structure](tcllib/files/modules/doctools2idx/idx\_structure\.md) · [doctools::toc::import::doctoc](tcllib/files/modules/doctools2toc/import\_doctoc\.md) · [doctools::toc::import::json](tcllib/files/modules/doctools2toc/toc\_import\_json\.md) · [doctools::toc::structure](tcllib/files/modules/doctools2toc/toc\_structure\.md)|
+|
/dev/null|[tcl::chan::null](tcllib/files/modules/virtchannel\_base/tcllib\_null\.md) · [tcl::chan::nullzero](tcllib/files/modules/virtchannel\_base/nullzero\.md)|
+|
/dev/random|[tcl::chan::random](tcllib/files/modules/virtchannel\_base/tcllib\_random\.md) · [tcl::randomseed](tcllib/files/modules/virtchannel\_base/randseed\.md)|
+|
/dev/zero|[tcl::chan::nullzero](tcllib/files/modules/virtchannel\_base/nullzero\.md) · [tcl::chan::zero](tcllib/files/modules/virtchannel\_base/tcllib\_zero\.md)|
+|
diameter|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
dict|[dicttool](tcllib/files/modules/dicttool/dicttool\.md)|
+|
diff|[docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md) · [struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
diff \-n format|[rcs](tcllib/files/modules/rcs/rcs\.md)|
+|
difference|[struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
differential|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
differential equations|[math::calculus](tcllib/files/modules/math/calculus\.md)|
+|
dijkstra|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
directory access|[ldap](tcllib/files/modules/ldap/ldap\.md) · [ldapx](tcllib/files/modules/ldap/ldapx\.md)|
+|
directory traversal|[fileutil\_traverse](tcllib/files/modules/fileutil/traverse\.md)|
+|
Discover|[valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md)|
+|
discrete items|[struct::pool](tcllib/files/modules/struct/pool\.md)|
+|
disjoint set|[struct::disjointset](tcllib/files/modules/struct/disjointset\.md)|
+|
dispatcher|[term::receive::bind](tcllib/files/modules/term/term\_bind\.md)|
+|
distance|[math::geometry](tcllib/files/modules/math/math\_geometry\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md) · [units](tcllib/files/modules/units/units\.md)|
+|
DNS|[dns](tcllib/files/modules/dns/tcllib\_dns\.md)|
+|
do|[control](tcllib/files/modules/control/control\.md)|
+|
docidx|[doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::export::docidx](tcllib/files/modules/doctools2idx/export\_docidx\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::idx::import::docidx](tcllib/files/modules/doctools2idx/import\_docidx\.md) · [doctools::idx::parse](tcllib/files/modules/doctools2idx/idx\_parse\.md) · [doctools::idx::structure](tcllib/files/modules/doctools2idx/idx\_structure\.md) · [doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md)|
+|
docidx commands|[docidx\_lang\_cmdref](tcllib/files/modules/doctools/docidx\_lang\_cmdref\.md) · [docidx\_lang\_faq](tcllib/files/modules/doctools/docidx\_lang\_faq\.md) · [docidx\_lang\_intro](tcllib/files/modules/doctools/docidx\_lang\_intro\.md) · [docidx\_lang\_syntax](tcllib/files/modules/doctools/docidx\_lang\_syntax\.md)|
+|
docidx language|[docidx\_lang\_cmdref](tcllib/files/modules/doctools/docidx\_lang\_cmdref\.md) · [docidx\_lang\_faq](tcllib/files/modules/doctools/docidx\_lang\_faq\.md) · [docidx\_lang\_intro](tcllib/files/modules/doctools/docidx\_lang\_intro\.md) · [docidx\_lang\_syntax](tcllib/files/modules/doctools/docidx\_lang\_syntax\.md)|
+|
docidx markup|[docidx\_lang\_cmdref](tcllib/files/modules/doctools/docidx\_lang\_cmdref\.md) · [docidx\_lang\_faq](tcllib/files/modules/doctools/docidx\_lang\_faq\.md) · [docidx\_lang\_intro](tcllib/files/modules/doctools/docidx\_lang\_intro\.md) · [docidx\_lang\_syntax](tcllib/files/modules/doctools/docidx\_lang\_syntax\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md)|
+|
docidx syntax|[docidx\_lang\_faq](tcllib/files/modules/doctools/docidx\_lang\_faq\.md) · [docidx\_lang\_intro](tcllib/files/modules/doctools/docidx\_lang\_intro\.md) · [docidx\_lang\_syntax](tcllib/files/modules/doctools/docidx\_lang\_syntax\.md)|
+|
docstrip|[docstrip](tcllib/files/modules/docstrip/docstrip\.md) · [docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md) · [tcldocstrip](tcllib/files/apps/tcldocstrip\.md)|
+|
doctoc|[doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::export::doctoc](tcllib/files/modules/doctools2toc/export\_doctoc\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [doctools::toc::import::doctoc](tcllib/files/modules/doctools2toc/import\_doctoc\.md) · [doctools::toc::parse](tcllib/files/modules/doctools2toc/toc\_parse\.md) · [doctools::toc::structure](tcllib/files/modules/doctools2toc/toc\_structure\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md)|
+|
doctoc commands|[doctoc\_lang\_cmdref](tcllib/files/modules/doctools/doctoc\_lang\_cmdref\.md) · [doctoc\_lang\_faq](tcllib/files/modules/doctools/doctoc\_lang\_faq\.md) · [doctoc\_lang\_intro](tcllib/files/modules/doctools/doctoc\_lang\_intro\.md) · [doctoc\_lang\_syntax](tcllib/files/modules/doctools/doctoc\_lang\_syntax\.md)|
+|
doctoc language|[doctoc\_lang\_cmdref](tcllib/files/modules/doctools/doctoc\_lang\_cmdref\.md) · [doctoc\_lang\_faq](tcllib/files/modules/doctools/doctoc\_lang\_faq\.md) · [doctoc\_lang\_intro](tcllib/files/modules/doctools/doctoc\_lang\_intro\.md) · [doctoc\_lang\_syntax](tcllib/files/modules/doctools/doctoc\_lang\_syntax\.md)|
+|
doctoc markup|[doctoc\_lang\_cmdref](tcllib/files/modules/doctools/doctoc\_lang\_cmdref\.md) · [doctoc\_lang\_faq](tcllib/files/modules/doctools/doctoc\_lang\_faq\.md) · [doctoc\_lang\_intro](tcllib/files/modules/doctools/doctoc\_lang\_intro\.md) · [doctoc\_lang\_syntax](tcllib/files/modules/doctools/doctoc\_lang\_syntax\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md)|
+|
doctoc syntax|[doctoc\_lang\_faq](tcllib/files/modules/doctools/doctoc\_lang\_faq\.md) · [doctoc\_lang\_intro](tcllib/files/modules/doctools/doctoc\_lang\_intro\.md) · [doctoc\_lang\_syntax](tcllib/files/modules/doctools/doctoc\_lang\_syntax\.md)|
+|
doctools|[docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md) · [doctools::changelog](tcllib/files/modules/doctools/changelog\.md) · [doctools::html::cssdefaults](tcllib/files/modules/doctools2base/html\_cssdefaults\.md) · [doctools::idx::export::docidx](tcllib/files/modules/doctools2idx/export\_docidx\.md) · [doctools::idx::export::html](tcllib/files/modules/doctools2idx/idx\_export\_html\.md) · [doctools::idx::export::json](tcllib/files/modules/doctools2idx/idx\_export\_json\.md) · [doctools::idx::export::nroff](tcllib/files/modules/doctools2idx/idx\_export\_nroff\.md) · [doctools::idx::export::text](tcllib/files/modules/doctools2idx/idx\_export\_text\.md) · [doctools::idx::export::wiki](tcllib/files/modules/doctools2idx/idx\_export\_wiki\.md) · [doctools::idx::import::docidx](tcllib/files/modules/doctools2idx/import\_docidx\.md) · [doctools::idx::import::json](tcllib/files/modules/doctools2idx/idx\_import\_json\.md) · [doctools::idx::parse](tcllib/files/modules/doctools2idx/idx\_parse\.md) · [doctools::idx::structure](tcllib/files/modules/doctools2idx/idx\_structure\.md) · [doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md) · [doctools::nroff::man\_macros](tcllib/files/modules/doctools2base/nroff\_manmacros\.md) · [doctools::tcl::parse](tcllib/files/modules/doctools2base/tcl\_parse\.md) · [doctools::toc::export::doctoc](tcllib/files/modules/doctools2toc/export\_doctoc\.md) · [doctools::toc::export::html](tcllib/files/modules/doctools2toc/toc\_export\_html\.md) · [doctools::toc::export::json](tcllib/files/modules/doctools2toc/toc\_export\_json\.md) · [doctools::toc::export::nroff](tcllib/files/modules/doctools2toc/toc\_export\_nroff\.md) · [doctools::toc::export::text](tcllib/files/modules/doctools2toc/toc\_export\_text\.md) · [doctools::toc::export::wiki](tcllib/files/modules/doctools2toc/toc\_export\_wiki\.md) · [doctools::toc::import::doctoc](tcllib/files/modules/doctools2toc/import\_doctoc\.md) · [doctools::toc::import::json](tcllib/files/modules/doctools2toc/toc\_import\_json\.md) · [doctools::toc::parse](tcllib/files/modules/doctools2toc/toc\_parse\.md) · [doctools::toc::structure](tcllib/files/modules/doctools2toc/toc\_structure\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md)|
+|
doctools commands|[doctools\_lang\_cmdref](tcllib/files/modules/doctools/doctools\_lang\_cmdref\.md) · [doctools\_lang\_faq](tcllib/files/modules/doctools/doctools\_lang\_faq\.md) · [doctools\_lang\_intro](tcllib/files/modules/doctools/doctools\_lang\_intro\.md) · [doctools\_lang\_syntax](tcllib/files/modules/doctools/doctools\_lang\_syntax\.md)|
+|
doctools language|[doctools\_lang\_cmdref](tcllib/files/modules/doctools/doctools\_lang\_cmdref\.md) · [doctools\_lang\_faq](tcllib/files/modules/doctools/doctools\_lang\_faq\.md) · [doctools\_lang\_intro](tcllib/files/modules/doctools/doctools\_lang\_intro\.md) · [doctools\_lang\_syntax](tcllib/files/modules/doctools/doctools\_lang\_syntax\.md)|
+|
doctools markup|[doctools\_lang\_cmdref](tcllib/files/modules/doctools/doctools\_lang\_cmdref\.md) · [doctools\_lang\_faq](tcllib/files/modules/doctools/doctools\_lang\_faq\.md) · [doctools\_lang\_intro](tcllib/files/modules/doctools/doctools\_lang\_intro\.md) · [doctools\_lang\_syntax](tcllib/files/modules/doctools/doctools\_lang\_syntax\.md)|
+|
doctools syntax|[doctools\_lang\_faq](tcllib/files/modules/doctools/doctools\_lang\_faq\.md) · [doctools\_lang\_intro](tcllib/files/modules/doctools/doctools\_lang\_intro\.md) · [doctools\_lang\_syntax](tcllib/files/modules/doctools/doctools\_lang\_syntax\.md)|
+|
document|[doctools\_plugin\_apiref](tcllib/files/modules/doctools/doctools\_plugin\_apiref\.md)|
+|
documentation|[docstrip](tcllib/files/modules/docstrip/docstrip\.md) · [docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md) · [doctools](tcllib/files/modules/doctools/doctools\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [tcldocstrip](tcllib/files/apps/tcldocstrip\.md) · [tepam::doc\_gen](tcllib/files/modules/tepam/tepam\_doc\_gen\.md)|
+|
DOM|[treeql](tcllib/files/modules/treeql/treeql\.md)|
+|
dom|[xsxp](tcllib/files/modules/amazon\-s3/xsxp\.md)|
+|
domain name service|[dns](tcllib/files/modules/dns/tcllib\_dns\.md)|
+|
\.dtx|[docstrip](tcllib/files/modules/docstrip/docstrip\.md) · [docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md) · [tcldocstrip](tcllib/files/apps/tcldocstrip\.md)|
+
+
+####
Keywords: E
+
+|||
+|---|---|
+|
e|[math::constants](tcllib/files/modules/math/constants\.md)|
+|
EAN|[valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md)|
+|
EAN13|[valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md)|
+|
earley|[grammar::aycock](tcllib/files/modules/grammar\_aycock/aycock\.md)|
+|
EBNF|[pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
eccentricity|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
edge|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
emacs|[doctools::changelog](tcllib/files/modules/doctools/changelog\.md) · [doctools::cvs](tcllib/files/modules/doctools/cvs\.md)|
+|
email|[imap4](tcllib/files/modules/imap4/imap4\.md) · [mime](tcllib/files/modules/mime/mime\.md) · [pop3](tcllib/files/modules/pop3/pop3\.md) · [smtp](tcllib/files/modules/mime/smtp\.md)|
+|
emptiness|[struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
empty interpreter|[interp](tcllib/files/modules/interp/tcllib\_interp\.md)|
+|
EN|[doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md)|
+|
encoding|[ascii85](tcllib/files/modules/base64/ascii85\.md) · [base64](tcllib/files/modules/base64/base64\.md) · [uuencode](tcllib/files/modules/base64/uuencode\.md) · [yencode](tcllib/files/modules/base64/yencode\.md)|
+|
encryption|[aes](tcllib/files/modules/aes/aes\.md) · [blowfish](tcllib/files/modules/blowfish/blowfish\.md) · [des](tcllib/files/modules/des/des\.md) · [pki](tcllib/files/modules/pki/pki\.md) · [rc4](tcllib/files/modules/rc4/rc4\.md) · [tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md) · [tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md) · [tclDES](tcllib/files/modules/des/tcldes\.md) · [tclDESjr](tcllib/files/modules/des/tcldesjr\.md)|
+|
entry mask|[tepam](tcllib/files/modules/tepam/tepam\_introduction\.md)|
+|
equal|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
equality|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
equivalence class|[struct::disjointset](tcllib/files/modules/struct/disjointset\.md)|
+|
error|[throw](tcllib/files/modules/try/tcllib\_throw\.md) · [try](tcllib/files/modules/try/tcllib\_try\.md)|
+|
error function|[math::special](tcllib/files/modules/math/special\.md)|
+|
European Article Number|[valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md)|
+|
event|[hook](tcllib/files/modules/hook/hook\.md) · [uevent](tcllib/files/modules/uev/uevent\.md) · [uevent::onidle](tcllib/files/modules/uev/uevent\_onidle\.md)|
+|
event management|[tcl::chan::events](tcllib/files/modules/virtchannel\_core/events\.md)|
+|
events|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
examples|[bench\_lang\_intro](tcllib/files/modules/bench/bench\_lang\_intro\.md) · [docidx\_lang\_faq](tcllib/files/modules/doctools/docidx\_lang\_faq\.md) · [doctoc\_lang\_faq](tcllib/files/modules/doctools/doctoc\_lang\_faq\.md) · [doctools\_lang\_faq](tcllib/files/modules/doctools/doctools\_lang\_faq\.md)|
+|
exception|[try](tcllib/files/modules/try/tcllib\_try\.md)|
+|
exchange format|[huddle](tcllib/files/modules/yaml/huddle\.md) · [json](tcllib/files/modules/json/json\.md) · [json::write](tcllib/files/modules/json/json\_write\.md)|
+|
exclusion|[struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
execution|[grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md)|
+|
exif|[jpeg](tcllib/files/modules/jpeg/jpeg\.md)|
+|
exit|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
export|[doctools::html::cssdefaults](tcllib/files/modules/doctools2base/html\_cssdefaults\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::export::docidx](tcllib/files/modules/doctools2idx/export\_docidx\.md) · [doctools::idx::export::html](tcllib/files/modules/doctools2idx/idx\_export\_html\.md) · [doctools::idx::export::json](tcllib/files/modules/doctools2idx/idx\_export\_json\.md) · [doctools::idx::export::nroff](tcllib/files/modules/doctools2idx/idx\_export\_nroff\.md) · [doctools::idx::export::text](tcllib/files/modules/doctools2idx/idx\_export\_text\.md) · [doctools::idx::export::wiki](tcllib/files/modules/doctools2idx/idx\_export\_wiki\.md) · [doctools::nroff::man\_macros](tcllib/files/modules/doctools2base/nroff\_manmacros\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::export::doctoc](tcllib/files/modules/doctools2toc/export\_doctoc\.md) · [doctools::toc::export::html](tcllib/files/modules/doctools2toc/toc\_export\_html\.md) · [doctools::toc::export::json](tcllib/files/modules/doctools2toc/toc\_export\_json\.md) · [doctools::toc::export::nroff](tcllib/files/modules/doctools2toc/toc\_export\_nroff\.md) · [doctools::toc::export::text](tcllib/files/modules/doctools2toc/toc\_export\_text\.md) · [doctools::toc::export::wiki](tcllib/files/modules/doctools2toc/toc\_export\_wiki\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md)|
+|
expression|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
extended namespace|[namespacex](tcllib/files/modules/namespacex/namespacex\.md)|
+
+
+####
Keywords: F
+
+|||
+|---|---|
+|
faq|[docidx\_lang\_faq](tcllib/files/modules/doctools/docidx\_lang\_faq\.md) · [doctoc\_lang\_faq](tcllib/files/modules/doctools/doctoc\_lang\_faq\.md) · [doctools\_lang\_faq](tcllib/files/modules/doctools/doctools\_lang\_faq\.md)|
+|
fetching information|[uri](tcllib/files/modules/uri/uri\.md)|
+|
FFT|[math::fourier](tcllib/files/modules/math/fourier\.md)|
+|
fifo|[tcl::chan::fifo](tcllib/files/modules/virtchannel\_base/tcllib\_fifo\.md) · [tcl::chan::fifo2](tcllib/files/modules/virtchannel\_base/tcllib\_fifo2\.md) · [tcl::chan::halfpipe](tcllib/files/modules/virtchannel\_base/halfpipe\.md)|
+|
file|[tie](tcllib/files/modules/tie/tie\_std\.md) · [tie](tcllib/files/modules/tie/tie\.md) · [uri](tcllib/files/modules/uri/uri\.md)|
+|
file recognition|[fileutil::magic::cfront](tcllib/files/modules/fumagic/cfront\.md) · [fileutil::magic::cgen](tcllib/files/modules/fumagic/cgen\.md) · [fileutil::magic::filetype](tcllib/files/modules/fumagic/filetypes\.md) · [fileutil::magic::rt](tcllib/files/modules/fumagic/rtcore\.md)|
+|
file type|[fileutil::magic::cfront](tcllib/files/modules/fumagic/cfront\.md) · [fileutil::magic::cgen](tcllib/files/modules/fumagic/cgen\.md) · [fileutil::magic::filetype](tcllib/files/modules/fumagic/filetypes\.md) · [fileutil::magic::rt](tcllib/files/modules/fumagic/rtcore\.md)|
+|
file utilities|[fileutil](tcllib/files/modules/fileutil/fileutil\.md) · [fileutil::magic::cfront](tcllib/files/modules/fumagic/cfront\.md) · [fileutil::magic::cgen](tcllib/files/modules/fumagic/cgen\.md) · [fileutil::magic::filetype](tcllib/files/modules/fumagic/filetypes\.md) · [fileutil::magic::rt](tcllib/files/modules/fumagic/rtcore\.md) · [fileutil::multi](tcllib/files/modules/fileutil/multi\.md) · [fileutil::multi::op](tcllib/files/modules/fileutil/multiop\.md)|
+|
filesystem|[map::slippy::cache](tcllib/files/modules/map/map\_slippy\_cache\.md)|
+|
filter|[generator](tcllib/files/modules/generator/generator\.md) · [struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
final|[try](tcllib/files/modules/try/tcllib\_try\.md)|
+|
finance|[valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md) · [valtype::iban](tcllib/files/modules/valtype/iban\.md)|
+|
find|[struct::disjointset](tcllib/files/modules/struct/disjointset\.md)|
+|
finite|[struct::pool](tcllib/files/modules/struct/pool\.md)|
+|
finite automaton|[grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md)|
+|
FIPS 180\-1|[sha1](tcllib/files/modules/sha1/sha1\.md) · [sha256](tcllib/files/modules/sha1/sha256\.md)|
+|
first permutation|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
Fisher\-Yates|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
flatten|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
floating\-point|[math::bigfloat](tcllib/files/modules/math/bigfloat\.md) · [math::fuzzy](tcllib/files/modules/math/fuzzy\.md)|
+|
flow|[control](tcllib/files/modules/control/control\.md)|
+|
flow network|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
folding|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
foldl|[generator](tcllib/files/modules/generator/generator\.md)|
+|
foldr|[generator](tcllib/files/modules/generator/generator\.md)|
+|
foreach|[generator](tcllib/files/modules/generator/generator\.md)|
+|
form|[html](tcllib/files/modules/html/html\.md) · [ncgi](tcllib/files/modules/ncgi/ncgi\.md)|
+|
format conversion|[pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md)|
+|
formatter|[doctools\_plugin\_apiref](tcllib/files/modules/doctools/doctools\_plugin\_apiref\.md)|
+|
formatting|[bench::in](tcllib/files/modules/bench/bench\_read\.md) · [bench::out::csv](tcllib/files/modules/bench/bench\_wcsv\.md) · [bench::out::text](tcllib/files/modules/bench/bench\_wtext\.md) · [doctools2idx\_introduction](tcllib/files/modules/doctools2idx/idx\_introduction\.md) · [doctools2toc\_introduction](tcllib/files/modules/doctools2toc/toc\_introduction\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [textutil](tcllib/files/modules/textutil/textutil\.md) · [textutil::adjust](tcllib/files/modules/textutil/adjust\.md) · [textutil::string](tcllib/files/modules/textutil/textutil\_string\.md) · [textutil::tabify](tcllib/files/modules/textutil/tabify\.md)|
+|
formatting engine|[docidx\_plugin\_apiref](tcllib/files/modules/doctools/docidx\_plugin\_apiref\.md) · [doctoc\_plugin\_apiref](tcllib/files/modules/doctools/doctoc\_plugin\_apiref\.md) · [doctools\_plugin\_apiref](tcllib/files/modules/doctools/doctools\_plugin\_apiref\.md)|
+|
Fourier transform|[math::fourier](tcllib/files/modules/math/fourier\.md)|
+|
FR|[doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md)|
+|
frame|[term::ansi::code::macros](tcllib/files/modules/term/ansi\_cmacros\.md)|
+|
framework|[tool](tcllib/files/modules/tool/tool\.md)|
+|
ftp|[ftp](tcllib/files/modules/ftp/ftp\.md) · [ftp::geturl](tcllib/files/modules/ftp/ftp\_geturl\.md) · [ftpd](tcllib/files/modules/ftpd/ftpd\.md) · [uri](tcllib/files/modules/uri/uri\.md)|
+|
ftpd|[ftpd](tcllib/files/modules/ftpd/ftpd\.md)|
+|
ftpserver|[ftpd](tcllib/files/modules/ftpd/ftpd\.md)|
+|
full outer join|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+
+
+####
Keywords: G
+
+|||
+|---|---|
+|
generate event|[uevent](tcllib/files/modules/uev/uevent\.md)|
+|
generate permutations|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
generation|[doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md)|
+|
generator|[generator](tcllib/files/modules/generator/generator\.md)|
+|
geocoding|[map::geocode::nominatim](tcllib/files/modules/map/map\_geocode\_nominatim\.md)|
+|
geodesy|[map::slippy](tcllib/files/modules/map/map\_slippy\.md) · [mapproj](tcllib/files/modules/mapproj/mapproj\.md)|
+|
geography|[map::slippy](tcllib/files/modules/map/map\_slippy\.md)|
+|
get character|[term::receive](tcllib/files/modules/term/receive\.md)|
+|
gets|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
global|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
golang|[defer](tcllib/files/modules/defer/defer\.md)|
+|
gopher|[uri](tcllib/files/modules/uri/uri\.md)|
+|
gps|[gpx](tcllib/files/modules/gpx/gpx\.md) · [nmea](tcllib/files/modules/nmea/nmea\.md)|
+|
gpx|[gpx](tcllib/files/modules/gpx/gpx\.md)|
+|
grammar|[grammar::aycock](tcllib/files/modules/grammar\_aycock/aycock\.md) · [grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md) · [grammar::me::cpu](tcllib/files/modules/grammar\_me/me\_cpu\.md) · [grammar::me::cpu::core](tcllib/files/modules/grammar\_me/me\_cpucore\.md) · [grammar::me::cpu::gasm](tcllib/files/modules/grammar\_me/gasm\.md) · [grammar::me::tcl](tcllib/files/modules/grammar\_me/me\_tcl\.md) · [grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::me\_vm](tcllib/files/modules/grammar\_me/me\_vm\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
graph|[grammar::me::cpu::gasm](tcllib/files/modules/grammar\_me/gasm\.md) · [struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md) · [struct::graph\_v1](tcllib/files/modules/struct/graph1\.md) · [struct::queue](tcllib/files/modules/struct/queue\.md) · [struct::stack](tcllib/files/modules/struct/stack\.md)|
+|
graph walking|[page\_util\_flow](tcllib/files/modules/page/page\_util\_flow\.md) · [page\_util\_norm\_lemon](tcllib/files/modules/page/page\_util\_norm\_lemon\.md) · [page\_util\_norm\_peg](tcllib/files/modules/page/page\_util\_norm\_peg\.md)|
+|
green threads|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
grep|[fileutil](tcllib/files/modules/fileutil/fileutil\.md)|
+|
GUID|[uuid](tcllib/files/modules/uuid/uuid\.md)|
+
+
+####
Keywords: H
+
+|||
+|---|---|
+|
hashing|[md4](tcllib/files/modules/md4/md4\.md) · [md5](tcllib/files/modules/md5/md5\.md) · [md5crypt](tcllib/files/modules/md5crypt/md5crypt\.md) · [otp](tcllib/files/modules/otp/otp\.md) · [ripemd128](tcllib/files/modules/ripemd/ripemd128\.md) · [ripemd160](tcllib/files/modules/ripemd/ripemd160\.md) · [sha1](tcllib/files/modules/sha1/sha1\.md) · [sha256](tcllib/files/modules/sha1/sha256\.md)|
+|
heartbeat|[debug::heartbeat](tcllib/files/modules/debug/debug\_heartbeat\.md)|
+|
heuristic|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
hex|[base32::hex](tcllib/files/modules/base32/base32hex\.md)|
+|
hexadecimal|[tcl::transform::hex](tcllib/files/modules/virtchannel\_transform/hex\.md)|
+|
histogram|[counter](tcllib/files/modules/counter/counter\.md)|
+|
hook|[hook](tcllib/files/modules/hook/hook\.md) · [uevent](tcllib/files/modules/uev/uevent\.md)|
+|
horspool|[grammar::aycock](tcllib/files/modules/grammar\_aycock/aycock\.md)|
+|
HTML|[doctools](tcllib/files/modules/doctools/doctools\.md) · [doctools::html::cssdefaults](tcllib/files/modules/doctools2base/html\_cssdefaults\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::export::html](tcllib/files/modules/doctools2idx/idx\_export\_html\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::export::html](tcllib/files/modules/doctools2toc/toc\_export\_html\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md) · [mpexpand](tcllib/files/modules/doctools/mpexpand\.md)|
+|
html|[html](tcllib/files/modules/html/html\.md) · [htmlparse](tcllib/files/modules/htmlparse/htmlparse\.md) · [javascript](tcllib/files/modules/javascript/javascript\.md) · [ncgi](tcllib/files/modules/ncgi/ncgi\.md)|
+|
http|[autoproxy](tcllib/files/modules/http/autoproxy\.md) · [map::geocode::nominatim](tcllib/files/modules/map/map\_geocode\_nominatim\.md) · [map::slippy::fetcher](tcllib/files/modules/map/map\_slippy\_fetcher\.md) · [tool](tcllib/files/modules/httpd/httpd\.md) · [uri](tcllib/files/modules/uri/uri\.md) · [websocket](tcllib/files/modules/websocket/websocket\.md)|
+|
httpd|[tool](tcllib/files/modules/httpd/httpd\.md)|
+|
https|[uri](tcllib/files/modules/uri/uri\.md)|
+|
httpserver|[tool](tcllib/files/modules/httpd/httpd\.md)|
+|
huddle|[huddle](tcllib/files/modules/yaml/huddle\.md) · [yaml](tcllib/files/modules/yaml/yaml\.md)|
+|
human readable|[bench::in](tcllib/files/modules/bench/bench\_read\.md) · [bench::out::text](tcllib/files/modules/bench/bench\_wtext\.md)|
+|
hyphenation|[textutil](tcllib/files/modules/textutil/textutil\.md) · [textutil::adjust](tcllib/files/modules/textutil/adjust\.md)|
+
+
+####
Keywords: I
+
+|||
+|---|---|
+|
i18n|[doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md)|
+|
IBAN|[valtype::iban](tcllib/files/modules/valtype/iban\.md)|
+|
ident|[ident](tcllib/files/modules/ident/ident\.md)|
+|
identification|[ident](tcllib/files/modules/ident/ident\.md)|
+|
identity|[tcl::transform::identity](tcllib/files/modules/virtchannel\_transform/identity\.md)|
+|
idle|[uevent::onidle](tcllib/files/modules/uev/uevent\_onidle\.md)|
+|
image|[jpeg](tcllib/files/modules/jpeg/jpeg\.md) · [png](tcllib/files/modules/png/png\.md) · [tiff](tcllib/files/modules/tiff/tiff\.md)|
+|
imap|[imap4](tcllib/files/modules/imap4/imap4\.md)|
+|
IMEI|[valtype::imei](tcllib/files/modules/valtype/imei\.md)|
+|
import|[doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::idx::import::docidx](tcllib/files/modules/doctools2idx/import\_docidx\.md) · [doctools::idx::import::json](tcllib/files/modules/doctools2idx/idx\_import\_json\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [doctools::toc::import::doctoc](tcllib/files/modules/doctools2toc/import\_doctoc\.md) · [doctools::toc::import::json](tcllib/files/modules/doctools2toc/toc\_import\_json\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md)|
+|
in\-memory channel|[tcl::chan::fifo](tcllib/files/modules/virtchannel\_base/tcllib\_fifo\.md) · [tcl::chan::fifo2](tcllib/files/modules/virtchannel\_base/tcllib\_fifo2\.md) · [tcl::chan::halfpipe](tcllib/files/modules/virtchannel\_base/halfpipe\.md) · [tcl::chan::memchan](tcllib/files/modules/virtchannel\_base/tcllib\_memchan\.md) · [tcl::chan::string](tcllib/files/modules/virtchannel\_base/tcllib\_string\.md) · [tcl::chan::variable](tcllib/files/modules/virtchannel\_base/tcllib\_variable\.md)|
+|
in\-order|[struct::tree](tcllib/files/modules/struct/struct\_tree\.md)|
+|
inclusion|[struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
Incr Tcl|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md)|
+|
indenting|[textutil](tcllib/files/modules/textutil/textutil\.md) · [textutil::adjust](tcllib/files/modules/textutil/adjust\.md)|
+|
independent set|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
index|[docidx\_intro](tcllib/files/modules/doctools/docidx\_intro\.md) · [docidx\_plugin\_apiref](tcllib/files/modules/doctools/docidx\_plugin\_apiref\.md) · [doctools2idx\_introduction](tcllib/files/modules/doctools2idx/idx\_introduction\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::export::docidx](tcllib/files/modules/doctools2idx/export\_docidx\.md) · [doctools::idx::export::html](tcllib/files/modules/doctools2idx/idx\_export\_html\.md) · [doctools::idx::export::json](tcllib/files/modules/doctools2idx/idx\_export\_json\.md) · [doctools::idx::export::nroff](tcllib/files/modules/doctools2idx/idx\_export\_nroff\.md) · [doctools::idx::export::text](tcllib/files/modules/doctools2idx/idx\_export\_text\.md) · [doctools::idx::export::wiki](tcllib/files/modules/doctools2idx/idx\_export\_wiki\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::idx::import::docidx](tcllib/files/modules/doctools2idx/import\_docidx\.md) · [doctools::idx::import::json](tcllib/files/modules/doctools2idx/idx\_import\_json\.md)|
+|
index formatter|[docidx\_plugin\_apiref](tcllib/files/modules/doctools/docidx\_plugin\_apiref\.md)|
+|
info|[namespacex](tcllib/files/modules/namespacex/namespacex\.md)|
+|
inner join|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
input mode|[term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md)|
+|
integer|[math::roman](tcllib/files/modules/math/roman\.md)|
+|
integration|[math::calculus](tcllib/files/modules/math/calculus\.md)|
+|
inter\-thread communication|[tcl::chan::fifo2](tcllib/files/modules/virtchannel\_base/tcllib\_fifo2\.md)|
+|
International Article Number|[valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md)|
+|
International Bank Account Number|[valtype::iban](tcllib/files/modules/valtype/iban\.md)|
+|
International Mobile Equipment Identity|[valtype::imei](tcllib/files/modules/valtype/imei\.md)|
+|
International Standard Book Number|[valtype::isbn](tcllib/files/modules/valtype/isbn\.md)|
+|
internationalization|[doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md)|
+|
internet|[asn](tcllib/files/modules/asn/asn\.md) · [ftp](tcllib/files/modules/ftp/ftp\.md) · [ftp::geturl](tcllib/files/modules/ftp/ftp\_geturl\.md) · [imap4](tcllib/files/modules/imap4/imap4\.md) · [ldap](tcllib/files/modules/ldap/ldap\.md) · [ldapx](tcllib/files/modules/ldap/ldapx\.md) · [mime](tcllib/files/modules/mime/mime\.md) · [pop3d](tcllib/files/modules/pop3d/pop3d\.md) · [pop3d::dbox](tcllib/files/modules/pop3d/pop3d\_dbox\.md) · [pop3d::udb](tcllib/files/modules/pop3d/pop3d\_udb\.md) · [smtp](tcllib/files/modules/mime/smtp\.md) · [websocket](tcllib/files/modules/websocket/websocket\.md)|
+|
internet address|[tcllib\_ip](tcllib/files/modules/dns/tcllib\_ip\.md)|
+|
interpolation|[math::interpolate](tcllib/files/modules/math/interpolate\.md)|
+|
interpreter|[deleg\_method](tcllib/files/modules/interp/deleg\_method\.md) · [deleg\_proc](tcllib/files/modules/interp/deleg\_proc\.md) · [interp](tcllib/files/modules/interp/tcllib\_interp\.md) · [wip](tcllib/files/modules/wip/wip\.md)|
+|
intersection|[struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
interval|[math::bigfloat](tcllib/files/modules/math/bigfloat\.md)|
+|
ip|[tcllib\_ip](tcllib/files/modules/dns/tcllib\_ip\.md)|
+|
ipc|[comm](tcllib/files/modules/comm/comm\.md) · [comm\_wire](tcllib/files/modules/comm/comm\_wire\.md)|
+|
ipv4|[tcllib\_ip](tcllib/files/modules/dns/tcllib\_ip\.md)|
+|
ipv6|[tcllib\_ip](tcllib/files/modules/dns/tcllib\_ip\.md)|
+|
irc|[irc](tcllib/files/modules/irc/irc\.md) · [picoirc](tcllib/files/modules/irc/picoirc\.md)|
+|
isA|[valtype::common](tcllib/files/modules/valtype/valtype\_common\.md) · [valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md) · [valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::iban](tcllib/files/modules/valtype/iban\.md) · [valtype::imei](tcllib/files/modules/valtype/imei\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md) · [valtype::luhn](tcllib/files/modules/valtype/luhn\.md) · [valtype::luhn5](tcllib/files/modules/valtype/luhn5\.md) · [valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md) · [valtype::verhoeff](tcllib/files/modules/valtype/verhoeff\.md)|
+|
ISBN|[valtype::isbn](tcllib/files/modules/valtype/isbn\.md)|
+|
isthmus|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
iterator|[generator](tcllib/files/modules/generator/generator\.md)|
+
+
+####
Keywords: J
+
+|||
+|---|---|
+|
javascript|[javascript](tcllib/files/modules/javascript/javascript\.md) · [json](tcllib/files/modules/json/json\.md) · [json::write](tcllib/files/modules/json/json\_write\.md)|
+|
jfif|[jpeg](tcllib/files/modules/jpeg/jpeg\.md)|
+|
join|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
jpeg|[jpeg](tcllib/files/modules/jpeg/jpeg\.md)|
+|
JSON|[doctools::idx::export::json](tcllib/files/modules/doctools2idx/idx\_export\_json\.md) · [doctools::idx::import::json](tcllib/files/modules/doctools2idx/idx\_import\_json\.md) · [doctools::toc::export::json](tcllib/files/modules/doctools2toc/toc\_export\_json\.md) · [doctools::toc::import::json](tcllib/files/modules/doctools2toc/toc\_import\_json\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md)|
+|
json|[doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [huddle](tcllib/files/modules/yaml/huddle\.md) · [json](tcllib/files/modules/json/json\.md) · [json::write](tcllib/files/modules/json/json\_write\.md)|
+|
justification|[textutil::adjust](tcllib/files/modules/textutil/adjust\.md)|
+
+
+####
Keywords: K
+
+|||
+|---|---|
+|
keyword index|[docidx\_intro](tcllib/files/modules/doctools/docidx\_intro\.md) · [doctools2idx\_introduction](tcllib/files/modules/doctools2idx/idx\_introduction\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md)|
+|
keywords|[docidx\_plugin\_apiref](tcllib/files/modules/doctools/docidx\_plugin\_apiref\.md)|
+|
knuth|[soundex](tcllib/files/modules/soundex/soundex\.md)|
+
+
+####
Keywords: L
+
+|||
+|---|---|
+|
l10n|[doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md)|
+|
lambda|[lambda](tcllib/files/modules/lambda/lambda\.md)|
+|
LaTeX|[docstrip](tcllib/files/modules/docstrip/docstrip\.md) · [docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md) · [tcldocstrip](tcllib/files/apps/tcldocstrip\.md)|
+|
latex|[doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md)|
+|
latitute|[map::slippy](tcllib/files/modules/map/map\_slippy\.md)|
+|
ldap|[ldap](tcllib/files/modules/ldap/ldap\.md) · [ldapx](tcllib/files/modules/ldap/ldapx\.md) · [uri](tcllib/files/modules/uri/uri\.md)|
+|
ldap client|[ldap](tcllib/files/modules/ldap/ldap\.md) · [ldapx](tcllib/files/modules/ldap/ldapx\.md)|
+|
ldif|[ldapx](tcllib/files/modules/ldap/ldapx\.md)|
+|
least squares|[math::linearalgebra](tcllib/files/modules/math/linalg\.md)|
+|
left outer join|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
lemon|[page\_util\_norm\_lemon](tcllib/files/modules/page/page\_util\_norm\_lemon\.md)|
+|
level graph|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
lexer|[doctools::idx::parse](tcllib/files/modules/doctools2idx/idx\_parse\.md) · [doctools::toc::parse](tcllib/files/modules/doctools2toc/toc\_parse\.md)|
+|
lexing|[string::token](tcllib/files/modules/string/token\.md) · [string::token::shell](tcllib/files/modules/string/token\_shell\.md)|
+|
limitsize|[tcl::transform::limitsize](tcllib/files/modules/virtchannel\_transform/limitsize\.md)|
+|
line|[math::geometry](tcllib/files/modules/math/math\_geometry\.md)|
+|
linear algebra|[math::linearalgebra](tcllib/files/modules/math/linalg\.md)|
+|
linear equations|[math::linearalgebra](tcllib/files/modules/math/linalg\.md)|
+|
linear program|[math::optimize](tcllib/files/modules/math/optimize\.md)|
+|
lines|[term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md)|
+|
list|[struct::list](tcllib/files/modules/struct/struct\_list\.md) · [struct::queue](tcllib/files/modules/struct/queue\.md) · [wip](tcllib/files/modules/wip/wip\.md)|
+|
listener|[term::receive](tcllib/files/modules/term/receive\.md) · [term::receive::bind](tcllib/files/modules/term/term\_bind\.md)|
+|
literate programming|[docstrip](tcllib/files/modules/docstrip/docstrip\.md) · [docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md) · [tcldocstrip](tcllib/files/apps/tcldocstrip\.md)|
+|
LL\(k\)|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
local searching|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
localization|[doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md)|
+|
location|[map::geocode::nominatim](tcllib/files/modules/map/map\_geocode\_nominatim\.md) · [map::slippy](tcllib/files/modules/map/map\_slippy\.md) · [map::slippy::cache](tcllib/files/modules/map/map\_slippy\_cache\.md) · [map::slippy::fetcher](tcllib/files/modules/map/map\_slippy\_fetcher\.md)|
+|
log|[debug](tcllib/files/modules/debug/debug\.md) · [debug::caller](tcllib/files/modules/debug/debug\_caller\.md) · [debug::heartbeat](tcllib/files/modules/debug/debug\_heartbeat\.md) · [debug::timestamp](tcllib/files/modules/debug/debug\_timestamp\.md) · [doctools::cvs](tcllib/files/modules/doctools/cvs\.md) · [log](tcllib/files/modules/log/log\.md) · [logger](tcllib/files/modules/log/logger\.md)|
+|
log level|[log](tcllib/files/modules/log/log\.md) · [logger](tcllib/files/modules/log/logger\.md)|
+|
logger|[logger](tcllib/files/modules/log/logger\.md) · [logger::appender](tcllib/files/modules/log/loggerAppender\.md) · [logger::utils](tcllib/files/modules/log/loggerUtils\.md)|
+|
longest common subsequence|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
longitude|[map::slippy](tcllib/files/modules/map/map\_slippy\.md)|
+|
loop|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
luhn|[valtype::luhn](tcllib/files/modules/valtype/luhn\.md) · [valtype::luhn5](tcllib/files/modules/valtype/luhn5\.md)|
+|
luhn\-5|[valtype::luhn5](tcllib/files/modules/valtype/luhn5\.md)|
+
+
+####
Keywords: M
+
+|||
+|---|---|
+|
macros|[doctools::nroff::man\_macros](tcllib/files/modules/doctools2base/nroff\_manmacros\.md)|
+|
mail|[imap4](tcllib/files/modules/imap4/imap4\.md) · [mime](tcllib/files/modules/mime/mime\.md) · [pop3](tcllib/files/modules/pop3/pop3\.md) · [smtp](tcllib/files/modules/mime/smtp\.md)|
+|
mailto|[uri](tcllib/files/modules/uri/uri\.md)|
+|
man\_macros|[doctools::nroff::man\_macros](tcllib/files/modules/doctools2base/nroff\_manmacros\.md)|
+|
manpage|[doctools](tcllib/files/modules/doctools/doctools\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [doctools\_plugin\_apiref](tcllib/files/modules/doctools/doctools\_plugin\_apiref\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md) · [mpexpand](tcllib/files/modules/doctools/mpexpand\.md)|
+|
map|[generator](tcllib/files/modules/generator/generator\.md) · [map::geocode::nominatim](tcllib/files/modules/map/map\_geocode\_nominatim\.md) · [map::slippy](tcllib/files/modules/map/map\_slippy\.md) · [map::slippy::cache](tcllib/files/modules/map/map\_slippy\_cache\.md) · [map::slippy::fetcher](tcllib/files/modules/map/map\_slippy\_fetcher\.md) · [mapproj](tcllib/files/modules/mapproj/mapproj\.md) · [struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
markdown|[doctools](tcllib/files/modules/doctools/doctools\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md)|
+|
markup|[docidx\_intro](tcllib/files/modules/doctools/docidx\_intro\.md) · [docidx\_lang\_cmdref](tcllib/files/modules/doctools/docidx\_lang\_cmdref\.md) · [docidx\_lang\_faq](tcllib/files/modules/doctools/docidx\_lang\_faq\.md) · [docidx\_lang\_intro](tcllib/files/modules/doctools/docidx\_lang\_intro\.md) · [docidx\_lang\_syntax](tcllib/files/modules/doctools/docidx\_lang\_syntax\.md) · [docidx\_plugin\_apiref](tcllib/files/modules/doctools/docidx\_plugin\_apiref\.md) · [doctoc\_intro](tcllib/files/modules/doctools/doctoc\_intro\.md) · [doctoc\_lang\_cmdref](tcllib/files/modules/doctools/doctoc\_lang\_cmdref\.md) · [doctoc\_lang\_faq](tcllib/files/modules/doctools/doctoc\_lang\_faq\.md) · [doctoc\_lang\_intro](tcllib/files/modules/doctools/doctoc\_lang\_intro\.md) · [doctoc\_lang\_syntax](tcllib/files/modules/doctools/doctoc\_lang\_syntax\.md) · [doctoc\_plugin\_apiref](tcllib/files/modules/doctools/doctoc\_plugin\_apiref\.md) · [doctools](tcllib/files/modules/doctools/doctools\.md) · [doctools2idx\_introduction](tcllib/files/modules/doctools2idx/idx\_introduction\.md) · [doctools2toc\_introduction](tcllib/files/modules/doctools2toc/toc\_introduction\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [doctools\_intro](tcllib/files/modules/doctools/doctools\_intro\.md) · [doctools\_lang\_cmdref](tcllib/files/modules/doctools/doctools\_lang\_cmdref\.md) · [doctools\_lang\_faq](tcllib/files/modules/doctools/doctools\_lang\_faq\.md) · [doctools\_lang\_intro](tcllib/files/modules/doctools/doctools\_lang\_intro\.md) · [doctools\_lang\_syntax](tcllib/files/modules/doctools/doctools\_lang\_syntax\.md) · [doctools\_plugin\_apiref](tcllib/files/modules/doctools/doctools\_plugin\_apiref\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md) · [mpexpand](tcllib/files/modules/doctools/mpexpand\.md) · [tcldocstrip](tcllib/files/apps/tcldocstrip\.md)|
+|
MasterCard|[valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md)|
+|
matching|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
math|[math](tcllib/files/modules/math/math\.md) · [math::bigfloat](tcllib/files/modules/math/bigfloat\.md) · [math::bignum](tcllib/files/modules/math/bignum\.md) · [math::calculus](tcllib/files/modules/math/calculus\.md) · [math::complexnumbers](tcllib/files/modules/math/qcomplex\.md) · [math::constants](tcllib/files/modules/math/constants\.md) · [math::decimal](tcllib/files/modules/math/decimal\.md) · [math::fuzzy](tcllib/files/modules/math/fuzzy\.md) · [math::geometry](tcllib/files/modules/math/math\_geometry\.md) · [math::interpolate](tcllib/files/modules/math/interpolate\.md) · [math::linearalgebra](tcllib/files/modules/math/linalg\.md) · [math::optimize](tcllib/files/modules/math/optimize\.md) · [math::PCA](tcllib/files/modules/math/pca\.md) · [math::polynomials](tcllib/files/modules/math/polynomials\.md) · [math::rationalfunctions](tcllib/files/modules/math/rational\_funcs\.md) · [math::special](tcllib/files/modules/math/special\.md) · [math::trig](tcllib/files/modules/math/trig\.md) · [simulation::annealing](tcllib/files/modules/simulation/annealing\.md) · [simulation::montecarlo](tcllib/files/modules/simulation/montecarlo\.md) · [simulation::random](tcllib/files/modules/simulation/simulation\_random\.md)|
+|
mathematics|[math::fourier](tcllib/files/modules/math/fourier\.md) · [math::statistics](tcllib/files/modules/math/statistics\.md)|
+|
matrices|[math::linearalgebra](tcllib/files/modules/math/linalg\.md)|
+|
matrix|[csv](tcllib/files/modules/csv/csv\.md) · [math::linearalgebra](tcllib/files/modules/math/linalg\.md) · [report](tcllib/files/modules/report/report\.md) · [struct::matrix](tcllib/files/modules/struct/matrix\.md) · [struct::matrix\_v1](tcllib/files/modules/struct/matrix1\.md) · [struct::queue](tcllib/files/modules/struct/queue\.md) · [struct::stack](tcllib/files/modules/struct/stack\.md)|
+|
max cut|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
maximum|[math::optimize](tcllib/files/modules/math/optimize\.md)|
+|
maximum flow|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
md4|[md4](tcllib/files/modules/md4/md4\.md) · [ripemd128](tcllib/files/modules/ripemd/ripemd128\.md) · [ripemd160](tcllib/files/modules/ripemd/ripemd160\.md)|
+|
md5|[md5](tcllib/files/modules/md5/md5\.md) · [md5crypt](tcllib/files/modules/md5crypt/md5crypt\.md)|
+|
md5crypt|[md5crypt](tcllib/files/modules/md5crypt/md5crypt\.md)|
+|
medicare|[valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md)|
+|
mega widget|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md)|
+|
membership|[struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
menu|[term::ansi::code::macros](tcllib/files/modules/term/ansi\_cmacros\.md) · [term::interact::menu](tcllib/files/modules/term/imenu\.md)|
+|
merge|[tcl::randomseed](tcllib/files/modules/virtchannel\_base/randseed\.md) · [uevent::onidle](tcllib/files/modules/uev/uevent\_onidle\.md)|
+|
merge find|[struct::disjointset](tcllib/files/modules/struct/disjointset\.md)|
+|
merging|[bench](tcllib/files/modules/bench/bench\.md)|
+|
message|[comm](tcllib/files/modules/comm/comm\.md) · [comm\_wire](tcllib/files/modules/comm/comm\_wire\.md) · [log](tcllib/files/modules/log/log\.md)|
+|
message catalog|[doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md)|
+|
message level|[log](tcllib/files/modules/log/log\.md)|
+|
message package|[doctools::msgcat](tcllib/files/modules/doctools2base/tcllib\_msgcat\.md) · [doctools::msgcat::idx::c](tcllib/files/modules/doctools2idx/idx\_msgcat\_c\.md) · [doctools::msgcat::idx::de](tcllib/files/modules/doctools2idx/idx\_msgcat\_de\.md) · [doctools::msgcat::idx::en](tcllib/files/modules/doctools2idx/idx\_msgcat\_en\.md) · [doctools::msgcat::idx::fr](tcllib/files/modules/doctools2idx/idx\_msgcat\_fr\.md) · [doctools::msgcat::toc::c](tcllib/files/modules/doctools2toc/toc\_msgcat\_c\.md) · [doctools::msgcat::toc::de](tcllib/files/modules/doctools2toc/toc\_msgcat\_de\.md) · [doctools::msgcat::toc::en](tcllib/files/modules/doctools2toc/toc\_msgcat\_en\.md) · [doctools::msgcat::toc::fr](tcllib/files/modules/doctools2toc/toc\_msgcat\_fr\.md)|
+|
message\-digest|[md4](tcllib/files/modules/md4/md4\.md) · [md5](tcllib/files/modules/md5/md5\.md) · [md5crypt](tcllib/files/modules/md5crypt/md5crypt\.md) · [otp](tcllib/files/modules/otp/otp\.md) · [ripemd128](tcllib/files/modules/ripemd/ripemd128\.md) · [ripemd160](tcllib/files/modules/ripemd/ripemd160\.md) · [sha1](tcllib/files/modules/sha1/sha1\.md) · [sha256](tcllib/files/modules/sha1/sha256\.md)|
+|
metakit|[tie](tcllib/files/modules/tie/tie\_std\.md) · [tie](tcllib/files/modules/tie/tie\.md)|
+|
method|[deleg\_method](tcllib/files/modules/interp/deleg\_method\.md) · [interp](tcllib/files/modules/interp/tcllib\_interp\.md)|
+|
method reference|[oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md)|
+|
mime|[fileutil::magic::cfront](tcllib/files/modules/fumagic/cfront\.md) · [fileutil::magic::cgen](tcllib/files/modules/fumagic/cgen\.md) · [fileutil::magic::rt](tcllib/files/modules/fumagic/rtcore\.md) · [mime](tcllib/files/modules/mime/mime\.md) · [smtp](tcllib/files/modules/mime/smtp\.md)|
+|
minimal spanning tree|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
minimum|[math::optimize](tcllib/files/modules/math/optimize\.md)|
+|
minimum cost flow|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
minimum degree spanning tree|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
minimum diameter spanning tree|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
mobile phone|[valtype::imei](tcllib/files/modules/valtype/imei\.md)|
+|
module|[docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md)|
+|
montecarlo simulation|[simulation::montecarlo](tcllib/files/modules/simulation/montecarlo\.md)|
+|
move|[fileutil::multi](tcllib/files/modules/fileutil/multi\.md) · [fileutil::multi::op](tcllib/files/modules/fileutil/multiop\.md)|
+|
multi\-file|[fileutil::multi](tcllib/files/modules/fileutil/multi\.md) · [fileutil::multi::op](tcllib/files/modules/fileutil/multiop\.md)|
+|
multiplexer|[multiplexer](tcllib/files/modules/multiplexer/multiplexer\.md)|
+|
multiprecision|[math::bigfloat](tcllib/files/modules/math/bigfloat\.md) · [math::bignum](tcllib/files/modules/math/bignum\.md)|
+|
my method|[oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md)|
+
+
+####
Keywords: N
+
+|||
+|---|---|
+|
name service|[nameserv](tcllib/files/modules/nns/nns\_client\.md) · [nameserv::auto](tcllib/files/modules/nns/nns\_auto\.md) · [nameserv::common](tcllib/files/modules/nns/nns\_common\.md) · [nameserv::protocol](tcllib/files/modules/nns/nns\_protocol\.md) · [nameserv::server](tcllib/files/modules/nns/nns\_server\.md) · [nns](tcllib/files/apps/nns\.md) · [nns\_intro](tcllib/files/modules/nns/nns\_intro\.md) · [nnsd](tcllib/files/apps/nnsd\.md) · [nnslog](tcllib/files/apps/nnslog\.md) · [udpcluster](tcllib/files/modules/udpcluster/udpcluster\.md)|
+|
namespace unknown|[namespacex](tcllib/files/modules/namespacex/namespacex\.md)|
+|
namespace utilities|[namespacex](tcllib/files/modules/namespacex/namespacex\.md)|
+|
narrative|[debug](tcllib/files/modules/debug/debug\.md) · [debug::caller](tcllib/files/modules/debug/debug\_caller\.md) · [debug::heartbeat](tcllib/files/modules/debug/debug\_heartbeat\.md) · [debug::timestamp](tcllib/files/modules/debug/debug\_timestamp\.md)|
+|
National Provider Identifier|[valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md)|
+|
neighbour|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
net|[ftp](tcllib/files/modules/ftp/ftp\.md) · [ftp::geturl](tcllib/files/modules/ftp/ftp\_geturl\.md) · [imap4](tcllib/files/modules/imap4/imap4\.md) · [mime](tcllib/files/modules/mime/mime\.md) · [smtp](tcllib/files/modules/mime/smtp\.md) · [websocket](tcllib/files/modules/websocket/websocket\.md)|
+|
nettool|[nettool](tcllib/files/modules/nettool/nettool\.md)|
+|
network|[pop3d](tcllib/files/modules/pop3d/pop3d\.md) · [pop3d::dbox](tcllib/files/modules/pop3d/pop3d\_dbox\.md) · [pop3d::udb](tcllib/files/modules/pop3d/pop3d\_udb\.md)|
+|
news|[nntp](tcllib/files/modules/nntp/nntp\.md) · [uri](tcllib/files/modules/uri/uri\.md)|
+|
next permutation|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
nmea|[nmea](tcllib/files/modules/nmea/nmea\.md)|
+|
nntp|[nntp](tcllib/files/modules/nntp/nntp\.md)|
+|
nntpclient|[nntp](tcllib/files/modules/nntp/nntp\.md)|
+|
no\-op|[control](tcllib/files/modules/control/control\.md)|
+|
node|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md) · [struct::tree](tcllib/files/modules/struct/struct\_tree\.md)|
+|
nominatim|[map::geocode::nominatim](tcllib/files/modules/map/map\_geocode\_nominatim\.md)|
+|
normalization|[bench](tcllib/files/modules/bench/bench\.md) · [page\_util\_norm\_lemon](tcllib/files/modules/page/page\_util\_norm\_lemon\.md) · [page\_util\_norm\_peg](tcllib/files/modules/page/page\_util\_norm\_peg\.md) · [unicode](tcllib/files/modules/stringprep/unicode\.md)|
+|
NPI|[valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md)|
+|
nroff|[doctools](tcllib/files/modules/doctools/doctools\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::export::nroff](tcllib/files/modules/doctools2idx/idx\_export\_nroff\.md) · [doctools::nroff::man\_macros](tcllib/files/modules/doctools2base/nroff\_manmacros\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::export::nroff](tcllib/files/modules/doctools2toc/toc\_export\_nroff\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md) · [mpexpand](tcllib/files/modules/doctools/mpexpand\.md)|
+|
NTLM|[SASL::NTLM](tcllib/files/modules/sasl/ntlm\.md)|
+|
NTP|[ntp\_time](tcllib/files/modules/ntp/ntp\_time\.md)|
+|
null|[tcl::chan::null](tcllib/files/modules/virtchannel\_base/tcllib\_null\.md) · [tcl::chan::nullzero](tcllib/files/modules/virtchannel\_base/nullzero\.md)|
+|
number theory|[math::numtheory](tcllib/files/modules/math/numtheory\.md)|
+
+
+####
Keywords: O
+
+|||
+|---|---|
+|
oauth|[oauth](tcllib/files/modules/oauth/oauth\.md)|
+|
object|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md) · [stooop](tcllib/files/modules/stooop/stooop\.md) · [switched](tcllib/files/modules/stooop/switched\.md)|
+|
object oriented|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md) · [stooop](tcllib/files/modules/stooop/stooop\.md) · [switched](tcllib/files/modules/stooop/switched\.md)|
+|
observer|[hook](tcllib/files/modules/hook/hook\.md) · [tcl::transform::observe](tcllib/files/modules/virtchannel\_transform/observe\.md)|
+|
odie|[cron](tcllib/files/modules/cron/cron\.md) · [nettool](tcllib/files/modules/nettool/nettool\.md) · [processman](tcllib/files/modules/processman/processman\.md)|
+|
on\-idle|[uevent::onidle](tcllib/files/modules/uev/uevent\_onidle\.md)|
+|
one time pad|[tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md)|
+|
optimization|[math::optimize](tcllib/files/modules/math/optimize\.md) · [simulation::annealing](tcllib/files/modules/simulation/annealing\.md)|
+|
ordered list|[struct::prioqueue](tcllib/files/modules/struct/prioqueue\.md)|
+|
otp|[tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md)|
+|
outer join|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+
+
+####
Keywords: P
+
+|||
+|---|---|
+|
package|[csv](tcllib/files/modules/csv/csv\.md)|
+|
package indexing|[docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md)|
+|
page|[page\_intro](tcllib/files/modules/page/page\_intro\.md) · [page\_pluginmgr](tcllib/files/modules/page/page\_pluginmgr\.md) · [page\_util\_flow](tcllib/files/modules/page/page\_util\_flow\.md) · [page\_util\_norm\_lemon](tcllib/files/modules/page/page\_util\_norm\_lemon\.md) · [page\_util\_norm\_peg](tcllib/files/modules/page/page\_util\_norm\_peg\.md) · [page\_util\_peg](tcllib/files/modules/page/page\_util\_peg\.md) · [page\_util\_quote](tcllib/files/modules/page/page\_util\_quote\.md)|
+|
pager|[term::interact::pager](tcllib/files/modules/term/ipager\.md)|
+|
paragraph|[textutil](tcllib/files/modules/textutil/textutil\.md) · [textutil::adjust](tcllib/files/modules/textutil/adjust\.md)|
+|
PARAM|[pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md)|
+|
parameter entry form|[tepam](tcllib/files/modules/tepam/tepam\_introduction\.md) · [tepam::argument\_dialogbox](tcllib/files/modules/tepam/tepam\_argument\_dialogbox\.md)|
+|
parser|[doctools::idx::parse](tcllib/files/modules/doctools2idx/idx\_parse\.md) · [doctools::tcl::parse](tcllib/files/modules/doctools2base/tcl\_parse\.md) · [doctools::toc::parse](tcllib/files/modules/doctools2toc/toc\_parse\.md) · [grammar::aycock](tcllib/files/modules/grammar\_aycock/aycock\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md) · [xsxp](tcllib/files/modules/amazon\-s3/xsxp\.md)|
+|
parser generator|[page](tcllib/files/apps/page\.md) · [page\_intro](tcllib/files/modules/page/page\_intro\.md) · [page\_pluginmgr](tcllib/files/modules/page/page\_pluginmgr\.md) · [page\_util\_flow](tcllib/files/modules/page/page\_util\_flow\.md) · [page\_util\_norm\_lemon](tcllib/files/modules/page/page\_util\_norm\_lemon\.md) · [page\_util\_norm\_peg](tcllib/files/modules/page/page\_util\_norm\_peg\.md) · [page\_util\_peg](tcllib/files/modules/page/page\_util\_peg\.md) · [page\_util\_quote](tcllib/files/modules/page/page\_util\_quote\.md)|
+|
parsing|[bench::in](tcllib/files/modules/bench/bench\_read\.md) · [bibtex](tcllib/files/modules/bibtex/bibtex\.md) · [doctools2idx\_introduction](tcllib/files/modules/doctools2idx/idx\_introduction\.md) · [doctools2toc\_introduction](tcllib/files/modules/doctools2toc/toc\_introduction\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [grammar::aycock](tcllib/files/modules/grammar\_aycock/aycock\.md) · [grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md) · [grammar::me::cpu](tcllib/files/modules/grammar\_me/me\_cpu\.md) · [grammar::me::cpu::core](tcllib/files/modules/grammar\_me/me\_cpucore\.md) · [grammar::me::cpu::gasm](tcllib/files/modules/grammar\_me/gasm\.md) · [grammar::me::tcl](tcllib/files/modules/grammar\_me/me\_tcl\.md) · [grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::me\_vm](tcllib/files/modules/grammar\_me/me\_vm\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [htmlparse](tcllib/files/modules/htmlparse/htmlparse\.md) · [huddle](tcllib/files/modules/yaml/huddle\.md) · [string::token::shell](tcllib/files/modules/string/token\_shell\.md) · [yaml](tcllib/files/modules/yaml/yaml\.md)|
+|
parsing expression|[grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
parsing expression grammar|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [page\_util\_peg](tcllib/files/modules/page/page\_util\_peg\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
partial application|[lambda](tcllib/files/modules/lambda/lambda\.md)|
+|
partition|[struct::disjointset](tcllib/files/modules/struct/disjointset\.md)|
+|
partitioned set|[struct::disjointset](tcllib/files/modules/struct/disjointset\.md)|
+|
passive|[transfer::connect](tcllib/files/modules/transfer/connect\.md)|
+|
password|[otp](tcllib/files/modules/otp/otp\.md)|
+|
patch|[docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md)|
+|
patching|[rcs](tcllib/files/modules/rcs/rcs\.md)|
+|
PCA|[math::PCA](tcllib/files/modules/math/pca\.md)|
+|
PEG|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [page\_util\_norm\_peg](tcllib/files/modules/page/page\_util\_norm\_peg\.md) · [page\_util\_peg](tcllib/files/modules/page/page\_util\_peg\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
performance|[bench](tcllib/files/modules/bench/bench\.md) · [bench::in](tcllib/files/modules/bench/bench\_read\.md) · [bench::out::csv](tcllib/files/modules/bench/bench\_wcsv\.md) · [bench::out::text](tcllib/files/modules/bench/bench\_wtext\.md) · [bench\_intro](tcllib/files/modules/bench/bench\_intro\.md) · [bench\_lang\_intro](tcllib/files/modules/bench/bench\_lang\_intro\.md) · [bench\_lang\_spec](tcllib/files/modules/bench/bench\_lang\_spec\.md) · [profiler](tcllib/files/modules/profiler/profiler\.md)|
+|
permutation|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
persistence|[tie](tcllib/files/modules/tie/tie\_std\.md) · [tie](tcllib/files/modules/tie/tie\.md)|
+|
phone|[valtype::imei](tcllib/files/modules/valtype/imei\.md)|
+|
pi|[math::constants](tcllib/files/modules/math/constants\.md)|
+|
plain text|[doctools::idx::export::text](tcllib/files/modules/doctools2idx/idx\_export\_text\.md) · [doctools::toc::export::text](tcllib/files/modules/doctools2toc/toc\_export\_text\.md)|
+|
plane geometry|[math::geometry](tcllib/files/modules/math/math\_geometry\.md)|
+|
plugin|[docidx\_plugin\_apiref](tcllib/files/modules/doctools/docidx\_plugin\_apiref\.md) · [doctoc\_plugin\_apiref](tcllib/files/modules/doctools/doctoc\_plugin\_apiref\.md) · [doctools2idx\_introduction](tcllib/files/modules/doctools2idx/idx\_introduction\.md) · [doctools2toc\_introduction](tcllib/files/modules/doctools2toc/toc\_introduction\.md) · [doctools::html::cssdefaults](tcllib/files/modules/doctools2base/html\_cssdefaults\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::nroff::man\_macros](tcllib/files/modules/doctools2base/nroff\_manmacros\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md)|
+|
plugin management|[pluginmgr](tcllib/files/modules/pluginmgr/pluginmgr\.md)|
+|
plugin search|[pluginmgr](tcllib/files/modules/pluginmgr/pluginmgr\.md)|
+|
png|[png](tcllib/files/modules/png/png\.md)|
+|
point|[math::geometry](tcllib/files/modules/math/math\_geometry\.md)|
+|
polynomial functions|[math::polynomials](tcllib/files/modules/math/polynomials\.md)|
+|
pool|[struct::pool](tcllib/files/modules/struct/pool\.md) · [struct::queue](tcllib/files/modules/struct/queue\.md)|
+|
pop|[pop3](tcllib/files/modules/pop3/pop3\.md)|
+|
pop3|[pop3](tcllib/files/modules/pop3/pop3\.md) · [pop3d](tcllib/files/modules/pop3d/pop3d\.md) · [pop3d::dbox](tcllib/files/modules/pop3d/pop3d\_dbox\.md) · [pop3d::udb](tcllib/files/modules/pop3d/pop3d\_udb\.md)|
+|
post\-order|[struct::tree](tcllib/files/modules/struct/struct\_tree\.md)|
+|
practcl|[practcl](tcllib/files/modules/practcl/practcl\.md)|
+|
pre\-order|[struct::tree](tcllib/files/modules/struct/struct\_tree\.md)|
+|
prefix|[textutil::string](tcllib/files/modules/textutil/textutil\_string\.md) · [textutil::trim](tcllib/files/modules/textutil/trim\.md)|
+|
prime|[math::numtheory](tcllib/files/modules/math/numtheory\.md)|
+|
prioqueue|[struct::prioqueue](tcllib/files/modules/struct/prioqueue\.md) · [struct::queue](tcllib/files/modules/struct/queue\.md)|
+|
priority queue|[struct::prioqueue](tcllib/files/modules/struct/prioqueue\.md)|
+|
proc|[lambda](tcllib/files/modules/lambda/lambda\.md)|
+|
procedure|[deleg\_proc](tcllib/files/modules/interp/deleg\_proc\.md) · [tepam](tcllib/files/modules/tepam/tepam\_introduction\.md) · [tepam::procedure](tcllib/files/modules/tepam/tepam\_procedure\.md)|
+|
procedure documentation|[tepam::doc\_gen](tcllib/files/modules/tepam/tepam\_doc\_gen\.md)|
+|
processman|[processman](tcllib/files/modules/processman/processman\.md)|
+|
producer|[hook](tcllib/files/modules/hook/hook\.md)|
+|
profile|[profiler](tcllib/files/modules/profiler/profiler\.md)|
+|
projection|[mapproj](tcllib/files/modules/mapproj/mapproj\.md)|
+|
prospero|[uri](tcllib/files/modules/uri/uri\.md)|
+|
protocol|[asn](tcllib/files/modules/asn/asn\.md) · [ldap](tcllib/files/modules/ldap/ldap\.md) · [ldapx](tcllib/files/modules/ldap/ldapx\.md) · [nameserv::protocol](tcllib/files/modules/nns/nns\_protocol\.md) · [pop3d](tcllib/files/modules/pop3d/pop3d\.md) · [pop3d::dbox](tcllib/files/modules/pop3d/pop3d\_dbox\.md) · [pop3d::udb](tcllib/files/modules/pop3d/pop3d\_udb\.md)|
+|
proxy|[autoproxy](tcllib/files/modules/http/autoproxy\.md)|
+|
public key cipher|[pki](tcllib/files/modules/pki/pki\.md)|
+|
publisher|[hook](tcllib/files/modules/hook/hook\.md)|
+|
push down automaton|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+
+
+####
Keywords: Q
+
+|||
+|---|---|
+|
queue|[csv](tcllib/files/modules/csv/csv\.md) · [htmlparse](tcllib/files/modules/htmlparse/htmlparse\.md) · [struct::stack](tcllib/files/modules/struct/stack\.md) · [transfer::copy::queue](tcllib/files/modules/transfer/tqueue\.md)|
+|
quoting|[page\_util\_quote](tcllib/files/modules/page/page\_util\_quote\.md)|
+
+
+####
Keywords: R
+
+|||
+|---|---|
+|
radians|[math::constants](tcllib/files/modules/math/constants\.md) · [units](tcllib/files/modules/units/units\.md)|
+|
radiobutton|[html](tcllib/files/modules/html/html\.md)|
+|
radius|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
random|[tcl::chan::random](tcllib/files/modules/virtchannel\_base/tcllib\_random\.md) · [tcl::randomseed](tcllib/files/modules/virtchannel\_base/randseed\.md)|
+|
random numbers|[simulation::random](tcllib/files/modules/simulation/simulation\_random\.md)|
+|
rational functions|[math::rationalfunctions](tcllib/files/modules/math/rational\_funcs\.md)|
+|
raw|[term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md)|
+|
rc4|[rc4](tcllib/files/modules/rc4/rc4\.md)|
+|
RCS|[rcs](tcllib/files/modules/rcs/rcs\.md)|
+|
RCS patch|[rcs](tcllib/files/modules/rcs/rcs\.md)|
+|
read|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
reading|[bench::in](tcllib/files/modules/bench/bench\_read\.md)|
+|
receiver|[term::receive](tcllib/files/modules/term/receive\.md) · [term::receive::bind](tcllib/files/modules/term/term\_bind\.md) · [transfer::receiver](tcllib/files/modules/transfer/receiver\.md)|
+|
reconnect|[nameserv::auto](tcllib/files/modules/nns/nns\_auto\.md)|
+|
record|[struct::queue](tcllib/files/modules/struct/queue\.md) · [struct::record](tcllib/files/modules/struct/record\.md)|
+|
recursive descent|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
reduce|[generator](tcllib/files/modules/generator/generator\.md) · [struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
reference|[doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md)|
+|
reflected channel|[tcl::chan::cat](tcllib/files/modules/virtchannel\_base/cat\.md) · [tcl::chan::core](tcllib/files/modules/virtchannel\_core/core\.md) · [tcl::chan::events](tcllib/files/modules/virtchannel\_core/events\.md) · [tcl::chan::facade](tcllib/files/modules/virtchannel\_base/facade\.md) · [tcl::chan::fifo](tcllib/files/modules/virtchannel\_base/tcllib\_fifo\.md) · [tcl::chan::fifo2](tcllib/files/modules/virtchannel\_base/tcllib\_fifo2\.md) · [tcl::chan::halfpipe](tcllib/files/modules/virtchannel\_base/halfpipe\.md) · [tcl::chan::memchan](tcllib/files/modules/virtchannel\_base/tcllib\_memchan\.md) · [tcl::chan::null](tcllib/files/modules/virtchannel\_base/tcllib\_null\.md) · [tcl::chan::nullzero](tcllib/files/modules/virtchannel\_base/nullzero\.md) · [tcl::chan::random](tcllib/files/modules/virtchannel\_base/tcllib\_random\.md) · [tcl::chan::std](tcllib/files/modules/virtchannel\_base/std\.md) · [tcl::chan::string](tcllib/files/modules/virtchannel\_base/tcllib\_string\.md) · [tcl::chan::textwindow](tcllib/files/modules/virtchannel\_base/textwindow\.md) · [tcl::chan::variable](tcllib/files/modules/virtchannel\_base/tcllib\_variable\.md) · [tcl::chan::zero](tcllib/files/modules/virtchannel\_base/tcllib\_zero\.md) · [tcl::randomseed](tcllib/files/modules/virtchannel\_base/randseed\.md) · [tcl::transform::adler32](tcllib/files/modules/virtchannel\_transform/adler32\.md) · [tcl::transform::base64](tcllib/files/modules/virtchannel\_transform/vt\_base64\.md) · [tcl::transform::core](tcllib/files/modules/virtchannel\_core/transformcore\.md) · [tcl::transform::counter](tcllib/files/modules/virtchannel\_transform/vt\_counter\.md) · [tcl::transform::crc32](tcllib/files/modules/virtchannel\_transform/vt\_crc32\.md) · [tcl::transform::hex](tcllib/files/modules/virtchannel\_transform/hex\.md) · [tcl::transform::identity](tcllib/files/modules/virtchannel\_transform/identity\.md) · [tcl::transform::limitsize](tcllib/files/modules/virtchannel\_transform/limitsize\.md) · [tcl::transform::observe](tcllib/files/modules/virtchannel\_transform/observe\.md) · [tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md) · [tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md) · [tcl::transform::spacer](tcllib/files/modules/virtchannel\_transform/spacer\.md) · [tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md)|
+|
regex|[string::token](tcllib/files/modules/string/token\.md)|
+|
regular expression|[grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md) · [textutil](tcllib/files/modules/textutil/textutil\.md) · [textutil::split](tcllib/files/modules/textutil/textutil\_split\.md) · [textutil::trim](tcllib/files/modules/textutil/trim\.md)|
+|
regular grammar|[grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md)|
+|
regular languages|[grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md)|
+|
remote communication|[comm](tcllib/files/modules/comm/comm\.md) · [comm\_wire](tcllib/files/modules/comm/comm\_wire\.md)|
+|
remote execution|[comm](tcllib/files/modules/comm/comm\.md) · [comm\_wire](tcllib/files/modules/comm/comm\_wire\.md)|
+|
remove|[fileutil::multi](tcllib/files/modules/fileutil/multi\.md) · [fileutil::multi::op](tcllib/files/modules/fileutil/multiop\.md)|
+|
repeating|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
repetition|[struct::list](tcllib/files/modules/struct/struct\_list\.md) · [textutil::repeat](tcllib/files/modules/textutil/repeat\.md)|
+|
report|[report](tcllib/files/modules/report/report\.md)|
+|
reshuffle|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
residual graph|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
resolver|[dns](tcllib/files/modules/dns/tcllib\_dns\.md)|
+|
resource management|[try](tcllib/files/modules/try/tcllib\_try\.md)|
+|
restore|[nameserv::auto](tcllib/files/modules/nns/nns\_auto\.md)|
+|
return|[throw](tcllib/files/modules/try/tcllib\_throw\.md)|
+|
reverse|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
rfc 821|[mime](tcllib/files/modules/mime/mime\.md) · [smtp](tcllib/files/modules/mime/smtp\.md) · [smtpd](tcllib/files/modules/smtpd/smtpd\.md)|
+|
rfc 822|[mime](tcllib/files/modules/mime/mime\.md) · [pop3d::dbox](tcllib/files/modules/pop3d/pop3d\_dbox\.md) · [smtp](tcllib/files/modules/mime/smtp\.md)|
+|
rfc 868|[ntp\_time](tcllib/files/modules/ntp/ntp\_time\.md)|
+|
rfc 959|[ftp](tcllib/files/modules/ftp/ftp\.md) · [ftp::geturl](tcllib/files/modules/ftp/ftp\_geturl\.md) · [ftpd](tcllib/files/modules/ftpd/ftpd\.md)|
+|
rfc 977|[nntp](tcllib/files/modules/nntp/nntp\.md)|
+|
rfc 1034|[dns](tcllib/files/modules/dns/tcllib\_dns\.md)|
+|
rfc 1035|[dns](tcllib/files/modules/dns/tcllib\_dns\.md)|
+|
rfc 1036|[nntp](tcllib/files/modules/nntp/nntp\.md)|
+|
rfc 1320|[md4](tcllib/files/modules/md4/md4\.md) · [md5](tcllib/files/modules/md5/md5\.md) · [ripemd128](tcllib/files/modules/ripemd/ripemd128\.md) · [ripemd160](tcllib/files/modules/ripemd/ripemd160\.md)|
+|
rfc 1321|[md4](tcllib/files/modules/md4/md4\.md) · [md5](tcllib/files/modules/md5/md5\.md) · [ripemd128](tcllib/files/modules/ripemd/ripemd128\.md) · [ripemd160](tcllib/files/modules/ripemd/ripemd160\.md)|
+|
rfc 1413|[ident](tcllib/files/modules/ident/ident\.md)|
+|
rfc 1630|[uri](tcllib/files/modules/uri/uri\.md)|
+|
rfc 1886|[dns](tcllib/files/modules/dns/tcllib\_dns\.md)|
+|
rfc 1939|[pop3](tcllib/files/modules/pop3/pop3\.md) · [pop3d](tcllib/files/modules/pop3d/pop3d\.md)|
+|
rfc 2030|[ntp\_time](tcllib/files/modules/ntp/ntp\_time\.md)|
+|
rfc 2045|[mime](tcllib/files/modules/mime/mime\.md)|
+|
rfc 2046|[mime](tcllib/files/modules/mime/mime\.md)|
+|
rfc 2049|[mime](tcllib/files/modules/mime/mime\.md)|
+|
rfc 2104|[md4](tcllib/files/modules/md4/md4\.md) · [md5](tcllib/files/modules/md5/md5\.md) · [ripemd128](tcllib/files/modules/ripemd/ripemd128\.md) · [ripemd160](tcllib/files/modules/ripemd/ripemd160\.md) · [sha1](tcllib/files/modules/sha1/sha1\.md) · [sha256](tcllib/files/modules/sha1/sha256\.md)|
+|
rfc 2141|[uri\_urn](tcllib/files/modules/uri/urn\-scheme\.md)|
+|
rfc 2251|[ldap](tcllib/files/modules/ldap/ldap\.md) · [ldapx](tcllib/files/modules/ldap/ldapx\.md)|
+|
rfc 2255|[uri](tcllib/files/modules/uri/uri\.md)|
+|
rfc 2289|[otp](tcllib/files/modules/otp/otp\.md)|
+|
rfc 2396|[uri](tcllib/files/modules/uri/uri\.md)|
+|
rfc 2554|[smtp](tcllib/files/modules/mime/smtp\.md)|
+|
RFC 2718|[oauth](tcllib/files/modules/oauth/oauth\.md)|
+|
rfc 2821|[smtp](tcllib/files/modules/mime/smtp\.md) · [smtpd](tcllib/files/modules/smtpd/smtpd\.md)|
+|
rfc 2849|[ldapx](tcllib/files/modules/ldap/ldapx\.md)|
+|
rfc 3207|[smtp](tcllib/files/modules/mime/smtp\.md)|
+|
rfc 3513|[tcllib\_ip](tcllib/files/modules/dns/tcllib\_ip\.md)|
+|
rfc 3986|[uri](tcllib/files/modules/uri/uri\.md)|
+|
rfc 4511|[ldap](tcllib/files/modules/ldap/ldap\.md)|
+|
RFC 5849|[oauth](tcllib/files/modules/oauth/oauth\.md)|
+|
rfc 6455|[websocket](tcllib/files/modules/websocket/websocket\.md)|
+|
rfc 7858|[dns](tcllib/files/modules/dns/tcllib\_dns\.md)|
+|
rfc3501|[imap4](tcllib/files/modules/imap4/imap4\.md)|
+|
rfc3548|[base32](tcllib/files/modules/base32/base32\.md) · [base32::hex](tcllib/files/modules/base32/base32hex\.md)|
+|
right outer join|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
RIPEMD|[ripemd128](tcllib/files/modules/ripemd/ripemd128\.md) · [ripemd160](tcllib/files/modules/ripemd/ripemd160\.md)|
+|
roman numeral|[math::roman](tcllib/files/modules/math/roman\.md)|
+|
roots|[math::calculus](tcllib/files/modules/math/calculus\.md)|
+|
rot|[tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md)|
+|
rot13|[tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md)|
+|
rounding|[math::fuzzy](tcllib/files/modules/math/fuzzy\.md)|
+|
rows|[term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md)|
+|
rpc|[comm](tcllib/files/modules/comm/comm\.md) · [comm\_wire](tcllib/files/modules/comm/comm\_wire\.md)|
+|
rsa|[pki](tcllib/files/modules/pki/pki\.md)|
+|
running|[grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md)|
+
+
+####
Keywords: S
+
+|||
+|---|---|
+|
s3|[S3](tcllib/files/modules/amazon\-s3/S3\.md)|
+|
SASL|[SASL](tcllib/files/modules/sasl/sasl\.md) · [SASL::NTLM](tcllib/files/modules/sasl/ntlm\.md) · [SASL::SCRAM](tcllib/files/modules/sasl/scram\.md) · [SASL::XGoogleToken](tcllib/files/modules/sasl/gtoken\.md)|
+|
scanl|[generator](tcllib/files/modules/generator/generator\.md)|
+|
SCCS|[rcs](tcllib/files/modules/rcs/rcs\.md)|
+|
SCRAM|[SASL::SCRAM](tcllib/files/modules/sasl/scram\.md)|
+|
secure|[comm](tcllib/files/modules/comm/comm\.md) · [pop3](tcllib/files/modules/pop3/pop3\.md) · [pop3d](tcllib/files/modules/pop3d/pop3d\.md) · [transfer::connect](tcllib/files/modules/transfer/connect\.md) · [transfer::receiver](tcllib/files/modules/transfer/receiver\.md) · [transfer::transmitter](tcllib/files/modules/transfer/transmitter\.md)|
+|
security|[aes](tcllib/files/modules/aes/aes\.md) · [blowfish](tcllib/files/modules/blowfish/blowfish\.md) · [cksum](tcllib/files/modules/crc/cksum\.md) · [crc16](tcllib/files/modules/crc/crc16\.md) · [crc32](tcllib/files/modules/crc/crc32\.md) · [des](tcllib/files/modules/des/des\.md) · [md4](tcllib/files/modules/md4/md4\.md) · [md5](tcllib/files/modules/md5/md5\.md) · [md5crypt](tcllib/files/modules/md5crypt/md5crypt\.md) · [otp](tcllib/files/modules/otp/otp\.md) · [pki](tcllib/files/modules/pki/pki\.md) · [rc4](tcllib/files/modules/rc4/rc4\.md) · [ripemd128](tcllib/files/modules/ripemd/ripemd128\.md) · [ripemd160](tcllib/files/modules/ripemd/ripemd160\.md) · [sha1](tcllib/files/modules/sha1/sha1\.md) · [sha256](tcllib/files/modules/sha1/sha256\.md) · [sum](tcllib/files/modules/crc/sum\.md) · [tclDES](tcllib/files/modules/des/tcldes\.md) · [tclDESjr](tcllib/files/modules/des/tcldesjr\.md)|
+|
seed|[tcl::randomseed](tcllib/files/modules/virtchannel\_base/randseed\.md)|
+|
selectionbox|[javascript](tcllib/files/modules/javascript/javascript\.md)|
+|
semantic markup|[docidx\_intro](tcllib/files/modules/doctools/docidx\_intro\.md) · [docidx\_lang\_cmdref](tcllib/files/modules/doctools/docidx\_lang\_cmdref\.md) · [docidx\_lang\_faq](tcllib/files/modules/doctools/docidx\_lang\_faq\.md) · [docidx\_lang\_intro](tcllib/files/modules/doctools/docidx\_lang\_intro\.md) · [docidx\_lang\_syntax](tcllib/files/modules/doctools/docidx\_lang\_syntax\.md) · [docidx\_plugin\_apiref](tcllib/files/modules/doctools/docidx\_plugin\_apiref\.md) · [doctoc\_intro](tcllib/files/modules/doctools/doctoc\_intro\.md) · [doctoc\_lang\_cmdref](tcllib/files/modules/doctools/doctoc\_lang\_cmdref\.md) · [doctoc\_lang\_faq](tcllib/files/modules/doctools/doctoc\_lang\_faq\.md) · [doctoc\_lang\_intro](tcllib/files/modules/doctools/doctoc\_lang\_intro\.md) · [doctoc\_lang\_syntax](tcllib/files/modules/doctools/doctoc\_lang\_syntax\.md) · [doctoc\_plugin\_apiref](tcllib/files/modules/doctools/doctoc\_plugin\_apiref\.md) · [doctools2idx\_introduction](tcllib/files/modules/doctools2idx/idx\_introduction\.md) · [doctools2toc\_introduction](tcllib/files/modules/doctools2toc/toc\_introduction\.md) · [doctools\_intro](tcllib/files/modules/doctools/doctools\_intro\.md) · [doctools\_lang\_cmdref](tcllib/files/modules/doctools/doctools\_lang\_cmdref\.md) · [doctools\_lang\_faq](tcllib/files/modules/doctools/doctools\_lang\_faq\.md) · [doctools\_lang\_intro](tcllib/files/modules/doctools/doctools\_lang\_intro\.md) · [doctools\_lang\_syntax](tcllib/files/modules/doctools/doctools\_lang\_syntax\.md) · [doctools\_plugin\_apiref](tcllib/files/modules/doctools/doctools\_plugin\_apiref\.md)|
+|
send|[comm](tcllib/files/modules/comm/comm\.md)|
+|
serialization|[bee](tcllib/files/modules/bee/bee\.md) · [doctools::idx::export::docidx](tcllib/files/modules/doctools2idx/export\_docidx\.md) · [doctools::idx::export::html](tcllib/files/modules/doctools2idx/idx\_export\_html\.md) · [doctools::idx::export::json](tcllib/files/modules/doctools2idx/idx\_export\_json\.md) · [doctools::idx::export::nroff](tcllib/files/modules/doctools2idx/idx\_export\_nroff\.md) · [doctools::idx::export::text](tcllib/files/modules/doctools2idx/idx\_export\_text\.md) · [doctools::idx::export::wiki](tcllib/files/modules/doctools2idx/idx\_export\_wiki\.md) · [doctools::idx::structure](tcllib/files/modules/doctools2idx/idx\_structure\.md) · [doctools::toc::export::doctoc](tcllib/files/modules/doctools2toc/export\_doctoc\.md) · [doctools::toc::export::html](tcllib/files/modules/doctools2toc/toc\_export\_html\.md) · [doctools::toc::export::json](tcllib/files/modules/doctools2toc/toc\_export\_json\.md) · [doctools::toc::export::nroff](tcllib/files/modules/doctools2toc/toc\_export\_nroff\.md) · [doctools::toc::export::text](tcllib/files/modules/doctools2toc/toc\_export\_text\.md) · [doctools::toc::export::wiki](tcllib/files/modules/doctools2toc/toc\_export\_wiki\.md) · [doctools::toc::structure](tcllib/files/modules/doctools2toc/toc\_structure\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::tree](tcllib/files/modules/struct/struct\_tree\.md)|
+|
server|[map::geocode::nominatim](tcllib/files/modules/map/map\_geocode\_nominatim\.md) · [map::slippy::fetcher](tcllib/files/modules/map/map\_slippy\_fetcher\.md) · [nameserv::common](tcllib/files/modules/nns/nns\_common\.md) · [nameserv::server](tcllib/files/modules/nns/nns\_server\.md) · [nns\_intro](tcllib/files/modules/nns/nns\_intro\.md) · [nnsd](tcllib/files/apps/nnsd\.md) · [udpcluster](tcllib/files/modules/udpcluster/udpcluster\.md)|
+|
service|[logger](tcllib/files/modules/log/logger\.md)|
+|
services|[ftpd](tcllib/files/modules/ftpd/ftpd\.md) · [smtpd](tcllib/files/modules/smtpd/smtpd\.md) · [tool](tcllib/files/modules/httpd/httpd\.md)|
+|
set|[struct::queue](tcllib/files/modules/struct/queue\.md) · [struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
sha1|[sha1](tcllib/files/modules/sha1/sha1\.md)|
+|
sha256|[sha256](tcllib/files/modules/sha1/sha256\.md)|
+|
shell|[string::token::shell](tcllib/files/modules/string/token\_shell\.md)|
+|
shortest path|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
shuffle|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
simulated annealing|[simulation::annealing](tcllib/files/modules/simulation/annealing\.md)|
+|
simulation|[simulation::random](tcllib/files/modules/simulation/simulation\_random\.md)|
+|
singleton|[oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md)|
+|
size limit|[tcl::transform::limitsize](tcllib/files/modules/virtchannel\_transform/limitsize\.md)|
+|
skiplist|[struct::queue](tcllib/files/modules/struct/queue\.md) · [struct::skiplist](tcllib/files/modules/struct/skiplist\.md)|
+|
slippy|[map::slippy](tcllib/files/modules/map/map\_slippy\.md) · [map::slippy::cache](tcllib/files/modules/map/map\_slippy\_cache\.md) · [map::slippy::fetcher](tcllib/files/modules/map/map\_slippy\_fetcher\.md)|
+|
smtp|[mime](tcllib/files/modules/mime/mime\.md) · [smtp](tcllib/files/modules/mime/smtp\.md) · [smtpd](tcllib/files/modules/smtpd/smtpd\.md)|
+|
smtpd|[smtpd](tcllib/files/modules/smtpd/smtpd\.md)|
+|
Snit|[snit](tcllib/files/modules/snit/snit\.md)|
+|
snit|[deleg\_method](tcllib/files/modules/interp/deleg\_method\.md) · [interp](tcllib/files/modules/interp/tcllib\_interp\.md)|
+|
SNTP|[ntp\_time](tcllib/files/modules/ntp/ntp\_time\.md)|
+|
socket|[comm](tcllib/files/modules/comm/comm\.md) · [comm\_wire](tcllib/files/modules/comm/comm\_wire\.md) · [smtpd](tcllib/files/modules/smtpd/smtpd\.md)|
+|
soundex|[soundex](tcllib/files/modules/soundex/soundex\.md)|
+|
source|[docstrip](tcllib/files/modules/docstrip/docstrip\.md) · [docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md) · [tcldocstrip](tcllib/files/apps/tcldocstrip\.md)|
+|
spacing|[tcl::transform::spacer](tcllib/files/modules/virtchannel\_transform/spacer\.md)|
+|
spatial interpolation|[math::interpolate](tcllib/files/modules/math/interpolate\.md)|
+|
special functions|[math::special](tcllib/files/modules/math/special\.md)|
+|
specification|[bench\_lang\_spec](tcllib/files/modules/bench/bench\_lang\_spec\.md)|
+|
speed|[profiler](tcllib/files/modules/profiler/profiler\.md)|
+|
split|[textutil::split](tcllib/files/modules/textutil/textutil\_split\.md)|
+|
squared graph|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
ssl|[comm](tcllib/files/modules/comm/comm\.md) · [imap4](tcllib/files/modules/imap4/imap4\.md) · [pop3](tcllib/files/modules/pop3/pop3\.md) · [pop3d](tcllib/files/modules/pop3d/pop3d\.md) · [transfer::connect](tcllib/files/modules/transfer/connect\.md) · [transfer::receiver](tcllib/files/modules/transfer/receiver\.md) · [transfer::transmitter](tcllib/files/modules/transfer/transmitter\.md)|
+|
stack|[struct::queue](tcllib/files/modules/struct/queue\.md)|
+|
standard io|[tcl::chan::std](tcllib/files/modules/virtchannel\_base/std\.md)|
+|
state|[grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
state \(de\)serialization|[namespacex](tcllib/files/modules/namespacex/namespacex\.md)|
+|
statistical distribution|[simulation::random](tcllib/files/modules/simulation/simulation\_random\.md)|
+|
statistics|[counter](tcllib/files/modules/counter/counter\.md) · [math](tcllib/files/modules/math/math\.md) · [math::PCA](tcllib/files/modules/math/pca\.md) · [math::statistics](tcllib/files/modules/math/statistics\.md)|
+|
stdin|[tcl::chan::std](tcllib/files/modules/virtchannel\_base/std\.md)|
+|
stdout|[tcl::chan::std](tcllib/files/modules/virtchannel\_base/std\.md)|
+|
stochastic modelling|[simulation::montecarlo](tcllib/files/modules/simulation/montecarlo\.md)|
+|
stream cipher|[rc4](tcllib/files/modules/rc4/rc4\.md)|
+|
stream copy|[tcl::transform::observe](tcllib/files/modules/virtchannel\_transform/observe\.md)|
+|
string|[string::token](tcllib/files/modules/string/token\.md) · [string::token::shell](tcllib/files/modules/string/token\_shell\.md) · [textutil](tcllib/files/modules/textutil/textutil\.md) · [textutil::adjust](tcllib/files/modules/textutil/adjust\.md) · [textutil::expander](tcllib/files/modules/textutil/expander\.md) · [textutil::repeat](tcllib/files/modules/textutil/repeat\.md) · [textutil::split](tcllib/files/modules/textutil/textutil\_split\.md) · [textutil::string](tcllib/files/modules/textutil/textutil\_string\.md) · [textutil::tabify](tcllib/files/modules/textutil/tabify\.md) · [textutil::trim](tcllib/files/modules/textutil/trim\.md)|
+|
stringprep|[stringprep](tcllib/files/modules/stringprep/stringprep\.md) · [stringprep::data](tcllib/files/modules/stringprep/stringprep\_data\.md) · [unicode::data](tcllib/files/modules/stringprep/unicode\_data\.md)|
+|
strongly connected component|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
struct|[struct::pool](tcllib/files/modules/struct/pool\.md) · [struct::record](tcllib/files/modules/struct/record\.md)|
+|
structure|[control](tcllib/files/modules/control/control\.md)|
+|
structured queries|[treeql](tcllib/files/modules/treeql/treeql\.md)|
+|
style|[doctools::html::cssdefaults](tcllib/files/modules/doctools2base/html\_cssdefaults\.md)|
+|
subcommand|[tepam](tcllib/files/modules/tepam/tepam\_introduction\.md) · [tepam::procedure](tcllib/files/modules/tepam/tepam\_procedure\.md)|
+|
subgraph|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
subject|[hook](tcllib/files/modules/hook/hook\.md)|
+|
submitbutton|[javascript](tcllib/files/modules/javascript/javascript\.md)|
+|
subscriber|[hook](tcllib/files/modules/hook/hook\.md)|
+|
subsequence|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
subst|[doctools::tcl::parse](tcllib/files/modules/doctools2base/tcl\_parse\.md)|
+|
sum|[sum](tcllib/files/modules/crc/sum\.md)|
+|
swapping|[struct::list](tcllib/files/modules/struct/struct\_list\.md)|
+|
symmetric difference|[struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
synchronous|[cache::async](tcllib/files/modules/cache/async\.md)|
+|
syntax tree|[grammar::me::util](tcllib/files/modules/grammar\_me/me\_util\.md)|
+
+
+####
Keywords: T
+
+|||
+|---|---|
+|
table|[doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [html](tcllib/files/modules/html/html\.md) · [report](tcllib/files/modules/report/report\.md)|
+|
table of contents|[doctoc\_intro](tcllib/files/modules/doctools/doctoc\_intro\.md) · [doctoc\_plugin\_apiref](tcllib/files/modules/doctools/doctoc\_plugin\_apiref\.md) · [doctools2toc\_introduction](tcllib/files/modules/doctools2toc/toc\_introduction\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::export::doctoc](tcllib/files/modules/doctools2toc/export\_doctoc\.md) · [doctools::toc::export::html](tcllib/files/modules/doctools2toc/toc\_export\_html\.md) · [doctools::toc::export::json](tcllib/files/modules/doctools2toc/toc\_export\_json\.md) · [doctools::toc::export::nroff](tcllib/files/modules/doctools2toc/toc\_export\_nroff\.md) · [doctools::toc::export::text](tcllib/files/modules/doctools2toc/toc\_export\_text\.md) · [doctools::toc::export::wiki](tcllib/files/modules/doctools2toc/toc\_export\_wiki\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [doctools::toc::import::doctoc](tcllib/files/modules/doctools2toc/import\_doctoc\.md) · [doctools::toc::import::json](tcllib/files/modules/doctools2toc/toc\_import\_json\.md)|
+|
tabstops|[textutil::tabify](tcllib/files/modules/textutil/tabify\.md)|
+|
tallying|[counter](tcllib/files/modules/counter/counter\.md)|
+|
tape archive|[tar](tcllib/files/modules/tar/tar\.md)|
+|
tar|[tar](tcllib/files/modules/tar/tar\.md)|
+|
tcl|[math::bigfloat](tcllib/files/modules/math/bigfloat\.md) · [math::bignum](tcllib/files/modules/math/bignum\.md) · [math::decimal](tcllib/files/modules/math/decimal\.md) · [math::PCA](tcllib/files/modules/math/pca\.md)|
+|
Tcl module|[docstrip\_util](tcllib/files/modules/docstrip/docstrip\_util\.md)|
+|
Tcl syntax|[doctools::tcl::parse](tcllib/files/modules/doctools2base/tcl\_parse\.md)|
+|
tcler's wiki|[doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md)|
+|
tcllib|[csv](tcllib/files/modules/csv/csv\.md)|
+|
TclOO|[oo::util](tcllib/files/modules/tool/meta\.md) · [oo::util](tcllib/files/modules/ooutil/ooutil\.md) · [oometa](tcllib/files/modules/oometa/oometa\.md) · [tool](tcllib/files/modules/httpd/httpd\.md) · [tool](tcllib/files/modules/tool/tool\.md) · [tool::dict\_ensemble](tcllib/files/modules/tool/tool\_dict\_ensemble\.md)|
+|
TCLPARAM|[pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md)|
+|
TDPL|[grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
temp file|[fileutil](tcllib/files/modules/fileutil/fileutil\.md)|
+|
template processing|[textutil::expander](tcllib/files/modules/textutil/expander\.md)|
+|
terminal|[term](tcllib/files/modules/term/term\.md) · [term::ansi::code](tcllib/files/modules/term/ansi\_code\.md) · [term::ansi::code::attr](tcllib/files/modules/term/ansi\_cattr\.md) · [term::ansi::code::ctrl](tcllib/files/modules/term/ansi\_cctrl\.md) · [term::ansi::code::macros](tcllib/files/modules/term/ansi\_cmacros\.md) · [term::ansi::ctrl::unix](tcllib/files/modules/term/ansi\_ctrlu\.md) · [term::ansi::send](tcllib/files/modules/term/ansi\_send\.md) · [term::interact::menu](tcllib/files/modules/term/imenu\.md) · [term::interact::pager](tcllib/files/modules/term/ipager\.md) · [term::receive](tcllib/files/modules/term/receive\.md) · [term::receive::bind](tcllib/files/modules/term/term\_bind\.md) · [term::send](tcllib/files/modules/term/term\_send\.md)|
+|
test|[fileutil](tcllib/files/modules/fileutil/fileutil\.md)|
+|
Testing|[valtype::common](tcllib/files/modules/valtype/valtype\_common\.md) · [valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md) · [valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::iban](tcllib/files/modules/valtype/iban\.md) · [valtype::imei](tcllib/files/modules/valtype/imei\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md) · [valtype::luhn](tcllib/files/modules/valtype/luhn\.md) · [valtype::luhn5](tcllib/files/modules/valtype/luhn5\.md) · [valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md) · [valtype::verhoeff](tcllib/files/modules/valtype/verhoeff\.md)|
+|
testing|[bench](tcllib/files/modules/bench/bench\.md) · [bench::in](tcllib/files/modules/bench/bench\_read\.md) · [bench::out::csv](tcllib/files/modules/bench/bench\_wcsv\.md) · [bench::out::text](tcllib/files/modules/bench/bench\_wtext\.md) · [bench\_intro](tcllib/files/modules/bench/bench\_intro\.md) · [bench\_lang\_intro](tcllib/files/modules/bench/bench\_lang\_intro\.md) · [bench\_lang\_spec](tcllib/files/modules/bench/bench\_lang\_spec\.md)|
+|
TeX|[textutil](tcllib/files/modules/textutil/textutil\.md) · [textutil::adjust](tcllib/files/modules/textutil/adjust\.md)|
+|
text|[bench::in](tcllib/files/modules/bench/bench\_read\.md) · [bench::out::text](tcllib/files/modules/bench/bench\_wtext\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md)|
+|
text comparison|[soundex](tcllib/files/modules/soundex/soundex\.md)|
+|
text conversion|[rcs](tcllib/files/modules/rcs/rcs\.md)|
+|
text differences|[rcs](tcllib/files/modules/rcs/rcs\.md)|
+|
text display|[term::interact::menu](tcllib/files/modules/term/imenu\.md) · [term::interact::pager](tcllib/files/modules/term/ipager\.md)|
+|
text expansion|[textutil::expander](tcllib/files/modules/textutil/expander\.md)|
+|
text likeness|[soundex](tcllib/files/modules/soundex/soundex\.md)|
+|
text processing|[bibtex](tcllib/files/modules/bibtex/bibtex\.md) · [huddle](tcllib/files/modules/yaml/huddle\.md) · [page](tcllib/files/apps/page\.md) · [page\_intro](tcllib/files/modules/page/page\_intro\.md) · [page\_pluginmgr](tcllib/files/modules/page/page\_pluginmgr\.md) · [page\_util\_flow](tcllib/files/modules/page/page\_util\_flow\.md) · [page\_util\_norm\_lemon](tcllib/files/modules/page/page\_util\_norm\_lemon\.md) · [page\_util\_norm\_peg](tcllib/files/modules/page/page\_util\_norm\_peg\.md) · [page\_util\_peg](tcllib/files/modules/page/page\_util\_peg\.md) · [page\_util\_quote](tcllib/files/modules/page/page\_util\_quote\.md) · [yaml](tcllib/files/modules/yaml/yaml\.md)|
+|
text widget|[tcl::chan::textwindow](tcllib/files/modules/virtchannel\_base/textwindow\.md)|
+|
threads|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
throw|[throw](tcllib/files/modules/try/tcllib\_throw\.md)|
+|
thumbnail|[jpeg](tcllib/files/modules/jpeg/jpeg\.md)|
+|
tie|[tie](tcllib/files/modules/tie/tie\_std\.md) · [tie](tcllib/files/modules/tie/tie\.md)|
+|
tif|[tiff](tcllib/files/modules/tiff/tiff\.md)|
+|
tiff|[tiff](tcllib/files/modules/tiff/tiff\.md)|
+|
tile|[map::slippy::cache](tcllib/files/modules/map/map\_slippy\_cache\.md) · [map::slippy::fetcher](tcllib/files/modules/map/map\_slippy\_fetcher\.md)|
+|
time|[ntp\_time](tcllib/files/modules/ntp/ntp\_time\.md)|
+|
timestamp|[png](tcllib/files/modules/png/png\.md)|
+|
timestamps|[debug::timestamp](tcllib/files/modules/debug/debug\_timestamp\.md)|
+|
tip 219|[tcl::chan::cat](tcllib/files/modules/virtchannel\_base/cat\.md) · [tcl::chan::core](tcllib/files/modules/virtchannel\_core/core\.md) · [tcl::chan::events](tcllib/files/modules/virtchannel\_core/events\.md) · [tcl::chan::facade](tcllib/files/modules/virtchannel\_base/facade\.md) · [tcl::chan::fifo](tcllib/files/modules/virtchannel\_base/tcllib\_fifo\.md) · [tcl::chan::fifo2](tcllib/files/modules/virtchannel\_base/tcllib\_fifo2\.md) · [tcl::chan::halfpipe](tcllib/files/modules/virtchannel\_base/halfpipe\.md) · [tcl::chan::memchan](tcllib/files/modules/virtchannel\_base/tcllib\_memchan\.md) · [tcl::chan::null](tcllib/files/modules/virtchannel\_base/tcllib\_null\.md) · [tcl::chan::nullzero](tcllib/files/modules/virtchannel\_base/nullzero\.md) · [tcl::chan::random](tcllib/files/modules/virtchannel\_base/tcllib\_random\.md) · [tcl::chan::std](tcllib/files/modules/virtchannel\_base/std\.md) · [tcl::chan::string](tcllib/files/modules/virtchannel\_base/tcllib\_string\.md) · [tcl::chan::textwindow](tcllib/files/modules/virtchannel\_base/textwindow\.md) · [tcl::chan::variable](tcllib/files/modules/virtchannel\_base/tcllib\_variable\.md) · [tcl::chan::zero](tcllib/files/modules/virtchannel\_base/tcllib\_zero\.md) · [tcl::randomseed](tcllib/files/modules/virtchannel\_base/randseed\.md) · [tcl::transform::core](tcllib/files/modules/virtchannel\_core/transformcore\.md)|
+|
tip 230|[tcl::transform::adler32](tcllib/files/modules/virtchannel\_transform/adler32\.md) · [tcl::transform::base64](tcllib/files/modules/virtchannel\_transform/vt\_base64\.md) · [tcl::transform::counter](tcllib/files/modules/virtchannel\_transform/vt\_counter\.md) · [tcl::transform::crc32](tcllib/files/modules/virtchannel\_transform/vt\_crc32\.md) · [tcl::transform::hex](tcllib/files/modules/virtchannel\_transform/hex\.md) · [tcl::transform::identity](tcllib/files/modules/virtchannel\_transform/identity\.md) · [tcl::transform::limitsize](tcllib/files/modules/virtchannel\_transform/limitsize\.md) · [tcl::transform::observe](tcllib/files/modules/virtchannel\_transform/observe\.md) · [tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md) · [tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md) · [tcl::transform::spacer](tcllib/files/modules/virtchannel\_transform/spacer\.md) · [tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md)|
+|
tip 234|[tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md)|
+|
tip 317|[tcl::transform::base64](tcllib/files/modules/virtchannel\_transform/vt\_base64\.md)|
+|
Tk|[tcl::chan::textwindow](tcllib/files/modules/virtchannel\_base/textwindow\.md)|
+|
tls|[comm](tcllib/files/modules/comm/comm\.md) · [imap4](tcllib/files/modules/imap4/imap4\.md) · [pop3](tcllib/files/modules/pop3/pop3\.md) · [pop3d](tcllib/files/modules/pop3d/pop3d\.md) · [smtp](tcllib/files/modules/mime/smtp\.md) · [transfer::connect](tcllib/files/modules/transfer/connect\.md) · [transfer::receiver](tcllib/files/modules/transfer/receiver\.md) · [transfer::transmitter](tcllib/files/modules/transfer/transmitter\.md)|
+|
TMML|[doctools](tcllib/files/modules/doctools/doctools\.md) · [doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [dtplite](tcllib/files/modules/dtplite/pkg\_dtplite\.md) · [dtplite](tcllib/files/apps/dtplite\.md) · [mpexpand](tcllib/files/modules/doctools/mpexpand\.md)|
+|
toc|[doctoc\_intro](tcllib/files/modules/doctools/doctoc\_intro\.md) · [doctoc\_plugin\_apiref](tcllib/files/modules/doctools/doctoc\_plugin\_apiref\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export::doctoc](tcllib/files/modules/doctools2toc/export\_doctoc\.md) · [doctools::toc::export::html](tcllib/files/modules/doctools2toc/toc\_export\_html\.md) · [doctools::toc::export::json](tcllib/files/modules/doctools2toc/toc\_export\_json\.md) · [doctools::toc::export::nroff](tcllib/files/modules/doctools2toc/toc\_export\_nroff\.md) · [doctools::toc::export::text](tcllib/files/modules/doctools2toc/toc\_export\_text\.md) · [doctools::toc::export::wiki](tcllib/files/modules/doctools2toc/toc\_export\_wiki\.md) · [doctools::toc::import::doctoc](tcllib/files/modules/doctools2toc/import\_doctoc\.md) · [doctools::toc::import::json](tcllib/files/modules/doctools2toc/toc\_import\_json\.md)|
+|
toc formatter|[doctoc\_plugin\_apiref](tcllib/files/modules/doctools/doctoc\_plugin\_apiref\.md)|
+|
tokenization|[string::token](tcllib/files/modules/string/token\.md) · [string::token::shell](tcllib/files/modules/string/token\_shell\.md)|
+|
TOOL|[oometa](tcllib/files/modules/oometa/oometa\.md) · [tool](tcllib/files/modules/tool/tool\.md) · [tool::dict\_ensemble](tcllib/files/modules/tool/tool\_dict\_ensemble\.md)|
+|
top\-down parsing languages|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
torrent|[bee](tcllib/files/modules/bee/bee\.md)|
+|
touch|[fileutil](tcllib/files/modules/fileutil/fileutil\.md)|
+|
TPDL|[grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md)|
+|
trace|[debug](tcllib/files/modules/debug/debug\.md) · [debug::caller](tcllib/files/modules/debug/debug\_caller\.md) · [debug::heartbeat](tcllib/files/modules/debug/debug\_heartbeat\.md) · [debug::timestamp](tcllib/files/modules/debug/debug\_timestamp\.md)|
+|
transducer|[grammar::aycock](tcllib/files/modules/grammar\_aycock/aycock\.md) · [grammar::fa](tcllib/files/modules/grammar\_fa/fa\.md) · [grammar::fa::dacceptor](tcllib/files/modules/grammar\_fa/dacceptor\.md) · [grammar::fa::dexec](tcllib/files/modules/grammar\_fa/dexec\.md) · [grammar::fa::op](tcllib/files/modules/grammar\_fa/faop\.md) · [grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::peg](tcllib/files/modules/grammar\_peg/peg\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt](tcllib/files/apps/pt\.md) · [pt::ast](tcllib/files/modules/pt/pt\_astree\.md) · [pt::cparam::configuration::critcl](tcllib/files/modules/pt/pt\_cparam\_config\_critcl\.md) · [pt::cparam::configuration::tea](tcllib/files/modules/pt/pt\_cparam\_config\_tea\.md) · [pt::json\_language](tcllib/files/modules/pt/pt\_json\_language\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md) · [pt::pe](tcllib/files/modules/pt/pt\_pexpression\.md) · [pt::pe::op](tcllib/files/modules/pt/pt\_pexpr\_op\.md) · [pt::peg](tcllib/files/modules/pt/pt\_pegrammar\.md) · [pt::peg::container](tcllib/files/modules/pt/pt\_peg\_container\.md) · [pt::peg::container::peg](tcllib/files/modules/pt/pt\_peg\_container\_peg\.md) · [pt::peg::export](tcllib/files/modules/pt/pt\_peg\_export\.md) · [pt::peg::export::container](tcllib/files/modules/pt/pt\_peg\_export\_container\.md) · [pt::peg::export::json](tcllib/files/modules/pt/pt\_peg\_export\_json\.md) · [pt::peg::export::peg](tcllib/files/modules/pt/pt\_peg\_export\_peg\.md) · [pt::peg::from::container](tcllib/files/modules/pt/pt\_peg\_from\_container\.md) · [pt::peg::from::json](tcllib/files/modules/pt/pt\_peg\_from\_json\.md) · [pt::peg::from::peg](tcllib/files/modules/pt/pt\_peg\_from\_peg\.md) · [pt::peg::import](tcllib/files/modules/pt/pt\_peg\_import\.md) · [pt::peg::import::container](tcllib/files/modules/pt/pt\_peg\_import\_container\.md) · [pt::peg::import::json](tcllib/files/modules/pt/pt\_peg\_import\_json\.md) · [pt::peg::import::peg](tcllib/files/modules/pt/pt\_peg\_import\_peg\.md) · [pt::peg::interp](tcllib/files/modules/pt/pt\_peg\_interp\.md) · [pt::peg::to::container](tcllib/files/modules/pt/pt\_peg\_to\_container\.md) · [pt::peg::to::cparam](tcllib/files/modules/pt/pt\_peg\_to\_cparam\.md) · [pt::peg::to::json](tcllib/files/modules/pt/pt\_peg\_to\_json\.md) · [pt::peg::to::param](tcllib/files/modules/pt/pt\_peg\_to\_param\.md) · [pt::peg::to::peg](tcllib/files/modules/pt/pt\_peg\_to\_peg\.md) · [pt::peg::to::tclparam](tcllib/files/modules/pt/pt\_peg\_to\_tclparam\.md) · [pt::peg\_language](tcllib/files/modules/pt/pt\_peg\_language\.md) · [pt::pegrammar](tcllib/files/modules/pt/pt\_peg\_introduction\.md) · [pt::pgen](tcllib/files/modules/pt/pt\_pgen\.md) · [pt::rde](tcllib/files/modules/pt/pt\_rdengine\.md) · [pt::tclparam::configuration::nx](tcllib/files/modules/pt/pt\_tclparam\_config\_nx\.md) · [pt::tclparam::configuration::snit](tcllib/files/modules/pt/pt\_tclparam\_config\_snit\.md) · [pt::tclparam::configuration::tcloo](tcllib/files/modules/pt/pt\_tclparam\_config\_tcloo\.md) · [pt::util](tcllib/files/modules/pt/pt\_util\.md) · [pt\_export\_api](tcllib/files/modules/pt/pt\_to\_api\.md) · [pt\_import\_api](tcllib/files/modules/pt/pt\_from\_api\.md) · [pt\_introduction](tcllib/files/modules/pt/pt\_introduction\.md) · [pt\_parse\_peg](tcllib/files/modules/pt/pt\_parse\_peg\.md) · [pt\_parser\_api](tcllib/files/modules/pt/pt\_parser\_api\.md) · [pt\_peg\_op](tcllib/files/modules/pt/pt\_peg\_op\.md)|
+|
transfer|[transfer::connect](tcllib/files/modules/transfer/connect\.md) · [transfer::copy](tcllib/files/modules/transfer/copyops\.md) · [transfer::copy::queue](tcllib/files/modules/transfer/tqueue\.md) · [transfer::data::destination](tcllib/files/modules/transfer/ddest\.md) · [transfer::data::source](tcllib/files/modules/transfer/dsource\.md) · [transfer::receiver](tcllib/files/modules/transfer/receiver\.md) · [transfer::transmitter](tcllib/files/modules/transfer/transmitter\.md)|
+|
transformation|[page\_util\_peg](tcllib/files/modules/page/page\_util\_peg\.md) · [tcl::transform::adler32](tcllib/files/modules/virtchannel\_transform/adler32\.md) · [tcl::transform::base64](tcllib/files/modules/virtchannel\_transform/vt\_base64\.md) · [tcl::transform::counter](tcllib/files/modules/virtchannel\_transform/vt\_counter\.md) · [tcl::transform::crc32](tcllib/files/modules/virtchannel\_transform/vt\_crc32\.md) · [tcl::transform::hex](tcllib/files/modules/virtchannel\_transform/hex\.md) · [tcl::transform::identity](tcllib/files/modules/virtchannel\_transform/identity\.md) · [tcl::transform::limitsize](tcllib/files/modules/virtchannel\_transform/limitsize\.md) · [tcl::transform::observe](tcllib/files/modules/virtchannel\_transform/observe\.md) · [tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md) · [tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md) · [tcl::transform::spacer](tcllib/files/modules/virtchannel\_transform/spacer\.md) · [tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md)|
+|
transmitter|[transfer::transmitter](tcllib/files/modules/transfer/transmitter\.md)|
+|
travelling salesman|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
traversal|[fileutil\_traverse](tcllib/files/modules/fileutil/traverse\.md)|
+|
tree|[grammar::me::cpu::gasm](tcllib/files/modules/grammar\_me/gasm\.md) · [grammar::me::util](tcllib/files/modules/grammar\_me/me\_util\.md) · [htmlparse](tcllib/files/modules/htmlparse/htmlparse\.md) · [struct::queue](tcllib/files/modules/struct/queue\.md) · [struct::stack](tcllib/files/modules/struct/stack\.md) · [struct::tree](tcllib/files/modules/struct/struct\_tree\.md) · [struct::tree\_v1](tcllib/files/modules/struct/struct\_tree1\.md) · [treeql](tcllib/files/modules/treeql/treeql\.md)|
+|
tree query language|[treeql](tcllib/files/modules/treeql/treeql\.md)|
+|
tree walking|[page\_util\_flow](tcllib/files/modules/page/page\_util\_flow\.md) · [page\_util\_norm\_lemon](tcllib/files/modules/page/page\_util\_norm\_lemon\.md) · [page\_util\_norm\_peg](tcllib/files/modules/page/page\_util\_norm\_peg\.md)|
+|
TreeQL|[treeql](tcllib/files/modules/treeql/treeql\.md)|
+|
trigonometry|[math::trig](tcllib/files/modules/math/trig\.md)|
+|
trimming|[textutil](tcllib/files/modules/textutil/textutil\.md) · [textutil::trim](tcllib/files/modules/textutil/trim\.md)|
+|
twitter|[oauth](tcllib/files/modules/oauth/oauth\.md)|
+|
type|[fileutil](tcllib/files/modules/fileutil/fileutil\.md) · [fileutil::magic::cfront](tcllib/files/modules/fumagic/cfront\.md) · [fileutil::magic::cgen](tcllib/files/modules/fumagic/cgen\.md) · [fileutil::magic::filetype](tcllib/files/modules/fumagic/filetypes\.md) · [fileutil::magic::rt](tcllib/files/modules/fumagic/rtcore\.md) · [snit](tcllib/files/modules/snit/snit\.md)|
+|
Type checking|[valtype::common](tcllib/files/modules/valtype/valtype\_common\.md) · [valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md) · [valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::iban](tcllib/files/modules/valtype/iban\.md) · [valtype::imei](tcllib/files/modules/valtype/imei\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md) · [valtype::luhn](tcllib/files/modules/valtype/luhn\.md) · [valtype::luhn5](tcllib/files/modules/valtype/luhn5\.md) · [valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md) · [valtype::verhoeff](tcllib/files/modules/valtype/verhoeff\.md)|
+
+
+####
Keywords: U
+
+|||
+|---|---|
+|
uevent|[hook](tcllib/files/modules/hook/hook\.md)|
+|
unbind|[uevent](tcllib/files/modules/uev/uevent\.md)|
+|
uncapitalize|[textutil::string](tcllib/files/modules/textutil/textutil\_string\.md)|
+|
undenting|[textutil::adjust](tcllib/files/modules/textutil/adjust\.md)|
+|
unicode|[stringprep](tcllib/files/modules/stringprep/stringprep\.md) · [stringprep::data](tcllib/files/modules/stringprep/stringprep\_data\.md) · [unicode](tcllib/files/modules/stringprep/unicode\.md) · [unicode::data](tcllib/files/modules/stringprep/unicode\_data\.md)|
+|
union|[struct::disjointset](tcllib/files/modules/struct/disjointset\.md) · [struct::set](tcllib/files/modules/struct/struct\_set\.md)|
+|
unit|[units](tcllib/files/modules/units/units\.md)|
+|
unknown hooking|[namespacex](tcllib/files/modules/namespacex/namespacex\.md)|
+|
untie|[tie](tcllib/files/modules/tie/tie\_std\.md) · [tie](tcllib/files/modules/tie/tie\.md)|
+|
update|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md)|
+|
uri|[uri](tcllib/files/modules/uri/uri\.md) · [uri\_urn](tcllib/files/modules/uri/urn\-scheme\.md)|
+|
url|[doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::import](tcllib/files/modules/doctools2idx/idx\_import\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::import](tcllib/files/modules/doctools2toc/toc\_import\.md) · [map::geocode::nominatim](tcllib/files/modules/map/map\_geocode\_nominatim\.md) · [map::slippy::fetcher](tcllib/files/modules/map/map\_slippy\_fetcher\.md) · [uri](tcllib/files/modules/uri/uri\.md) · [uri\_urn](tcllib/files/modules/uri/urn\-scheme\.md)|
+|
urn|[uri\_urn](tcllib/files/modules/uri/urn\-scheme\.md)|
+|
US\-NPI|[valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md)|
+|
utilities|[namespacex](tcllib/files/modules/namespacex/namespacex\.md)|
+|
uuencode|[uuencode](tcllib/files/modules/base64/uuencode\.md)|
+|
UUID|[uuid](tcllib/files/modules/uuid/uuid\.md)|
+
+
+####
Keywords: V
+
+|||
+|---|---|
+|
Validation|[valtype::common](tcllib/files/modules/valtype/valtype\_common\.md) · [valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md) · [valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::iban](tcllib/files/modules/valtype/iban\.md) · [valtype::imei](tcllib/files/modules/valtype/imei\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md) · [valtype::luhn](tcllib/files/modules/valtype/luhn\.md) · [valtype::luhn5](tcllib/files/modules/valtype/luhn5\.md) · [valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md) · [valtype::verhoeff](tcllib/files/modules/valtype/verhoeff\.md)|
+|
Value checking|[valtype::common](tcllib/files/modules/valtype/valtype\_common\.md) · [valtype::creditcard::amex](tcllib/files/modules/valtype/cc\_amex\.md) · [valtype::creditcard::discover](tcllib/files/modules/valtype/cc\_discover\.md) · [valtype::creditcard::mastercard](tcllib/files/modules/valtype/cc\_mastercard\.md) · [valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md) · [valtype::gs1::ean13](tcllib/files/modules/valtype/ean13\.md) · [valtype::iban](tcllib/files/modules/valtype/iban\.md) · [valtype::imei](tcllib/files/modules/valtype/imei\.md) · [valtype::isbn](tcllib/files/modules/valtype/isbn\.md) · [valtype::luhn](tcllib/files/modules/valtype/luhn\.md) · [valtype::luhn5](tcllib/files/modules/valtype/luhn5\.md) · [valtype::usnpi](tcllib/files/modules/valtype/usnpi\.md) · [valtype::verhoeff](tcllib/files/modules/valtype/verhoeff\.md)|
+|
vectors|[math::linearalgebra](tcllib/files/modules/math/linalg\.md)|
+|
verhoeff|[valtype::verhoeff](tcllib/files/modules/valtype/verhoeff\.md)|
+|
vertex|[struct::graph](tcllib/files/modules/struct/graph\.md) · [struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
vertex cover|[struct::graph::op](tcllib/files/modules/struct/graphops\.md)|
+|
virtual channel|[tcl::chan::cat](tcllib/files/modules/virtchannel\_base/cat\.md) · [tcl::chan::core](tcllib/files/modules/virtchannel\_core/core\.md) · [tcl::chan::events](tcllib/files/modules/virtchannel\_core/events\.md) · [tcl::chan::facade](tcllib/files/modules/virtchannel\_base/facade\.md) · [tcl::chan::fifo](tcllib/files/modules/virtchannel\_base/tcllib\_fifo\.md) · [tcl::chan::fifo2](tcllib/files/modules/virtchannel\_base/tcllib\_fifo2\.md) · [tcl::chan::halfpipe](tcllib/files/modules/virtchannel\_base/halfpipe\.md) · [tcl::chan::memchan](tcllib/files/modules/virtchannel\_base/tcllib\_memchan\.md) · [tcl::chan::null](tcllib/files/modules/virtchannel\_base/tcllib\_null\.md) · [tcl::chan::nullzero](tcllib/files/modules/virtchannel\_base/nullzero\.md) · [tcl::chan::random](tcllib/files/modules/virtchannel\_base/tcllib\_random\.md) · [tcl::chan::std](tcllib/files/modules/virtchannel\_base/std\.md) · [tcl::chan::string](tcllib/files/modules/virtchannel\_base/tcllib\_string\.md) · [tcl::chan::textwindow](tcllib/files/modules/virtchannel\_base/textwindow\.md) · [tcl::chan::variable](tcllib/files/modules/virtchannel\_base/tcllib\_variable\.md) · [tcl::chan::zero](tcllib/files/modules/virtchannel\_base/tcllib\_zero\.md) · [tcl::randomseed](tcllib/files/modules/virtchannel\_base/randseed\.md) · [tcl::transform::adler32](tcllib/files/modules/virtchannel\_transform/adler32\.md) · [tcl::transform::base64](tcllib/files/modules/virtchannel\_transform/vt\_base64\.md) · [tcl::transform::core](tcllib/files/modules/virtchannel\_core/transformcore\.md) · [tcl::transform::counter](tcllib/files/modules/virtchannel\_transform/vt\_counter\.md) · [tcl::transform::crc32](tcllib/files/modules/virtchannel\_transform/vt\_crc32\.md) · [tcl::transform::hex](tcllib/files/modules/virtchannel\_transform/hex\.md) · [tcl::transform::identity](tcllib/files/modules/virtchannel\_transform/identity\.md) · [tcl::transform::limitsize](tcllib/files/modules/virtchannel\_transform/limitsize\.md) · [tcl::transform::observe](tcllib/files/modules/virtchannel\_transform/observe\.md) · [tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md) · [tcl::transform::rot](tcllib/files/modules/virtchannel\_transform/rot\.md) · [tcl::transform::spacer](tcllib/files/modules/virtchannel\_transform/spacer\.md) · [tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md)|
+|
virtual machine|[grammar::me::cpu](tcllib/files/modules/grammar\_me/me\_cpu\.md) · [grammar::me::cpu::core](tcllib/files/modules/grammar\_me/me\_cpucore\.md) · [grammar::me::cpu::gasm](tcllib/files/modules/grammar\_me/gasm\.md) · [grammar::me::tcl](tcllib/files/modules/grammar\_me/me\_tcl\.md) · [grammar::me\_intro](tcllib/files/modules/grammar\_me/me\_intro\.md) · [grammar::me\_vm](tcllib/files/modules/grammar\_me/me\_vm\.md) · [grammar::peg::interp](tcllib/files/modules/grammar\_peg/peg\_interp\.md) · [pt::param](tcllib/files/modules/pt/pt\_param\.md)|
+|
VISA|[valtype::creditcard::visa](tcllib/files/modules/valtype/cc\_visa\.md)|
+|
vwait|[coroutine](tcllib/files/modules/coroutine/tcllib\_coroutine\.md) · [coroutine::auto](tcllib/files/modules/coroutine/coro\_auto\.md) · [smtpd](tcllib/files/modules/smtpd/smtpd\.md)|
+
+
+####
Keywords: W
+
+|||
+|---|---|
+|
wais|[uri](tcllib/files/modules/uri/uri\.md)|
+|
widget|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md)|
+|
widget adaptors|[snit](tcllib/files/modules/snit/snit\.md) · [snitfaq](tcllib/files/modules/snit/snitfaq\.md)|
+|
wiki|[doctools::idx](tcllib/files/modules/doctools/docidx\.md) · [doctools::idx](tcllib/files/modules/doctools2idx/idx\_container\.md) · [doctools::idx::export](tcllib/files/modules/doctools2idx/idx\_export\.md) · [doctools::idx::export::wiki](tcllib/files/modules/doctools2idx/idx\_export\_wiki\.md) · [doctools::toc](tcllib/files/modules/doctools2toc/toc\_container\.md) · [doctools::toc](tcllib/files/modules/doctools/doctoc\.md) · [doctools::toc::export](tcllib/files/modules/doctools2toc/toc\_export\.md) · [doctools::toc::export::wiki](tcllib/files/modules/doctools2toc/toc\_export\_wiki\.md)|
+|
word|[doctools::tcl::parse](tcllib/files/modules/doctools2base/tcl\_parse\.md) · [wip](tcllib/files/modules/wip/wip\.md)|
+|
WWW|[tool](tcllib/files/modules/httpd/httpd\.md)|
+|
www|[uri](tcllib/files/modules/uri/uri\.md)|
+
+
+####
Keywords: X
+
+|||
+|---|---|
+|
x\.208|[asn](tcllib/files/modules/asn/asn\.md)|
+|
x\.209|[asn](tcllib/files/modules/asn/asn\.md)|
+|
x\.500|[ldap](tcllib/files/modules/ldap/ldap\.md)|
+|
XGoogleToken|[SASL::XGoogleToken](tcllib/files/modules/sasl/gtoken\.md)|
+|
xml|[xsxp](tcllib/files/modules/amazon\-s3/xsxp\.md)|
+|
xor|[tcl::transform::otp](tcllib/files/modules/virtchannel\_transform/vt\_otp\.md)|
+|
XPath|[treeql](tcllib/files/modules/treeql/treeql\.md)|
+|
XSLT|[treeql](tcllib/files/modules/treeql/treeql\.md)|
+
+
+####
Keywords: Y
+
+|||
+|---|---|
+|
yaml|[huddle](tcllib/files/modules/yaml/huddle\.md) · [yaml](tcllib/files/modules/yaml/yaml\.md)|
+|
ydecode|[yencode](tcllib/files/modules/base64/yencode\.md)|
+|
yEnc|[yencode](tcllib/files/modules/base64/yencode\.md)|
+|
yencode|[yencode](tcllib/files/modules/base64/yencode\.md)|
+
+
+####
Keywords: Z
+
+|||
+|---|---|
+|
zero|[tcl::chan::nullzero](tcllib/files/modules/virtchannel\_base/nullzero\.md) · [tcl::chan::zero](tcllib/files/modules/virtchannel\_base/tcllib\_zero\.md)|
+|
zip|[zipfile::decode](tcllib/files/modules/zip/decode\.md) · [zipfile::encode](tcllib/files/modules/zip/encode\.md) · [zipfile::mkzip](tcllib/files/modules/zip/mkzip\.md)|
+|
zlib|[tcl::transform::zlib](tcllib/files/modules/virtchannel\_transform/tcllib\_zlib\.md)|
+|
zoom|[map::slippy](tcllib/files/modules/map/map\_slippy\.md) · [map::slippy::cache](tcllib/files/modules/map/map\_slippy\_cache\.md) · [map::slippy::fetcher](tcllib/files/modules/map/map\_slippy\_fetcher\.md)|
ADDED embedded/md/tcllib/files/apps/dtplite.md
Index: embedded/md/tcllib/files/apps/dtplite.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/apps/dtplite.md
@@ -0,0 +1,408 @@
+
+[//000000001]: # (dtplite \- Documentation toolbox)
+[//000000002]: # (Generated from file 'dtplite\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2004\-2013 Andreas Kupries
)
+[//000000004]: # (dtplite\(n\) 1\.0\.5 tcllib "Documentation toolbox")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+dtplite \- Lightweight DocTools Markup Processor
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [USE CASES](#subsection1)
+
+ - [COMMAND LINE](#subsection2)
+
+ - [OPTIONS](#subsection3)
+
+ - [FORMATS](#subsection4)
+
+ - [DIRECTORY STRUCTURES](#subsection5)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__dtplite__ __\-o__ *output* ?options? *format* *inputfile*](#1)
+[__dtplite__ __validate__ *inputfile*](#2)
+[__dtplite__ __\-o__ *output* ?options? *format* *inputdirectory*](#3)
+[__dtplite__ __\-merge__ __\-o__ *output* ?options? *format* *inputdirectory*](#4)
+
+# DESCRIPTION
+
+The application described by this document, __dtplite__, is the successor to
+the extremely simple __[mpexpand](\.\./modules/doctools/mpexpand\.md)__\.
+Influenced in its functionality by the __dtp__ doctools processor it is much
+more powerful than __[mpexpand](\.\./modules/doctools/mpexpand\.md)__, yet
+still as easy to use; definitely easier than __dtp__ with its myriad of
+subcommands and options\.
+
+__dtplite__ is based upon the package
+__[doctools](\.\./modules/doctools/doctools\.md)__, like the other two
+processors\.
+
+## USE CASES
+
+__dtplite__ was written with the following three use cases in mind\.
+
+ 1. Validation of a single document, i\.e\. checking that it was written in valid
+ doctools format\. This mode can also be used to get a preliminary version of
+ the formatted output for a single document, for display in a browser,
+ nroff, etc\., allowing proofreading of the formatting\.
+
+ 1. Generation of the formatted documentation for a single package, i\.e\. all
+ the manpages, plus a table of contents and an index of keywords\.
+
+ 1. An extension of the previous mode of operation, a method for the easy
+ generation of one documentation tree for several packages, and especially
+ of a unified table of contents and keyword index\.
+
+Beyond the above we also want to make use of the customization features provided
+by the HTML formatter\. It is not the only format the application should be able
+to generate, but we anticipiate it to be the most commonly used, and it is one
+of the few which do provide customization hooks\.
+
+We allow the caller to specify a header string, footer string, a stylesheet, and
+data for a bar of navigation links at the top of the generated document\. While
+all can be set as long as the formatting engine provides an appropriate engine
+parameter \(See section [OPTIONS](#subsection3)\) the last two have internal
+processing which make them specific to HTML\.
+
+## COMMAND LINE
+
+ - __dtplite__ __\-o__ *output* ?options? *format* *inputfile*
+
+ This is the form for use case \[1\]\. The *options* will be explained later,
+ in section [OPTIONS](#subsection3)\.
+
+ * path *output* \(in\)
+
+ This argument specifies where to write the generated document\. It can be
+ the path to a file or directory, or __\-__\. The last value causes the
+ application to write the generated documented to __stdout__\.
+
+ If the *output* does not exist then \[file dirname $output\] has to
+ exist and must be a writable directory\. The generated document will be
+ written to a file in that directory, and the name of that file will be
+ derived from the *inputfile*, the *format*, and the value given to
+ option __\-ext__ \(if present\)\.
+
+ * \(path|handle\) *format* \(in\)
+
+ This argument specifies the formatting engine to use when processing the
+ input, and thus the format of the generated document\. See section
+ [FORMATS](#subsection4) for the possibilities recognized by the
+ application\.
+
+ * path *inputfile* \(in\)
+
+ This argument specifies the path to the file to process\. It has to
+ exist, must be readable, and written in
+ *[doctools](\.\./\.\./\.\./index\.md\#doctools)* format\.
+
+ - __dtplite__ __validate__ *inputfile*
+
+ This is a simpler form for use case \[1\]\. The "validate" format generates no
+ output at all, only syntax checks are performed\. As such the specification
+ of an output file or other options is not necessary and left out\.
+
+ - __dtplite__ __\-o__ *output* ?options? *format* *inputdirectory*
+
+ This is the form for use case \[2\]\. It differs from the form for use case \[1\]
+ by having the input documents specified through a directory instead of a
+ file\. The other arguments are identical, except for *output*, which now
+ has to be the path to an existing and writable directory\.
+
+ The input documents are all files in *inputdirectory* or any of its
+ subdirectories which were recognized by __fileutil::fileType__ as
+ containing text in *[doctools](\.\./\.\./\.\./index\.md\#doctools)* format\.
+
+ - __dtplite__ __\-merge__ __\-o__ *output* ?options? *format* *inputdirectory*
+
+ This is the form for use case \[3\]\. The only difference to the form for use
+ case \[2\] is the additional option __\-merge__\.
+
+ Each such call will merge the generated documents coming from processing the
+ input documents under *inputdirectory* or any of its subdirectories to the
+ files under *output*\. In this manner it is possible to incrementally build
+ the unified documentation for any number of packages\. Note that it is
+ necessary to run through all the packages twice to get fully correct
+ cross\-references \(for formats supporting them\)\.
+
+## OPTIONS
+
+This section describes all the options available to the user of the application,
+with the exception of the options __\-o__ and __\-merge__\. These two were
+described already, in section [COMMAND LINE](#subsection2)\.
+
+ - __\-exclude__ string
+
+ This option specifies an exclude \(glob\) pattern\. Any files identified as
+ manpages to process which match the exclude pattern are ignored\. The option
+ can be provided multiple times, each usage adding an additional pattern to
+ the list of exclusions\.
+
+ - __\-ext__ string
+
+ If the name of an output file has to be derived from the name of an input
+ file it will use the name of the *format* as the extension by default\.
+ This option here will override this however, forcing it to use *string* as
+ the file extension\. This option is ignored if the name of the output file is
+ fully specified through option __\-o__\.
+
+ When used multiple times only the last definition is relevant\.
+
+ - __\-header__ file
+
+ This option can be used if and only if the selected *format* provides an
+ engine parameter named "header"\. It takes the contents of the specified file
+ and assign them to that parameter, for whatever use by the engine\. The HTML
+ engine will insert the text just after the tag ____\. If navigation
+ buttons are present \(see option __\-nav__ below\), then the HTML generated
+ for them is appended to the header data originating here before the final
+ assignment to the parameter\.
+
+ When used multiple times only the last definition is relevant\.
+
+ - __\-footer__ file
+
+ Like __\-header__, except that: Any navigation buttons are ignored, the
+ corresponding required engine parameter is named "footer", and the data is
+ inserted just before the tag ____\.
+
+ When used multiple times only the last definition is relevant\.
+
+ - __\-style__ file
+
+ This option can be used if and only if the selected *format* provides an
+ engine parameter named "meta"\. When specified it will generate a piece of
+ HTML code declaring the *file* as the stylesheet for the generated
+ document and assign that to the parameter\. The HTML engine will insert this
+ inot the document, just after the tag ____\.
+
+ When processing an input directory the stylesheet file is copied into the
+ output directory and the generated HTML will refer to the copy, to make the
+ result more self\-contained\. When processing an input file we have no
+ location to copy the stylesheet to and so just reference it as specified\.
+
+ When used multiple times only the last definition is relevant\.
+
+ - __\-toc__ path
+
+ This option specifies a doctoc file to use for the table of contents instead
+ of generating our own\.
+
+ When used multiple times only the last definition is relevant\.
+
+ - __\-pre\+toc__ label path|text
+
+ - __\-post\+toc__ label path|text
+
+ This option specifies additional doctoc files \(or texts\) to use in the
+ navigation bar\.
+
+ Positioning and handling of multiple uses is like for options
+ __\-prenav__ and __\-postnav__, see below\.
+
+ - __\-nav__ label url
+
+ - __\-prenav__ label url
+
+ Use this option to specify a navigation button with *label* to display and
+ the *url* to link to\. This option can be used if and only if the selected
+ *format* provides an engine parameter named "header"\. The HTML generated
+ for this is appended to whatever data we got from option __\-header__
+ before it is inserted into the generated documents\.
+
+ When used multiple times all definitions are collected and a navigation bar
+ is created, with the first definition shown at the left edge and the last
+ definition to the right\.
+
+ The url can be relative\. In that case it is assumed to be relative to the
+ main files \(TOC and Keyword index\), and will be transformed for all others
+ to still link properly\.
+
+ - __\-postnav__ label url
+
+ Use this option to specify a navigation button with *label* to display and
+ the *url* to link to\. This option can be used if and only if the selected
+ *format* provides an engine parameter named "header"\. The HTML generated
+ for this is appended to whatever data we got from option __\-header__
+ before it is inserted into the generated documents\.
+
+ When used multiple times all definitions are collected and a navigation bar
+ is created, with the last definition shown at the right edge and the first
+ definition to the left\.
+
+ The url can be relative\. In that case it is assumed to be relative to the
+ main files \(TOC and Keyword index\), and will be transformed for all others
+ to still link properly\.
+
+## FORMATS
+
+At first the *format* argument will be treated as a path to a tcl file
+containing the code for the requested formatting engine\. The argument will be
+treated as the name of one of the predefined formats listed below if and only if
+the path does not exist\.
+
+*Note a limitation*: If treating the format as path to the tcl script
+implementing the engine was sucessful, then this script has to implement not
+only the engine API for doctools, i\.e\. *doctools\_api*, but for *doctoc\_api*
+and *docidx\_api* as well\. Otherwise the generation of a table of contents and
+of a keyword index will fail\.
+
+List of predefined formats, i\.e\. as provided by the package
+__[doctools](\.\./modules/doctools/doctools\.md)__:
+
+ - __nroff__
+
+ The processor generates \*roff output, the standard format for unix manpages\.
+
+ - __html__
+
+ The processor generates HTML output, for usage in and display by web
+ browsers\. This engine is currently the only one providing the various engine
+ parameters required for the additional customaization of the output\.
+
+ - __tmml__
+
+ The processor generates TMML output, the Tcl Manpage Markup Language, a
+ derivative of XML\.
+
+ - __latex__
+
+ The processor generates LaTeX output\.
+
+ - __wiki__
+
+ The processor generates Wiki markup as understood by __wikit__\.
+
+ - __list__
+
+ The processor extracts the information provided by __manpage\_begin__\.
+ This format is used internally to extract the meta data from which both
+ table of contents and keyword index are derived from\.
+
+ - __null__
+
+ The processor does not generate any output\. This is equivalent to
+ __validate__\.
+
+## DIRECTORY STRUCTURES
+
+In this section we describe the directory structures generated by the
+application under *output* when processing all documents in an
+*inputdirectory*\. In other words, this is only relevant to the use cases \[2\]
+and \[3\]\.
+
+ - \[2\]
+
+ The following directory structure is created when processing a single set of
+ input documents\. The file extension used is for output in HTML, but that is
+ not relevant to the structure and was just used to have proper file names\.
+
+ output/
+ toc\.html
+ index\.html
+ files/
+ path/to/FOO\.html
+
+ The last line in the example shows the document generated for a file FOO
+ located at
+
+ inputdirectory/path/to/FOO
+
+ - \[3\]
+
+ When merging many packages into a unified set of documents the generated
+ directory structure is a bit deeper:
+
+ output
+ \.toc
+ \.idx
+ \.tocdoc
+ \.idxdoc
+ \.xrf
+ toc\.html
+ index\.html
+ FOO1/
+ \.\.\.
+ FOO2/
+ toc\.html
+ files/
+ path/to/BAR\.html
+
+ Each of the directories FOO1, \.\.\. contains the documents generated for the
+ package FOO1, \.\.\. and follows the structure shown for use case \[2\]\. The only
+ exception is that there is no per\-package index\.
+
+ The files "\.toc", "\.idx", and "\.xrf" contain the internal status of the
+ whole output and will be read and updated by the next invokation\. Their
+ contents will not be documented\. Remove these files when all packages wanted
+ for the output have been processed, i\.e\. when the output is complete\.
+
+ The files "\.tocdoc", and "\.idxdoc", are intermediate files in doctoc and
+ docidx markup, respectively, containing the main table of contents and
+ keyword index for the set of documents before their conversion to the chosen
+ output format\. They are left in place, i\.e\. not deleted, to serve as
+ demonstrations of doctoc and docidx markup\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx introduction](\.\./modules/doctools/docidx\_intro\.md), [doctoc
+introduction](\.\./modules/doctools/doctoc\_intro\.md), [doctools
+introduction](\.\./modules/doctools/doctools\_intro\.md)
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./index\.md\#html), [TMML](\.\./\.\./\.\./index\.md\#tmml),
+[conversion](\.\./\.\./\.\./index\.md\#conversion),
+[docidx](\.\./\.\./\.\./index\.md\#docidx), [doctoc](\.\./\.\./\.\./index\.md\#doctoc),
+[doctools](\.\./\.\./\.\./index\.md\#doctools),
+[manpage](\.\./\.\./\.\./index\.md\#manpage),
+[markup](\.\./\.\./\.\./index\.md\#markup), [nroff](\.\./\.\./\.\./index\.md\#nroff)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2004\-2013 Andreas Kupries
ADDED embedded/md/tcllib/files/apps/nns.md
Index: embedded/md/tcllib/files/apps/nns.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/apps/nns.md
@@ -0,0 +1,169 @@
+
+[//000000001]: # (nns \- Name service facility)
+[//000000002]: # (Generated from file 'nns\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007\-2008 Andreas Kupries )
+[//000000004]: # (nns\(n\) 1\.1 tcllib "Name service facility")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+nns \- Name service facility, Commandline Client Application
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [USE CASES](#subsection1)
+
+ - [COMMAND LINE](#subsection2)
+
+ - [OPTIONS](#subsection3)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__nns__ __bind__ ?__\-host__ *host*? ?__\-port__ *port*? *name* *data*](#1)
+[__nns__ __search__ ?__\-host__ *host*? ?__\-port__ *port*? ?__\-continuous__? ?*pattern*?](#2)
+[__nns__ __ident__ ?__\-host__ *host*? ?__\-port__ *port*?](#3)
+[__nns__ __who__](#4)
+
+# DESCRIPTION
+
+Please read *[Name service facility,
+introduction](\.\./modules/nns/nns\_intro\.md)* first\.
+
+The application described by this document, __nns__, is a simple command
+line client for the nano name service facility provided by the Tcllib packages
+__[nameserv](\.\./modules/nns/nns\_client\.md)__, and
+__[nameserv::server](\.\./modules/nns/nns\_server\.md)__\. Beyond that the
+application's sources also serve as an example of how to use the client package
+__[nameserv](\.\./modules/nns/nns\_client\.md)__\. All abilities of a client
+are covered, from configuration to registration of names to searching\.
+
+This name service facility has nothing to do with the Internet's *Domain Name
+System*, otherwise known as *[DNS](\.\./\.\./\.\./index\.md\#dns)*\. If the reader
+is looking for a package dealing with that please see either of the packages
+__[dns](\.\./modules/dns/tcllib\_dns\.md)__ and __resolv__, both found
+in Tcllib too\.
+
+## USE CASES
+
+__nns__ was written with the following two main use cases in mind\.
+
+ 1. Registration of a name/data pair in the name service\.
+
+ 1. Searching the name service for entries matching a glob pattern\.
+
+Beyond the above we also want to be able to identify the client, and get
+information about the name service\.
+
+## COMMAND LINE
+
+ - __nns__ __bind__ ?__\-host__ *host*? ?__\-port__ *port*? *name* *data*
+
+ This form registers the *name*/*data* pair in the specified name
+ service\. In this form the command will *not* exit to keep the registration
+ alive\. The user has to kill it explicitly, either by sending a signal, or
+ through the job\-control facilities of the shell in use\. It will especially
+ survive the loss of the connection to the name service and reestablish the
+ *name*/*data* pair when the connection is restored\.
+
+ The options to specify the name service will be explained later, in section
+ [OPTIONS](#subsection3)\.
+
+ - __nns__ __search__ ?__\-host__ *host*? ?__\-port__ *port*? ?__\-continuous__? ?*pattern*?
+
+ This form searches the specified name service for entries matching the
+ glob\-*pattern* and prints them to stdout, with each entry on its own line\.
+ If no pattern is specified it defaults to __\*__, matching everything\.
+
+ The options to specify the name service will be explained later, in section
+ [OPTIONS](#subsection3)\.
+
+ If the option __\-continuous__ is specified the client will not exit
+ after performing the search, but start to continuously monitor the service
+ for changes to the set of matching entries, appropriately updating the
+ display as changes arrive\. In that form it will especially also survive the
+ loss of the connection to the name service and reestablish the search when
+ the connection is restored\.
+
+ - __nns__ __ident__ ?__\-host__ *host*? ?__\-port__ *port*?
+
+ This form asks the specified name service for the version and features of
+ the name service protocol it supports and prints the results to stdout\.
+
+ The options to specify the name service will be explained later, in section
+ [OPTIONS](#subsection3)\.
+
+ - __nns__ __who__
+
+ This form prints name, version, and protocol version of the application to
+ stdout\.
+
+## OPTIONS
+
+This section describes all the options available to the user of the application
+
+ - __\-host__ name|ipaddress
+
+ If this option is not specified it defaults to __localhost__\. It
+ specifies the name or ip\-address of the host the name service to talk to is
+ running on\.
+
+ - __\-port__ number
+
+ If this option is not specified it defaults to __38573__\. It specifies
+ the TCP port the name service to talk to is listening on for requests\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *nameserv* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[nameserv\(n\)](\.\./modules/nns/nns\_client\.md),
+[nameserv::common\(n\)](\.\./modules/nns/nns\_common\.md)
+
+# KEYWORDS
+
+[application](\.\./\.\./\.\./index\.md\#application),
+[client](\.\./\.\./\.\./index\.md\#client), [name
+service](\.\./\.\./\.\./index\.md\#name\_service)
+
+# CATEGORY
+
+Networking
+
+# COPYRIGHT
+
+Copyright © 2007\-2008 Andreas Kupries
ADDED embedded/md/tcllib/files/apps/nnsd.md
Index: embedded/md/tcllib/files/apps/nnsd.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/apps/nnsd.md
@@ -0,0 +1,130 @@
+
+[//000000001]: # (nnsd \- Name service facility)
+[//000000002]: # (Generated from file 'nnsd\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007\-2008 Andreas Kupries )
+[//000000004]: # (nnsd\(n\) 1\.0\.1 tcllib "Name service facility")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+nnsd \- Name service facility, Commandline Server Application
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [USE CASES](#subsection1)
+
+ - [COMMAND LINE](#subsection2)
+
+ - [OPTIONS](#subsection3)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__nnsd__ ?__\-localonly__ *flag*? ?__\-port__ *port*?](#1)
+
+# DESCRIPTION
+
+Please read *[Name service facility,
+introduction](\.\./modules/nns/nns\_intro\.md)* first\.
+
+The application described by this document, __[nns](nns\.md)__, is a
+simple command line server for the nano name service facility provided by the
+Tcllib packages __[nameserv](\.\./modules/nns/nns\_client\.md)__, and
+__[nameserv::server](\.\./modules/nns/nns\_server\.md)__\. Beyond that the
+application's sources also serve as an example of how to use the server package
+__[nameserv::server](\.\./modules/nns/nns\_server\.md)__\.
+
+This name service facility has nothing to do with the Internet's *Domain Name
+System*, otherwise known as *[DNS](\.\./\.\./\.\./index\.md\#dns)*\. If the reader
+is looking for a package dealing with that please see either of the packages
+__[dns](\.\./modules/dns/tcllib\_dns\.md)__ and __resolv__, both found
+in Tcllib too\.
+
+## USE CASES
+
+__nnsd__ was written with the following main use case in mind\.
+
+ 1. Run a nano name service on some host\.
+
+## COMMAND LINE
+
+ - __nnsd__ ?__\-localonly__ *flag*? ?__\-port__ *port*?
+
+ The command configures a server per the specified options and starts it\. The
+ command will not exit on its own, as it keeps the name service database
+ wholly in memory\. The user has to kill it explicitly, either by sending a a
+ signal, or through the job\-control facilities of the shell in use\.
+
+ The options to configure the name service are explained in section
+ [OPTIONS](#subsection3)\.
+
+## OPTIONS
+
+This section describes all the options available to the user of the application
+
+ - __\-localonly__ bool
+
+ If this option is not specified it defaults to __true__, i\.e\. acceptance
+ of only local connections\. The server will accept remote connections, i\.e\.
+ connections from other hosts, if and only if this option is configured to
+ __false__\.
+
+ - __\-port__ number
+
+ If this option is not specified it defaults to __38573__\. It specifies
+ the TCP port the server has to listen on for requests\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *nameserv* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[nameserv::common\(n\)](\.\./modules/nns/nns\_common\.md),
+[nameserv::server\(n\)](\.\./modules/nns/nns\_server\.md)
+
+# KEYWORDS
+
+[application](\.\./\.\./\.\./index\.md\#application), [name
+service](\.\./\.\./\.\./index\.md\#name\_service),
+[server](\.\./\.\./\.\./index\.md\#server)
+
+# CATEGORY
+
+Networking
+
+# COPYRIGHT
+
+Copyright © 2007\-2008 Andreas Kupries
ADDED embedded/md/tcllib/files/apps/nnslog.md
Index: embedded/md/tcllib/files/apps/nnslog.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/apps/nnslog.md
@@ -0,0 +1,134 @@
+
+[//000000001]: # (nnslog \- Name service facility)
+[//000000002]: # (Generated from file 'nnslog\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2008 Andreas Kupries )
+[//000000004]: # (nnslog\(n\) 1\.0 tcllib "Name service facility")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+nnslog \- Name service facility, Commandline Logging Client Application
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [USE CASES](#subsection1)
+
+ - [COMMAND LINE](#subsection2)
+
+ - [OPTIONS](#subsection3)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__nnslog__ ?__\-host__ *host*? ?__\-port__ *port*?](#1)
+
+# DESCRIPTION
+
+Please read *[Name service facility,
+introduction](\.\./modules/nns/nns\_intro\.md)* first\.
+
+The application described by this document, __nnslog__, is a simple command
+line client for the nano name service facility provided by the Tcllib packages
+__[nameserv](\.\./modules/nns/nns\_client\.md)__, and
+__[nameserv::server](\.\./modules/nns/nns\_server\.md)__\.
+
+It essentially implements "__[nns](nns\.md)__ search \-continuous \*", but
+uses a different output formatting\. Instead of continuously showing the current
+contents of the server in the terminal it simply logs all received add/remove
+events to __stdout__\.
+
+This name service facility has nothing to do with the Internet's *Domain Name
+System*, otherwise known as *[DNS](\.\./\.\./\.\./index\.md\#dns)*\. If the reader
+is looking for a package dealing with that please see either of the packages
+__[dns](\.\./modules/dns/tcllib\_dns\.md)__ and __resolv__, both found
+in Tcllib too\.
+
+## USE CASES
+
+__nnslog__ was written with the following main use case in mind\.
+
+ 1. Monitoring the name service for all changes and logging them in a text
+ terminal\.
+
+## COMMAND LINE
+
+ - __nnslog__ ?__\-host__ *host*? ?__\-port__ *port*?
+
+ The command connects to the specified name service, sets up a search for all
+ changes and then prints all received events to stdout, with each events on
+ its own line\. The command will not exit until it is explicitly terminated by
+ the user\. It will especially survive the loss of the connection to the name
+ service and reestablish the search and log when the connection is restored\.
+
+ The options to specify the name service will be explained later, in section
+ [OPTIONS](#subsection3)\.
+
+## OPTIONS
+
+This section describes all the options available to the user of the application
+
+ - __\-host__ name|ipaddress
+
+ If this option is not specified it defaults to __localhost__\. It
+ specifies the name or ip\-address of the host the name service to talk to is
+ running on\.
+
+ - __\-port__ number
+
+ If this option is not specified it defaults to __38573__\. It specifies
+ the TCP port the name service to talk to is listening on for requests\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *nameserv* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[nameserv\(n\)](\.\./modules/nns/nns\_client\.md),
+[nameserv::common\(n\)](\.\./modules/nns/nns\_common\.md)
+
+# KEYWORDS
+
+[application](\.\./\.\./\.\./index\.md\#application),
+[client](\.\./\.\./\.\./index\.md\#client), [name
+service](\.\./\.\./\.\./index\.md\#name\_service)
+
+# CATEGORY
+
+Networking
+
+# COPYRIGHT
+
+Copyright © 2008 Andreas Kupries
ADDED embedded/md/tcllib/files/apps/page.md
Index: embedded/md/tcllib/files/apps/page.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/apps/page.md
@@ -0,0 +1,474 @@
+
+[//000000001]: # (page \- Development Tools)
+[//000000002]: # (Generated from file 'page\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2005 Andreas Kupries )
+[//000000004]: # (page\(n\) 1\.0 tcllib "Development Tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+page \- Parser Generator
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMAND LINE](#subsection1)
+
+ - [OPERATION](#subsection2)
+
+ - [OPTIONS](#subsection3)
+
+ - [PLUGINS](#subsection4)
+
+ - [PLUGIN LOCATIONS](#subsection5)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__page__ ?*options*\.\.\.? ?*input* ?*output*??](#1)
+
+# DESCRIPTION
+
+The application described by this document, __page__, is actually not just a
+parser generator, as the name implies, but a generic tool for the execution of
+arbitrary transformations on texts\.
+
+Its genericity comes through the use of *plugins* for reading, transforming,
+and writing data, and the predefined set of plugins provided by Tcllib is for
+the generation of memoizing recursive descent parsers \(aka *packrat parsers*\)
+from grammar specifications \(*Parsing Expression Grammars*\)\.
+
+__page__ is written on top of the package __page::pluginmgr__, wrapping
+its functionality into a command line based application\. All the other
+__page::\*__ packages are plugin and/or supporting packages for the
+generation of parsers\. The parsers themselves are based on the packages
+__[grammar::peg](\.\./modules/grammar\_peg/peg\.md)__,
+__[grammar::peg::interp](\.\./modules/grammar\_peg/peg\_interp\.md)__, and
+__grammar::mengine__\.
+
+## COMMAND LINE
+
+ - __page__ ?*options*\.\.\.? ?*input* ?*output*??
+
+ This is general form for calling __page__\. The application will read the
+ contents of the file *input*, process them under the control of the
+ specified *options*, and then write the result to the file *output*\.
+
+ If *input* is the string __\-__ the data to process will be read from
+ __stdin__ instead of a file\. Analogously the result will be written to
+ __stdout__ instead of a file if *output* is the string __\-__\. A
+ missing output or input specification causes the application to assume
+ __\-__\.
+
+ The detailed specifications of the recognized *options* are provided in
+ section [OPTIONS](#subsection3)\.
+
+ * path *input* \(in\)
+
+ This argument specifies the path to the file to be processed by the
+ application, or __\-__\. The last value causes the application to read
+ the text from __stdin__\. Otherwise it has to exist, and be readable\.
+ If the argument is missing __\-__ is assumed\.
+
+ * path *output* \(in\)
+
+ This argument specifies where to write the generated text\. It can be the
+ path to a file, or __\-__\. The last value causes the application to
+ write the generated documented to __stdout__\.
+
+ If the file *output* does not exist then \[file dirname $output\] has to
+ exist and must be a writable directory, as the application will create
+ the fileto write to\.
+
+ If the argument is missing __\-__ is assumed\.
+
+## OPERATION
+
+\.\.\. reading \.\.\. transforming \.\.\. writing \- plugins \- pipeline \.\.\.
+
+## OPTIONS
+
+This section describes all the options available to the user of the application\.
+Options are always processed in order\. I\.e\. of both __\-\-help__ and
+__\-\-version__ are specified the option encountered first has precedence\.
+
+Unknown options specified before any of the options __\-rd__, __\-wr__, or
+__\-tr__ will cause processing to abort with an error\. Unknown options coming
+in between these options, or after the last of them are assumed to always take a
+single argument and are associated with the last plugin option coming before
+them\. They will be checked after all the relevant plugins, and thus the options
+they understand, are known\. I\.e\. such unknown options cause error if and only if
+the plugin option they are associated with does not understand them, and was not
+superceded by a plugin option coming after\.
+
+Default options are used if and only if the command line did not contain any
+options at all\. They will set the application up as a PEG\-based parser
+generator\. The exact list of options is
+
+ \-c peg
+
+And now the recognized options and their arguments, if they have any:
+
+ - __\-\-help__
+
+ - __\-h__
+
+ - __\-?__
+
+ When one of these options is found on the command line all arguments coming
+ before or after are ignored\. The application will print a short description
+ of the recognized options and exit\.
+
+ - __\-\-version__
+
+ - __\-V__
+
+ When one of these options is found on the command line all arguments coming
+ before or after are ignored\. The application will print its own revision and
+ exit\.
+
+ - __\-P__
+
+ This option signals the application to activate visual feedback while
+ reading the input\.
+
+ - __\-T__
+
+ This option signals the application to collect statistics while reading the
+ input and to print them after reading has completed, before processing
+ started\.
+
+ - __\-D__
+
+ This option signals the application to activate logging in the Safe base,
+ for the debugging of problems with plugins\.
+
+ - __\-r__ parser
+
+ - __\-rd__ parser
+
+ - __\-\-reader__ parser
+
+ These options specify the plugin the application has to use for reading the
+ *input*\. If the options are used multiple times the last one will be used\.
+
+ - __\-w__ generator
+
+ - __\-wr__ generator
+
+ - __\-\-writer__ generator
+
+ These options specify the plugin the application has to use for generating
+ and writing the final *output*\. If the options are used multiple times the
+ last one will be used\.
+
+ - __\-t__ process
+
+ - __\-tr__ process
+
+ - __\-\-transform__ process
+
+ These options specify a plugin to run on the input\. In contrast to readers
+ and writers each use will *not* supersede previous uses, but add each
+ chosen plugin to a list of transformations, either at the front, or the end,
+ per the last seen use of either option __\-p__ or __\-a__\. The initial
+ default is to append the new transformations\.
+
+ - __\-a__
+
+ - __\-\-append__
+
+ These options signal the application that all following transformations
+ should be added at the end of the list of transformations\.
+
+ - __\-p__
+
+ - __\-\-prepend__
+
+ These options signal the application that all following transformations
+ should be added at the beginning of the list of transformations\.
+
+ - __\-\-reset__
+
+ This option signals the application to clear the list of transformations\.
+ This is necessary to wipe out the default transformations used\.
+
+ - __\-c__ file
+
+ - __\-\-configuration__ file
+
+ This option causes the application to load a configuration file and/or
+ plugin\. This is a plugin which in essence provides a pre\-defined set of
+ commandline options\. They are processed exactly as if they have been
+ specified in place of the option and its arguments\. This means that unknown
+ options found at the beginning of the configuration file are associated with
+ the last plugin, even if that plugin was specified before the configuration
+ file itself\. Conversely, unknown options coming after the configuration file
+ can be associated with a plugin specified in the file\.
+
+ If the argument is a file which cannot be loaded as a plugin the application
+ will assume that its contents are a list of options and their arguments,
+ separated by space, tabs, and newlines\. Options and argumentes containing
+ spaces can be quoted via double\-quotes \("\) and quotes \('\)\. The quote
+ character can be specified within in a quoted string by doubling it\.
+ Newlines in a quoted string are accepted as is\.
+
+## PLUGINS
+
+__page__ makes use of four different types of plugins, namely: readers,
+writers, transformations, and configurations\. Here we provide only a basic
+introduction on how to use them from __page__\. The exact APIs provided to
+and expected from the plugins can be found in the documentation for
+__page::pluginmgr__, for those who wish to write their own plugins\.
+
+Plugins are specified as arguments to the options __\-r__, __\-w__,
+__\-t__, __\-c__, and their equivalent longer forms\. See the section
+[OPTIONS](#subsection3) for reference\.
+
+Each such argument will be first treated as the name of a file and this file is
+loaded as the plugin\. If however there is no file with that name, then it will
+be translated into the name of a package, and this package is then loaded\. For
+each type of plugins the package management searches not only the regular paths,
+but a set application\- and type\-specific paths as well\. Please see the section
+[PLUGIN LOCATIONS](#subsection5) for a listing of all paths and their
+sources\.
+
+ - __\-c__ *name*
+
+ Configurations\. The name of the package for the plugin *name* is
+ "page::config::*name*"\.
+
+ We have one predefined plugin:
+
+ * *peg*
+
+ It sets the application up as a parser generator accepting parsing
+ expression grammars and writing a packrat parser in Tcl\. The actual
+ arguments it specifies are:
+
+ \-\-reset
+ \-\-append
+ \-\-reader peg
+ \-\-transform reach
+ \-\-transform use
+ \-\-writer me
+
+ - __\-r__ *name*
+
+ Readers\. The name of the package for the plugin *name* is
+ "page::reader::*name*"\.
+
+ We have five predefined plugins:
+
+ * *peg*
+
+ Interprets the input as a parsing expression grammar
+ \(*[PEG](\.\./\.\./\.\./index\.md\#peg)*\) and generates a tree
+ representation for it\. Both the syntax of PEGs and the structure of the
+ tree representation are explained in their own manpages\.
+
+ * *hb*
+
+ Interprets the input as Tcl code as generated by the writer plugin
+ *hb* and generates its tree representation\.
+
+ * *ser*
+
+ Interprets the input as the serialization of a PEG, as generated by the
+ writer plugin *ser*, using the package
+ __[grammar::peg](\.\./modules/grammar\_peg/peg\.md)__\.
+
+ * *lemon*
+
+ Interprets the input as a grammar specification as understood by Richard
+ Hipp's *[LEMON](\.\./\.\./\.\./index\.md\#lemon)* parser generator and
+ generates a tree representation for it\. Both the input syntax and the
+ structure of the tree representation are explained in their own
+ manpages\.
+
+ * *treeser*
+
+ Interprets the input as the serialization of a
+ __[struct::tree](\.\./modules/struct/struct\_tree\.md)__\. It is
+ validated as such, but nothing else\. It is *not* assumed to be the
+ tree representation of a grammar\.
+
+ - __\-w__ *name*
+
+ Writers\. The name of the package for the plugin *name* is
+ "page::writer::*name*"\.
+
+ We have eight predefined plugins:
+
+ * *identity*
+
+ Simply writes the incoming data as it is, without making any changes\.
+ This is good for inspecting the raw result of a reader or
+ transformation\.
+
+ * *null*
+
+ Generates nothing, and ignores the incoming data structure\.
+
+ * *tree*
+
+ Assumes that the incoming data structure is a
+ __[struct::tree](\.\./modules/struct/struct\_tree\.md)__ and
+ generates an indented textual representation of all nodes, their
+ parental relationships, and their attribute information\.
+
+ * *peg*
+
+ Assumes that the incoming data structure is a tree representation of a
+ *[PEG](\.\./\.\./\.\./index\.md\#peg)* or other other grammar and writes
+ it out as a PEG\. The result is nicely formatted and partially simplified
+ \(strings as sequences of characters\)\. A pretty printer in essence, but
+ can also be used to obtain a canonical representation of the input
+ grammar\.
+
+ * *tpc*
+
+ Assumes that the incoming data structure is a tree representation of a
+ *[PEG](\.\./\.\./\.\./index\.md\#peg)* or other other grammar and writes
+ out Tcl code defining a package which defines a
+ __[grammar::peg](\.\./modules/grammar\_peg/peg\.md)__ object
+ containing the grammar when it is loaded into an interpreter\.
+
+ * *hb*
+
+ This is like the writer plugin *tpc*, but it writes only the
+ statements which define stat expression and grammar rules\. The code
+ making the result a package is left out\.
+
+ * *ser*
+
+ Assumes that the incoming data structure is a tree representation of a
+ *[PEG](\.\./\.\./\.\./index\.md\#peg)* or other other grammar, transforms
+ it internally into a
+ __[grammar::peg](\.\./modules/grammar\_peg/peg\.md)__ object and
+ writes out its serialization\.
+
+ * *me*
+
+ Assumes that the incoming data structure is a tree representation of a
+ *[PEG](\.\./\.\./\.\./index\.md\#peg)* or other other grammar and writes
+ out Tcl code defining a package which implements a memoizing recursive
+ descent parser based on the match engine \(ME\) provided by the package
+ __grammar::mengine__\.
+
+ - __\-t__ *name*
+
+ Transformers\. The name of the package for the plugin *name* is
+ "page::transform::*name*"\.
+
+ We have two predefined plugins:
+
+ * *reach*
+
+ Assumes that the incoming data structure is a tree representation of a
+ *[PEG](\.\./\.\./\.\./index\.md\#peg)* or other other grammar\. It
+ determines which nonterminal symbols and rules are reachable from
+ start\-symbol/expression\. All nonterminal symbols which were not reached
+ are removed\.
+
+ * *use*
+
+ Assumes that the incoming data structure is a tree representation of a
+ *[PEG](\.\./\.\./\.\./index\.md\#peg)* or other other grammar\. It
+ determines which nonterminal symbols and rules are able to generate a
+ *finite* sequences of terminal symbols \(in the sense for a Context
+ Free Grammar\)\. All nonterminal symbols which were not deemed useful in
+ this sense are removed\.
+
+## PLUGIN LOCATIONS
+
+The application\-specific paths searched by __page__ either are, or come
+from:
+
+ 1. The directory "~/\.page/plugin"
+
+ 1. The environment variable *PAGE\_PLUGINS*
+
+ 1. The registry entry *HKEY\_LOCAL\_MACHINE\\SOFTWARE\\PAGE\\PLUGINS*
+
+ 1. The registry entry *HKEY\_CURRENT\_USER\\SOFTWARE\\PAGE\\PLUGINS*
+
+The type\-specific paths searched by __page__ either are, or come from:
+
+ 1. The directory "~/\.page/plugin/"
+
+ 1. The environment variable *PAGE\_\_PLUGINS*
+
+ 1. The registry entry *HKEY\_LOCAL\_MACHINE\\SOFTWARE\\PAGE\\\\PLUGINS*
+
+ 1. The registry entry *HKEY\_CURRENT\_USER\\SOFTWARE\\PAGE\\\\PLUGINS*
+
+Where the placeholder ** is always one of the values below, properly
+capitalized\.
+
+ 1. reader
+
+ 1. writer
+
+ 1. transform
+
+ 1. config
+
+The registry entries are specific to the Windows\(tm\) platform, all other
+platforms will ignore them\.
+
+The contents of both environment variables and registry entries are interpreted
+as a list of paths, with the elements separated by either colon \(Unix\), or
+semicolon \(Windows\)\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *page* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+page::pluginmgr
+
+# KEYWORDS
+
+[parser generator](\.\./\.\./\.\./index\.md\#parser\_generator), [text
+processing](\.\./\.\./\.\./index\.md\#text\_processing)
+
+# CATEGORY
+
+Page Parser Generator
+
+# COPYRIGHT
+
+Copyright © 2005 Andreas Kupries
ADDED embedded/md/tcllib/files/apps/pt.md
Index: embedded/md/tcllib/files/apps/pt.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/apps/pt.md
@@ -0,0 +1,799 @@
+
+[//000000001]: # (pt \- Parser Tools)
+[//000000002]: # (Generated from file 'pt\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (pt\(n\) 1 tcllib "Parser Tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+pt \- Parser Tools Application
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Command Line](#section2)
+
+ - [PEG Specification Language](#section3)
+
+ - [JSON Grammar Exchange](#section4)
+
+ - [C Parser Embedded In Tcl](#section5)
+
+ - [C Parser](#section6)
+
+ - [Snit Parser](#section7)
+
+ - [TclOO Parser](#section8)
+
+ - [Grammar Container](#section9)
+
+ - [Example](#section10)
+
+ - [Internals](#section11)
+
+ - [Bugs, Ideas, Feedback](#section12)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+
+[__pt__ __generate__ *resultformat* ?*options\.\.\.*? *resultfile* *inputformat* *inputfile*](#1)
+
+# DESCRIPTION
+
+Are you lost ? Do you have trouble understanding this document ? In that case
+please read the overview provided by the *[Introduction to Parser
+Tools](\.\./modules/pt/pt\_introduction\.md)*\. This document is the entrypoint
+to the whole system the current package is a part of\.
+
+This document describes __pt__, the main application of the module, a
+*[parser generator](\.\./\.\./\.\./index\.md\#parser\_generator)*\. Its intended
+audience are people who wish to create a parser for some language of theirs\.
+Should you wish to modify the application instead, please see the section about
+the application's [Internals](#section11) for the basic references\.
+
+It resides in the User Application Layer of Parser Tools\.
+
+![](\.\./\.\./\.\./image/arch\_user\_app\.png)
+
+# Command Line
+
+ - __pt__ __generate__ *resultformat* ?*options\.\.\.*? *resultfile* *inputformat* *inputfile*
+
+ This sub\-command of the application reads the parsing expression grammar
+ stored in the *inputfile* in the format *inputformat*, converts it to
+ the *resultformat* under the direction of the \(format\-specific\) set of
+ options specified by the user and stores the result in the *resultfile*\.
+
+ The *inputfile* has to exist, while the *resultfile* may be created,
+ overwriting any pre\-existing content of the file\. Any missing directory in
+ the path to the *resultfile* will be created as well\.
+
+ The exact form of the result for, and the set of options supported by the
+ known result\-formats, are explained in the upcoming sections of this
+ document, with the list below providing an index mapping between format name
+ and its associated section\. In alphabetical order:
+
+ * __c__
+
+ A *resultformat*\. See section [C Parser](#section6)\.
+
+ * __container__
+
+ A *resultformat*\. See section [Grammar Container](#section9)\.
+
+ * __critcl__
+
+ A *resultformat*\. See section [C Parser Embedded In
+ Tcl](#section5)\.
+
+ * __json__
+
+ A *input*\- and *resultformat*\. See section [JSON Grammar
+ Exchange](#section4)\.
+
+ * __oo__
+
+ A *resultformat*\. See section [TclOO Parser](#section8)\.
+
+ * __peg__
+
+ A *input*\- and *resultformat*\. See section [PEG Specification
+ Language](#section3)\.
+
+ * __snit__
+
+ A *resultformat*\. See section [Snit Parser](#section7)\.
+
+Of the seven possible results four are parsers outright \(__c__,
+__critcl__, __oo__, and __snit__\), one \(__container__\) provides
+code which can be used in conjunction with a generic parser \(also known as a
+grammar interpreter\), and the last two \(__json__ and __peg__\) are doing
+double\-duty as input formats, allowing the transformation of grammars for
+exchange, reformatting, and the like\.
+
+The created parsers fall into three categories:
+
+![](\.\./\.\./\.\./image/gen\_options\.png)
+
+ - __Specialized parsers implemented in C__
+
+ The fastest parsers are created when using the result formats __c__ and
+ __critcl__\. The first returns the raw C code for the parser, while the
+ latter wraps it into a Tcl package using *CriTcl*\.
+
+ This makes the latter much easier to use than the former\. On the other hand,
+ the former can be adapted to the users' requirements through a multitude of
+ options, allowing for things like usage of the parser outside of a Tcl
+ environment, something the __critcl__ format doesn't support\. As such
+ the __c__ format is meant for more advanced users, or users with special
+ needs\.
+
+ A disadvantage of all the parsers in this section is the need to run them
+ through a C compiler to make them actually executable\. This is not something
+ everyone has the necessary tools for\. The parsers in the next section are
+ for people under such restrictions\.
+
+ - __Specialized parsers implemented in Tcl__
+
+ As the parsers in this section are implemented in Tcl they are quite a bit
+ slower than anything from the previous section\. On the other hand this
+ allows them to be used in pure\-Tcl environments, or in environments which
+ allow only a limited set of binary packages\. In the latter case it will be
+ advantageous to lobby for the inclusion of the C\-based runtime support
+ \(notes below\) into the environment to reduce the impact of Tcl's on the
+ speed of these parsers\.
+
+ The relevant formats are __snit__ and __oo__\. Both place their
+ result into a Tcl package containing a __snit::type__, or TclOO
+ __[class](\.\./\.\./\.\./index\.md\#class)__ respectively\.
+
+ Of the supporting runtime, which is the package
+ __[pt::rde](\.\./modules/pt/pt\_rdengine\.md)__, the user has to know
+ nothing but that it does exist and that the parsers are dependent on it\.
+ Knowledge of the API exported by the runtime for the parsers' consumption is
+ *not* required by the parsers' users\.
+
+ - __Interpreted parsing implemented in Tcl__
+
+ The last category, grammar interpretation\. This means that an interpreter
+ for parsing expression grammars takes the description of the grammar to
+ parse input for, and uses it guide the parsing process\. This is the slowest
+ of the available options, as the interpreter has to continually run through
+ the configured grammar, whereas the specialized parsers of the previous
+ sections have the relevant knowledge about the grammar baked into them\.
+
+ The only places where using interpretation make sense is where the grammar
+ for some input may be changed interactively by the user, as the
+ interpretation allows for quick turnaround after each change, whereas the
+ previous methods require the generation of a whole new parser, which is not
+ as fast\. On the other hand, wherever the grammar to use is fixed, the
+ previous methods are much more advantageous as the time to generate the
+ parser is minuscule compared to the time the parser code is in use\.
+
+ The relevant result format is __container__\. It \(quickly\) generates
+ grammar descriptions \(instead of a full parser\) which match the API expected
+ by ParserTools' grammar interpreter\. The latter is provided by the package
+ __[pt::peg::interp](\.\./modules/pt/pt\_peg\_interp\.md)__\.
+
+All the parsers generated by __critcl__, __snit__, and __oo__, and
+the grammar interpreter share a common API for access to the actual parsing
+functionality, making them all plug\-compatible\. It is described in the
+*[Parser API](\.\./modules/pt/pt\_parser\_api\.md)* specification document\.
+
+# PEG Specification Language
+
+__peg__, a language for the specification of parsing expression grammars is
+meant to be human readable, and writable as well, yet strict enough to allow its
+processing by machine\. Like any computer language\. It was defined to make
+writing the specification of a grammar easy, something the other formats found
+in the Parser Tools do not lend themselves too\.
+
+For either an introduction to or the formal specification of the language,
+please go and read the *[PEG Language
+Tutorial](\.\./modules/pt/pt\_peg\_language\.md)*\.
+
+When used as a result\-format this format supports the following options:
+
+ - __\-file__ string
+
+ The value of this option is the name of the file or other entity from which
+ the grammar came, for which the command is run\. The default value is
+ __unknown__\.
+
+ - __\-name__ string
+
+ The value of this option is the name of the grammar we are processing\. The
+ default value is __a\_pe\_grammar__\.
+
+ - __\-user__ string
+
+ The value of this option is the name of the user for which the command is
+ run\. The default value is __unknown__\.
+
+ - __\-template__ string
+
+ The value of this option is a string into which to put the generated text
+ and the values of the other options\. The various locations for user\-data are
+ expected to be specified with the placeholders listed below\. The default
+ value is "__@code@__"\.
+
+ * __@user@__
+
+ To be replaced with the value of the option __\-user__\.
+
+ * __@format@__
+
+ To be replaced with the the constant __PEG__\.
+
+ * __@file@__
+
+ To be replaced with the value of the option __\-file__\.
+
+ * __@name@__
+
+ To be replaced with the value of the option __\-name__\.
+
+ * __@code@__
+
+ To be replaced with the generated text\.
+
+# JSON Grammar Exchange
+
+The __json__ format for parsing expression grammars was written as a data
+exchange format not bound to Tcl\. It was defined to allow the exchange of
+grammars with PackRat/PEG based parser generators for other languages\.
+
+For the formal specification of the JSON grammar exchange format, please go and
+read *[The JSON Grammar Exchange
+Format](\.\./modules/pt/pt\_json\_language\.md)*\.
+
+When used as a result\-format this format supports the following options:
+
+ - __\-file__ string
+
+ The value of this option is the name of the file or other entity from which
+ the grammar came, for which the command is run\. The default value is
+ __unknown__\.
+
+ - __\-name__ string
+
+ The value of this option is the name of the grammar we are processing\. The
+ default value is __a\_pe\_grammar__\.
+
+ - __\-user__ string
+
+ The value of this option is the name of the user for which the command is
+ run\. The default value is __unknown__\.
+
+ - __\-indented__ boolean
+
+ If this option is set the system will break the generated JSON across lines
+ and indent it according to its inner structure, with each key of a
+ dictionary on a separate line\.
+
+ If the option is not set \(the default\), the whole JSON object will be
+ written on a single line, with minimum spacing between all elements\.
+
+ - __\-aligned__ boolean
+
+ If this option is set the system will ensure that the values for the keys in
+ a dictionary are vertically aligned with each other, for a nice table
+ effect\. To make this work this also implies that __\-indented__ is set\.
+
+ If the option is not set \(the default\), the output is formatted as per the
+ value of __indented__, without trying to align the values for dictionary
+ keys\.
+
+# C Parser Embedded In Tcl
+
+The __critcl__ format is executable code, a parser for the grammar\. It is a
+Tcl package with the actual parser implementation written in C and embedded in
+Tcl via the __critcl__ package\.
+
+This result\-format supports the following options:
+
+ - __\-file__ string
+
+ The value of this option is the name of the file or other entity from which
+ the grammar came, for which the command is run\. The default value is
+ __unknown__\.
+
+ - __\-name__ string
+
+ The value of this option is the name of the grammar we are processing\. The
+ default value is __a\_pe\_grammar__\.
+
+ - __\-user__ string
+
+ The value of this option is the name of the user for which the command is
+ run\. The default value is __unknown__\.
+
+ - __\-class__ string
+
+ The value of this option is the name of the class to generate, without
+ leading colons\. The default value is __CLASS__\.
+
+ For a simple value __X__ without colons, like CLASS, the parser command
+ will be __X__::__X__\. Whereas for a namespaced value __X::Y__
+ the parser command will be __X::Y__\.
+
+ - __\-package__ string
+
+ The value of this option is the name of the package to generate\. The default
+ value is __PACKAGE__\.
+
+ - __\-version__ string
+
+ The value of this option is the version of the package to generate\. The
+ default value is __1__\.
+
+# C Parser
+
+The __c__ format is executable code, a parser for the grammar\. The parser
+implementation is written in C and can be tweaked to the users' needs through a
+multitude of options\.
+
+The __critcl__ format, for example, is implemented as a canned configuration
+of these options on top of the generator for __c__\.
+
+This result\-format supports the following options:
+
+ - __\-file__ string
+
+ The value of this option is the name of the file or other entity from which
+ the grammar came, for which the command is run\. The default value is
+ __unknown__\.
+
+ - __\-name__ string
+
+ The value of this option is the name of the grammar we are processing\. The
+ default value is __a\_pe\_grammar__\.
+
+ - __\-user__ string
+
+ The value of this option is the name of the user for which the command is
+ run\. The default value is __unknown__\.
+
+ - __\-template__ string
+
+ The value of this option is a string into which to put the generated text
+ and the other configuration settings\. The various locations for user\-data
+ are expected to be specified with the placeholders listed below\. The default
+ value is "__@code@__"\.
+
+ * __@user@__
+
+ To be replaced with the value of the option __\-user__\.
+
+ * __@format@__
+
+ To be replaced with the the constant __C/PARAM__\.
+
+ * __@file@__
+
+ To be replaced with the value of the option __\-file__\.
+
+ * __@name@__
+
+ To be replaced with the value of the option __\-name__\.
+
+ * __@code@__
+
+ To be replaced with the generated Tcl code\.
+
+ The following options are special, in that they will occur within the
+ generated code, and are replaced there as well\.
+
+ * __@statedecl@__
+
+ To be replaced with the value of the option __state\-decl__\.
+
+ * __@stateref@__
+
+ To be replaced with the value of the option __state\-ref__\.
+
+ * __@strings@__
+
+ To be replaced with the value of the option __string\-varname__\.
+
+ * __@self@__
+
+ To be replaced with the value of the option __self\-command__\.
+
+ * __@def@__
+
+ To be replaced with the value of the option __fun\-qualifier__\.
+
+ * __@ns@__
+
+ To be replaced with the value of the option __namespace__\.
+
+ * __@main@__
+
+ To be replaced with the value of the option __main__\.
+
+ * __@prelude@__
+
+ To be replaced with the value of the option __prelude__\.
+
+ - __\-state\-decl__ string
+
+ A C string representing the argument declaration to use in the generated
+ parsing functions to refer to the parsing state\. In essence type and
+ argument name\. The default value is the string __RDE\_PARAM p__\.
+
+ - __\-state\-ref__ string
+
+ A C string representing the argument named used in the generated parsing
+ functions to refer to the parsing state\. The default value is the string
+ __p__\.
+
+ - __\-self\-command__ string
+
+ A C string representing the reference needed to call the generated parser
+ function \(methods \.\.\.\) from another parser fonction, per the chosen
+ framework \(template\)\. The default value is the empty string\.
+
+ - __\-fun\-qualifier__ string
+
+ A C string containing the attributes to give to the generated functions
+ \(methods \.\.\.\), per the chosen framework \(template\)\. The default value is
+ __static__\.
+
+ - __\-namespace__ string
+
+ The name of the C namespace the parser functions \(methods, \.\.\.\) shall reside
+ in, or a general prefix to add to the function names\. The default value is
+ the empty string\.
+
+ - __\-main__ string
+
+ The name of the main function \(method, \.\.\.\) to be called by the chosen
+ framework \(template\) to start parsing input\. The default value is
+ __\_\_main__\.
+
+ - __\-string\-varname__ string
+
+ The name of the variable used for the table of strings used by the generated
+ parser, i\.e\. error messages, symbol names, etc\. The default value is
+ __p\_string__\.
+
+ - __\-prelude__ string
+
+ A snippet of code to be inserted at the head of each generated parsing
+ function\. The default value is the empty string\.
+
+ - __\-indent__ integer
+
+ The number of characters to indent each line of the generated code by\. The
+ default value is __0__\.
+
+ - __\-comments__ boolean
+
+ A flag controlling the generation of code comments containing the original
+ parsing expression a parsing function is for\. The default value is
+ __on__\.
+
+# Snit Parser
+
+The __snit__ format is executable code, a parser for the grammar\. It is a
+Tcl package holding a __snit::type__, i\.e\. a class, whose instances are
+parsers for the input grammar\.
+
+This result\-format supports the following options:
+
+ - __\-file__ string
+
+ The value of this option is the name of the file or other entity from which
+ the grammar came, for which the command is run\. The default value is
+ __unknown__\.
+
+ - __\-name__ string
+
+ The value of this option is the name of the grammar we are processing\. The
+ default value is __a\_pe\_grammar__\.
+
+ - __\-user__ string
+
+ The value of this option is the name of the user for which the command is
+ run\. The default value is __unknown__\.
+
+ - __\-class__ string
+
+ The value of this option is the name of the class to generate, without
+ leading colons\. Note, it serves double\-duty as the name of the package to
+ generate too, if option __\-package__ is not specified, see below\. The
+ default value is __CLASS__, applying if neither option __\-class__
+ nor __\-package__ were specified\.
+
+ - __\-package__ string
+
+ The value of this option is the name of the package to generate, without
+ leading colons\. Note, it serves double\-duty as the name of the class to
+ generate too, if option __\-class__ is not specified, see above\. The
+ default value is __PACKAGE__, applying if neither option
+ __\-package__ nor __\-class__ were specified\.
+
+ - __\-version__ string
+
+ The value of this option is the version of the package to generate\. The
+ default value is __1__\.
+
+# TclOO Parser
+
+The __oo__ format is executable code, a parser for the grammar\. It is a Tcl
+package holding a __[TclOO](\.\./\.\./\.\./index\.md\#tcloo)__ class, whose
+instances are parsers for the input grammar\.
+
+This result\-format supports the following options:
+
+ - __\-file__ string
+
+ The value of this option is the name of the file or other entity from which
+ the grammar came, for which the command is run\. The default value is
+ __unknown__\.
+
+ - __\-name__ string
+
+ The value of this option is the name of the grammar we are processing\. The
+ default value is __a\_pe\_grammar__\.
+
+ - __\-user__ string
+
+ The value of this option is the name of the user for which the command is
+ run\. The default value is __unknown__\.
+
+ - __\-class__ string
+
+ The value of this option is the name of the class to generate, without
+ leading colons\. Note, it serves double\-duty as the name of the package to
+ generate too, if option __\-package__ is not specified, see below\. The
+ default value is __CLASS__, applying if neither option __\-class__
+ nor __\-package__ were specified\.
+
+ - __\-package__ string
+
+ The value of this option is the name of the package to generate, without
+ leading colons\. Note, it serves double\-duty as the name of the class to
+ generate too, if option __\-class__ is not specified, see above\. The
+ default value is __PACKAGE__, applying if neither option
+ __\-package__ nor __\-class__ were specified\.
+
+ - __\-version__ string
+
+ The value of this option is the version of the package to generate\. The
+ default value is __1__\.
+
+# Grammar Container
+
+The __container__ format is another form of describing parsing expression
+grammars\. While data in this format is executable it does not constitute a
+parser for the grammar\. It always has to be used in conjunction with the package
+__[pt::peg::interp](\.\./modules/pt/pt\_peg\_interp\.md)__, a grammar
+interpreter\.
+
+The format represents grammars by a __snit::type__, i\.e\. class, whose
+instances are API\-compatible to the instances of the
+__[pt::peg::container](\.\./modules/pt/pt\_peg\_container\.md)__ package, and
+which are preloaded with the grammar in question\.
+
+This result\-format supports the following options:
+
+ - __\-file__ string
+
+ The value of this option is the name of the file or other entity from which
+ the grammar came, for which the command is run\. The default value is
+ __unknown__\.
+
+ - __\-name__ string
+
+ The value of this option is the name of the grammar we are processing\. The
+ default value is __a\_pe\_grammar__\.
+
+ - __\-user__ string
+
+ The value of this option is the name of the user for which the command is
+ run\. The default value is __unknown__\.
+
+ - __\-mode__ __bulk__|__incremental__
+
+ The value of this option controls which methods of
+ __[pt::peg::container](\.\./modules/pt/pt\_peg\_container\.md)__
+ instances are used to specify the grammar, i\.e\. preload it into the
+ container\. There are two legal values, as listed below\. The default is
+ __bulk__\.
+
+ * __bulk__
+
+ In this mode the methods __start__, __add__, __modes__, and
+ __rules__ are used to specify the grammar in a bulk manner, i\.e\. as
+ a set of nonterminal symbols, and two dictionaries mapping from the
+ symbols to their semantic modes and parsing expressions\.
+
+ This mode is the default\.
+
+ * __incremental__
+
+ In this mode the methods __start__, __add__, __mode__, and
+ __rule__ are used to specify the grammar piecemal, with each
+ nonterminal having its own block of defining commands\.
+
+ - __\-template__ string
+
+ The value of this option is a string into which to put the generated code
+ and the other configuration settings\. The various locations for user\-data
+ are expected to be specified with the placeholders listed below\. The default
+ value is "__@code@__"\.
+
+ * __@user@__
+
+ To be replaced with the value of the option __\-user__\.
+
+ * __@format@__
+
+ To be replaced with the the constant __CONTAINER__\.
+
+ * __@file@__
+
+ To be replaced with the value of the option __\-file__\.
+
+ * __@name@__
+
+ To be replaced with the value of the option __\-name__\.
+
+ * __@mode@__
+
+ To be replaced with the value of the option __\-mode__\.
+
+ * __@code@__
+
+ To be replaced with the generated code\.
+
+# Example
+
+In this section we are working a complete example, starting with a PEG grammar
+and ending with running the parser generated from it over some input, following
+the outline shown in the figure below:
+
+![](\.\./\.\./\.\./image/flow\.png) Our grammar, assumed to the stored in the file
+"calculator\.peg" is
+
+ PEG calculator \(Expression\)
+ Digit <\- '0'/'1'/'2'/'3'/'4'/'5'/'6'/'7'/'8'/'9' ;
+ Sign <\- '\-' / '\+' ;
+ Number <\- Sign? Digit\+ ;
+ Expression <\- Term \(AddOp Term\)\* ;
+ MulOp <\- '\*' / '/' ;
+ Term <\- Factor \(MulOp Factor\)\* ;
+ AddOp <\- '\+'/'\-' ;
+ Factor <\- '\(' Expression '\)' / Number ;
+ END;
+
+From this we create a snit\-based parser via
+
+ pt generate snit calculator\.tcl \-class calculator \-name calculator peg calculator\.peg
+
+which leaves us with the parser package and class written to the file
+"calculator\.tcl"\. Assuming that this package is then properly installed in a
+place where Tcl can find it we can now use this class via a script like
+
+ package require calculator
+
+ lassign $argv input
+ set channel \[open $input r\]
+
+ set parser \[calculator\]
+ set ast \[$parser parse $channel\]
+ $parser destroy
+ close $channel
+
+ \.\.\. now process the returned abstract syntax tree \.\.\.
+
+where the abstract syntax tree stored in the variable will look like
+
+ set ast \{Expression 0 4
+ \{Factor 0 4
+ \{Term 0 2
+ \{Number 0 2
+ \{Digit 0 0\}
+ \{Digit 1 1\}
+ \{Digit 2 2\}
+ \}
+ \}
+ \{AddOp 3 3\}
+ \{Term 4 4
+ \{Number 4 4
+ \{Digit 4 4\}
+ \}
+ \}
+ \}
+ \}
+
+assuming that the input file and channel contained the text
+
+ 120\+5
+
+A more graphical representation of the tree would be
+
+![](\.\./\.\./\.\./image/expr\_ast\.png) Regardless, at this point it is the user's
+responsibility to work with the tree to reach whatever goal she desires\. I\.e\.
+analyze it, transform it, etc\. The package
+__[pt::ast](\.\./modules/pt/pt\_astree\.md)__ should be of help here,
+providing commands to walk such ASTs structures in various ways\.
+
+One important thing to note is that the parsers used here return a data
+structure representing the structure of the input per the grammar underlying the
+parser\. There are *no* callbacks during the parsing process, i\.e\. no *parsing
+actions*, as most other parsers will have\.
+
+Going back to the last snippet of code, the execution of the parser for some
+input, note how the parser instance follows the specified *[Parser
+API](\.\./modules/pt/pt\_parser\_api\.md)*\.
+
+# Internals
+
+This section is intended for users of the application which wish to modify or
+extend it\. Users only interested in the generation of parsers can ignore it\.
+
+The main functionality of the application is encapsulated in the package
+__[pt::pgen](\.\./modules/pt/pt\_pgen\.md)__\. Please read it for more
+information\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *pt* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[EBNF](\.\./\.\./\.\./index\.md\#ebnf), [LL\(k\)](\.\./\.\./\.\./index\.md\#ll\_k\_),
+[PEG](\.\./\.\./\.\./index\.md\#peg), [TDPL](\.\./\.\./\.\./index\.md\#tdpl),
+[context\-free languages](\.\./\.\./\.\./index\.md\#context\_free\_languages),
+[expression](\.\./\.\./\.\./index\.md\#expression),
+[grammar](\.\./\.\./\.\./index\.md\#grammar),
+[matching](\.\./\.\./\.\./index\.md\#matching),
+[parser](\.\./\.\./\.\./index\.md\#parser), [parsing
+expression](\.\./\.\./\.\./index\.md\#parsing\_expression), [parsing expression
+grammar](\.\./\.\./\.\./index\.md\#parsing\_expression\_grammar), [push down
+automaton](\.\./\.\./\.\./index\.md\#push\_down\_automaton), [recursive
+descent](\.\./\.\./\.\./index\.md\#recursive\_descent),
+[state](\.\./\.\./\.\./index\.md\#state), [top\-down parsing
+languages](\.\./\.\./\.\./index\.md\#top\_down\_parsing\_languages),
+[transducer](\.\./\.\./\.\./index\.md\#transducer)
+
+# CATEGORY
+
+Parsing and Grammars
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/apps/tcldocstrip.md
Index: embedded/md/tcllib/files/apps/tcldocstrip.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/apps/tcldocstrip.md
@@ -0,0 +1,221 @@
+
+[//000000001]: # (tcldocstrip \- Textprocessing toolbox)
+[//000000002]: # (Generated from file 'tcldocstrip\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2005 Andreas Kupries )
+[//000000004]: # (tcldocstrip\(n\) 1\.0 tcllib "Textprocessing toolbox")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+tcldocstrip \- Tcl\-based Docstrip Processor
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [USE CASES](#subsection1)
+
+ - [COMMAND LINE](#subsection2)
+
+ - [OPTIONS](#subsection3)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__tcldocstrip__ *output* ?options? *input* ?*guards*?](#1)
+[__tcldocstrip__ ?options? *output* \(?options? *input* *guards*\)\.\.\.](#2)
+[__tcldocstrip__ __\-guards__ *input*](#3)
+
+# DESCRIPTION
+
+The application described by this document, __tcldocstrip__, is a relative
+of __[docstrip](\.\./modules/docstrip/docstrip\.md)__, a simple literate
+programming tool for LaTeX\.
+
+__tcldocstrip__ is based upon the package
+__[docstrip](\.\./modules/docstrip/docstrip\.md)__\.
+
+## USE CASES
+
+__tcldocstrip__ was written with the following three use cases in mind\.
+
+ 1. Conversion of a single input file according to the listed guards into the
+ stripped output\. This handles the most simple case of a set of guards
+ specifying a single document found in a single input file\.
+
+ 1. Stitching, or the assembly of an output from several sets of guards, in a
+ specific order, and possibly from different files\. This is the second
+ common case\. One document spread over several inputs, and/or spread over
+ different guard sets\.
+
+ 1. Extraction and listing of all the unique guard expressions and guards used
+ within a document to help a person which did not author the document in
+ question in familiarizing itself with it\.
+
+## COMMAND LINE
+
+ - __tcldocstrip__ *output* ?options? *input* ?*guards*?
+
+ This is the form for use case \[1\]\. It converts the *input* file according
+ to the specified *guards* and options\. The result is written to the named
+ *output* file\. Usage of the string __\-__ as the name of the output
+ signals that the result should be written to __stdout__\. The guards are
+ document\-specific and have to be known to the caller\. The *options* will
+ be explained later, in section [OPTIONS](#subsection3)\.
+
+ * path *output* \(in\)
+
+ This argument specifies where to write the generated document\. It can be
+ the path to a file or directory, or __\-__\. The last value causes the
+ application to write the generated documented to __stdout__\.
+
+ If the *output* does not exist then \[file dirname $output\] has to
+ exist and must be a writable directory\.
+
+ * path *inputfile* \(in\)
+
+ This argument specifies the path to the file to process\. It has to
+ exist, must be readable, and written in
+ *[docstrip](\.\./\.\./\.\./index\.md\#docstrip)* format\.
+
+ - __tcldocstrip__ ?options? *output* \(?options? *input* *guards*\)\.\.\.
+
+ This is the form for use case \[2\]\. It differs from the form for use case \[1\]
+ by the possibility of having options before the output file, which apply in
+ general, and specifying more than one inputfile, each with its own set of
+ input specific options and guards\.
+
+ It extracts data from the various *input* files, according to the
+ specified *options* and *guards*, and writes the result to the given
+ *output*, in the order of their specification on the command line\. Options
+ specified before the output are global settings, whereas the options
+ specified before each input are valid only just for this input file\.
+ Unspecified values are taken from the global settings, or defaults\. As for
+ form \[1\] using the string __\-__ as output causes the application to
+ write to stdout\. Using the string __\.__ for an input file signals that
+ the last input file should be used again\. This enables the assembly of the
+ output from one input file using multiple and different sets of guards,
+ without having to specify the full name of the file every time\.
+
+ - __tcldocstrip__ __\-guards__ *input*
+
+ This is the form for use case \[3\]\. It determines the guards, and unique
+ guard expressions used within the provided *input* document\. The found
+ strings are written to stdout, one string per line\.
+
+## OPTIONS
+
+This section describes all the options available to the user of the application,
+with the exception of the option __\-guards__\. This option was described
+already, in section [COMMAND LINE](#subsection2)\.
+
+ - __\-metaprefix__ string
+
+ This option is inherited from the command __docstrip::extract__ provided
+ by the package __[docstrip](\.\./modules/docstrip/docstrip\.md)__\.
+
+ It specifies the string by which the '%%' prefix of a metacomment line will
+ be replaced\. Defaults to '%%'\. For Tcl code this would typically be '\#'\.
+
+ - __\-onerror__ mode
+
+ This option is inherited from the command __docstrip::extract__ provided
+ by the package __[docstrip](\.\./modules/docstrip/docstrip\.md)__\.
+
+ It controls what will be done when a format error in the *text* being
+ processed is detected\. The settings are:
+
+ * __ignore__
+
+ Just ignore the error; continue as if nothing happened\.
+
+ * __puts__
+
+ Write an error message to __stderr__, then continue processing\.
+
+ * __throw__
+
+ Throw an error\. __::errorCode__ is set to a list whose first element
+ is __DOCSTRIP__, second element is the type of error, and third
+ element is the line number where the error is detected\. This is the
+ default\.
+
+ - __\-trimlines__ bool
+
+ This option is inherited from the command __docstrip::extract__ provided
+ by the package __[docstrip](\.\./modules/docstrip/docstrip\.md)__\.
+
+ Controls whether *spaces* at the end of a line should be trimmed away
+ before the line is processed\. Defaults to __true__\.
+
+ - __\-preamble__ text
+
+ - __\-postamble__ text
+
+ - __\-nopreamble__
+
+ - __\-nopostamble__
+
+ The \-no\*amble options deactivate file pre\- and postambles altogether,
+ whereas the \-\*amble options specify the *user* part of the file pre\- and
+ postambles\. This part can be empty, in that case only the standard parts are
+ shown\. This is the default\.
+
+ Preambles, when active, are written before the actual content of a generated
+ file\. In the same manner postambles are, when active, written after the
+ actual content of a generated file\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *docstrip* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docstrip](\.\./modules/docstrip/docstrip\.md)
+
+# KEYWORDS
+
+[\.dtx](\.\./\.\./\.\./index\.md\#\_dtx), [LaTeX](\.\./\.\./\.\./index\.md\#latex),
+[conversion](\.\./\.\./\.\./index\.md\#conversion),
+[docstrip](\.\./\.\./\.\./index\.md\#docstrip),
+[documentation](\.\./\.\./\.\./index\.md\#documentation), [literate
+programming](\.\./\.\./\.\./index\.md\#literate\_programming),
+[markup](\.\./\.\./\.\./index\.md\#markup), [source](\.\./\.\./\.\./index\.md\#source)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2005 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/aes/aes.md
Index: embedded/md/tcllib/files/modules/aes/aes.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/aes/aes.md
@@ -0,0 +1,201 @@
+
+[//000000001]: # (aes \- Advanced Encryption Standard \(AES\))
+[//000000002]: # (Generated from file 'aes\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2005, Pat Thoyts
+Copyright © 2012\-2014, Andreas Kupries )
+[//000000004]: # (aes\(n\) 1\.2\.1 tcllib "Advanced Encryption Standard \(AES\)")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+aes \- Implementation of the AES block cipher
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [PROGRAMMING INTERFACE](#section3)
+
+ - [MODES OF OPERATION](#section4)
+
+ - [EXAMPLES](#section5)
+
+ - [REFERENCES](#section6)
+
+ - [AUTHORS](#section7)
+
+ - [Bugs, Ideas, Feedback](#section8)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+package require aes ?1\.2\.1?
+
+[__::aes::aes__ ?*\-mode \[ecb|cbc\]*? ?*\-dir \[encrypt|decrypt\]*? *\-key keydata* ?*\-iv vector*? ?*\-hex*? ?*\-out channel*? ?*\-chunksize size*? \[ *\-in channel* | ?__\-\-__? *data* \]](#1)
+[__::aes::Init__ *mode* *keydata* *iv*](#2)
+[__::aes::Encrypt__ *Key* *data*](#3)
+[__::aes::Decrypt__ *Key* *data*](#4)
+[__::aes::Reset__ *Key* *iv*](#5)
+[__::aes::Final__ *Key*](#6)
+
+# DESCRIPTION
+
+This is an implementation in Tcl of the Advanced Encryption Standard \(AES\) as
+published by the U\.S\. National Institute of Standards and Technology \[1\]\. AES is
+a 128\-bit block cipher with a variable key size of 128, 192 or 256 bits\. This
+implementation supports ECB and CBC modes\.
+
+# COMMANDS
+
+ - __::aes::aes__ ?*\-mode \[ecb|cbc\]*? ?*\-dir \[encrypt|decrypt\]*? *\-key keydata* ?*\-iv vector*? ?*\-hex*? ?*\-out channel*? ?*\-chunksize size*? \[ *\-in channel* | ?__\-\-__? *data* \]
+
+ Perform the __aes__ algorithm on either the data provided by the
+ argument or on the data read from the *\-in* channel\. If an *\-out*
+ channel is given then the result will be written to this channel\.
+
+ The *\-key* option must be given\. This parameter takes a binary string of
+ either 16, 24 or 32 bytes in length and is used to generate the key
+ schedule\.
+
+ The *\-mode* and *\-dir* options are optional and default to cbc mode and
+ encrypt respectively\. The initialization vector *\-iv* takes a 16 byte
+ binary argument which defaults to all zeros\. See [MODES OF
+ OPERATION](#section4) for more about available modes and their uses\.
+
+ AES is a 128\-bit block cipher\. This means that the data must be provided in
+ units that are a multiple of 16 bytes\.
+
+# PROGRAMMING INTERFACE
+
+Internal state is maintained in an opaque structure that is returned from the
+__Init__ function\. In ECB mode the state is not affected by the input but
+for CBC mode some input dependent state is maintained and may be reset by
+calling the __Reset__ function with a new initialization vector value\.
+
+ - __::aes::Init__ *mode* *keydata* *iv*
+
+ Construct a new AES key schedule using the specified key data and the given
+ initialization vector\. The initialization vector is not used with ECB mode
+ but is important for CBC mode\. See [MODES OF OPERATION](#section4) for
+ details about cipher modes\.
+
+ - __::aes::Encrypt__ *Key* *data*
+
+ Use a prepared key acquired by calling __Init__ to encrypt the provided
+ data\. The data argument should be a binary array that is a multiple of the
+ AES block size of 16 bytes\. The result is a binary array the same size as
+ the input of encrypted data\.
+
+ - __::aes::Decrypt__ *Key* *data*
+
+ Decipher data using the key\. Note that the same key may be used to encrypt
+ and decrypt data provided that the initialization vector is reset
+ appropriately for CBC mode\.
+
+ - __::aes::Reset__ *Key* *iv*
+
+ Reset the initialization vector\. This permits the programmer to re\-use a key
+ and avoid the cost of re\-generating the key schedule where the same key data
+ is being used multiple times\.
+
+ - __::aes::Final__ *Key*
+
+ This should be called to clean up resources associated with *Key*\. Once
+ this function has been called the key may not be used again\.
+
+# MODES OF OPERATION
+
+ - Electronic Code Book \(ECB\)
+
+ ECB is the basic mode of all block ciphers\. Each block is encrypted
+ independently and so identical plain text will produce identical output when
+ encrypted with the same key\. Any encryption errors will only affect a single
+ block however this is vulnerable to known plaintext attacks\.
+
+ - Cipher Block Chaining \(CBC\)
+
+ CBC mode uses the output of the last block encryption to affect the current
+ block\. An initialization vector of the same size as the cipher block size is
+ used to handle the first block\. The initialization vector should be chosen
+ randomly and transmitted as the first block of the output\. Errors in
+ encryption affect the current block and the next block after which the
+ cipher will correct itself\. CBC is the most commonly used mode in software
+ encryption\. This is the default mode of operation for this module\.
+
+# EXAMPLES
+
+ % set nil\_block \[string repeat \\\\0 16\]
+ % aes::aes \-hex \-mode cbc \-dir encrypt \-key $nil\_block $nil\_block
+ 66e94bd4ef8a2c3b884cfa59ca342b2e
+
+ set Key \[aes::Init cbc $sixteen\_bytes\_key\_data $sixteen\_byte\_iv\]
+ append ciphertext \[aes::Encrypt $Key $plaintext\]
+ append ciphertext \[aes::Encrypt $Key $additional\_plaintext\]
+ aes::Final $Key
+
+# REFERENCES
+
+ 1. "Advanced Encryption Standard", Federal Information Processing Standards
+ Publication 197, 2001
+ \([http://csrc\.nist\.gov/publications/fips/fips197/fips\-197\.pdf](http://csrc\.nist\.gov/publications/fips/fips197/fips\-197\.pdf)\)
+
+# AUTHORS
+
+Thorsten Schloermann, Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *aes* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[blowfish\(n\)](\.\./blowfish/blowfish\.md), [des\(n\)](\.\./des/des\.md),
+[md5\(n\)](\.\./md5/md5\.md), [sha1\(n\)](\.\./sha1/sha1\.md)
+
+# KEYWORDS
+
+[aes](\.\./\.\./\.\./\.\./index\.md\#aes), [block
+cipher](\.\./\.\./\.\./\.\./index\.md\#block\_cipher), [data
+integrity](\.\./\.\./\.\./\.\./index\.md\#data\_integrity),
+[encryption](\.\./\.\./\.\./\.\./index\.md\#encryption),
+[security](\.\./\.\./\.\./\.\./index\.md\#security)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2005, Pat Thoyts
+Copyright © 2012\-2014, Andreas Kupries
ADDED embedded/md/tcllib/files/modules/amazon-s3/S3.md
Index: embedded/md/tcllib/files/modules/amazon-s3/S3.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/amazon-s3/S3.md
@@ -0,0 +1,1514 @@
+
+[//000000001]: # (S3 \- Amazon S3 Web Service Utilities)
+[//000000002]: # (Generated from file 'S3\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (2006,2008 Darren New\. All Rights Reserved\. See LICENSE\.TXT for terms\.)
+[//000000004]: # (S3\(n\) 1\.0\.3 tcllib "Amazon S3 Web Service Utilities")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+S3 \- Amazon S3 Web Service Interface
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [ERROR REPORTING](#section2)
+
+ - [COMMANDS](#section3)
+
+ - [LOW LEVEL COMMANDS](#section4)
+
+ - [HIGH LEVEL COMMANDS](#section5)
+
+ - [LIMITATIONS](#section6)
+
+ - [USAGE SUGGESTIONS](#section7)
+
+ - [FUTURE DEVELOPMENTS](#section8)
+
+ - [TLS Security Considerations](#section9)
+
+ - [Bugs, Ideas, Feedback](#section10)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+package require S3 ?1\.0\.3?
+package require sha1 1\.0
+package require md5 2\.0
+package require base64 2\.3
+package require xsxp 1\.0
+
+[__S3::Configure__ ?__\-reset__ *boolean*? ?__\-retries__ *integer*? ?__\-accesskeyid__ *idstring*? ?__\-secretaccesskey__ *idstring*? ?__\-service\-access\-point__ *FQDN*? ?__\-use\-tls__ *boolean*? ?__\-default\-compare__ *always|never|exists|missing|newer|date|checksum|different*? ?__\-default\-separator__ *string*? ?__\-default\-acl__ *private|public\-read|public\-read\-write|authenticated\-read|keep|calc*? ?__\-default\-bucket__ *bucketname*?](#1)
+[__S3::SuggestBucket__ ?*name*?](#2)
+[__S3::REST__ *dict*](#3)
+[__S3::ListAllMyBuckets__ ?__\-blocking__ *boolean*? ?__\-parse\-xml__ *xmlstring*? ?__\-result\-type__ *REST|xml|pxml|dict|names|owner*?](#4)
+[__S3::PutBucket__ ?__\-bucket__ *bucketname*? ?__\-blocking__ *boolean*? ?__\-acl__ *\{\}|private|public\-read|public\-read\-write|authenticated\-read*?](#5)
+[__S3::DeleteBucket__ ?__\-bucket__ *bucketname*? ?__\-blocking__ *boolean*?](#6)
+[__S3::GetBucket__ ?__\-bucket__ *bucketname*? ?__\-blocking__ *boolean*? ?__\-parse\-xml__ *xmlstring*? ?__\-max\-count__ *integer*? ?__\-prefix__ *prefixstring*? ?__\-delimiter__ *delimiterstring*? ?__\-result\-type__ *REST|xml|pxml|names|dict*?](#7)
+[__S3::Put__ ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-blocking__ *boolean*? ?__\-file__ *filename*? ?__\-content__ *contentstring*? ?__\-acl__ *private|public\-read|public\-read\-write|authenticated\-read|calc|keep*? ?__\-content\-type__ *contenttypestring*? ?__\-x\-amz\-meta\-\*__ *metadatatext*? ?__\-compare__ *comparemode*?](#8)
+[__S3::Get__ ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-blocking__ *boolean*? ?__\-compare__ *comparemode*? ?__\-file__ *filename*? ?__\-content__ *contentvarname*? ?__\-timestamp__ *aws|now*? ?__\-headers__ *headervarname*?](#9)
+[__S3::Head__ ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-blocking__ *boolean*? ?__\-dict__ *dictvarname*? ?__\-headers__ *headersvarname*? ?__\-status__ *statusvarname*?](#10)
+[__S3::GetAcl__ ?__\-blocking__ *boolean*? ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-result\-type__ *REST|xml|pxml*?](#11)
+[__S3::PutAcl__ ?__\-blocking__ *boolean*? ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-acl__ *new\-acl*?](#12)
+[__S3::Delete__ ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-blocking__ *boolean*? ?__\-status__ *statusvar*?](#13)
+[__S3::Push__ ?__\-bucket__ *bucketname*? __\-directory__ *directoryname* ?__\-prefix__ *prefixstring*? ?__\-compare__ *comparemode*? ?__\-x\-amz\-meta\-\*__ *metastring*? ?__\-acl__ *aclcode*? ?__\-delete__ *boolean*? ?__\-error__ *throw|break|continue*? ?__\-progress__ *scriptprefix*?](#14)
+[__S3::Pull__ ?__\-bucket__ *bucketname*? __\-directory__ *directoryname* ?__\-prefix__ *prefixstring*? ?__\-blocking__ *boolean*? ?__\-compare__ *comparemode*? ?__\-delete__ *boolean*? ?__\-timestamp__ *aws|now*? ?__\-error__ *throw|break|continue*? ?__\-progress__ *scriptprefix*?](#15)
+[__S3::Toss__ ?__\-bucket__ *bucketname*? __\-prefix__ *prefixstring* ?__\-blocking__ *boolean*? ?__\-error__ *throw|break|continue*? ?__\-progress__ *scriptprefix*?](#16)
+
+# DESCRIPTION
+
+This package provides access to Amazon's Simple Storage Solution web service\.
+
+As a quick summary, Amazon Simple Storage Solution provides a for\-fee web
+service allowing the storage of arbitrary data as "resources" within "buckets"
+online\. See [http://www\.amazonaws\.com/](http://www\.amazonaws\.com/) for
+details on that system\. Access to the service is via HTTP \(SOAP or REST\)\. Much
+of this documentation will not make sense if you're not familiar with the terms
+and functionality of the Amazon S3 service\.
+
+This package provides services for reading and writing the data items via the
+REST interface\. It also provides some higher\-level operations\. Other packages in
+the same distribution provide for even more functionality\.
+
+Copyright 2006 Darren New\. All Rights Reserved\. NO WARRANTIES OF ANY TYPE ARE
+PROVIDED\. COPYING OR USE INDEMNIFIES THE AUTHOR IN ALL WAYS\. This software is
+licensed under essentially the same terms as Tcl\. See LICENSE\.txt for the terms\.
+
+# ERROR REPORTING
+
+The error reporting from this package makes use of $errorCode to provide more
+details on what happened than simply throwing an error\. Any error caught by the
+S3 package \(and we try to catch them all\) will return with an $errorCode being a
+list having at least three elements\. In all cases, the first element will be
+"S3"\. The second element will take on one of six values, with that element
+defining the value of the third and subsequent elements\. S3::REST does not throw
+an error, but rather returns a dictionary with the keys "error", "errorInfo",
+and "errorCode" set\. This allows for reliable background use\. The possible
+second elements are these:
+
+ - usage
+
+ The usage of the package is incorrect\. For example, a command has been
+ invoked which requires the library to be configured before the library has
+ been configured, or an invalid combination of options has been specified\.
+ The third element of $errorCode supplies the name of the parameter that was
+ wrong\. The fourth usually provides the arguments that were actually supplied
+ to the throwing proc, unless the usage error isn't confined to a single
+ proc\.
+
+ - local
+
+ Something happened on the local system which threw an error\. For example, a
+ request to upload or download a file was made and the file permissions
+ denied that sort of access\. The third element of $errorCode is the original
+ $errorCode\.
+
+ - socket
+
+ Something happened with the socket\. It closed prematurely, or some other
+ condition of failure\-to\-communicate\-with\-Amazon was detected\. The third
+ element of $errorCode is the original $errorCode, or sometimes the message
+ from fcopy, or \.\.\.?
+
+ - remote
+
+ The Amazon web service returned an error code outside the 2xx range in the
+ HTTP header\. In other words, everything went as documented, except this
+ particular case was documented not to work\. The third element is the
+ dictionary returned from __::S3::REST__\. Note that S3::REST itself never
+ throws this error, but just returns the dictionary\. Most of the higher\-level
+ commands throw for convenience, unless an argument indicates they should
+ not\. If something is documented as "not throwing an S3 remote error", it
+ means a status return is set rather than throwing an error if Amazon returns
+ a non\-2XX HTTP result code\.
+
+ - notyet
+
+ The user obeyed the documentation, but the author has not yet gotten around
+ to implementing this feature\. \(Right now, only TLS support and sophisticated
+ permissions fall into this category, as well as the S3::Acl command\.\)
+
+ - xml
+
+ The service has returned invalid XML, or XML whose schema is unexpected\. For
+ the high\-level commands that accept service XML as input for parsing, this
+ may also be thrown\.
+
+# COMMANDS
+
+This package provides several separate levels of complexity\.
+
+ - The lowest level simply takes arguments to be sent to the service, sends
+ them, retrieves the result, and provides it to the caller\. *Note:* This
+ layer allows both synchronous and event\-driven processing\. It depends on the
+ MD5 and SHA1 and base64 packages from Tcllib \(available at
+ [http://core\.tcl\.tk/tcllib/](http://core\.tcl\.tk/tcllib/)\)\. Note that
+ __S3::Configure__ is required for __S3::REST__ to work due to the
+ authentication portion, so we put that in the "lowest level\."
+
+ - The next layer parses the results of calls, allowing for functionality such
+ as uploading only changed files, synchronizing directories, and so on\. This
+ layer depends on the __TclXML__ package as well as the included
+ __[xsxp](xsxp\.md)__ package\. These packages are package required
+ when these more\-sophisticated routines are called, so nothing breaks if they
+ are not correctly installed\.
+
+ - Also included is a separate program that uses the library\. It provides code
+ to parse $argv0 and $argv from the command line, allowing invocation as a
+ tclkit, etc\. \(Not yet implmented\.\)
+
+ - Another separate program provides a GUI interface allowing drag\-and\-drop and
+ other such functionality\. \(Not yet implemented\.\)
+
+ - Also built on this package is the OddJob program\. It is a separate program
+ designed to allow distribution of computational work units over Amazon's
+ Elastic Compute Cloud web service\.
+
+The goal is to have at least the bottom\-most layers implemented in pure Tcl
+using only that which comes from widely\-available sources, such as Tcllib\.
+
+# LOW LEVEL COMMANDS
+
+These commands do not require any packages not listed above\. They talk directly
+to the service, or they are utility or configuration routines\. Note that the
+"xsxp" package was written to support this package, so it should be available
+wherever you got this package\.
+
+ - __S3::Configure__ ?__\-reset__ *boolean*? ?__\-retries__ *integer*? ?__\-accesskeyid__ *idstring*? ?__\-secretaccesskey__ *idstring*? ?__\-service\-access\-point__ *FQDN*? ?__\-use\-tls__ *boolean*? ?__\-default\-compare__ *always|never|exists|missing|newer|date|checksum|different*? ?__\-default\-separator__ *string*? ?__\-default\-acl__ *private|public\-read|public\-read\-write|authenticated\-read|keep|calc*? ?__\-default\-bucket__ *bucketname*?
+
+ There is one command for configuration, and that is __S3::Configure__\.
+ If called with no arguments, it returns a dictionary of key/value pairs
+ listing all current settings\. If called with one argument, it returns the
+ value of that single argument\. If called with two or more arguments, it must
+ be called with pairs of arguments, and it applies the changes in order\.
+ There is only one set of configuration information per interpreter\.
+
+ The following options are accepted:
+
+ * __\-reset__ *boolean*
+
+ By default, false\. If true, any previous changes and any changes on the
+ same call before the reset option will be returned to default values\.
+
+ * __\-retries__ *integer*
+
+ Default value is 3\. If Amazon returns a 500 error, a retry after an
+ exponential backoff delay will be tried this many times before finally
+ throwing the 500 error\. This applies to each call to __S3::REST__
+ from the higher\-level commands, but not to __S3::REST__ itself\. That
+ is, __S3::REST__ will always return httpstatus 500 if that's what it
+ receives\. Functions like __S3::Put__ will retry the PUT call, and
+ will also retry the GET and HEAD calls used to do content comparison\.
+ Changing this to 0 will prevent retries and their associated delays\. In
+ addition, socket errors \(i\.e\., errors whose errorCode starts with "S3
+ socket"\) will be similarly retried after backoffs\.
+
+ * __\-accesskeyid__ *idstring*
+
+ * __\-secretaccesskey__ *idstring*
+
+ Each defaults to an empty string\. These must be set before any calls are
+ made\. This is your S3 ID\. Once you sign up for an account, go to
+ [http://www\.amazonaws\.com/](http://www\.amazonaws\.com/), sign in, go
+ to the "Your Web Services Account" button, pick "AWS Access
+ Identifiers", and your access key ID and secret access keys will be
+ available\. All __S3::REST__ calls are authenticated\. Blame Amazon
+ for the poor choice of names\.
+
+ * __\-service\-access\-point__ *FQDN*
+
+ Defaults to "s3\.amazonaws\.com"\. This is the fully\-qualified domain name
+ of the server to contact for __S3::REST__ calls\. You should probably
+ never need to touch this, unless someone else implements a compatible
+ service, or you wish to test something by pointing the library at your
+ own service\.
+
+ * __\-slop\-seconds__ *integer*
+
+ When comparing dates between Amazon and the local machine, two dates
+ within this many seconds of each other are considered the same\. Useful
+ for clock drift correction, processing overhead time, and so on\.
+
+ * __\-use\-tls__ *boolean*
+
+ Defaults to false\. This is not yet implemented\. If true,
+ __S3::REST__ will negotiate a TLS connection to Amazon\. If false,
+ unencrypted connections are used\.
+
+ * __\-bucket\-prefix__ *string*
+
+ Defaults to "TclS3"\. This string is used by
+ __S3::SuggestBucketName__ if that command is passed an empty string
+ as an argument\. It is used to distinguish different applications using
+ the Amazon service\. Your application should always set this to keep from
+ interfering with the buckets of other users of Amazon S3 or with other
+ buckets of the same user\.
+
+ * __\-default\-compare__ *always|never|exists|missing|newer|date|checksum|different*
+
+ Defaults to "always\." If no \-compare is specified on __S3::Put__,
+ __S3::Get__, or __S3::Delete__, this comparison is used\. See
+ those commands for a description of the meaning\.
+
+ * __\-default\-separator__ *string*
+
+ Defaults to "/"\. This is currently unused\. It might make sense to use
+ this for __S3::Push__ and __S3::Pull__, but allowing resources
+ to have slashes in their names that aren't marking directories would be
+ problematic\. Hence, this currently does nothing\.
+
+ * __\-default\-acl__ *private|public\-read|public\-read\-write|authenticated\-read|keep|calc*
+
+ Defaults to an empty string\. If no \-acl argument is provided to
+ __S3::Put__ or __S3::Push__, this string is used \(given as the
+ x\-amz\-acl header if not keep or calc\)\. If this is also empty, no
+ x\-amz\-acl header is generated\. This is *not* used by __S3::REST__\.
+
+ * __\-default\-bucket__ *bucketname*
+
+ If no bucket is given to __S3::GetBucket__, __S3::PutBucket__,
+ __S3::Get__, __S3::Put__, __S3::Head__, __S3::Acl__,
+ __S3::Delete__, __S3::Push__, __S3::Pull__, or
+ __S3::Toss__, and if this configuration variable is not an empty
+ string \(and not simply "/"\), then this value will be used for the
+ bucket\. This is useful if one program does a large amount of resource
+ manipulation within a single bucket\.
+
+ - __S3::SuggestBucket__ ?*name*?
+
+ The __S3::SuggestBucket__ command accepts an optional string as a prefix
+ and returns a valid bucket containing the *name* argument and the Access
+ Key ID\. This makes the name unique to the owner and to the application
+ \(assuming the application picks a good *name* argument\)\. If no name is
+ provided, the name from __S3::Configure__ *\-bucket\-prefix* is used\. If
+ that too is empty \(which is not the default\), an error is thrown\.
+
+ - __S3::REST__ *dict*
+
+ The __S3::REST__ command takes as an argument a dictionary and returns a
+ dictionary\. The return dictionary has the same keys as the input dictionary,
+ and includes additional keys as the result\. The presence or absence of keys
+ in the input dictionary can control the behavior of the routine\. It never
+ throws an error directly, but includes keys "error", "errorInfo", and
+ "errorCode" if necessary\. Some keys are required, some optional\. The routine
+ can run either in blocking or non\-blocking mode, based on the presense of
+ __resultvar__ in the input dictionary\. This requires the
+ *\-accesskeyid* and *\-secretaccesskey* to be configured via
+ __S3::Configure__ before being called\.
+
+ The possible input keys are these:
+
+ * __verb__ *GET|PUT|DELETE|HEAD*
+
+ This required item indicates the verb to be used\.
+
+ * __resource__ *string*
+
+ This required item indicates the resource to be accessed\. A leading / is
+ added if not there already\. It will be URL\-encoded for you if necessary\.
+ Do not supply a resource name that is already URL\-encoded\.
+
+ * ?__rtype__ *torrent|acl*?
+
+ This indicates a torrent or acl resource is being manipulated\. Do not
+ include this in the __resource__ key, or the "?" separator will get
+ URL\-encoded\.
+
+ * ?__parameters__ *dict*?
+
+ This optional dictionary provides parameters added to the URL for the
+ transaction\. The keys must be in the correct case \(which is confusing in
+ the Amazon documentation\) and the values must be valid\. This can be an
+ empty dictionary or omitted entirely if no parameters are desired\. No
+ other error checking on parameters is performed\.
+
+ * ?__headers__ *dict*?
+
+ This optional dictionary provides headers to be added to the HTTP
+ request\. The keys must be in *lower case* for the authentication to
+ work\. The values must not contain embedded newlines or carriage returns\.
+ This is primarily useful for adding x\-amz\-\* headers\. Since
+ authentication is calculated by __S3::REST__, do not add that header
+ here\. Since content\-type gets its own key, also do not add that header
+ here\.
+
+ * ?__inbody__ *contentstring*?
+
+ This optional item, if provided, gives the content that will be sent\. It
+ is sent with a tranfer encoding of binary, and only the low bytes are
+ used, so use \[encoding convertto utf\-8\] if the string is a utf\-8 string\.
+ This is written all in one blast, so if you are using non\-blocking mode
+ and the __inbody__ is especially large, you may wind up blocking on
+ the write socket\.
+
+ * ?__infile__ *filename*?
+
+ This optional item, if provided, and if __inbody__ is not provided,
+ names the file from which the body of the HTTP message will be
+ constructed\. The file is opened for reading and sent progressively by
+ \[fcopy\], so it should not block in non\-blocking mode even if the file is
+ very large\. The file is transfered in binary mode, so the bytes on your
+ disk will match the bytes in your resource\. Due to HTTP restrictions, it
+ must be possible to use \[file size\] on this file to determine the size
+ at the start of the transaction\.
+
+ * ?__S3chan__ *channel*?
+
+ This optional item, if provided, indicates the already\-open socket over
+ which the transaction should be conducted\. If not provided, a connection
+ is made to the service access point specified via __S3::Configure__,
+ which is normally s3\.amazonaws\.com\. If this is provided, the channel is
+ not closed at the end of the transaction\.
+
+ * ?__outchan__ *channel*?
+
+ This optional item, if provided, indicates the already\-open channel to
+ which the body returned from S3 should be written\. That is, to retrieve
+ a large resource, open a file, set the translation mode, and pass the
+ channel as the value of the key outchan\. Output will be written to the
+ channel in pieces so memory does not fill up unnecessarily\. The channel
+ is not closed at the end of the transaction\.
+
+ * ?__resultvar__ *varname*?
+
+ This optional item, if provided, indicates that __S3::REST__ should
+ run in non\-blocking mode\. The *varname* should be fully qualified with
+ respect to namespaces and cannot be local to a proc\. If provided, the
+ result of the __S3::REST__ call is assigned to this variable once
+ everything has completed; use trace or vwait to know when this has
+ happened\. If this key is not provided, the result is simply returned
+ from the call to __S3::REST__ and no calls to the eventloop are
+ invoked from within this call\.
+
+ * ?__throwsocket__ *throw|return*?
+
+ This optional item, if provided, indicates that __S3::REST__ should
+ throw an error if throwmode is throw and a socket error is encountered\.
+ It indicates that __S3::REST__ should return the error code in the
+ returned dictionary if a socket error is encountered and this is set to
+ return\. If __throwsocket__ is set to *return* or if the call is
+ not blocking, then a socket error \(i\.e\., an error whose error code
+ starts with "S3 socket" will be returned in the dictionary as
+ __error__, __errorInfo__, and __errorCode__\. If a foreground
+ call is made \(i\.e\., __resultvar__ is not provided\), and this option
+ is not provided or is set to *throw*, then
+ __[error](\.\./\.\./\.\./\.\./index\.md\#error)__ will be invoked instead\.
+
+ Once the call to __S3::REST__ completes, a new dict is returned, either
+ in the *resultvar* or as the result of execution\. This dict is a copy of
+ the original dict with the results added as new keys\. The possible new keys
+ are these:
+
+ * __error__ *errorstring*
+
+ * __errorInfo__ *errorstring*
+
+ * __errorCode__ *errorstring*
+
+ If an error is caught, these three keys will be set in the result\. Note
+ that __S3::REST__ does *not* consider a non\-2XX HTTP return code
+ as an error\. The __errorCode__ value will be formatted according to
+ the [ERROR REPORTING](#section2) description\. If these are present,
+ other keys described here might not be\.
+
+ * __httpstatus__ *threedigits*
+
+ The three\-digit code from the HTTP transaction\. 2XX for good, 5XX for
+ server error, etc\.
+
+ * __httpmessage__ *text*
+
+ The textual result after the status code\. "OK" or "Forbidden" or etc\.
+
+ * __outbody__ *contentstring*
+
+ If *outchan* was not specified, this key will hold a reference to the
+ \(unencoded\) contents of the body returned\. If Amazon returned an error
+ \(a la the httpstatus not a 2XX value\), the error message will be in
+ __outbody__ or written to __outchan__ as appropriate\.
+
+ * __outheaders__ *dict*
+
+ This contains a dictionary of headers returned by Amazon\. The keys are
+ always lower case\. It's mainly useful for finding the x\-amz\-meta\-\*
+ headers, if any, although things like last\-modified and content\-type are
+ also useful\. The keys of this dictionary are always lower case\. Both
+ keys and values are trimmed of extraneous whitespace\.
+
+# HIGH LEVEL COMMANDS
+
+The routines in this section all make use of one or more calls to
+__S3::REST__ to do their work, then parse and manage the data in a
+convenient way\. All these commands throw errors as described in [ERROR
+REPORTING](#section2) unless otherwise noted\.
+
+In all these commands, all arguments are presented as name/value pairs, in any
+order\. All the argument names start with a hyphen\.
+
+There are a few options that are common to many of the commands, and those
+common options are documented here\.
+
+ - __\-blocking__ *boolean*
+
+ If provided and specified as false, then any calls to __S3:REST__ will
+ be non\-blocking, and internally these routines will call \[vwait\] to get the
+ results\. In other words, these routines will return the same value, but
+ they'll have event loops running while waiting for Amazon\.
+
+ - __\-parse\-xml__ *xmlstring*
+
+ If provided, the routine skips actually communicating with Amazon, and
+ instead behaves as if the XML string provided was returned as the body of
+ the call\. Since several of these routines allow the return of data in
+ various formats, this argument can be used to parse existing XML to extract
+ the bits of information that are needed\. It's also helpful for testing\.
+
+ - __\-bucket__ *bucketname*
+
+ Almost every high\-level command needs to know what bucket the resources are
+ in\. This option specifies that\. \(Only the command to list available buckets
+ does not require this parameter\.\) This does not need to be URL\-encoded, even
+ if it contains special or non\-ASCII characters\. May or may not contain
+ leading or trailing spaces \- commands normalize the bucket\. If this is not
+ supplied, the value is taken from __S3::Configure \-default\-bucket__ if
+ that string isn't empty\. Note that spaces and slashes are always trimmed
+ from both ends and the rest must leave a valid bucket\.
+
+ - __\-resource__ *resourcename*
+
+ This specifies the resource of interest within the bucket\. It may or may not
+ start with a slash \- both cases are handled\. This does not need to be
+ URL\-encoded, even if it contains special or non\-ASCII characters\.
+
+ - __\-compare__ *always|never|exists|missing|newer|date|checksum|different*
+
+ When commands copy resources to files or files to resources, the caller may
+ specify that the copy should be skipped if the contents are the same\. This
+ argument specifies the conditions under which the files should be copied\. If
+ it is not passed, the result of __S3::Configure \-default\-compare__ is
+ used, which in turn defaults to "always\." The meanings of the various values
+ are these:
+
+ * *always*
+
+ Always copy the data\. This is the default\.
+
+ * *never*
+
+ Never copy the data\. This is essentially a no\-op, except in
+ __S3::Push__ and __S3::Pull__ where the \-delete flag might make
+ a difference\.
+
+ * *exists*
+
+ Copy the data only if the destination already exists\.
+
+ * *missing*
+
+ Copy the data only if the destination does not already exist\.
+
+ * *newer*
+
+ Copy the data if the destination is missing, or if the date on the
+ source is newer than the date on the destination by at least
+ __S3::Configure \-slop\-seconds__ seconds\. If the source is Amazon,
+ the date is taken from the Last\-Modified header\. If the source is local,
+ it is taken as the mtime of the file\. If the source data is specified in
+ a string rather than a file, it is taken as right now, via \[clock
+ seconds\]\.
+
+ * *date*
+
+ Like *newer*, except copy if the date is newer *or* older\.
+
+ * *checksum*
+
+ Calculate the MD5 checksum on the local file or string, ask Amazon for
+ the eTag of the resource, and copy the data if they're different\. Copy
+ the data also if the destination is missing\. Note that this can be slow
+ with large local files unless the C version of the MD5 support is
+ available\.
+
+ * *different*
+
+ Copy the data if the destination does not exist\. If the destination
+ exists and an actual file name was specified \(rather than a content
+ string\), and the date on the file differs from the date on the resource,
+ copy the data\. If the data is provided as a content string, the "date"
+ is treated as "right now", so it will likely always differ unless
+ slop\-seconds is large\. If the dates are the same, the MD5 checksums are
+ compared, and the data is copied if the checksums differ\.
+
+ Note that "newer" and "date" don't care about the contents, and "checksum"
+ doesn't care about the dates, but "different" checks both\.
+
+ - __S3::ListAllMyBuckets__ ?__\-blocking__ *boolean*? ?__\-parse\-xml__ *xmlstring*? ?__\-result\-type__ *REST|xml|pxml|dict|names|owner*?
+
+ This routine performs a GET on the Amazon S3 service, which is defined to
+ return a list of buckets owned by the account identified by the
+ authorization header\. \(Blame Amazon for the dumb names\.\)
+
+ * __\-blocking__ *boolean*
+
+ See above for standard definition\.
+
+ * __\-parse\-xml__ *xmlstring*
+
+ See above for standard definition\.
+
+ * __\-result\-type__ *REST*
+
+ The dictionary returned by __S3::REST__ is the return value of
+ __S3::ListAllMyBuckets__\. In this case, a non\-2XX httpstatus will
+ not throw an error\. You may not combine this with *\-parse\-xml*\.
+
+ * __\-result\-type__ *xml*
+
+ The raw XML of the body is returned as the result \(with no encoding
+ applied\)\.
+
+ * __\-result\-type__ *pxml*
+
+ The XML of the body as parsed by __xsxp::parse__ is returned\.
+
+ * __\-result\-type__ *dict*
+
+ A dictionary of interesting portions of the XML is returned\. The
+ dictionary contains the following keys:
+
+ + Owner/ID
+
+ The Amazon AWS ID \(in hex\) of the owner of the bucket\.
+
+ + Owner/DisplayName
+
+ The Amazon AWS ID's Display Name\.
+
+ + Bucket/Name
+
+ A list of names, one for each bucket\.
+
+ + Bucket/CreationDate
+
+ A list of dates, one for each bucket, in the same order as
+ Bucket/Name, in ISO format \(as returned by Amazon\)\.
+
+ * __\-result\-type__ *names*
+
+ A list of bucket names is returned with all other information stripped
+ out\. This is the default result type for this command\.
+
+ * __\-result\-type__ *owner*
+
+ A list containing two elements is returned\. The first element is the
+ owner's ID, and the second is the owner's display name\.
+
+ - __S3::PutBucket__ ?__\-bucket__ *bucketname*? ?__\-blocking__ *boolean*? ?__\-acl__ *\{\}|private|public\-read|public\-read\-write|authenticated\-read*?
+
+ This command creates a bucket if it does not already exist\. Bucket names are
+ globally unique, so you may get a "Forbidden" error from Amazon even if you
+ cannot see the bucket in __S3::ListAllMyBuckets__\. See
+ __S3::SuggestBucket__ for ways to minimize this risk\. The x\-amz\-acl
+ header comes from the __\-acl__ option, or from __S3::Configure
+ \-default\-acl__ if not specified\.
+
+ - __S3::DeleteBucket__ ?__\-bucket__ *bucketname*? ?__\-blocking__ *boolean*?
+
+ This command deletes a bucket if it is empty and you have such permission\.
+ Note that Amazon's list of buckets is a global resource, requiring far\-flung
+ synchronization\. If you delete a bucket, it may be quite a few minutes \(or
+ hours\) before you can recreate it, yielding "Conflict" errors until then\.
+
+ - __S3::GetBucket__ ?__\-bucket__ *bucketname*? ?__\-blocking__ *boolean*? ?__\-parse\-xml__ *xmlstring*? ?__\-max\-count__ *integer*? ?__\-prefix__ *prefixstring*? ?__\-delimiter__ *delimiterstring*? ?__\-result\-type__ *REST|xml|pxml|names|dict*?
+
+ This lists the contents of a bucket\. That is, it returns a directory listing
+ of resources within a bucket, rather than transfering any user data\.
+
+ * __\-bucket__ *bucketname*
+
+ The standard bucket argument\.
+
+ * __\-blocking__ *boolean*
+
+ The standard blocking argument\.
+
+ * __\-parse\-xml__ *xmlstring*
+
+ The standard parse\-xml argument\.
+
+ * __\-max\-count__ *integer*
+
+ If supplied, this is the most number of records to be returned\. If not
+ supplied, the code will iterate until all records have been found\. Not
+ compatible with \-parse\-xml\. Note that if this is supplied, only one call
+ to __S3::REST__ will be made\. Otherwise, enough calls will be made
+ to exhaust the listing, buffering results in memory, so take care if you
+ may have huge buckets\.
+
+ * __\-prefix__ *prefixstring*
+
+ If present, restricts listing to resources with a particular prefix\. One
+ leading / is stripped if present\.
+
+ * __\-delimiter__ *delimiterstring*
+
+ If present, specifies a delimiter for the listing\. The presence of this
+ will summarize multiple resources into one entry, as if S3 supported
+ directories\. See the Amazon documentation for details\.
+
+ * __\-result\-type__ *REST|xml|pxml|names|dict*
+
+ This indicates the format of the return result of the command\.
+
+ + REST
+
+ If *\-max\-count* is specified, the dictionary returned from
+ __S3::REST__ is returned\. If *\-max\-count* is not specified, a
+ list of all the dictionaries returned from the one or more calls to
+ __S3::REST__ is returned\.
+
+ + xml
+
+ If *\-max\-count* is specified, the body returned from
+ __S3::REST__ is returned\. If *\-max\-count* is not specified, a
+ list of all the bodies returned from the one or more calls to
+ __S3::REST__ is returned\.
+
+ + pxml
+
+ If *\-max\-count* is specified, the body returned from
+ __S3::REST__ is passed throught __xsxp::parse__ and then
+ returned\. If *\-max\-count* is not specified, a list of all the
+ bodies returned from the one or more calls to __S3::REST__ are
+ each passed through __xsxp::parse__ and then returned\.
+
+ + names
+
+ Returns a list of all names found in either the Contents/Key fields
+ or the CommonPrefixes/Prefix fields\. If no *\-delimiter* is
+ specified and no *\-max\-count* is specified, this returns a list of
+ all resources with the specified *\-prefix*\.
+
+ + dict
+
+ Returns a dictionary\. \(Returns only one dictionary even if
+ *\-max\-count* wasn't specified\.\) The keys of the dictionary are as
+ follows:
+
+ - Name
+
+ The name of the bucket \(from the final call to
+ __S3::REST__\)\.
+
+ - Prefix
+
+ From the final call to __S3::REST__\.
+
+ - Marker
+
+ From the final call to __S3::REST__\.
+
+ - MaxKeys
+
+ From the final call to __S3::REST__\.
+
+ - IsTruncated
+
+ From the final call to __S3::REST__, so always false if
+ *\-max\-count* is not specified\.
+
+ - NextMarker
+
+ Always provided if IsTruncated is true, and calculated of Amazon
+ does not provide it\. May be empty if IsTruncated is false\.
+
+ - Key
+
+ A list of names of resources in the bucket matching the
+ *\-prefix* and *\-delimiter* restrictions\.
+
+ - LastModified
+
+ A list of times of resources in the bucket, in the same order as
+ Key, in the format returned by Amazon\. \(I\.e\., it is not parsed
+ into a seconds\-from\-epoch\.\)
+
+ - ETag
+
+ A list of entity tags \(a\.k\.a\. MD5 checksums\) in the same order
+ as Key\.
+
+ - Size
+
+ A list of sizes in bytes of the resources, in the same order as
+ Key\.
+
+ - Owner/ID
+
+ A list of owners of the resources in the bucket, in the same
+ order as Key\.
+
+ - Owner/DisplayName
+
+ A list of owners of the resources in the bucket, in the same
+ order as Key\. These are the display names\.
+
+ - CommonPrefixes/Prefix
+
+ A list of prefixes common to multiple entities\. This is present
+ only if *\-delimiter* was supplied\.
+
+ - __S3::Put__ ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-blocking__ *boolean*? ?__\-file__ *filename*? ?__\-content__ *contentstring*? ?__\-acl__ *private|public\-read|public\-read\-write|authenticated\-read|calc|keep*? ?__\-content\-type__ *contenttypestring*? ?__\-x\-amz\-meta\-\*__ *metadatatext*? ?__\-compare__ *comparemode*?
+
+ This command sends data to a resource on Amazon's servers for storage, using
+ the HTTP PUT command\. It returns 0 if the __\-compare__ mode prevented
+ the transfer, 1 if the transfer worked, or throws an error if the transfer
+ was attempted but failed\. Server 5XX errors and S3 socket errors are retried
+ according to __S3:Configure \-retries__ settings before throwing an
+ error; other errors throw immediately\.
+
+ * __\-bucket__
+
+ This specifies the bucket into which the resource will be written\.
+ Leading and/or trailing slashes are removed for you, as are spaces\.
+
+ * __\-resource__
+
+ This is the full name of the resource within the bucket\. A single
+ leading slash is removed, but not a trailing slash\. Spaces are not
+ trimmed\.
+
+ * __\-blocking__
+
+ The standard blocking flag\.
+
+ * __\-file__
+
+ If this is specified, the *filename* must exist, must be readable, and
+ must not be a special or directory file\. \[file size\] must apply to it
+ and must not change for the lifetime of the call\. The default
+ content\-type is calculated based on the name and/or contents of the
+ file\. Specifying this is an error if __\-content__ is also specified,
+ but at least one of __\-file__ or __\-content__ must be specified\.
+ \(The file is allowed to not exist or not be readable if __\-compare__
+ *never* is specified\.\)
+
+ * __\-content__
+
+ If this is specified, the *contentstring* is sent as the body of the
+ resource\. The content\-type defaults to "application/octet\-string"\. Only
+ the low bytes are sent, so non\-ASCII should use the appropriate encoding
+ \(such as \[encoding convertto utf\-8\]\) before passing it to this routine,
+ if necessary\. Specifying this is an error if __\-file__ is also
+ specified, but at least one of __\-file__ or __\-content__ must be
+ specified\.
+
+ * __\-acl__
+
+ This defaults to __S3::Configure \-default\-acl__ if not specified\. It
+ sets the x\-amz\-acl header on the PUT operation\. If the value provided is
+ *calc*, the x\-amz\-acl header is calculated based on the I/O
+ permissions of the file to be uploaded; it is an error to specify
+ *calc* and __\-content__\. If the value provided is *keep*, the
+ acl of the resource is read before the PUT \(or the default is used if
+ the resource does not exist\), then set back to what it was after the PUT
+ \(if it existed\)\. An error will occur if the resource is successfully
+ written but the kept ACL cannot be then applied\. This should never
+ happen\. *Note:* *calc* is not currently fully implemented\.
+
+ * __\-x\-amz\-meta\-\*__
+
+ If any header starts with "\-x\-amz\-meta\-", its contents are added to the
+ PUT command to be stored as metadata with the resource\. Again, no
+ encoding is performed, and the metadata should not contain characters
+ like newlines, carriage returns, and so on\. It is best to stick with
+ simple ASCII strings, or to fix the library in several places\.
+
+ * __\-content\-type__
+
+ This overrides the content\-type calculated by __\-file__ or sets the
+ content\-type for __\-content__\.
+
+ * __\-compare__
+
+ This is the standard compare mode argument\. __S3::Put__ returns 1 if
+ the data was copied or 0 if the data was skipped due to the comparison
+ mode so indicating it should be skipped\.
+
+ - __S3::Get__ ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-blocking__ *boolean*? ?__\-compare__ *comparemode*? ?__\-file__ *filename*? ?__\-content__ *contentvarname*? ?__\-timestamp__ *aws|now*? ?__\-headers__ *headervarname*?
+
+ This command retrieves data from a resource on Amazon's S3 servers, using
+ the HTTP GET command\. It returns 0 if the __\-compare__ mode prevented
+ the transfer, 1 if the transfer worked, or throws an error if the transfer
+ was attempted but failed\. Server 5XX errors and S3 socket errors are are
+ retried according to __S3:Configure__ settings before throwing an error;
+ other errors throw immediately\. Note that this is always authenticated as
+ the user configured in via __S3::Configure \-accesskeyid__\. Use the
+ Tcllib http for unauthenticated GETs\.
+
+ * __\-bucket__
+
+ This specifies the bucket from which the resource will be read\. Leading
+ and/or trailing slashes are removed for you, as are spaces\.
+
+ * __\-resource__
+
+ This is the full name of the resource within the bucket\. A single
+ leading slash is removed, but not a trailing slash\. Spaces are not
+ trimmed\.
+
+ * __\-blocking__
+
+ The standard blocking flag\.
+
+ * __\-file__
+
+ If this is specified, the body of the resource will be read into this
+ file, incrementally without pulling it entirely into memory first\. The
+ parent directory must already exist\. If the file already exists, it must
+ be writable\. If an error is thrown part\-way through the process and the
+ file already existed, it may be clobbered\. If an error is thrown
+ part\-way through the process and the file did not already exist, any
+ partial bits will be deleted\. Specifying this is an error if
+ __\-content__ is also specified, but at least one of __\-file__ or
+ __\-content__ must be specified\.
+
+ * __\-timestamp__
+
+ This is only valid in conjunction with __\-file__\. It may be
+ specified as *now* or *aws*\. The default is *now*\. If *now*, the
+ file's modification date is left up to the system\. If *aws*, the
+ file's mtime is set to match the Last\-Modified header on the resource,
+ synchronizing the two appropriately for __\-compare__ *date* or
+ __\-compare__ *newer*\.
+
+ * __\-content__
+
+ If this is specified, the *contentvarname* is a variable in the
+ caller's scope \(not necessarily global\) that receives the value of the
+ body of the resource\. No encoding is done, so if the resource \(for
+ example\) represents a UTF\-8 byte sequence, use \[encoding convertfrom
+ utf\-8\] to get a valid UTF\-8 string\. If this is specified, the
+ __\-compare__ is ignored unless it is *never*, in which case no
+ assignment to *contentvarname* is performed\. Specifying this is an
+ error if __\-file__ is also specified, but at least one of
+ __\-file__ or __\-content__ must be specified\.
+
+ * __\-compare__
+
+ This is the standard compare mode argument\. __S3::Get__ returns 1 if
+ the data was copied or 0 if the data was skipped due to the comparison
+ mode so indicating it should be skipped\.
+
+ * __\-headers__
+
+ If this is specified, the headers resulting from the fetch are stored in
+ the provided variable, as a dictionary\. This will include content\-type
+ and x\-amz\-meta\-\* headers, as well as the usual HTTP headers, the
+ x\-amz\-id debugging headers, and so on\. If no file is fetched \(due to
+ __\-compare__ or other errors\), no assignment to this variable is
+ performed\.
+
+ - __S3::Head__ ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-blocking__ *boolean*? ?__\-dict__ *dictvarname*? ?__\-headers__ *headersvarname*? ?__\-status__ *statusvarname*?
+
+ This command requests HEAD from the resource\. It returns whether a 2XX code
+ was returned as a result of the request, never throwing an S3 remote error\.
+ That is, if this returns 1, the resource exists and is accessible\. If this
+ returns 0, something went wrong, and the __\-status__ result can be
+ consulted for details\.
+
+ * __\-bucket__
+
+ This specifies the bucket from which the resource will be read\. Leading
+ and/or trailing slashes are removed for you, as are spaces\.
+
+ * __\-resource__
+
+ This is the full name of the resource within the bucket\. A single
+ leading slash is removed, but not a trailing slash\. Spaces are not
+ trimmed\.
+
+ * __\-blocking__
+
+ The standard blocking flag\.
+
+ * __\-dict__
+
+ If specified, the resulting dictionary from the __S3::REST__ call is
+ assigned to the indicated \(not necessarily global\) variable in the
+ caller's scope\.
+
+ * __\-headers__
+
+ If specified, the dictionary of headers from the result are assigned to
+ the indicated \(not necessarily global\) variable in the caller's scope\.
+
+ * __\-status__
+
+ If specified, the indicated \(not necessarily global\) variable in the
+ caller's scope is assigned a 2\-element list\. The first element is the
+ 3\-digit HTTP status code, while the second element is the HTTP message
+ \(such as "OK" or "Forbidden"\)\.
+
+ - __S3::GetAcl__ ?__\-blocking__ *boolean*? ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-result\-type__ *REST|xml|pxml*?
+
+ This command gets the ACL of the indicated resource or throws an error if it
+ is unavailable\.
+
+ * __\-blocking__ *boolean*
+
+ See above for standard definition\.
+
+ * __\-bucket__
+
+ This specifies the bucket from which the resource will be read\. Leading
+ and/or trailing slashes are removed for you, as are spaces\.
+
+ * __\-resource__
+
+ This is the full name of the resource within the bucket\. A single
+ leading slash is removed, but not a trailing slash\. Spaces are not
+ trimmed\.
+
+ * __\-parse\-xml__ *xml*
+
+ The XML from a previous GetACL can be passed in to be parsed into
+ dictionary form\. In this case, \-result\-type must be pxml or dict\.
+
+ * __\-result\-type__ *REST*
+
+ The dictionary returned by __S3::REST__ is the return value of
+ __S3::GetAcl__\. In this case, a non\-2XX httpstatus will not throw an
+ error\.
+
+ * __\-result\-type__ *xml*
+
+ The raw XML of the body is returned as the result \(with no encoding
+ applied\)\.
+
+ * __\-result\-type__ *pxml*
+
+ The XML of the body as parsed by __xsxp::parse__ is returned\.
+
+ * __\-result\-type__ *dict*
+
+ This fetches the ACL, parses it, and returns a dictionary of two
+ elements\.
+
+ The first element has the key "owner" whose value is the canonical ID of
+ the owner of the resource\.
+
+ The second element has the key "acl" whose value is a dictionary\. Each
+ key in the dictionary is one of Amazon's permissions, namely "READ",
+ "WRITE", "READ\_ACP", "WRITE\_ACP", or "FULL\_CONTROL"\. Each value of each
+ key is a list of canonical IDs or group URLs that have that permission\.
+ Elements are not in the list in any particular order, and not all keys
+ are necessarily present\. Display names are not returned, as they are not
+ especially useful; use pxml to obtain them if necessary\.
+
+ - __S3::PutAcl__ ?__\-blocking__ *boolean*? ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-acl__ *new\-acl*?
+
+ This sets the ACL on the indicated resource\. It returns the XML written to
+ the ACL, or throws an error if anything went wrong\.
+
+ * __\-blocking__ *boolean*
+
+ See above for standard definition\.
+
+ * __\-bucket__
+
+ This specifies the bucket from which the resource will be read\. Leading
+ and/or trailing slashes are removed for you, as are spaces\.
+
+ * __\-resource__
+
+ This is the full name of the resource within the bucket\. A single
+ leading slash is removed, but not a trailing slash\. Spaces are not
+ trimmed\.
+
+ * __\-owner__
+
+ If this is provided, it is assumed to match the owner of the resource\.
+ Otherwise, a GET may need to be issued against the resource to find the
+ owner\. If you already have the owner \(such as from a call to
+ __S3::GetAcl__, you can pass the value of the "owner" key as the
+ value of this option, and it will be used in the construction of the
+ XML\.
+
+ * __\-acl__
+
+ If this option is specified, it provides the ACL the caller wishes to
+ write to the resource\. If this is not supplied or is empty, the value is
+ taken from __S3::Configure \-default\-acl__\. The ACL is written with a
+ PUT to the ?acl resource\.
+
+ If the value passed to this option starts with "<", it is taken to be a
+ body to be PUT to the ACL resource\.
+
+ If the value matches one of the standard Amazon x\-amz\-acl headers \(i\.e\.,
+ a canned access policy\), that header is translated to XML and then
+ applied\. The canned access policies are private, public\-read,
+ public\-read\-write, and authenticated\-read \(in lower case\)\.
+
+ Otherwise, the value is assumed to be a dictionary formatted as the
+ "acl" sub\-entry within the dict returns by __S3::GetAcl \-result\-type
+ dict__\. The proper XML is generated and applied to the resource\. Note
+ that a value containing "//" is assumed to be a group, a value
+ containing "@" is assumed to be an AmazonCustomerByEmail, and otherwise
+ the value is assumed to be a canonical Amazon ID\.
+
+ Note that you cannot change the owner, so calling GetAcl on a resource
+ owned by one user and applying it via PutAcl on a resource owned by
+ another user may not do exactly what you expect\.
+
+ - __S3::Delete__ ?__\-bucket__ *bucketname*? __\-resource__ *resourcename* ?__\-blocking__ *boolean*? ?__\-status__ *statusvar*?
+
+ This command deletes the specified resource from the specified bucket\. It
+ returns 1 if the resource was deleted successfully, 0 otherwise\. It returns
+ 0 rather than throwing an S3 remote error\.
+
+ * __\-bucket__
+
+ This specifies the bucket from which the resource will be deleted\.
+ Leading and/or trailing slashes are removed for you, as are spaces\.
+
+ * __\-resource__
+
+ This is the full name of the resource within the bucket\. A single
+ leading slash is removed, but not a trailing slash\. Spaces are not
+ trimmed\.
+
+ * __\-blocking__
+
+ The standard blocking flag\.
+
+ * __\-status__
+
+ If specified, the indicated \(not necessarily global\) variable in the
+ caller's scope is set to a two\-element list\. The first element is the
+ 3\-digit HTTP status code\. The second element is the HTTP message \(such
+ as "OK" or "Forbidden"\)\. Note that Amazon's DELETE result is 204 on
+ success, that being the code indicating no content in the returned body\.
+
+ - __S3::Push__ ?__\-bucket__ *bucketname*? __\-directory__ *directoryname* ?__\-prefix__ *prefixstring*? ?__\-compare__ *comparemode*? ?__\-x\-amz\-meta\-\*__ *metastring*? ?__\-acl__ *aclcode*? ?__\-delete__ *boolean*? ?__\-error__ *throw|break|continue*? ?__\-progress__ *scriptprefix*?
+
+ This synchronises a local directory with a remote bucket by pushing the
+ differences using __S3::Put__\. Note that if something has changed in the
+ bucket but not locally, those changes could be lost\. Thus, this is not a
+ general two\-way synchronization primitive\. \(See __S3::Sync__ for that\.\)
+ Note too that resource names are case sensitive, so changing the case of a
+ file on a Windows machine may lead to otherwise\-unnecessary transfers\. Note
+ that only regular files are considered, so devices, pipes, symlinks, and
+ directories are not copied\.
+
+ * __\-bucket__
+
+ This names the bucket into which data will be pushed\.
+
+ * __\-directory__
+
+ This names the local directory from which files will be taken\. It must
+ exist, be readable via \[glob\] and so on\. If only some of the files
+ therein are readable, __S3::Push__ will PUT those files that are
+ readable and return in its results the list of files that could not be
+ opened\.
+
+ * __\-prefix__
+
+ This names the prefix that will be added to all resources\. That is, it
+ is the remote equivalent of __\-directory__\. If it is not specified,
+ the root of the bucket will be treated as the remote directory\. An
+ example may clarify\.
+
+ S3::Push \-bucket test \-directory /tmp/xyz \-prefix hello/world
+
+ In this example, /tmp/xyz/pdq\.html will be stored as
+ http://s3\.amazonaws\.com/test/hello/world/pdq\.html in Amazon's servers\.
+ Also, /tmp/xyz/abc/def/Hello will be stored as
+ http://s3\.amazonaws\.com/test/hello/world/abc/def/Hello in Amazon's
+ servers\. Without the __\-prefix__ option, /tmp/xyz/pdq\.html would be
+ stored as http://s3\.amazonaws\.com/test/pdq\.html\.
+
+ * __\-blocking__
+
+ This is the standard blocking option\.
+
+ * __\-compare__
+
+ If present, this is passed to each invocation of __S3::Put__\.
+ Naturally, __S3::Configure \-default\-compare__ is used if this is not
+ specified\.
+
+ * __\-x\-amz\-meta\-\*__
+
+ If present, this is passed to each invocation of __S3::Put__\. All
+ copied files will have the same metadata\.
+
+ * __\-acl__
+
+ If present, this is passed to each invocation of __S3::Put__\.
+
+ * __\-delete__
+
+ This defaults to false\. If true, resources in the destination that are
+ not in the source directory are deleted with __S3::Delete__\. Since
+ only regular files are considered, the existance of a symlink, pipe,
+ device, or directory in the local source will *not* prevent the
+ deletion of a remote resource with a corresponding name\.
+
+ * __\-error__
+
+ This controls the behavior of __S3::Push__ in the event that
+ __S3::Put__ throws an error\. Note that errors encountered on the
+ local file system or in reading the list of resources in the remote
+ bucket always throw errors\. This option allows control over "partial"
+ errors, when some files were copied and some were not\.
+ __S3::Delete__ is always finished up, with errors simply recorded in
+ the return result\.
+
+ + throw
+
+ The error is rethrown with the same errorCode\.
+
+ + break
+
+ Processing stops without throwing an error, the error is recorded in
+ the return value, and the command returns with a normal return\. The
+ calls to __S3::Delete__ are not started\.
+
+ + continue
+
+ This is the default\. Processing continues without throwing,
+ recording the error in the return result, and resuming with the next
+ file in the local directory to be copied\.
+
+ * __\-progress__
+
+ If this is specified and the indicated script prefix is not empty, the
+ indicated script prefix will be invoked several times in the caller's
+ context with additional arguments at various points in the processing\.
+ This allows progress reporting without backgrounding\. The provided
+ prefix will be invoked with additional arguments, with the first
+ additional argument indicating what part of the process is being
+ reported on\. The prefix is initially invoked with *args* as the first
+ additional argument and a dictionary representing the normalized
+ arguments to the __S3::Push__ call as the second additional
+ argument\. Then the prefix is invoked with *local* as the first
+ additional argument and a list of suffixes of the files to be considered
+ as the second argument\. Then the prefix is invoked with *remote* as
+ the first additional argument and a list of suffixes existing in the
+ remote bucket as the second additional argument\. Then, for each file in
+ the local list, the prefix will be invoked with *start* as the first
+ additional argument and the common suffix as the second additional
+ argument\. When __S3::Put__ returns for that file, the prefix will be
+ invoked with *copy* as the first additional argument, the common
+ suffix as the second additional argument, and a third argument that will
+ be "copied" \(if __S3::Put__ sent the resource\), "skipped" \(if
+ __S3::Put__ decided not to based on __\-compare__\), or the
+ errorCode that __S3::Put__ threw due to unexpected errors \(in which
+ case the third argument is a list that starts with "S3"\)\. When all files
+ have been transfered, the prefix may be invoked zero or more times with
+ *delete* as the first additional argument and the suffix of the
+ resource being deleted as the second additional argument, with a third
+ argument being either an empty string \(if the delete worked\) or the
+ errorCode from __S3::Delete__ if it failed\. Finally, the prefix will
+ be invoked with *finished* as the first additional argument and the
+ return value as the second additional argument\.
+
+ The return result from this command is a dictionary\. They keys are the
+ suffixes \(i\.e\., the common portion of the path after the __\-directory__
+ and __\-prefix__\), while the values are either "copied", "skipped" \(if
+ __\-compare__ indicated not to copy the file\), or the errorCode thrown by
+ __S3::Put__, as appropriate\. If __\-delete__ was true, there may also
+ be entries for suffixes with the value "deleted" or "notdeleted", indicating
+ whether the attempted __S3::Delete__ worked or not, respectively\. There
+ is one additional pair in the return result, whose key is the empty string
+ and whose value is a nested dictionary\. The keys of this nested dictionary
+ include "filescopied" \(the number of files successfully copied\),
+ "bytescopied" \(the number of data bytes in the files copied, excluding
+ headers, metadata, etc\), "compareskipped" \(the number of files not copied
+ due to __\-compare__ mode\), "errorskipped" \(the number of files not
+ copied due to thrown errors\), "filesdeleted" \(the number of resources
+ deleted due to not having corresponding files locally, or 0 if
+ __\-delete__ is false\), and "filesnotdeleted" \(the number of resources
+ whose deletion was attempted but failed\)\.
+
+ Note that this is currently implemented somewhat inefficiently\. It fetches
+ the bucket listing \(including timestamps and eTags\), then calls
+ __S3::Put__, which uses HEAD to find the timestamps and eTags again\.
+ Correcting this with no API change is planned for a future upgrade\.
+
+ - __S3::Pull__ ?__\-bucket__ *bucketname*? __\-directory__ *directoryname* ?__\-prefix__ *prefixstring*? ?__\-blocking__ *boolean*? ?__\-compare__ *comparemode*? ?__\-delete__ *boolean*? ?__\-timestamp__ *aws|now*? ?__\-error__ *throw|break|continue*? ?__\-progress__ *scriptprefix*?
+
+ This synchronises a remote bucket with a local directory by pulling the
+ differences using __S3::Get__ If something has been changed locally but
+ not in the bucket, those difference may be lost\. This is not a general
+ two\-way synchronization mechanism\. \(See __S3::Sync__ for that\.\) This
+ creates directories if needed; new directories are created with default
+ permissions\. Note that resource names are case sensitive, so changing the
+ case of a file on a Windows machine may lead to otherwise\-unnecessary
+ transfers\. Also, try not to store data in resources that end with a slash,
+ or which are prefixes of resources that otherwise would start with a slash;
+ i\.e\., don't use this if you store data in resources whose names have to be
+ directories locally\.
+
+ Note that this is currently implemented somewhat inefficiently\. It fetches
+ the bucket listing \(including timestamps and eTags\), then calls
+ __S3::Get__, which uses HEAD to find the timestamps and eTags again\.
+ Correcting this with no API change is planned for a future upgrade\.
+
+ * __\-bucket__
+
+ This names the bucket from which data will be pulled\.
+
+ * __\-directory__
+
+ This names the local directory into which files will be written It must
+ exist, be readable via \[glob\], writable for file creation, and so on\. If
+ only some of the files therein are writable, __S3::Pull__ will GET
+ those files that are writable and return in its results the list of
+ files that could not be opened\.
+
+ * __\-prefix__
+
+ The prefix of resources that will be considered for retrieval\. See
+ __S3::Push__ for more details, examples, etc\. \(Of course,
+ __S3::Pull__ reads rather than writes, but the prefix is treated
+ similarly\.\)
+
+ * __\-blocking__
+
+ This is the standard blocking option\.
+
+ * __\-compare__
+
+ This is passed to each invocation of __S3::Get__ if provided\.
+ Naturally, __S3::Configure \-default\-compare__ is used if this is not
+ provided\.
+
+ * __\-timestamp__
+
+ This is passed to each invocation of __S3::Get__ if provided\.
+
+ * __\-delete__
+
+ If this is specified and true, files that exist in the
+ __\-directory__ that are not in the __\-prefix__ will be deleted
+ after all resources have been copied\. In addition, empty directories
+ \(other than the top\-level __\-directory__\) will be deleted, as Amazon
+ S3 has no concept of an empty directory\.
+
+ * __\-error__
+
+ See __S3::Push__ for a description of this option\.
+
+ * __\-progress__
+
+ See __S3::Push__ for a description of this option\. It differs
+ slightly in that local directories may be included with a trailing slash
+ to indicate they are directories\.
+
+ The return value from this command is a dictionary\. It is identical in form
+ and meaning to the description of the return result of __S3::Push__\. It
+ differs only in that directories may be included, with a trailing slash in
+ their name, if they are empty and get deleted\.
+
+ - __S3::Toss__ ?__\-bucket__ *bucketname*? __\-prefix__ *prefixstring* ?__\-blocking__ *boolean*? ?__\-error__ *throw|break|continue*? ?__\-progress__ *scriptprefix*?
+
+ This deletes some or all resources within a bucket\. It would be considered a
+ "recursive delete" had Amazon implemented actual directories\.
+
+ * __\-bucket__
+
+ The bucket from which resources will be deleted\.
+
+ * ____\-blocking____
+
+ The standard blocking option\.
+
+ * ____\-prefix____
+
+ The prefix for resources to be deleted\. Any resource that starts with
+ this string will be deleted\. This is required\. To delete everything in
+ the bucket, pass an empty string for the prefix\.
+
+ * ____\-error____
+
+ If this is "throw", __S3::Toss__ rethrows any errors it encounters\.
+ If this is "break", __S3::Toss__ returns with a normal return after
+ the first error, recording that error in the return result\. If this is
+ "continue", which is the default, __S3::Toss__ continues on and
+ lists all errors in the return result\.
+
+ * ____\-progress____
+
+ If this is specified and not an empty string, the script prefix will be
+ invoked several times in the context of the caller with additional
+ arguments appended\. Initially, it will be invoked with the first
+ additional argument being *args* and the second being the processed
+ list of arguments to __S3::Toss__\. Then it is invoked with
+ *remote* as the first additional argument and the list of suffixes in
+ the bucket to be deleted as the second additional argument\. Then it is
+ invoked with the first additional argument being *delete* and the
+ second additional argument being the suffix deleted and the third
+ additional argument being "deleted" or "notdeleted" depending on whether
+ __S3::Delete__ threw an error\. Finally, the script prefix is invoked
+ with a first additional argument of "finished" and a second additional
+ argument of the return value\.
+
+ The return value is a dictionary\. The keys are the suffixes of files that
+ __S3::Toss__ attempted to delete, and whose values are either the string
+ "deleted" or "notdeleted"\. There is also one additional pair, whose key is
+ the empty string and whose value is an embedded dictionary\. The keys of this
+ embedded dictionary include "filesdeleted" and "filesnotdeleted", each of
+ which has integer values\.
+
+# LIMITATIONS
+
+ - The pure\-Tcl MD5 checking is slow\. If you are processing files in the
+ megabyte range, consider ensuring binary support is available\.
+
+ - The commands __S3::Pull__ and __S3::Push__ fetch a directory listing
+ which includes timestamps and MD5 hashes, then invoke __S3::Get__ and
+ __S3::Put__\. If a complex __\-compare__ mode is specified,
+ __S3::Get__ and __S3::Put__ will invoke a HEAD operation for each
+ file to fetch timestamps and MD5 hashes of each resource again\. It is
+ expected that a future release of this package will solve this without any
+ API changes\.
+
+ - The commands __S3::Pull__ and __S3::Push__ fetch a directory listing
+ without using __\-max\-count__\. The entire directory is pulled into memory
+ at once\. For very large buckets, this could be a performance problem\. The
+ author, at this time, does not plan to change this behavior\. Welcome to Open
+ Source\.
+
+ - __S3::Sync__ is neither designed nor implemented yet\. The intention
+ would be to keep changes synchronised, so changes could be made to both the
+ bucket and the local directory and be merged by __S3::Sync__\.
+
+ - Nor is __\-compare__ *calc* fully implemented\. This is primarily due to
+ Windows not providing a convenient method for distinguishing between local
+ files that are "public\-read" or "public\-read\-write"\. Assistance figuring out
+ TWAPI for this would be appreciated\. The U\*\*X semantics are difficult to map
+ directly as well\. See the source for details\. Note that there are not tests
+ for calc, since it isn't done yet\.
+
+ - The HTTP processing is implemented within the library, rather than using a
+ "real" HTTP package\. Hence, multi\-line headers are not \(yet\) handled
+ correctly\. Do not include carriage returns or linefeeds in x\-amz\-meta\-\*
+ headers, content\-type values, and so on\. The author does not at this time
+ expect to improve this\.
+
+ - Internally, __S3::Push__ and __S3::Pull__ and __S3::Toss__ are
+ all very similar and should be refactored\.
+
+ - The idea of using __\-compare__ *never* __\-delete__ *true* to
+ delete files that have been deleted from one place but not the other yet not
+ copying changed files is untested\.
+
+# USAGE SUGGESTIONS
+
+To fetch a "directory" out of a bucket, make changes, and store it back:
+
+ file mkdir \./tempfiles
+ S3::Pull \-bucket sample \-prefix of/interest \-directory \./tempfiles \\
+ \-timestamp aws
+ do\_my\_process \./tempfiles other arguments
+ S3::Push \-bucket sample \-prefix of/interest \-directory \./tempfiles \\
+ \-compare newer \-delete true
+
+To delete files locally that were deleted off of S3 but not otherwise update
+files:
+
+ S3::Pull \-bucket sample \-prefix of/interest \-directory \./myfiles \\
+ \-compare never \-delete true
+
+# FUTURE DEVELOPMENTS
+
+The author intends to work on several additional projects related to this
+package, in addition to finishing the unfinished features\.
+
+First, a command\-line program allowing browsing of buckets and transfer of files
+from shell scripts and command prompts is useful\.
+
+Second, a GUI\-based program allowing visual manipulation of bucket and resource
+trees not unlike Windows Explorer would be useful\.
+
+Third, a command\-line \(and perhaps a GUI\-based\) program called "OddJob" that
+will use S3 to synchronize computation amongst multiple servers running OddJob\.
+An S3 bucket will be set up with a number of scripts to run, and the OddJob
+program can be invoked on multiple machines to run scripts on all the machines,
+each moving on to the next unstarted task as it finishes each\. This is still
+being designed, and it is intended primarily to be run on Amazon's Elastic
+Compute Cloud\.
+
+# TLS Security Considerations
+
+This package uses the __[TLS](\.\./\.\./\.\./\.\./index\.md\#tls)__ package to
+handle the security for __https__ urls and other socket connections\.
+
+Policy decisions like the set of protocols to support and what ciphers to use
+are not the responsibility of __[TLS](\.\./\.\./\.\./\.\./index\.md\#tls)__, nor
+of this package itself however\. Such decisions are the responsibility of
+whichever application is using the package, and are likely influenced by the set
+of servers the application will talk to as well\.
+
+For example, in light of the recent [POODLE
+attack](http://googleonlinesecurity\.blogspot\.co\.uk/2014/10/this\-poodle\-bites\-exploiting\-ssl\-30\.html)
+discovered by Google many servers will disable support for the SSLv3 protocol\.
+To handle this change the applications using
+__[TLS](\.\./\.\./\.\./\.\./index\.md\#tls)__ must be patched, and not this
+package, nor __[TLS](\.\./\.\./\.\./\.\./index\.md\#tls)__ itself\. Such a patch
+may be as simple as generally activating __tls1__ support, as shown in the
+example below\.
+
+ package require tls
+ tls::init \-tls1 1 ;\# forcibly activate support for the TLS1 protocol
+
+ \.\.\. your own application code \.\.\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *amazon\-s3* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[amazon](\.\./\.\./\.\./\.\./index\.md\#amazon),
+[cloud](\.\./\.\./\.\./\.\./index\.md\#cloud), [s3](\.\./\.\./\.\./\.\./index\.md\#s3)
+
+# CATEGORY
+
+Networking
+
+# COPYRIGHT
+
+2006,2008 Darren New\. All Rights Reserved\. See LICENSE\.TXT for terms\.
ADDED embedded/md/tcllib/files/modules/amazon-s3/xsxp.md
Index: embedded/md/tcllib/files/modules/amazon-s3/xsxp.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/amazon-s3/xsxp.md
@@ -0,0 +1,194 @@
+
+[//000000001]: # (xsxp \- Amazon S3 Web Service Utilities)
+[//000000002]: # (Generated from file 'xsxp\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (2006 Darren New\. All Rights Reserved\.)
+[//000000004]: # (xsxp\(n\) 1\.0 tcllib "Amazon S3 Web Service Utilities")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+xsxp \- eXtremely Simple Xml Parser
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require xsxp 1
+package require xml
+
+[__xsxp::parse__ *xml*](#1)
+[__xsxp::fetch__ *pxml* *path* ?*part*?](#2)
+[__xsxp::fetchall__ *pxml\_list* *path* ?*part*?](#3)
+[__xsxp::only__ *pxml* *tagname*](#4)
+[__xsxp::prettyprint__ *pxml* ?*chan*?](#5)
+
+# DESCRIPTION
+
+This package provides a simple interface to parse XML into a pure\-value list\. It
+also provides accessor routines to pull out specific subtags, not unlike DOM
+access\. This package was written for and is used by Darren New's Amazon S3
+access package\.
+
+This is pretty lame, but I needed something like this for S3, and at the time,
+TclDOM would not work with the new 8\.5 Tcl due to version number problems\.
+
+In addition, this is a pure\-value implementation\. There is no garbage to clean
+up in the event of a thrown error, for example\. This simplifies the code for
+sufficiently small XML documents, which is what Amazon's S3 guarantees\.
+
+Copyright 2006 Darren New\. All Rights Reserved\. NO WARRANTIES OF ANY TYPE ARE
+PROVIDED\. COPYING OR USE INDEMNIFIES THE AUTHOR IN ALL WAYS\. This software is
+licensed under essentially the same terms as Tcl\. See LICENSE\.txt for the terms\.
+
+# COMMANDS
+
+The package implements five rather simple procedures\. One parses, one is for
+debugging, and the rest pull various parts of the parsed document out for
+processing\.
+
+ - __xsxp::parse__ *xml*
+
+ This parses an XML document \(using the standard xml tcllib module in a SAX
+ sort of way\) and builds a data structure which it returns if the parsing
+ succeeded\. The return value is referred to herein as a "pxml", or "parsed
+ xml"\. The list consists of two or more elements:
+
+ The first element is the name of the tag\.
+
+ The second element is an array\-get formatted list of key/value pairs\. The
+ keys are attribute names and the values are attribute values\. This is an
+ empty list if there are no attributes on the tag\.
+
+ The third through end elements are the children of the node, if any\. Each
+ child is, recursively, a pxml\.
+
+ Note that if the zero'th element, i\.e\. the tag name, is "%PCDATA", then the
+ attributes will be empty and the third element will be the text of the
+ element\. In addition, if an element's contents consists only of PCDATA, it
+ will have only one child, and all the PCDATA will be concatenated\. In other
+ words, this parser works poorly for XML with elements that contain both
+ child tags and PCDATA\. Since Amazon S3 does not do this \(and for that matter
+ most uses of XML where XML is a poor choice don't do this\), this is probably
+ not a serious limitation\.
+
+ - __xsxp::fetch__ *pxml* *path* ?*part*?
+
+ *pxml* is a parsed XML, as returned from xsxp::parse\. *path* is a list
+ of element tag names\. Each element is the name of a child to look up,
+ optionally followed by a hash \("\#"\) and a string of digits\. An empty list or
+ an initial empty element selects *pxml*\. If no hash sign is present, the
+ behavior is as if "\#0" had been appended to that element\. \(In addition to a
+ list, slashes can separate subparts where convenient\.\)
+
+ An element of *path* scans the children at the indicated level for the
+ n'th instance of a child whose tag matches the part of the element before
+ the hash sign\. If an element is simply "\#" followed by digits, that indexed
+ child is selected, regardless of the tags in the children\. Hence, an element
+ of "\#3" will always select the fourth child of the node under consideration\.
+
+ *part* defaults to "%ALL"\. It can be one of the following case\-sensitive
+ terms:
+
+ * %ALL
+
+ returns the entire selected element\.
+
+ * %TAGNAME
+
+ returns lindex 0 of the selected element\.
+
+ * %ATTRIBUTES
+
+ returns index 1 of the selected element\.
+
+ * %CHILDREN
+
+ returns lrange 2 through end of the selected element, resulting in a
+ list of elements being returned\.
+
+ * %PCDATA
+
+ returns a concatenation of all the bodies of direct children of this
+ node whose tag is %PCDATA\. It throws an error if no such children are
+ found\. That is, part=%PCDATA means return the textual content found in
+ that node but not its children nodes\.
+
+ * %PCDATA?
+
+ is like %PCDATA, but returns an empty string if no PCDATA is found\.
+
+ For example, to fetch the first bold text from the fifth paragraph of the
+ body of your HTML file,
+
+ xsxp::fetch $pxml \{body p\#4 b\} %PCDATA
+
+ - __xsxp::fetchall__ *pxml\_list* *path* ?*part*?
+
+ This iterates over each PXML in *pxml\_list* \(which must be a list of
+ pxmls\) selecting the indicated path from it, building a new list with the
+ selected data, and returning that new list\.
+
+ For example, *pxml\_list* might be the %CHILDREN of a particular element,
+ and the *path* and *part* might select from each child a sub\-element in
+ which we're interested\.
+
+ - __xsxp::only__ *pxml* *tagname*
+
+ This iterates over the direct children of *pxml* and selects only those
+ with *tagname* as their tag\. Returns a list of matching elements\.
+
+ - __xsxp::prettyprint__ *pxml* ?*chan*?
+
+ This outputs to *chan* \(default stdout\) a pretty\-printed version of
+ *pxml*\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *amazon\-s3* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[dom](\.\./\.\./\.\./\.\./index\.md\#dom), [parser](\.\./\.\./\.\./\.\./index\.md\#parser),
+[xml](\.\./\.\./\.\./\.\./index\.md\#xml)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+2006 Darren New\. All Rights Reserved\.
ADDED embedded/md/tcllib/files/modules/asn/asn.md
Index: embedded/md/tcllib/files/modules/asn/asn.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/asn/asn.md
@@ -0,0 +1,517 @@
+
+[//000000001]: # (asn \- ASN\.1 processing)
+[//000000002]: # (Generated from file 'asn\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2004 Andreas Kupries
+Copyright © 2004 Jochen Loewer
+Copyright © 2004\-2011 Michael Schlenker )
+[//000000004]: # (asn\(n\) 0\.8 tcllib "ASN\.1 processing")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+asn \- ASN\.1 BER encoder/decoder
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [ENCODER](#subsection1)
+
+ - [DECODER](#subsection2)
+
+ - [HANDLING TAGS](#subsection3)
+
+ - [EXAMPLES](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require asn ?0\.8\.4?
+
+[__::asn::asnSequence__ *evalue*\.\.\.](#1)
+[__::asn::asnSequenceFromList__ *elist*](#2)
+[__::asn::asnSet__ *evalue*\.\.\.](#3)
+[__::asn::asnSetFromList__ *elist*](#4)
+[__::asn::asnApplicationConstr__ *appNumber* *evalue*\.\.\.](#5)
+[__::asn::asnApplication__ *appNumber* *data*](#6)
+[__::asn::asnChoice__ *appNumber* *evalue*\.\.\.](#7)
+[__::asn::asnChoiceConstr__ *appNumber* *evalue*\.\.\.](#8)
+[__::asn::asnInteger__ *number*](#9)
+[__::asn::asnEnumeration__ *number*](#10)
+[__::asn::asnBoolean__ *bool*](#11)
+[__::asn::asnContext__ *context* *data*](#12)
+[__::asn::asnContextConstr__ *context* *evalue*\.\.\.](#13)
+[__::asn::asnObjectIdentifier__ *idlist*](#14)
+[__::asn::asnUTCTime__ *utcstring*](#15)
+[__::asn::asnNull__](#16)
+[__::asn::asnBitString__ *string*](#17)
+[__::asn::asnOctetString__ *string*](#18)
+[__::asn::asnNumericString__ *string*](#19)
+[__::asn::asnPrintableString__ *string*](#20)
+[__::asn::asnIA5String__ *string*](#21)
+[__::asn::asnBMPString__ *string*](#22)
+[__::asn::asnUTF8String__ *string*](#23)
+[__::asn::asnString__ *string*](#24)
+[__::asn::defaultStringType__ ?*type*?](#25)
+[__::asn::asnPeekByte__ *data\_var* *byte\_var*](#26)
+[__::asn::asnGetLength__ *data\_var* *length\_var*](#27)
+[__::asn::asnGetResponse__ *chan* *data\_var*](#28)
+[__::asn::asnGetInteger__ *data\_var* *int\_var*](#29)
+[__::asn::asnGetEnumeration__ *data\_var* *enum\_var*](#30)
+[__::asn::asnGetOctetString__ *data\_var* *string\_var*](#31)
+[__::asn::asnGetString__ *data\_var* *string\_var* ?*type\_var*?](#32)
+[__::asn::asnGetNumericString__ *data\_var* *string\_var*](#33)
+[__::asn::asnGetPrintableString__ *data\_var* *string\_var*](#34)
+[__::asn::asnGetIA5String__ *data\_var* *string\_var*](#35)
+[__::asn::asnGetBMPString__ *data\_var* *string\_var*](#36)
+[__::asn::asnGetUTF8String__ *data\_var* *string\_var*](#37)
+[__::asn::asnGetUTCTime__ *data\_var* *utc\_var*](#38)
+[__::asn::asnGetBitString__ *data\_var* *bits\_var*](#39)
+[__::asn::asnGetObjectIdentifier__ *data\_var* *oid\_var*](#40)
+[__::asn::asnGetBoolean__ *data\_var* *bool\_var*](#41)
+[__::asn::asnGetNull__ *data\_var*](#42)
+[__::asn::asnGetSequence__ *data\_var* *sequence\_var*](#43)
+[__::asn::asnGetSet__ *data\_var* *set\_var*](#44)
+[__::asn::asnGetApplication__ *data\_var* *appNumber\_var* ?*content\_var*? ?*encodingType\_var*?](#45)
+[__::asn::asnGetContext__ *data\_var* *contextNumber\_var* ?*content\_var*? ?*encodingType\_var*?](#46)
+[__::asn::asnPeekTag__ *data\_var* *tag\_var* *tagtype\_var* *constr\_var*](#47)
+[__::asn::asnTag__ *tagnumber* ?*class*? ?*tagstyle*?](#48)
+[__::asn::asnRetag__ *data\_var* *newTag*](#49)
+
+# DESCRIPTION
+
+The __asn__ package provides *partial* de\- and encoder commands for BER
+encoded ASN\.1 data\. It can also be used for decoding DER, which is a restricted
+subset of BER\.
+
+ASN\.1 is a standard *Abstract Syntax Notation*, and BER are its *Basic
+Encoding Rules*\.
+
+See
+[http://asn1\.elibel\.tm\.fr/en/standards/index\.htm](http://asn1\.elibel\.tm\.fr/en/standards/index\.htm)
+for more information about the standard\.
+
+Also see
+[http://luca\.ntop\.org/Teaching/Appunti/asn1\.html](http://luca\.ntop\.org/Teaching/Appunti/asn1\.html)
+for *A Layman's Guide to a Subset of ASN\.1, BER, and DER*, an RSA Laboratories
+Technical Note by Burton S\. Kaliski Jr\. \(Revised November 1, 1993\)\. A text
+version of this note is part of the module sources and should be read by any
+implementor\.
+
+# PUBLIC API
+
+## ENCODER
+
+ - __::asn::asnSequence__ *evalue*\.\.\.
+
+ Takes zero or more encoded values, packs them into an ASN sequence and
+ returns its encoded binary form\.
+
+ - __::asn::asnSequenceFromList__ *elist*
+
+ Takes a list of encoded values, packs them into an ASN sequence and returns
+ its encoded binary form\.
+
+ - __::asn::asnSet__ *evalue*\.\.\.
+
+ Takes zero or more encoded values, packs them into an ASN set and returns
+ its encoded binary form\.
+
+ - __::asn::asnSetFromList__ *elist*
+
+ Takes a list of encoded values, packs them into an ASN set and returns its
+ encoded binary form\.
+
+ - __::asn::asnApplicationConstr__ *appNumber* *evalue*\.\.\.
+
+ Takes zero or more encoded values, packs them into an ASN application
+ construct and returns its encoded binary form\.
+
+ - __::asn::asnApplication__ *appNumber* *data*
+
+ Takes a single encoded value *data*, packs it into an ASN application
+ construct and returns its encoded binary form\.
+
+ - __::asn::asnChoice__ *appNumber* *evalue*\.\.\.
+
+ Takes zero or more encoded values, packs them into an ASN choice construct
+ and returns its encoded binary form\.
+
+ - __::asn::asnChoiceConstr__ *appNumber* *evalue*\.\.\.
+
+ Takes zero or more encoded values, packs them into an ASN choice construct
+ and returns its encoded binary form\.
+
+ - __::asn::asnInteger__ *number*
+
+ Returns the encoded form of the specified integer *number*\.
+
+ - __::asn::asnEnumeration__ *number*
+
+ Returns the encoded form of the specified enumeration id *number*\.
+
+ - __::asn::asnBoolean__ *bool*
+
+ Returns the encoded form of the specified boolean value *bool*\.
+
+ - __::asn::asnContext__ *context* *data*
+
+ Takes an encoded value and packs it into a constructed value with
+ application tag, the *context* number\.
+
+ - __::asn::asnContextConstr__ *context* *evalue*\.\.\.
+
+ Takes zero or more encoded values and packs them into a constructed value
+ with application tag, the *context* number\.
+
+ - __::asn::asnObjectIdentifier__ *idlist*
+
+ Takes a list of at least 2 integers describing an object identifier \(OID\)
+ value, and returns the encoded value\.
+
+ - __::asn::asnUTCTime__ *utcstring*
+
+ Returns the encoded form of the specified UTC time string\.
+
+ - __::asn::asnNull__
+
+ Returns the NULL encoding\.
+
+ - __::asn::asnBitString__ *string*
+
+ Returns the encoded form of the specified *string*\.
+
+ - __::asn::asnOctetString__ *string*
+
+ Returns the encoded form of the specified *string*\.
+
+ - __::asn::asnNumericString__ *string*
+
+ Returns the *string* encoded as ASN\.1 NumericString\. Raises an error if
+ the *string* contains characters other than decimal numbers and space\.
+
+ - __::asn::asnPrintableString__ *string*
+
+ Returns the *string* encoding as ASN\.1 PrintableString\. Raises an error if
+ the *string* contains characters which are not allowed by the Printable
+ String datatype\. The allowed characters are A\-Z, a\-z, 0\-9, space,
+ apostrophe, colon, parentheses, plus, minus, comma, period, forward slash,
+ question mark, and the equals sign\.
+
+ - __::asn::asnIA5String__ *string*
+
+ Returns the *string* encoded as ASN\.1 IA5String\. Raises an error if the
+ *string* contains any characters outside of the US\-ASCII range\.
+
+ - __::asn::asnBMPString__ *string*
+
+ Returns the *string* encoded as ASN\.1 Basic Multilingual Plane string
+ \(Which is essentialy big\-endian UCS2\)\.
+
+ - __::asn::asnUTF8String__ *string*
+
+ Returns the *string* encoded as UTF8 String\. Note that some legacy
+ applications such as Windows CryptoAPI do not like UTF8 strings\. Use
+ BMPStrings if you are not sure\.
+
+ - __::asn::asnString__ *string*
+
+ Returns an encoded form of *string*, choosing the most restricted ASN\.1
+ string type possible\. If the string contains non\-ASCII characters, then
+ there is more than one string type which can be used\. See
+ __::asn::defaultStringType__\.
+
+ - __::asn::defaultStringType__ ?*type*?
+
+ Selects the string type to use for the encoding of non\-ASCII strings\.
+ Returns current default when called without argument\. If the argument
+ *type* is supplied, it should be either __UTF8__ or __BMP__ to
+ choose UTF8String or BMPString respectively\.
+
+## DECODER
+
+General notes:
+
+ 1. Nearly all decoder commands take two arguments\. These arguments are
+ variable names, except for __::asn::asnGetResponse__\. The first
+ variable contains the encoded ASN value to decode at the beginning, and
+ more, and the second variable is where the value is stored to\. The
+ remainder of the input after the decoded value is stored back into the
+ datavariable\.
+
+ 1. After extraction the data variable is always modified first, before by
+ writing the extracted value to its variable\. This means that if both
+ arguments refer to the same variable, it will always contain the extracted
+ value after the call, and not the remainder of the input\.
+
+ - __::asn::asnPeekByte__ *data\_var* *byte\_var*
+
+ Retrieve the first byte of the data, without modifing *data\_var*\. This can
+ be used to check for implicit tags\.
+
+ - __::asn::asnGetLength__ *data\_var* *length\_var*
+
+ Decode the length information for a block of BER data\. The tag has already
+ to be removed from the data\.
+
+ - __::asn::asnGetResponse__ *chan* *data\_var*
+
+ Reads an encoded ASN *sequence* from the channel *chan* and stores it
+ into the variable named by *data\_var*\.
+
+ - __::asn::asnGetInteger__ *data\_var* *int\_var*
+
+ Assumes that an encoded integer value is at the front of the data stored in
+ the variable named *data\_var*, extracts and stores it into the variable
+ named by *int\_var*\. Additionally removes all bytes associated with the
+ value from the data for further processing by the following decoder
+ commands\.
+
+ - __::asn::asnGetEnumeration__ *data\_var* *enum\_var*
+
+ Assumes that an enumeration id is at the front of the data stored in the
+ variable named *data\_var*, and stores it into the variable named by
+ *enum\_var*\. Additionally removes all bytes associated with the value from
+ the data for further processing by the following decoder commands\.
+
+ - __::asn::asnGetOctetString__ *data\_var* *string\_var*
+
+ Assumes that a string is at the front of the data stored in the variable
+ named *data\_var*, and stores it into the variable named by *string\_var*\.
+ Additionally removes all bytes associated with the value from the data for
+ further processing by the following decoder commands\.
+
+ - __::asn::asnGetString__ *data\_var* *string\_var* ?*type\_var*?
+
+ Decodes a user\-readable string\. This is a convenience function which is able
+ to automatically distinguish all supported ASN\.1 string types and convert
+ the input value appropriately\. See __::asn::asnGetPrintableString__,
+ __::asnGetIA5String__, etc\. below for the type\-specific conversion
+ commands\.
+
+ If the optional third argument *type\_var* is supplied, then the type of
+ the incoming string is stored in the variable named by it\.
+
+ The function throws the error "Invalid command name
+ asnGetSome__UnsupportedString__" if the unsupported string type
+ __Unsupported__ is encountered\. You can create the appropriate function
+ "asn::asnGetSome__UnsupportedString__" in your application if
+ neccessary\.
+
+ - __::asn::asnGetNumericString__ *data\_var* *string\_var*
+
+ Assumes that a numeric string value is at the front of the data stored in
+ the variable named *data\_var*, and stores it into the variable named by
+ *string\_var*\. Additionally removes all bytes associated with the value
+ from the data for further processing by the following decoder commands\.
+
+ - __::asn::asnGetPrintableString__ *data\_var* *string\_var*
+
+ Assumes that a printable string value is at the front of the data stored in
+ the variable named *data\_var*, and stores it into the variable named by
+ *string\_var*\. Additionally removes all bytes associated with the value
+ from the data for further processing by the following decoder commands\.
+
+ - __::asn::asnGetIA5String__ *data\_var* *string\_var*
+
+ Assumes that a IA5 \(ASCII\) string value is at the front of the data stored
+ in the variable named *data\_var*, and stores it into the variable named by
+ *string\_var*\. Additionally removes all bytes associated with the value
+ from the data for further processing by the following decoder commands\.
+
+ - __::asn::asnGetBMPString__ *data\_var* *string\_var*
+
+ Assumes that a BMP \(two\-byte unicode\) string value is at the front of the
+ data stored in the variable named *data\_var*, and stores it into the
+ variable named by *string\_var*, converting it into a proper Tcl string\.
+ Additionally removes all bytes associated with the value from the data for
+ further processing by the following decoder commands\.
+
+ - __::asn::asnGetUTF8String__ *data\_var* *string\_var*
+
+ Assumes that a UTF8 string value is at the front of the data stored in the
+ variable named *data\_var*, and stores it into the variable named by
+ *string\_var*, converting it into a proper Tcl string\. Additionally removes
+ all bytes associated with the value from the data for further processing by
+ the following decoder commands\.
+
+ - __::asn::asnGetUTCTime__ *data\_var* *utc\_var*
+
+ Assumes that a UTC time value is at the front of the data stored in the
+ variable named *data\_var*, and stores it into the variable named by
+ *utc\_var*\. The UTC time value is stored as a string, which has to be
+ decoded with the usual clock scan commands\. Additionally removes all bytes
+ associated with the value from the data for further processing by the
+ following decoder commands\.
+
+ - __::asn::asnGetBitString__ *data\_var* *bits\_var*
+
+ Assumes that a bit string value is at the front of the data stored in the
+ variable named *data\_var*, and stores it into the variable named by
+ *bits\_var* as a string containing only 0 and 1\. Additionally removes all
+ bytes associated with the value from the data for further processing by the
+ following decoder commands\.
+
+ - __::asn::asnGetObjectIdentifier__ *data\_var* *oid\_var*
+
+ Assumes that a object identifier \(OID\) value is at the front of the data
+ stored in the variable named *data\_var*, and stores it into the variable
+ named by *oid\_var* as a list of integers\. Additionally removes all bytes
+ associated with the value from the data for further processing by the
+ following decoder commands\.
+
+ - __::asn::asnGetBoolean__ *data\_var* *bool\_var*
+
+ Assumes that a boolean value is at the front of the data stored in the
+ variable named *data\_var*, and stores it into the variable named by
+ *bool\_var*\. Additionally removes all bytes associated with the value from
+ the data for further processing by the following decoder commands\.
+
+ - __::asn::asnGetNull__ *data\_var*
+
+ Assumes that a NULL value is at the front of the data stored in the variable
+ named *data\_var* and removes the bytes used to encode it from the data\.
+
+ - __::asn::asnGetSequence__ *data\_var* *sequence\_var*
+
+ Assumes that an ASN sequence is at the front of the data stored in the
+ variable named *data\_var*, and stores it into the variable named by
+ *sequence\_var*\. Additionally removes all bytes associated with the value
+ from the data for further processing by the following decoder commands\.
+
+ The data in *sequence\_var* is encoded binary and has to be further decoded
+ according to the definition of the sequence, using the decoder commands
+ here\.
+
+ - __::asn::asnGetSet__ *data\_var* *set\_var*
+
+ Assumes that an ASN set is at the front of the data stored in the variable
+ named *data\_var*, and stores it into the variable named by *set\_var*\.
+ Additionally removes all bytes associated with the value from the data for
+ further processing by the following decoder commands\.
+
+ The data in *set\_var* is encoded binary and has to be further decoded
+ according to the definition of the set, using the decoder commands here\.
+
+ - __::asn::asnGetApplication__ *data\_var* *appNumber\_var* ?*content\_var*? ?*encodingType\_var*?
+
+ Assumes that an ASN application construct is at the front of the data stored
+ in the variable named *data\_var*, and stores its id into the variable
+ named by *appNumber\_var*\. Additionally removes all bytes associated with
+ the value from the data for further processing by the following decoder
+ commands\. If a *content\_var* is specified, then the command places all
+ data associated with it into the named variable, in the binary form which
+ can be processed using the decoder commands of this package\. If a
+ *encodingType\_var* is specified, then that var is set to 1 if the encoding
+ is constructed and 0 if it is primitive\.
+
+ Otherwise it is the responsibility of the caller to decode the remainder of
+ the application construct based on the id retrieved by this command, using
+ the decoder commands of this package\.
+
+ - __::asn::asnGetContext__ *data\_var* *contextNumber\_var* ?*content\_var*? ?*encodingType\_var*?
+
+ Assumes that an ASN context tag construct is at the front of the data stored
+ in the variable named *data\_var*, and stores its id into the variable
+ named by *contextNumber\_var*\. Additionally removes all bytes associated
+ with the value from the data for further processing by the following decoder
+ commands\. If a *content\_var* is specified, then the command places all
+ data associated with it into the named variable, in the binary form which
+ can be processed using the decoder commands of this package\. If a
+ *encodingType\_var* is specified, then that var is set to 1 if the encoding
+ is constructed and 0 if it is primitive\.
+
+ Otherwise it is the responsibility of the caller to decode the remainder of
+ the construct based on the id retrieved by this command, using the decoder
+ commands of this package\.
+
+## HANDLING TAGS
+
+Working with ASN\.1 you often need to decode tagged values, which use a tag thats
+different from the universal tag for a type\. In those cases you have to replace
+the tag with the universal tag used for the type, to decode the value\. To decode
+a tagged value use the __::asn::asnRetag__ to change the tag to the
+appropriate type to use one of the decoders for primitive values\. To help with
+this the module contains three functions:
+
+ - __::asn::asnPeekTag__ *data\_var* *tag\_var* *tagtype\_var* *constr\_var*
+
+ The __::asn::asnPeekTag__ command can be used to take a peek at the data
+ and decode the tag value, without removing it from the data\. The *tag\_var*
+ gets set to the tag number, while the *tagtype\_var* gets set to the class
+ of the tag\. \(Either UNIVERSAL, CONTEXT, APPLICATION or PRIVATE\)\. The
+ *constr\_var* is set to 1 if the tag is for a constructed value, and to 0
+ for not constructed\. It returns the length of the tag\.
+
+ - __::asn::asnTag__ *tagnumber* ?*class*? ?*tagstyle*?
+
+ The __::asn::asnTag__ can be used to create a tag value\. The
+ *tagnumber* gives the number of the tag, while the *class* gives one of
+ the classes \(UNIVERSAL,CONTEXT,APPLICATION or PRIVATE\)\. The class may be
+ abbreviated to just the first letter \(U,C,A,P\), default is UNIVERSAL\. The
+ *tagstyle* is either C for Constructed encoding, or P for primitve
+ encoding\. It defaults to P\. You can also use 1 instead of C and 0 instead of
+ P for direct use of the values returned by __::asn::asnPeekTag__\.
+
+ - __::asn::asnRetag__ *data\_var* *newTag*
+
+ Replaces the tag in front of the data in *data\_var* with *newTag*\. The
+ new Tag can be created using the __::asn::asnTag__ command\.
+
+# EXAMPLES
+
+Examples for the usage of this package can be found in the implementation of
+package __[ldap](\.\./ldap/ldap\.md)__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *asn* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[asn](\.\./\.\./\.\./\.\./index\.md\#asn), [ber](\.\./\.\./\.\./\.\./index\.md\#ber),
+[cer](\.\./\.\./\.\./\.\./index\.md\#cer), [der](\.\./\.\./\.\./\.\./index\.md\#der),
+[internet](\.\./\.\./\.\./\.\./index\.md\#internet),
+[protocol](\.\./\.\./\.\./\.\./index\.md\#protocol),
+[x\.208](\.\./\.\./\.\./\.\./index\.md\#x\_208), [x\.209](\.\./\.\./\.\./\.\./index\.md\#x\_209)
+
+# CATEGORY
+
+Networking
+
+# COPYRIGHT
+
+Copyright © 2004 Andreas Kupries
+Copyright © 2004 Jochen Loewer
+Copyright © 2004\-2011 Michael Schlenker
ADDED embedded/md/tcllib/files/modules/base32/base32.md
Index: embedded/md/tcllib/files/modules/base32/base32.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/base32/base32.md
@@ -0,0 +1,125 @@
+
+[//000000001]: # (base32 \- Base32 encoding)
+[//000000002]: # (Generated from file 'base32\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Public domain)
+[//000000004]: # (base32\(n\) 0\.1 tcllib "Base32 encoding")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+base32 \- base32 standard encoding
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Code map](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require base32::core ?0\.1?
+package require base32 ?0\.1?
+
+[__::base32::encode__ *string*](#1)
+[__::base32::decode__ *estring*](#2)
+
+# DESCRIPTION
+
+This package provides commands for encoding and decoding of strings into and out
+of the standard base32 encoding as specified in RFC 3548\.
+
+# API
+
+ - __::base32::encode__ *string*
+
+ This command encodes the given *string* in base32 and returns the encoded
+ string as its result\. The result may be padded with the character __=__
+ to signal a partial encoding at the end of the input string\.
+
+ - __::base32::decode__ *estring*
+
+ This commands takes the *estring* and decodes it under the assumption that
+ it is a valid base32 encoded string\. The result of the decoding is returned
+ as the result of the command\.
+
+ Note that while the encoder will generate only uppercase characters this
+ decoder accepts input in lowercase as well\.
+
+ The command will always throw an error whenever encountering conditions
+ which signal some type of bogus input, namely if
+
+ the input contains characters which are not valid output of a base32
+ encoder,
+
+ the length of the input is not a multiple of eight,
+
+ padding appears not at the end of input, but in the middle,
+
+ the padding has not of length six, four, three, or one characters,
+
+# Code map
+
+The code map used to convert 5\-bit sequences is shown below, with the numeric id
+of the bit sequences to the left and the character used to encode it to the
+right\. It should be noted that the characters "0" and "1" are not used by the
+encoding\. This is done as these characters can be easily confused with "O", "o"
+and "l" \(L\)\.
+
+ 0 A 9 J 18 S 27 3
+ 1 B 10 K 19 T 28 4
+ 2 C 11 L 20 U 29 5
+ 3 D 12 M 21 V 30 6
+ 4 E 13 N 22 W 31 7
+ 5 F 14 O 23 X
+ 6 G 15 P 24 Y
+ 7 H 16 Q 25 Z
+ 8 I 17 R 26 2
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *base32* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[base32](\.\./\.\./\.\./\.\./index\.md\#base32),
+[rfc3548](\.\./\.\./\.\./\.\./index\.md\#rfc3548)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Public domain
ADDED embedded/md/tcllib/files/modules/base32/base32core.md
Index: embedded/md/tcllib/files/modules/base32/base32core.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/base32/base32core.md
@@ -0,0 +1,109 @@
+
+[//000000001]: # (base32::core \- Base32 encoding)
+[//000000002]: # (Generated from file 'base32core\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Public domain)
+[//000000004]: # (base32::core\(n\) 0\.1 tcllib "Base32 encoding")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+base32::core \- Expanding basic base32 maps
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require base32::core ?0\.1?
+
+[__::base32::core::define__ *map* *forwvar* *backwvar* *ivar*](#1)
+[__::base32::core::valid__ *string* *pattern* *mvar*](#2)
+
+# DESCRIPTION
+
+This package provides generic commands for the construction of full base32
+mappings from a basic mapping listing just the codes and associated characters\.
+The full mappings, regular and inverse, created here map to and from bit
+sequences, and also handle the partial mappings at the end of a string\.
+
+This is in essence an internal package to be used by implementors of a base32
+en\- and decoder\. A regular user has no need of this package at all\.
+
+# API
+
+ - __::base32::core::define__ *map* *forwvar* *backwvar* *ivar*
+
+ This command computes full forward and backward \(inverse\) mappings from the
+ basic *map* and stores them in the variables named by *forwvar* and
+ *backwvar* resp\. It also constructs a regexp pattern for the detection of
+ invalid characters in supposedly base32 encoded input and stores it in the
+ variable named by *ivar*\.
+
+ - __::base32::core::valid__ *string* *pattern* *mvar*
+
+ This command checks if the input *string* is a valid base32 encoded
+ string, based on the *pattern* of invalid characters as generated by
+ __::base32::core::define__, and some other general rules\.
+
+ The result of the command is a boolean flag\. Its value is __True__ for a
+ valid *string*, and __False__ otherwise\. In the latter case an error
+ message describing the problem with the input is stored into the variable
+ named by *mvar*\. The variable is not touched if the input was found to be
+ valid\.
+
+ The rules checked by the command, beyond rejection of bad characters, are:
+
+ The length of the input is not a multiple of eight,
+
+ The padding appears not at the end of input, but in the middle,
+
+ The padding has not of length six, four, three, or one characters,
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *base32* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[base32](\.\./\.\./\.\./\.\./index\.md\#base32)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Public domain
ADDED embedded/md/tcllib/files/modules/base32/base32hex.md
Index: embedded/md/tcllib/files/modules/base32/base32hex.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/base32/base32hex.md
@@ -0,0 +1,125 @@
+
+[//000000001]: # (base32::hex \- Base32 encoding)
+[//000000002]: # (Generated from file 'base32hex\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Public domain)
+[//000000004]: # (base32::hex\(n\) 0\.1 tcllib "Base32 encoding")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+base32::hex \- base32 extended hex encoding
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Code map](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require base32::core ?0\.1?
+package require base32::hex ?0\.1?
+
+[__::base32::hex::encode__ *string*](#1)
+[__::base32::hex::decode__ *estring*](#2)
+
+# DESCRIPTION
+
+This package provides commands for encoding and decoding of strings into and out
+of the extended hex base32 encoding as specified in the RFC 3548bis draft\.
+
+# API
+
+ - __::base32::hex::encode__ *string*
+
+ This command encodes the given *string* in extended hex base32 and returns
+ the encoded string as its result\. The result may be padded with the
+ character __=__ to signal a partial encoding at the end of the input
+ string\.
+
+ - __::base32::hex::decode__ *estring*
+
+ This commands takes the *estring* and decodes it under the assumption that
+ it is a valid extended hex base32 encoded string\. The result of the decoding
+ is returned as the result of the command\.
+
+ Note that while the encoder will generate only uppercase characters this
+ decoder accepts input in lowercase as well\.
+
+ The command will always throw an error whenever encountering conditions
+ which signal some type of bogus input, namely if
+
+ the input contains characters which are not valid output of a extended hex
+ base32 encoder,
+
+ the length of the input is not a multiple of eight,
+
+ padding appears not at the end of input, but in the middle,
+
+ the padding has not of length six, four, three, or one characters,
+
+# Code map
+
+The code map used to convert 5\-bit sequences is shown below, with the numeric id
+of the bit sequences to the left and the character used to encode it to the
+right\. The important feature of the extended hex mapping is that the first 16
+codes map to the digits and hex characters\.
+
+ 0 0 9 9 18 I 27 R
+ 1 1 10 A 19 J 28 S
+ 2 2 11 B 20 K 29 T
+ 3 3 12 C 21 L 30 U
+ 4 4 13 D 22 M 31 V
+ 5 5 14 E 23 N
+ 6 6 15 F 24 O
+ 7 7 16 G 25 P
+ 8 8 17 H 26 Q
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *base32* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[base32](\.\./\.\./\.\./\.\./index\.md\#base32), [hex](\.\./\.\./\.\./\.\./index\.md\#hex),
+[rfc3548](\.\./\.\./\.\./\.\./index\.md\#rfc3548)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Public domain
ADDED embedded/md/tcllib/files/modules/base64/ascii85.md
Index: embedded/md/tcllib/files/modules/base64/ascii85.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/base64/ascii85.md
@@ -0,0 +1,117 @@
+
+[//000000001]: # (ascii85 \- Text encoding & decoding binary data)
+[//000000002]: # (Generated from file 'ascii85\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2010, Emiliano Gavilán)
+[//000000004]: # (ascii85\(n\) 1\.0 tcllib "Text encoding & decoding binary data")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+ascii85 \- ascii85\-encode/decode binary data
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [EXAMPLES](#section2)
+
+ - [References](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require ascii85 ?1\.0?
+
+[__::ascii85::encode__ ?__\-maxlen__ *maxlen*? ?__\-wrapchar__ *wrapchar*? *string*](#1)
+[__::ascii85::decode__ *string*](#2)
+
+# DESCRIPTION
+
+This package provides procedures to encode binary data into ascii85 and back\.
+
+ - __::ascii85::encode__ ?__\-maxlen__ *maxlen*? ?__\-wrapchar__ *wrapchar*? *string*
+
+ Ascii85 encodes the given binary *string* and returns the encoded result\.
+ Inserts the character *wrapchar* every *maxlen* characters of output\.
+ *wrapchar* defaults to newline\. *maxlen* defaults to __76__\.
+
+ *Note well*: If your string is not simple ascii you should fix the string
+ encoding before doing ascii85 encoding\. See the examples\.
+
+ The command will throw an error for negative values of *maxlen*, or if
+ *maxlen* is not an integer number\.
+
+ - __::ascii85::decode__ *string*
+
+ Ascii85 decodes the given *string* and returns the binary data\. The
+ decoder ignores whitespace in the string, as well as tabs and newlines\.
+
+# EXAMPLES
+
+ % ascii85::encode "Hello, world"
+ 87cURD\_\*\#TDfTZ\)
+
+ % ascii85::encode \[string repeat xyz 24\]
+ G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]G
+ ^4U\[H$X^\\H?a^\]
+ % ascii85::encode \-wrapchar "" \[string repeat xyz 24\]
+ G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]G^4U\[H$X^\\H?a^\]
+
+ \# NOTE: ascii85 encodes BINARY strings\.
+ % set chemical \[encoding convertto utf\-8 "C\\u2088H\\u2081\\u2080N\\u2084O\\u2082"\]
+ % set encoded \[ascii85::encode $chemical\]
+ 6fN\]R8E,5Pidu\\UiduhZidua
+ % set caffeine \[encoding convertfrom utf\-8 \[ascii85::decode $encoded\]\]
+
+# References
+
+ 1. [http://en\.wikipedia\.org/wiki/Ascii85](http://en\.wikipedia\.org/wiki/Ascii85)
+
+ 1. Postscript Language Reference Manual, 3rd Edition, page 131\.
+ [http://www\.adobe\.com/devnet/postscript/pdfs/PLRM\.pdf](http://www\.adobe\.com/devnet/postscript/pdfs/PLRM\.pdf)
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *base64* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[ascii85](\.\./\.\./\.\./\.\./index\.md\#ascii85),
+[encoding](\.\./\.\./\.\./\.\./index\.md\#encoding)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Copyright © 2010, Emiliano Gavilán
ADDED embedded/md/tcllib/files/modules/base64/base64.md
Index: embedded/md/tcllib/files/modules/base64/base64.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/base64/base64.md
@@ -0,0 +1,113 @@
+
+[//000000001]: # (base64 \- Text encoding & decoding binary data)
+[//000000002]: # (Generated from file 'base64\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2000, Eric Melski
+Copyright © 2001, Miguel Sofer)
+[//000000004]: # (base64\(n\) 2\.4\.2 tcllib "Text encoding & decoding binary data")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+base64 \- base64\-encode/decode binary data
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [EXAMPLES](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8
+package require base64 ?2\.4\.2?
+
+[__::base64::encode__ ?__\-maxlen__ *maxlen*? ?__\-wrapchar__ *wrapchar*? *string*](#1)
+[__::base64::decode__ *string*](#2)
+
+# DESCRIPTION
+
+This package provides procedures to encode binary data into base64 and back\.
+
+ - __::base64::encode__ ?__\-maxlen__ *maxlen*? ?__\-wrapchar__ *wrapchar*? *string*
+
+ Base64 encodes the given binary *string* and returns the encoded result\.
+ Inserts the character *wrapchar* every *maxlen* characters of output\.
+ *wrapchar* defaults to newline\. *maxlen* defaults to __76__\.
+
+ *Note* that if *maxlen* is set to __0__, the output will not be
+ wrapped at all\.
+
+ *Note well*: If your string is not simple ascii you should fix the string
+ encoding before doing base64 encoding\. See the examples\.
+
+ The command will throw an error for negative values of *maxlen*, or if
+ *maxlen* is not an integer number\.
+
+ - __::base64::decode__ *string*
+
+ Base64 decodes the given *string* and returns the binary data\. The decoder
+ ignores whitespace in the string\.
+
+# EXAMPLES
+
+ % base64::encode "Hello, world"
+ SGVsbG8sIHdvcmxk
+
+ % base64::encode \[string repeat xyz 20\]
+ eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6
+ eHl6eHl6eHl6
+ % base64::encode \-wrapchar "" \[string repeat xyz 20\]
+ eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6eHl6
+
+ \# NOTE: base64 encodes BINARY strings\.
+ % set chemical \[encoding convertto utf\-8 "C\\u2088H\\u2081\\u2080N\\u2084O\\u2082"\]
+ % set encoded \[base64::encode $chemical\]
+ Q\+KCiEjigoHigoBO4oKET\+KCgg==
+ % set caffeine \[encoding convertfrom utf\-8 \[base64::decode $encoded\]\]
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *base64* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[base64](\.\./\.\./\.\./\.\./index\.md\#base64),
+[encoding](\.\./\.\./\.\./\.\./index\.md\#encoding)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Copyright © 2000, Eric Melski
+Copyright © 2001, Miguel Sofer
ADDED embedded/md/tcllib/files/modules/base64/uuencode.md
Index: embedded/md/tcllib/files/modules/base64/uuencode.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/base64/uuencode.md
@@ -0,0 +1,138 @@
+
+[//000000001]: # (uuencode \- Text encoding & decoding binary data)
+[//000000002]: # (Generated from file 'uuencode\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002, Pat Thoyts)
+[//000000004]: # (uuencode\(n\) 1\.1\.4 tcllib "Text encoding & decoding binary data")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+uuencode \- UU\-encode/decode binary data
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [OPTIONS](#section2)
+
+ - [EXAMPLES](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8
+package require uuencode ?1\.1\.4?
+
+[__::uuencode::encode__ *string*](#1)
+[__::uuencode::decode__ *string*](#2)
+[__::uuencode::uuencode__ ?__\-name__ *string*? ?__\-mode__ *octal*? \(__\-file__ *filename* | ?__\-\-__? *string*\)](#3)
+[__::uuencode::uudecode__ \(__\-file__ *filename* | ?__\-\-__? *string*\)](#4)
+
+# DESCRIPTION
+
+This package provides a Tcl\-only implementation of the __uuencode\(1\)__ and
+__uudecode\(1\)__ commands\. This encoding packs binary data into printable
+ASCII characters\.
+
+ - __::uuencode::encode__ *string*
+
+ returns the uuencoded data\. This will encode all the data passed in even if
+ this is longer than the uuencode maximum line length\. If the number of input
+ bytes is not a multiple of 3 then additional 0 bytes are added to pad the
+ string\.
+
+ - __::uuencode::decode__ *string*
+
+ Decodes the given encoded data\. This will return any padding characters as
+ well and it is the callers responsibility to deal with handling the actual
+ length of the encoded data\. \(see uuencode\)\.
+
+ - __::uuencode::uuencode__ ?__\-name__ *string*? ?__\-mode__ *octal*? \(__\-file__ *filename* | ?__\-\-__? *string*\)
+
+ - __::uuencode::uudecode__ \(__\-file__ *filename* | ?__\-\-__? *string*\)
+
+ UUDecode a file or block of data\. A file may contain more than one embedded
+ file so the result is a list where each element is a three element list of
+ filename, mode value and data\.
+
+# OPTIONS
+
+ - \-filename name
+
+ Cause the uuencode or uudecode commands to read their data from the named
+ file rather that taking a string parameter\.
+
+ - \-name string
+
+ The uuencoded data header line contains the suggested file name to be used
+ when unpacking the data\. Use this option to change this from the default of
+ "data\.dat"\.
+
+ - \-mode octal
+
+ The uuencoded data header line contains a suggested permissions bit pattern
+ expressed as an octal string\. To change the default of 0644 you can set this
+ option\. For instance, 0755 would be suitable for an executable\. See
+ __chmod\(1\)__\.
+
+# EXAMPLES
+
+ % set d \[uuencode::encode "Hello World\!"\]
+ 2&5L;&\\\\@5V\]R;&0A
+
+ % uuencode::uudecode $d
+ Hello World\!
+
+ % set d \[uuencode::uuencode \-name hello\.txt "Hello World"\]
+ begin 644 hello\.txt
+ \+2&5L;&\\@5V\]R;&0\`
+ \`
+ end
+
+ % uuencode::uudecode $d
+ \{hello\.txt 644 \{Hello World\}\}
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *base64* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[encoding](\.\./\.\./\.\./\.\./index\.md\#encoding),
+[uuencode](\.\./\.\./\.\./\.\./index\.md\#uuencode)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Copyright © 2002, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/base64/yencode.md
Index: embedded/md/tcllib/files/modules/base64/yencode.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/base64/yencode.md
@@ -0,0 +1,139 @@
+
+[//000000001]: # (yencode \- Text encoding & decoding binary data)
+[//000000002]: # (Generated from file 'yencode\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002, Pat Thoyts)
+[//000000004]: # (yencode\(n\) 1\.1\.2 tcllib "Text encoding & decoding binary data")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+yencode \- Y\-encode/decode binary data
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [OPTIONS](#section2)
+
+ - [References](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require yencode ?1\.1\.2?
+
+[__::yencode::encode__ *string*](#1)
+[__::yencode::decode__ *string*](#2)
+[__::yencode::yencode__ ?__\-name__ *string*? ?__\-line__ *integer*? ?__\-crc32__ *boolean*? \(__\-file__ *filename* | ?__\-\-__? *string*\)](#3)
+[__::yencode::ydecode__ \(__\-file__ *filename* | ?__\-\-__? *string*\)](#4)
+
+# DESCRIPTION
+
+This package provides a Tcl\-only implementation of the yEnc file encoding\. This
+is a recently introduced method of encoding binary files for transmission
+through Usenet\. This encoding packs binary data into a format that requires an
+8\-bit clean transmission layer but that escapes characters special to the
+*[NNTP](\.\./\.\./\.\./\.\./index\.md\#nntp)* posting protocols\. See
+[http://www\.yenc\.org/](http://www\.yenc\.org/) for details concerning the
+algorithm\.
+
+ - __::yencode::encode__ *string*
+
+ returns the yEnc encoded data\.
+
+ - __::yencode::decode__ *string*
+
+ Decodes the given yEnc encoded data\.
+
+ - __::yencode::yencode__ ?__\-name__ *string*? ?__\-line__ *integer*? ?__\-crc32__ *boolean*? \(__\-file__ *filename* | ?__\-\-__? *string*\)
+
+ Encode a file or block of data\.
+
+ - __::yencode::ydecode__ \(__\-file__ *filename* | ?__\-\-__? *string*\)
+
+ Decode a file or block of data\. A file may contain more than one embedded
+ file so the result is a list where each element is a three element list of
+ filename, file size and data\.
+
+# OPTIONS
+
+ - \-filename name
+
+ Cause the yencode or ydecode commands to read their data from the named file
+ rather that taking a string parameter\.
+
+ - \-name string
+
+ The encoded data header line contains the suggested file name to be used
+ when unpacking the data\. Use this option to change this from the default of
+ "data\.dat"\.
+
+ - \-line integer
+
+ The yencoded data header line contains records the line length used during
+ the encoding\. Use this option to select a line length other that the default
+ of 128\. Note that NNTP imposes a 1000 character line length limit and some
+ gateways may have trouble with more than 255 characters per line\.
+
+ - \-crc32 boolean
+
+ The yEnc specification recommends the inclusion of a cyclic redundancy check
+ value in the footer\. Use this option to change the default from *true* to
+ *false*\.
+
+ % set d \[yencode::yencode \-file testfile\.txt\]
+ =ybegin line=128 size=584 name=testfile\.txt
+ \-o\- data not shown \-o\-
+ =yend size=584 crc32=ded29f4f
+
+# References
+
+ 1. [http://www\.yenc\.org/yenc\-draft\.1\.3\.txt](http://www\.yenc\.org/yenc\-draft\.1\.3\.txt)
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *base64* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[encoding](\.\./\.\./\.\./\.\./index\.md\#encoding),
+[yEnc](\.\./\.\./\.\./\.\./index\.md\#yenc),
+[ydecode](\.\./\.\./\.\./\.\./index\.md\#ydecode),
+[yencode](\.\./\.\./\.\./\.\./index\.md\#yencode)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Copyright © 2002, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/bee/bee.md
Index: embedded/md/tcllib/files/modules/bee/bee.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bee/bee.md
@@ -0,0 +1,344 @@
+
+[//000000001]: # (bee \- BitTorrent)
+[//000000002]: # (Generated from file 'bee\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2004 Andreas Kupries )
+[//000000004]: # (bee\(n\) 0\.1 tcllib "BitTorrent")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bee \- BitTorrent Serialization Format Encoder/Decoder
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [ENCODER](#subsection1)
+
+ - [DECODER](#subsection2)
+
+ - [FORMAT DEFINITION](#section3)
+
+ - [EXAMPLES](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require bee ?0\.1?
+
+[__::bee::encodeString__ *string*](#1)
+[__::bee::encodeNumber__ *integer*](#2)
+[__::bee::encodeListArgs__ *value*\.\.\.](#3)
+[__::bee::encodeList__ *list*](#4)
+[__::bee::encodeDictArgs__ *key* *value*\.\.\.](#5)
+[__::bee::encodeDict__ *dict*](#6)
+[__::bee::decode__ *string* ?*endvar*? ?*start*?](#7)
+[__::bee::decodeIndices__ *string* ?*endvar*? ?*start*?](#8)
+[__::bee::decodeChannel__ *chan* __\-command__ *cmdprefix* ?__\-exact__? ?__\-prefix__ *data*?](#9)
+[__cmdprefix__ __eof__ *token*](#10)
+[__cmdprefix__ __error__ *token* *message*](#11)
+[__cmdprefix__ __value__ *token* *value*](#12)
+[__::bee::decodeCancel__ *token*](#13)
+[__::bee::decodePush__ *token* *string*](#14)
+
+# DESCRIPTION
+
+The __bee__ package provides de\- and encoder commands for data in bencoding
+\(speak 'bee'\), the serialization format for data and messages used by the
+BitTorrent protocol\.
+
+# PUBLIC API
+
+## ENCODER
+
+The package provides one encoder command for each of the basic forms, and two
+commands per container, one taking a proper tcl data structure to encode in the
+container, the other taking the same information as several arguments\.
+
+ - __::bee::encodeString__ *string*
+
+ Returns the bee\-encoding of the *string*\.
+
+ - __::bee::encodeNumber__ *integer*
+
+ Returns the bee\-encoding of the *integer* number\.
+
+ - __::bee::encodeListArgs__ *value*\.\.\.
+
+ Takes zero or more bee\-encoded values and returns the bee\-encoding of their
+ list\.
+
+ - __::bee::encodeList__ *list*
+
+ Takes a list of bee\-encoded values and returns the bee\-encoding of the list\.
+
+ - __::bee::encodeDictArgs__ *key* *value*\.\.\.
+
+ Takes zero or more pairs of keys and values and returns the bee\-encoding of
+ the dictionary they form\. The values are expected to be already bee\-encoded,
+ but the keys must not be\. Their encoding will be done by the command itself\.
+
+ - __::bee::encodeDict__ *dict*
+
+ Takes a dictionary list of string keys and bee\-encoded values and returns
+ the bee\-encoding of the list\. Note that the keys in the input must not be
+ bee\-encoded already\. This will be done by the command itself\.
+
+## DECODER
+
+The package provides two main decoder commands, one for decoding a string
+expected to contain a complete data structure, the other for the incremental
+decoding of bee\-values arriving on a channel\. The latter command is asynchronous
+and provides the completed decoded values to the user through a command
+callback\.
+
+ - __::bee::decode__ *string* ?*endvar*? ?*start*?
+
+ Takes the bee\-encoding in the string and returns one decoded value\. In the
+ case of this being a container all contained values are decoded recursively
+ as well and the result is a properly nested tcl list and/or dictionary\.
+
+ If the optional *endvar* is set then it is the name of a variable to store
+ the index of the first character *after* the decoded value into\. In other
+ words, if the string contains more than one value then *endvar* can be
+ used to obtain the position of the bee\-value after the bee\-value currently
+ decoded\. together with *start*, see below, it is possible to iterate over
+ the string to extract all contained values\.
+
+ The optional *start* index defaults to __0__, i\.e\. the beginning of
+ the string\. It is the index of the first character of the bee\-encoded value
+ to extract\.
+
+ - __::bee::decodeIndices__ *string* ?*endvar*? ?*start*?
+
+ Takes the same arguments as __::bee::decode__ and returns the same
+ information in *endvar*\. The result however is different\. Instead of the
+ tcl value contained in the *string* it returns a list describing the value
+ with respect to type and location \(indices for the first and last character
+ of the bee\-value\)\. In case of a container the structure also contains the
+ same information for all the embedded values\.
+
+ Formally the results for the various types of bee\-values are:
+
+ * string
+
+ A list containing three elements:
+
+ The constant string __string__, denoting the type of the value\.
+
+ An integer number greater than or equal to zero\. This is the index of
+ the first character of the bee\-value in the input *string*\.
+
+ An integer number greater than or equal to zero\. This is the index of
+ the last character of the bee\-value in the input *string*\.
+
+ *Note* that this information is present in the results for all four
+ types of bee\-values, with only the first element changing according to
+ the type of the value\.
+
+ * integer
+
+ The result is like for strings, except that the type element contains
+ the constant string __integer__\.
+
+ * list
+
+ The result is like before, with two exceptions: One, the type element
+ contains the constant string __list__\. And two, the result actually
+ contains four elements\. The last element is new, and contains the index
+ data as described here for all elements of the bee\-list\.
+
+ * dictionary
+
+ The result is like for strings, except that the type element contains
+ the constant string __dict__\. A fourth element is present as well,
+ with a slightly different structure than for lists\. The element is a
+ dictionary mapping from the strings keys of the bee\-dictionary to a list
+ containing two elements\. The first of them is the index information for
+ the key, and the second element is the index information for the value
+ the key maps to\. This structure is the only which contains not only
+ index data, but actual values from the bee\-string\. While the index
+ information of the keys is unique enough, i\.e\. serviceable as keys, they
+ are not easy to navigate when trying to find particular element\. Using
+ the actual keys makes this much easier\.
+
+ - __::bee::decodeChannel__ *chan* __\-command__ *cmdprefix* ?__\-exact__? ?__\-prefix__ *data*?
+
+ The command creates a decoder for a series of bee\-values arriving on the
+ channel *chan* and returns its handle\. This handle can be used to remove
+ the decoder again\. Setting up another bee decoder on *chan* while a bee
+ decoder is still active will fail with an error message\.
+
+ * __\-command__
+
+ The command prefix *cmdprefix* specified by the *required* option
+ __\-command__ is used to report extracted values and exceptional
+ situations \(error, and EOF on the channel\)\. The callback will be
+ executed at the global level of the interpreter, with two or three
+ arguments\. The exact call signatures are
+
+ + __cmdprefix__ __eof__ *token*
+
+ The decoder has reached eof on the channel *chan*\. No further
+ invocations of the callback will be made after this\. The channel has
+ already been closed at the time of the call, and the *token* is
+ not valid anymore as well\.
+
+ + __cmdprefix__ __error__ *token* *message*
+
+ The decoder encountered an error, which is not eof\. For example a
+ malformed bee\-value\. The *message* provides details about the
+ error\. The decoder token is in the same state as for eof, i\.e\.
+ invalid\. The channel however is kept open\.
+
+ + __cmdprefix__ __value__ *token* *value*
+
+ The decoder received and successfully decoded a bee\-value\. The
+ format of the equivalent tcl *value* is the same as returned by
+ __::bee::decode__\. The channel is still open and the decoder
+ token is valid\. This means that the callback is able to remove the
+ decoder\.
+
+ * __\-exact__
+
+ By default the decoder assumes that the remainder of the data in the
+ channel consists only of bee\-values, and reads as much as possible per
+ event, without regard for boundaries between bee\-values\. This means that
+ if the the input contains non\-bee data after a series of bee\-value the
+ beginning of that data may be lost because it was already read by the
+ decoder, but not processed\.
+
+ The __\-exact__ was made for this situation\. When specified the
+ decoder will take care to not read any characters behind the currently
+ processed bee\-value, so that any non\-bee data is kept in the channel for
+ further processing after removal of the decoder\.
+
+ * __\-prefix__
+
+ If this option is specified its value is assumed to be the beginning of
+ the bee\-value and used to initialize the internal decoder buffer\. This
+ feature is required if the creator of the decoder used data from the
+ channel to determine if it should create the decoder or not\. Without the
+ option this data would be lost to the decoding\.
+
+ - __::bee::decodeCancel__ *token*
+
+ This command cancels the decoder set up by __::bee::decodeChannel__ and
+ represented by the handle *token*\.
+
+ - __::bee::decodePush__ *token* *string*
+
+ This command appends the *string* to the internal decoder buffer\. It is
+ the runtime equivalent of the option __\-prefix__ of
+ __::bee::decodeChannel__\. Use it to push data back into the decoder when
+ the __value__ callback used data from the channel to determine if it
+ should decode another bee\-value or not\.
+
+# FORMAT DEFINITION
+
+Data in the bee serialization format is constructed from two basic forms, and
+two container forms\. The basic forms are strings and integer numbers, and the
+containers are lists and dictionaries\.
+
+ - String *S*
+
+ A string *S* of length *L* is encoded by the string
+ "*L*__:__*S*", where the length is written out in textual form\.
+
+ - Integer *N*
+
+ An integer number *N* is encoded by the string "__i__*N*__e__"\.
+
+ - List *v1* \.\.\. *vn*
+
+ A list of the values *v1* to *vn* is encoded by the string
+ "__l__*BV1*\.\.\.*BVn*__e__" where "BV__i__" is the
+ bee\-encoding of the value "v__i__"\.
+
+ - Dict *k1* \-> *v1* \.\.\.
+
+ A dictionary mapping the string key *k*__i__ to the value
+ *v*__i__, for __i__ in __1__ \.\.\. __n__ is encoded by the
+ string "__d__*BK*__i__*BV*__i__\.\.\.__e__" for i in
+ __1__ \.\.\. __n__, where "BK__i__" is the bee\-encoding of the key
+ string "k__i__"\. and "BV__i__" is the bee\-encoding of the value
+ "v__i__"\.
+
+ *Note*: The bee\-encoding does not retain the order of the keys in the
+ input, but stores in a sorted order\. The sorting is done for the "raw
+ strings"\.
+
+Note that the type of each encoded item can be determined immediately from the
+first character of its representation:
+
+ - i
+
+ Integer\.
+
+ - l
+
+ List\.
+
+ - d
+
+ Dictionary\.
+
+ - \[0\-9\]
+
+ String\.
+
+By wrapping an integer number into __i__\.\.\.__e__ the format makes sure
+that they are different from strings, which all begin with a digit\.
+
+# EXAMPLES
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bee* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[BitTorrent](\.\./\.\./\.\./\.\./index\.md\#bittorrent),
+[bee](\.\./\.\./\.\./\.\./index\.md\#bee),
+[bittorrent](\.\./\.\./\.\./\.\./index\.md\#bittorrent),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization),
+[torrent](\.\./\.\./\.\./\.\./index\.md\#torrent)
+
+# CATEGORY
+
+Networking
+
+# COPYRIGHT
+
+Copyright © 2004 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/bench/bench.md
Index: embedded/md/tcllib/files/modules/bench/bench.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bench/bench.md
@@ -0,0 +1,308 @@
+
+[//000000001]: # (bench \- Benchmarking/Performance tools)
+[//000000002]: # (Generated from file 'bench\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007\-2008 Andreas Kupries )
+[//000000004]: # (bench\(n\) 0\.4 tcllib "Benchmarking/Performance tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bench \- bench \- Processing benchmark suites
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [Benchmark execution](#subsection1)
+
+ - [Result manipulation](#subsection2)
+
+ - [Result format](#subsection3)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require bench ?0\.4?
+
+[__::bench::locate__ *pattern* *paths*](#1)
+[__::bench::run__ ?*option value*\.\.\.? *interp\_list* *file*\.\.\.](#2)
+[__::bench::versions__ *interp\_list*](#3)
+[__::bench::del__ *bench\_result* *column*](#4)
+[__::bench::edit__ *bench\_result* *column* *newvalue*](#5)
+[__::bench::merge__ *bench\_result*\.\.\.](#6)
+[__::bench::norm__ *bench\_result* *column*](#7)
+[__::bench::out::raw__ *bench\_result*](#8)
+
+# DESCRIPTION
+
+This package provides commands for the execution of benchmarks written in the
+bench language, and for the processing of results generated by such execution\.
+
+A reader interested in the bench language itself should start with the *[bench
+language introduction](bench\_lang\_intro\.md)* and proceed from there to the
+formal *[bench language specification](bench\_lang\_spec\.md)*\.
+
+# PUBLIC API
+
+## Benchmark execution
+
+ - __::bench::locate__ *pattern* *paths*
+
+ This command locates Tcl interpreters and returns a list containing their
+ paths\. It searches them in the list of *paths* specified by the caller,
+ using the glob *pattern*\.
+
+ The command resolves soft links to find the actual executables matching the
+ pattern\. Note that only interpreters which are marked as executable and are
+ actually executable on the current platform are put into the result\.
+
+ - __::bench::run__ ?*option value*\.\.\.? *interp\_list* *file*\.\.\.
+
+ This command executes the benchmarks declared in the set of files, once per
+ Tcl interpreter specified via the *interp\_list*, and per the configuration
+ specified by the options, and then returns the accumulated timing results\.
+ The format of this result is described in section [Result
+ format](#subsection3)\.
+
+ It is assumed that the contents of the files are written in the bench
+ language\.
+
+ The available options are
+
+ * __\-errors__ *flag*
+
+ The argument is a boolean value\. If set errors in benchmarks are
+ propagated to the command, aborting benchmark execution\. Otherwise they
+ are recorded in the timing result via a special result code\. The default
+ is to propagate and abort\.
+
+ * __\-threads__ *n*
+
+ The argument is a non\-negative integer value declaring the number of
+ threads to use while executing the benchmarks\. The default value is
+ __0__, to not use threads\.
+
+ * __\-match__ *pattern*
+
+ The argument is a glob pattern\. Only benchmarks whose description
+ matches the pattern are executed\. The default is the empty string, to
+ execute all patterns\.
+
+ * __\-rmatch__ *pattern*
+
+ The argument is a regular expression pattern\. Only benchmarks whose
+ description matches the pattern are executed\. The default is the empty
+ string, to execute all patterns\.
+
+ * __\-iters__ *n*
+
+ The argument is positive integer number, the maximal number of
+ iterations for any benchmark\. The default is __1000__\. Individual
+ benchmarks can override this\.
+
+ * __\-pkgdir__ *path*
+
+ The argument is a path to an existing, readable directory\. Multiple
+ paths can be specified, simply use the option multiple times, each time
+ with one of the paths to use\.
+
+ If no paths were specified the system will behave as before\. If one or
+ more paths are specified, say __N__, each of the specified
+ interpreters will be invoked __N__ times, with one of the specified
+ paths\. The chosen path is put into the interpreters' __auto\_path__,
+ thus allowing it to find specific versions of a package\.
+
+ In this way the use of __\-pkgdir__ allows the user to benchmark
+ several different versions of a package, against one or more
+ interpreters\.
+
+ *Note:* The empty string is allowed as a path and causes the system to
+ run the specified interpreters with an unmodified __auto\_path__\. In
+ case the package in question is available there as well\.
+
+ - __::bench::versions__ *interp\_list*
+
+ This command takes a list of Tcl interpreters, identified by their path, and
+ returns a dictionary mapping from the interpreters to their versions\.
+ Interpreters which are not actually executable, or fail when interrogated,
+ are not put into the result\. I\.e the result may contain less interpreters
+ than there in the input list\.
+
+ The command uses builtin command __info patchlevel__ to determine the
+ version of each interpreter\.
+
+## Result manipulation
+
+ - __::bench::del__ *bench\_result* *column*
+
+ This command removes a column, i\.e\. all benchmark results for a specific Tcl
+ interpreter, from the specified benchmark result and returns the modified
+ result\.
+
+ The benchmark results are in the format described in section [Result
+ format](#subsection3)\.
+
+ The column is identified by an integer number\.
+
+ - __::bench::edit__ *bench\_result* *column* *newvalue*
+
+ This command renames a column in the specified benchmark result and returns
+ the modified result\. This means that the path of the Tcl interpreter in the
+ identified column is changed to an arbitrary string\.
+
+ The benchmark results are in the format described in section [Result
+ format](#subsection3)\.
+
+ The column is identified by an integer number\.
+
+ - __::bench::merge__ *bench\_result*\.\.\.
+
+ This commands takes one or more benchmark results, merges them into one big
+ result, and returns that as its result\.
+
+ All benchmark results are in the format described in section [Result
+ format](#subsection3)\.
+
+ - __::bench::norm__ *bench\_result* *column*
+
+ This command normalizes the timing results in the specified benchmark result
+ and returns the modified result\. This means that the cell values are not
+ times anymore, but factors showing how much faster or slower the execution
+ was relative to the baseline\.
+
+ The baseline against which the command normalizes are the timing results in
+ the chosen column\. This means that after the normalization the values in
+ this column are all __1__, as these benchmarks are neither faster nor
+ slower than the baseline\.
+
+ A factor less than __1__ indicates a benchmark which was faster than the
+ baseline, whereas a factor greater than __1__ indicates a slower
+ execution\.
+
+ The benchmark results are in the format described in section [Result
+ format](#subsection3)\.
+
+ The column is identified by an integer number\.
+
+ - __::bench::out::raw__ *bench\_result*
+
+ This command formats the specified benchmark result for output to a file,
+ socket, etc\. This specific command does no formatting at all, it passes the
+ input through unchanged\.
+
+ For other formatting styles see the packages
+ __[bench::out::text](bench\_wtext\.md)__ and
+ __[bench::out::csv](bench\_wcsv\.md)__ which provide commands to
+ format benchmark results for human consumption, or as CSV data importable by
+ spread sheets, respectively\.
+
+ Complementary, to read benchmark results from files, sockets etc\. look for
+ the package __[bench::in](bench\_read\.md)__ and the commands provided
+ by it\.
+
+## Result format
+
+After the execution of a set of benchmarks the raw result returned by this
+package is a Tcl dictionary containing all the relevant information\. The
+dictionary is a compact representation, i\.e\. serialization, of a 2\-dimensional
+table which has Tcl interpreters as columns and benchmarks as rows\. The cells of
+the table contain the timing results\. The Tcl interpreters / columns are
+identified by their paths\. The benchmarks / rows are identified by their
+description\.
+
+The possible keys are all valid Tcl lists of two or three elements and have one
+of the following forms:
+
+ - \{interp \*\}
+
+ The set of keys matching this glob pattern capture the information about all
+ the Tcl interpreters used to run the benchmarks\. The second element of the
+ key is the path to the interpreter\.
+
+ The associated value is the version of the Tcl interpreter\.
+
+ - \{desc \*\}
+
+ The set of keys matching this glob pattern capture the information about all
+ the benchmarks found in the executed benchmark suite\. The second element of
+ the key is the description of the benchmark, which has to be unique\.
+
+ The associated value is irrelevant, and set to the empty string\.
+
+ - \{usec \* \*\}
+
+ The set of keys matching this glob pattern capture the performance
+ information, i\.e\. timing results\. The second element of the key is the
+ description of the benchmark, the third element the path of the Tcl
+ interpreter which was used to run it\.
+
+ The associated value is either one of several special result codes, or the
+ time it took to execute the benchmark, in microseconds\. The possible special
+ result codes are
+
+ * ERR
+
+ Benchmark could not be executed, failed with a Tcl error\.
+
+ * BAD\_RES
+
+ The benchmark could be executed, however the result from its body did
+ not match the declared expectations\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bench* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[bench\_intro](bench\_intro\.md), [bench\_lang\_intro](bench\_lang\_intro\.md),
+[bench\_lang\_spec](bench\_lang\_spec\.md), bench\_read, bench\_wcsv, bench\_wtext
+
+# KEYWORDS
+
+[benchmark](\.\./\.\./\.\./\.\./index\.md\#benchmark),
+[merging](\.\./\.\./\.\./\.\./index\.md\#merging),
+[normalization](\.\./\.\./\.\./\.\./index\.md\#normalization),
+[performance](\.\./\.\./\.\./\.\./index\.md\#performance),
+[testing](\.\./\.\./\.\./\.\./index\.md\#testing)
+
+# CATEGORY
+
+Benchmark tools
+
+# COPYRIGHT
+
+Copyright © 2007\-2008 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/bench/bench_intro.md
Index: embedded/md/tcllib/files/modules/bench/bench_intro.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bench/bench_intro.md
@@ -0,0 +1,106 @@
+
+[//000000001]: # (bench\_intro \- Benchmarking/Performance tools)
+[//000000002]: # (Generated from file 'bench\_intro\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (bench\_intro\(n\) 1\.0 tcllib "Benchmarking/Performance tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bench\_intro \- bench introduction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [HISTORICAL NOTES](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+The *[bench](bench\.md)* \(short for *benchmark tools*\), is a set of
+related, yet different, entities which are working together for the easy
+creation and execution of performance test suites, also known as benchmarks\.
+These are
+
+ 1. A tcl based language for the declaration of test cases\. A test case is
+ represented by a tcl command declaring the various parts needed to execute
+ it, like setup, cleanup, the commands to test, etc\.
+
+ 1. A package providing the ability to execute test cases written in that
+ language\.
+
+Which of the more detailed documents are relevant to the reader of this
+introduction depends on their role in the benchmarking process\.
+
+ 1. A *writer* of benchmarks has to understand the bench language itself\. A
+ beginner to bench should read the more informally written *[bench
+ language introduction](bench\_lang\_intro\.md)* first\. Having digested
+ this the formal *[bench language specification](bench\_lang\_spec\.md)*
+ should become understandable\. A writer experienced with bench may only need
+ this last document from time to time, to refresh her memory\.
+
+ 1. A *user* of benchmark suites written in the *[bench](bench\.md)*
+ language has to know which tools are available for use\. At the bottom level
+ sits the package __[bench](bench\.md)__, providing the basic
+ facilities to read and execute files containing benchmarks written in the
+ bench language, and to manipulate benchmark results\.
+
+# HISTORICAL NOTES
+
+This module and package have been derived from Jeff Hobbs' __tclbench__
+application for the benchmarking of the Tcl core and its ancestor
+"runbench\.tcl"\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bench* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[bench](bench\.md), bench\_lang\_faq,
+[bench\_lang\_intro](bench\_lang\_intro\.md),
+[bench\_lang\_spec](bench\_lang\_spec\.md)
+
+# KEYWORDS
+
+[bench language](\.\./\.\./\.\./\.\./index\.md\#bench\_language),
+[benchmark](\.\./\.\./\.\./\.\./index\.md\#benchmark),
+[performance](\.\./\.\./\.\./\.\./index\.md\#performance),
+[testing](\.\./\.\./\.\./\.\./index\.md\#testing)
+
+# CATEGORY
+
+Benchmark tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/bench/bench_lang_intro.md
Index: embedded/md/tcllib/files/modules/bench/bench_lang_intro.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bench/bench_lang_intro.md
@@ -0,0 +1,183 @@
+
+[//000000001]: # (bench\_lang\_intro \- Benchmarking/Performance tools)
+[//000000002]: # (Generated from file 'bench\_lang\_intro\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (bench\_lang\_intro\(n\) 1\.0 tcllib "Benchmarking/Performance tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bench\_lang\_intro \- bench language introduction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [Fundamentals](#subsection1)
+
+ - [Basics](#subsection2)
+
+ - [Pre\- and postprocessing](#subsection3)
+
+ - [Advanced pre\- and postprocessing](#subsection4)
+
+ - [FURTHER READING](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+This document is an informal introduction to version 1 of the bench language
+based on a multitude of examples\. After reading this a benchmark writer should
+be ready to understand the formal *[bench language
+specification](bench\_lang\_spec\.md)*\.
+
+## Fundamentals
+
+In the broadest terms possible the *[bench
+language](\.\./\.\./\.\./\.\./index\.md\#bench\_language)* is essentially Tcl, plus a
+number of commands to support the declaration of benchmarks\. A document written
+in this language is a Tcl script and has the same syntax\.
+
+## Basics
+
+One of the most simplest benchmarks which can be written in bench is
+
+ bench \-desc LABEL \-body \{
+ set a b
+ \}
+
+This code declares a benchmark named __LABEL__ which measures the time it
+takes to assign a value to a variable\. The Tcl code doing this assignment is the
+__\-body__ of the benchmark\.
+
+## Pre\- and postprocessing
+
+Our next example demonstrates how to declare *initialization* and
+*[cleanup](\.\./\.\./\.\./\.\./index\.md\#cleanup)* code, i\.e\. code computing
+information for the use of the __\-body__, and for releasing such resources
+after the measurement is done\. They are the __\-pre__\- and the
+__\-post__\-body, respectively\.
+
+In our example, directly drawn from the benchmark suite of Tcllib's
+__[aes](\.\./aes/aes\.md)__ package, the concrete initialization code
+constructs the key schedule used by the encryption command whose speed we
+measure, and the cleanup code releases any resources bound to that schedule\.
+
+ bench \-desc "AES\-$\{len\} ECB encryption core" __\-pre__ \{
+ set key \[aes::Init ecb $k $i\]
+ \} \-body \{
+ aes::Encrypt $key $p
+ \} __\-post__ \{
+ aes::Final $key
+ \}
+
+## Advanced pre\- and postprocessing
+
+Our last example again deals with initialization and cleanup code\. To see the
+difference to the regular initialization and cleanup discussed in the last
+section it is necessary to know a bit more about how bench actually measures the
+speed of the the __\-body__\.
+
+Instead of running the __\-body__ just once the system actually executes the
+__\-body__ several hundred times and then returns the average of the found
+execution times\. This is done to remove environmental effects like machine load
+from the result as much as possible, with outliers canceling each other out in
+the average\.
+
+The drawback of doing things this way is that when we measure operations which
+are not idempotent we will most likely not measure the time for the operation we
+want, but of the state\(s\) the system is in after the first iteration, a mixture
+of things we have no interest in\.
+
+Should we wish, for example, to measure the time it takes to include an element
+into a set, with the element not yet in the set, and the set having specific
+properties like being a shared Tcl\_Obj, then the first iteration will measure
+the time for this\. *However* all subsequent iterations will measure the time
+to include an element which is already in the set, and the Tcl\_Obj holding the
+set will not be shared anymore either\. In the end the timings taken for the
+several hundred iterations of this state will overwhelm the time taken from the
+first iteration, the only one which actually measured what we wanted\.
+
+The advanced initialization and cleanup codes, __\-ipre__\- and the
+__\-ipost__\-body respectively, are present to solve this very problem\. While
+the regular initialization and cleanup codes are executed before and after the
+whole series of iterations the advanced codes are executed before and after each
+iteration of the body, without being measured themselves\. This allows them to
+bring the system into the exact state the body wishes to measure\.
+
+Our example, directly drawn from the benchmark suite of Tcllib's
+__[struct::set](\.\./struct/struct\_set\.md)__ package, is for exactly the
+example we used above to demonstrate the necessity for the advanced
+initialization and cleanup\. Its concrete initialization code constructs a
+variable refering to a set with specific properties \(The set has a string
+representation, which is shared\) affecting the speed of the inclusion command,
+and the cleanup code releases the temporary variables created by this
+initialization\.
+
+ bench \-desc "set include, missing x$times $n" __\-ipre__ \{
+ set A $sx\($times,$n\)
+ set B $A
+ \} \-body \{
+ struct::set include A x
+ \} __\-ipost__ \{
+ unset A B
+ \}
+
+# FURTHER READING
+
+Now that this document has been digested the reader, assumed to be a *writer*
+of benchmarks, he should be fortified enough to be able to understand the formal
+*bench language specfication*\. It will also serve as the detailed
+specification and cheat sheet for all available commands and their syntax\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bench* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[bench\_intro](bench\_intro\.md), [bench\_lang\_spec](bench\_lang\_spec\.md)
+
+# KEYWORDS
+
+[bench language](\.\./\.\./\.\./\.\./index\.md\#bench\_language),
+[benchmark](\.\./\.\./\.\./\.\./index\.md\#benchmark),
+[examples](\.\./\.\./\.\./\.\./index\.md\#examples),
+[performance](\.\./\.\./\.\./\.\./index\.md\#performance),
+[testing](\.\./\.\./\.\./\.\./index\.md\#testing)
+
+# CATEGORY
+
+Benchmark tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/bench/bench_lang_spec.md
Index: embedded/md/tcllib/files/modules/bench/bench_lang_spec.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bench/bench_lang_spec.md
@@ -0,0 +1,175 @@
+
+[//000000001]: # (bench\_lang\_spec \- Documentation tools)
+[//000000002]: # (Generated from file 'bench\_lang\_spec\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (bench\_lang\_spec\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bench\_lang\_spec \- bench language specification
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Commands](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__bench\_rm__ *path*\.\.\.](#1)
+[__bench\_tmpfile__](#2)
+[__[bench](bench\.md)__ *options*\.\.\.](#3)
+
+# DESCRIPTION
+
+This document specifies both names and syntax of all the commands which together
+are the bench language, version 1\. As this document is intended to be a
+reference the commands are listed in alphabetical order, and the descriptions
+are relatively short\. A beginner should read the more informally written
+*[bench language introduction](bench\_lang\_intro\.md)* first\.
+
+# Commands
+
+ - __bench\_rm__ *path*\.\.\.
+
+ This command silently removes the files specified as its arguments and then
+ returns the empty string as its result\. The command is *trusted*, there is
+ no checking if the specified files are outside of whatever restricted area
+ the benchmarks are run in\.
+
+ - __bench\_tmpfile__
+
+ This command returns the path to a bench specific unique temporary file\. The
+ uniqueness means that multiple calls will return different paths\. While the
+ path may exist from previous runs, the command itself does *not* create
+ aynthing\.
+
+ The base location of the temporary files is platform dependent:
+
+ * Unix, and indeterminate platform
+
+ "/tmp"
+
+ * Windows
+
+ __$TEMP__
+
+ * Anything else
+
+ The current working directory\.
+
+ - __[bench](bench\.md)__ *options*\.\.\.
+
+ This command declares a single benchmark\. Its result is the empty string\.
+ All parts of the benchmark are declared via options, and their values\. The
+ options can occur in any order\. The accepted options are:
+
+ * __\-body__ script
+
+ The argument of this option declares the body of the benchmark, the Tcl
+ script whose performance we wish to measure\. This option, and
+ __\-desc__, are the two required parts of each benchmark\.
+
+ * __\-desc__ msg
+
+ The argument of this option declares the name of the benchmark\. It has
+ to be unique, or timing data from different benchmarks will be mixed
+ together\.
+
+ *Beware\!* This requirement is not checked when benchmarks are
+ executed, and the system will silently produce bogus data\. This option,
+ and __\-body__, are the two required parts of each benchmark\.
+
+ * __\-ipost__ script
+
+ The argument of this option declares a script which is run immediately
+ *after* each iteration of the body\. Its responsibility is to release
+ resources created by the body, or __\-ipre__\-bodym which we do not
+ wish to live into the next iteration\.
+
+ * __\-ipre__ script
+
+ The argument of this option declares a script which is run immediately
+ *before* each iteration of the body\. Its responsibility is to create
+ the state of the system expected by the body so that we measure the
+ right thing\.
+
+ * __\-iterations__ num
+
+ The argument of this option declares the maximum number of times to run
+ the __\-body__ of the benchmark\. During execution this and the global
+ maximum number of iterations are compared and the smaller of the two
+ values is used\.
+
+ This option should be used only for benchmarks which are expected or
+ known to take a long time per run\. I\.e\. reduce the number of times they
+ are run to keep the overall time for the execution of the whole
+ benchmark within manageable limits\.
+
+ * __\-post__ script
+
+ The argument of this option declares a script which is run *after* all
+ iterations of the body have been run\. Its responsibility is to release
+ resources created by the body, or __\-pre__\-body\.
+
+ * __\-pre__ script
+
+ The argument of this option declares a script which is run *before*
+ any of the iterations of the body are run\. Its responsibility is to
+ create whatever resources are needed by the body to run without failing\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bench* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[bench\_intro](bench\_intro\.md), [bench\_lang\_intro](bench\_lang\_intro\.md)
+
+# KEYWORDS
+
+[bench language](\.\./\.\./\.\./\.\./index\.md\#bench\_language),
+[benchmark](\.\./\.\./\.\./\.\./index\.md\#benchmark),
+[performance](\.\./\.\./\.\./\.\./index\.md\#performance),
+[specification](\.\./\.\./\.\./\.\./index\.md\#specification),
+[testing](\.\./\.\./\.\./\.\./index\.md\#testing)
+
+# CATEGORY
+
+Benchmark tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/bench/bench_read.md
Index: embedded/md/tcllib/files/modules/bench/bench_read.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bench/bench_read.md
@@ -0,0 +1,119 @@
+
+[//000000001]: # (bench::in \- Benchmarking/Performance tools)
+[//000000002]: # (Generated from file 'bench\_read\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (bench::in\(n\) 0\.1 tcllib "Benchmarking/Performance tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bench::in \- bench::in \- Reading benchmark results
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require csv
+package require bench::in ?0\.1?
+
+[__::bench::in::read__ *file*](#1)
+
+# DESCRIPTION
+
+This package provides a command for reading benchmark results from files,
+sockets, etc\.
+
+A reader interested in the creation, processing or writing of such results
+should go and read *[bench \- Processing benchmark suites](bench\.md)*
+instead\.
+
+If the bench language itself is the actual interest please start with the
+*[bench language introduction](bench\_lang\_intro\.md)* and then proceed from
+there to the formal *[bench language specification](bench\_lang\_spec\.md)*\.
+
+# PUBLIC API
+
+ - __::bench::in::read__ *file*
+
+ This command reads a benchmark result from the specified *file* and
+ returns it as its result\. The command understands the three formats created
+ by the commands
+
+ * __bench::out::raw__
+
+ Provided by package __[bench](bench\.md)__\.
+
+ * __[bench::out::csv](bench\_wcsv\.md)__
+
+ Provided by package __[bench::out::csv](bench\_wcsv\.md)__\.
+
+ * __[bench::out::text](bench\_wtext\.md)__
+
+ Provided by package __[bench::out::text](bench\_wtext\.md)__\.
+
+ and automatically detects which format is used by the input file\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bench* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[bench](bench\.md), [bench::out::csv](bench\_wcsv\.md),
+[bench::out::text](bench\_wtext\.md), [bench\_intro](bench\_intro\.md)
+
+# KEYWORDS
+
+[benchmark](\.\./\.\./\.\./\.\./index\.md\#benchmark),
+[csv](\.\./\.\./\.\./\.\./index\.md\#csv),
+[formatting](\.\./\.\./\.\./\.\./index\.md\#formatting), [human
+readable](\.\./\.\./\.\./\.\./index\.md\#human\_readable),
+[parsing](\.\./\.\./\.\./\.\./index\.md\#parsing),
+[performance](\.\./\.\./\.\./\.\./index\.md\#performance),
+[reading](\.\./\.\./\.\./\.\./index\.md\#reading),
+[testing](\.\./\.\./\.\./\.\./index\.md\#testing),
+[text](\.\./\.\./\.\./\.\./index\.md\#text)
+
+# CATEGORY
+
+Benchmark tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/bench/bench_wcsv.md
Index: embedded/md/tcllib/files/modules/bench/bench_wcsv.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bench/bench_wcsv.md
@@ -0,0 +1,103 @@
+
+[//000000001]: # (bench::out::csv \- Benchmarking/Performance tools)
+[//000000002]: # (Generated from file 'bench\_wcsv\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (bench::out::csv\(n\) 0\.1\.2 tcllib "Benchmarking/Performance tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bench::out::csv \- bench::out::csv \- Formatting benchmark results as CSV
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require bench::out::csv ?0\.1\.2?
+
+[__::bench::out::csv__ *bench\_result*](#1)
+
+# DESCRIPTION
+
+This package provides commands for fomatting of benchmark results into a CSV
+table importable by spread sheets\.
+
+A reader interested in the generation or processing of such results should go
+and read *[bench \- Processing benchmark suites](bench\.md)* instead\.
+
+If the bench language itself is the actual interest please start with the
+*[bench language introduction](bench\_lang\_intro\.md)* and then proceed from
+there to the formal *[bench language specification](bench\_lang\_spec\.md)*\.
+
+# PUBLIC API
+
+ - __::bench::out::csv__ *bench\_result*
+
+ This command formats the specified benchmark result for output to a file,
+ socket, etc\. This specific command generates CSV data importable by spread
+ sheets\.
+
+ For other formatting styles see the packages __[bench](bench\.md)__
+ and __[bench::out::text](bench\_wtext\.md)__ which provide commands to
+ format benchmark results in raw form, or for human consumption,
+ respectively\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bench* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[bench](bench\.md), [bench::out::text](bench\_wtext\.md)
+
+# KEYWORDS
+
+[benchmark](\.\./\.\./\.\./\.\./index\.md\#benchmark),
+[csv](\.\./\.\./\.\./\.\./index\.md\#csv),
+[formatting](\.\./\.\./\.\./\.\./index\.md\#formatting),
+[performance](\.\./\.\./\.\./\.\./index\.md\#performance),
+[testing](\.\./\.\./\.\./\.\./index\.md\#testing)
+
+# CATEGORY
+
+Benchmark tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/bench/bench_wtext.md
Index: embedded/md/tcllib/files/modules/bench/bench_wtext.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bench/bench_wtext.md
@@ -0,0 +1,104 @@
+
+[//000000001]: # (bench::out::text \- Benchmarking/Performance tools)
+[//000000002]: # (Generated from file 'bench\_wtext\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (bench::out::text\(n\) 0\.1\.2 tcllib "Benchmarking/Performance tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bench::out::text \- bench::out::text \- Formatting benchmark results as human
+readable text
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require bench::out::text ?0\.1\.2?
+
+[__::bench::out::text__ *bench\_result*](#1)
+
+# DESCRIPTION
+
+This package provides commands for fomatting of benchmark results into human
+readable text\.
+
+A reader interested in the generation or processing of such results should go
+and read *[bench \- Processing benchmark suites](bench\.md)* instead\.
+
+If the bench language itself is the actual interest please start with the
+*[bench language introduction](bench\_lang\_intro\.md)* and then proceed from
+there to the formal *[bench language specification](bench\_lang\_spec\.md)*\.
+
+# PUBLIC API
+
+ - __::bench::out::text__ *bench\_result*
+
+ This command formats the specified benchmark result for output to a file,
+ socket, etc\. This specific command generates human readable text\.
+
+ For other formatting styles see the packages __[bench](bench\.md)__
+ and __[bench::out::csv](bench\_wcsv\.md)__ which provide commands to
+ format benchmark results in raw form, or as importable CSV data,
+ respectively\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bench* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[bench](bench\.md), [bench::out::csv](bench\_wcsv\.md)
+
+# KEYWORDS
+
+[benchmark](\.\./\.\./\.\./\.\./index\.md\#benchmark),
+[formatting](\.\./\.\./\.\./\.\./index\.md\#formatting), [human
+readable](\.\./\.\./\.\./\.\./index\.md\#human\_readable),
+[performance](\.\./\.\./\.\./\.\./index\.md\#performance),
+[testing](\.\./\.\./\.\./\.\./index\.md\#testing),
+[text](\.\./\.\./\.\./\.\./index\.md\#text)
+
+# CATEGORY
+
+Benchmark tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/bibtex/bibtex.md
Index: embedded/md/tcllib/files/modules/bibtex/bibtex.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/bibtex/bibtex.md
@@ -0,0 +1,198 @@
+
+[//000000001]: # (bibtex \- bibtex)
+[//000000002]: # (Generated from file 'bibtex\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2005 for documentation, Andreas Kupries )
+[//000000004]: # (bibtex\(n\) 0\.6 tcllib "bibtex")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+bibtex \- Parse bibtex files
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require bibtex ?0\.6?
+
+[__::bibtex::parse__ ?*options*? ?*text*?](#1)
+[__::bibtex::parse__ *text*](#2)
+[__::bibtex::parse__ ?__\-command__ *cmd*? __\-channel__ *chan*](#3)
+[__::bibtex::parse__ ?__\-recordcommand__ *recordcmd*? ?__\-preamblecommand__ *preamblecmd*? ?__\-stringcommand__ *stringcmd*? ?__\-commentcommand__ *commentcmd*? ?__\-progresscommand__ *progresscmd*? ?__\-casesensitivestrings__ *bool*? \(*text* | __\-channel__ *chan*\)](#4)
+[__::bibtex::wait__ *token*](#5)
+[__::bibtex::destroy__ *token*](#6)
+[__::bibtex::addStrings__ *token* *stringdict*](#7)
+
+# DESCRIPTION
+
+This package provides commands for the parsing of bibliographies in BibTeX
+format\.
+
+ - __::bibtex::parse__ ?*options*? ?*text*?
+
+ This is the general form of the command for parsing a bibliography\.
+ Depending on the options used to invoke it it will either return a token for
+ the parser, or the parsed entries of the input bibliography\. Instead of
+ performing an immediate parse returning a predefined format the command can
+ also enter an event\-based parsing style where all relevant entries in the
+ input are reported through callback commands, in the style of SAX\.
+
+ - __::bibtex::parse__ *text*
+
+ In this form the command will assume that the specified *text* is a
+ bibliography in BibTeX format, parse it, and then return a list containing
+ one element per record found in the bibliography\. Note that comments, string
+ definitions, preambles, etc\. will not show up in the result\. Each element
+ will be a list containing record type, bibliography key and record data, in
+ this order\. The record data will be a dictionary, its keys the keys of the
+ record, with the associated values\.
+
+ - __::bibtex::parse__ ?__\-command__ *cmd*? __\-channel__ *chan*
+
+ In this form the command will reads the bibliography from the specified Tcl
+ channel *chan* and then returns the same data structure as described
+ above\.
+
+ If however the option __\-command__ is specified the result will be a
+ handle for the parser instead and all processing will be incremental and
+ happen in the background\. When the input has been exhausted the callback
+ *cmd* will be invoked with the result of the parse\. The exact definition
+ for the callback is
+
+ * __cmd__ *token* *parseresult*
+
+ The parse result will have the structure explained above, for the
+ simpler forms of the parser\.
+
+ *Note* that the parser will *not* close the channel after it has
+ exhausted it\. This is still the responsibility of the user of the parser\.
+
+ - __::bibtex::parse__ ?__\-recordcommand__ *recordcmd*? ?__\-preamblecommand__ *preamblecmd*? ?__\-stringcommand__ *stringcmd*? ?__\-commentcommand__ *commentcmd*? ?__\-progresscommand__ *progresscmd*? ?__\-casesensitivestrings__ *bool*? \(*text* | __\-channel__ *chan*\)
+
+ This is the most low\-level form for the parser\. The returned result will be
+ a handle for the parser\. During processing it will invoke the invoke the
+ specified callback commands for each type of data found in the bibliography\.
+
+ The processing will be incremental and happen in the background if, and only
+ if a Tcl channel *chan* is specified\. For a *text* the processing will
+ happen immediately and all callbacks will be invoked before the command
+ itself returns\.
+
+ The callbacks, i\.e\. *\*cmd*, are all command prefixes and will be invoked
+ with additional arguments appended to them\. The meaning of the arguments
+ depends on the callback and is explained below\. The first argument will
+ however always be the handle of the parser invoking the callback\.
+
+ * __\-casesensitivestrings__
+
+ This option takes a boolean value\. When set string macro processing
+ becomes case\-sensitive\. The default is case\-insensitive string macro
+ processing\.
+
+ * __recordcmd__ *token* *type* *key* *recorddict*
+
+ This callback is invoked whenever the parser detects a bibliography
+ record in the input\. Its arguments are the record type, the bibliography
+ key for the record, and a dictionary containing the keys and values
+ describing the record\. Any string macros known to the parser have
+ already been expanded\.
+
+ * __preamblecmd__ *token* *preambletext*
+
+ This callback is invoked whenever the parser detects an @preamble block
+ in the input\. The only additional argument is the text found in the
+ preamble block\. By default such entries are ignored\.
+
+ * __stringcmd__ *token* *stringdict*
+
+ This callback is invoked whenever the parser detects an @string\-based
+ macro definition in the input\. The argument is a dictionary with the
+ macro names as keys and their replacement strings as values\. By default
+ such definitions are added to the parser state for use in future
+ bibliography records\.
+
+ * __commentcmd__ *token* *commenttext*
+
+ This callback is invoked whenever the parser detects a comment in the
+ input\. The only additional argument is the comment text\. By default such
+ entries are ignored\.
+
+ * __progresscmd__ *token* *percent*
+
+ This callback is invoked during processing to tell the user about the
+ progress which has been made\. Its argument is the percentage of data
+ processed, as integer number between __0__ and __100__\. In the
+ case of incremental processing the perecentage will always be __\-1__
+ as the total number of entries is not known beforehand\.
+
+ - __::bibtex::wait__ *token*
+
+ This command waits for the parser represented by the *token* to complete
+ and then returns\. The returned result is the empty string\.
+
+ - __::bibtex::destroy__ *token*
+
+ This command cleans up all internal state associated with the parser
+ represented by the handle *token*, effectively destroying it\. This command
+ can be called from within the parser callbacks to terminate processing\.
+
+ - __::bibtex::addStrings__ *token* *stringdict*
+
+ This command adds the macro definitions stored in the dictionary
+ *stringdict* to the parser represented by the handle *token*\.
+
+ The dictionary keys are the macro names and the values their replacement
+ strings\. This command has the correct signature for use as a
+ __\-stringcommand__ callback in an invokation of the command
+ __::bibtex::parse__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *bibtex* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[bibliography](\.\./\.\./\.\./\.\./index\.md\#bibliography),
+[bibtex](\.\./\.\./\.\./\.\./index\.md\#bibtex),
+[parsing](\.\./\.\./\.\./\.\./index\.md\#parsing), [text
+processing](\.\./\.\./\.\./\.\./index\.md\#text\_processing)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Copyright © 2005 for documentation, Andreas Kupries
ADDED embedded/md/tcllib/files/modules/blowfish/blowfish.md
Index: embedded/md/tcllib/files/modules/blowfish/blowfish.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/blowfish/blowfish.md
@@ -0,0 +1,198 @@
+
+[//000000001]: # (blowfish \- Blowfish Block Cipher)
+[//000000002]: # (Generated from file 'blowfish\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2003, Pat Thoyts )
+[//000000004]: # (blowfish\(n\) 1\.0\.3 tcllib "Blowfish Block Cipher")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+blowfish \- Implementation of the Blowfish block cipher
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [PROGRAMMING INTERFACE](#section3)
+
+ - [MODES OF OPERATION](#section4)
+
+ - [EXAMPLES](#section5)
+
+ - [REFERENCES](#section6)
+
+ - [AUTHORS](#section7)
+
+ - [Bugs, Ideas, Feedback](#section8)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require blowfish ?1\.0\.4?
+
+[__::blowfish::blowfish__ ?*\-mode \[ecb|cbc\]*? ?*\-dir \[encrypt|decrypt\]*? *\-key keydata* ?*\-iv vector*? ?*\-out channel*? ?*\-chunksize size*? ?*\-pad padchar*? \[ *\-in channel* | ?*\-\-*? *data* \]](#1)
+[__::blowfish::Init__ *mode* *keydata* *iv*](#2)
+[__::blowfish::Encrypt__ *Key* *data*](#3)
+[__::blowfish::Decrypt__ *Key* *data*](#4)
+[__::blowfish::Reset__ *Key* *iv*](#5)
+[__::blowfish::Final__ *Key*](#6)
+
+# DESCRIPTION
+
+This package is an implementation in Tcl of the Blowfish algorithm developed by
+Bruce Schneier \[1\]\. Blowfish is a 64\-bit block cipher designed to operate
+quickly on 32 bit architectures and accepting a variable key length\. This
+implementation supports ECB and CBC mode blowfish encryption\.
+
+# COMMANDS
+
+ - __::blowfish::blowfish__ ?*\-mode \[ecb|cbc\]*? ?*\-dir \[encrypt|decrypt\]*? *\-key keydata* ?*\-iv vector*? ?*\-out channel*? ?*\-chunksize size*? ?*\-pad padchar*? \[ *\-in channel* | ?*\-\-*? *data* \]
+
+ Perform the __blowfish__ algorithm on either the data provided by the
+ argument or on the data read from the *\-in* channel\. If an *\-out*
+ channel is given then the result will be written to this channel\.
+
+ The *\-key* option must be given\. This parameter takes a binary string of
+ variable length and is used to generate the __blowfish__ key schedule\.
+ You should be aware that creating a key schedule is quite an expensive
+ operation in blowfish so it is worth reusing the key where possible\. See
+ __Reset__\.
+
+ The *\-mode* and *\-dir* options are optional and default to cbc mode and
+ encrypt respectively\. The initialization vector *\-iv* takes an 8 byte
+ binary argument which defaults to 8 zeros\. See [MODES OF
+ OPERATION](#section4) for more about available modes and their uses\.
+
+ Blowfish is a 64\-bit block cipher\. This means that the data must be provided
+ in units that are a multiple of 8 bytes\. The __blowfish__ command will
+ by default add nul characters to pad the input data to a multiple of 8 bytes
+ if necessary\. The programming api commands will never add padding and
+ instead will raise an error if the input is not a multiple of the block
+ size\. The *\-pad* option can be used to change the padding character or to
+ disable padding if the empty string is provided as the argument\.
+
+# PROGRAMMING INTERFACE
+
+ - __::blowfish::Init__ *mode* *keydata* *iv*
+
+ Construct a new blowfish key schedule using the specified key data and the
+ given initialization vector\. The initialization vector is not used with ECB
+ mode but is important for CBC mode\. See [MODES OF OPERATION](#section4)
+ for details about cipher modes\.
+
+ - __::blowfish::Encrypt__ *Key* *data*
+
+ Use a prepared key acquired by calling __Init__ to encrypt the provided
+ data\. The data argument should be a binary array that is a multiple of the
+ block size of 8 bytes\. The result is a binary array the same size as the
+ input of encrypted data\.
+
+ - __::blowfish::Decrypt__ *Key* *data*
+
+ Decipher data using the key\. Note that the same key may be used to encrypt
+ and decrypt data provided that the initialization vector is reset
+ appropriately for CBC mode\.
+
+ - __::blowfish::Reset__ *Key* *iv*
+
+ Reset the initialization vector\. This permits the programmer to re\-use a key
+ and avoid the cost of re\-generating the key schedule where the same key data
+ is being used multiple times\.
+
+ - __::blowfish::Final__ *Key*
+
+ This should be called to clean up resources associated with *Key*\. Once
+ this function has been called the key may not be used again\.
+
+# MODES OF OPERATION
+
+ - Electronic Code Book \(ECB\)
+
+ ECB is the basic mode of all block ciphers\. Each block is encrypted
+ independently and so identical plain text will produce identical output when
+ encrypted with the same key\. Any encryption errors will only affect a single
+ block however this is vulnerable to known plaintext attacks\.
+
+ - Cipher Block Chaining \(CBC\)
+
+ CBC mode uses the output of the last block encryption to affect the current
+ block\. An initialization vector of the same size as the cipher block size is
+ used to handle the first block\. The initialization vector should be chosen
+ randomly and transmitted as the first block of the output\. Errors in
+ encryption affect the current block and the next block after which the
+ cipher will correct itself\. CBC is the most commonly used mode in software
+ encryption\.
+
+# EXAMPLES
+
+ % blowfish::blowfish \-hex \-mode ecb \-dir encrypt \-key secret01 "hello, world\!"
+ d0d8f27e7a374b9e2dbd9938dd04195a
+
+ set Key \[blowfish::Init cbc $eight\_bytes\_key\_data $eight\_byte\_iv\]
+ append ciphertext \[blowfish::Encrypt $Key $plaintext\]
+ append ciphertext \[blowfish::Encrypt $Key $additional\_plaintext\]
+ blowfish::Final $Key
+
+# REFERENCES
+
+ 1. Schneier, B\. "Applied Cryptography, 2nd edition", 1996, ISBN 0\-471\-11709\-9,
+ pub\. John Wiley & Sons\.
+
+# AUTHORS
+
+Frank Pilhofer, Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *blowfish* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+3des, [des](\.\./des/des\.md), [rc4](\.\./rc4/rc4\.md)
+
+# KEYWORDS
+
+[block cipher](\.\./\.\./\.\./\.\./index\.md\#block\_cipher),
+[blowfish](\.\./\.\./\.\./\.\./index\.md\#blowfish),
+[cryptography](\.\./\.\./\.\./\.\./index\.md\#cryptography),
+[encryption](\.\./\.\./\.\./\.\./index\.md\#encryption),
+[security](\.\./\.\./\.\./\.\./index\.md\#security)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2003, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/cache/async.md
Index: embedded/md/tcllib/files/modules/cache/async.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/cache/async.md
@@ -0,0 +1,167 @@
+
+[//000000001]: # (cache::async \- In\-memory caches)
+[//000000002]: # (Generated from file 'async\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2008 Andreas Kupries )
+[//000000004]: # (cache::async\(n\) 0\.3\.1 tcllib "In\-memory caches")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+cache::async \- Asynchronous in\-memory cache
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require cache::async ?0\.3\.1?
+
+[__::cache::async__ *objectName* *commandprefix* ?*options*\.\.\.?](#1)
+[*objectName* __get__ *key* *donecmdprefix*](#2)
+[*objectName* __set__ *key* *value*](#3)
+[*objectName* __unset__ *key*](#4)
+[*objectName* __exists__ *key*](#5)
+[*objectName* __clear__ ?*key*?](#6)
+
+# DESCRIPTION
+
+This package provides objects which cache data in memory, and operate
+asynchronously with regard to request and responses\. The objects are agnostic
+with regard to cache keys and values, and unknown methods are delegated to the
+provider of cached data\. These two properties make it easy to use caches as a
+facade for any data provider\.
+
+# API
+
+The package exports a class, __cache::async__, as specified below\.
+
+ - __::cache::async__ *objectName* *commandprefix* ?*options*\.\.\.?
+
+ The command creates a new *[cache](\.\./\.\./\.\./\.\./index\.md\#cache)* object
+ with an associated global Tcl command whose name is *objectName*\. This
+ command may be used to invoke various operations on the object\.
+
+ The *commandprefix* is the action to perform when an user asks for data in
+ the cache and the cache doesn't yet know about the key\. When run the
+ commandprefix is given three additional arguments, the string __get__,
+ the key requested, and the cache object itself, in the form of its object
+ command, in this order\. The execution of the action is done in an
+ idle\-handler, decoupling it from the original request\.
+
+ The only supported option is
+
+ * __\-full\-async\-results__
+
+ This option defines the behaviour of the cache for when requested keys
+ are known to the cache at the time of __get__ request\. By default
+ such requeste are responded to asynchronously as well\. Setting this
+ option to __false__ forces the cache to respond to them
+ synchronuously, although still through the specified callback\.
+
+The object commands created by the class commands above have the form:
+
+ - *objectName* __get__ *key* *donecmdprefix*
+
+ This method requests the data for the *key* from the cache\. If the data is
+ not yet known the command prefix specified during construction of the cache
+ object is used to ask for this information\.
+
+ Whenever the information is/becomes available the *donecmdprefix* will be
+ run to transfer the result to the caller\. This command prefix is invoked
+ with either 2 or 3 arguments, i\.e\.
+
+ The string __set__, the *key*, and the value\.
+
+ The string __unset__, and the *key*\.
+
+ These two possibilities are used to either signal the value for the *key*,
+ or that the *key* has no value defined for it\. The latter is distinct from
+ the cache not knowing about the *key*\.
+
+ For a cache object configured to be fully asynchronous \(default\) the
+ *donecmdprefix* is always run in an idle\-handler, decoupling it from the
+ request\. Otherwise the callback will be invoked synchronously when the
+ *key* is known to the cache at the time of the invokation\.
+
+ Another important part of the cache's behaviour, as it is asynchronous it is
+ possible that multiple __get__ requests are issued for the same *key*
+ before it can respond\. In that case the cache will issue only one data
+ request to the provider, for the first of these, and suspend the others, and
+ then notify all of them when the data becomes available\.
+
+ - *objectName* __set__ *key* *value*
+
+ - *objectName* __unset__ *key*
+
+ These two methods are provided to allow users of the cache to make keys
+ known to the cache, as either having a *value*, or as undefined\.
+
+ It is expected that the data provider \(see *commandprefix* of the
+ constructor\) uses them in response to data requests for unknown keys\.
+
+ Note how this matches the cache's own API towards its caller, calling the
+ *donecmd* of __get__\-requests issued to itself with either "set key
+ value" or "unset key", versus issuing __get__\-requests to its own
+ provider with itself in the place of the *donecmd*, expecting to be called
+ with either "set key value" or "unset key"\.
+
+ This also means that these methods invoke the *donecmd* of all
+ __get__\-requests waiting for information about the modified *key*\.
+
+ - *objectName* __exists__ *key*
+
+ This method queries the cache for knowledge about the *key* and returns a
+ boolean value\. The result is __true__ if the key is known, and
+ __false__ otherwise\.
+
+ - *objectName* __clear__ ?*key*?
+
+ This method resets the state of either the specified *key* or of all keys
+ known to the cache, making it unkown\. This forces future
+ __get__\-requests to reload the information from the provider\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *cache* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[asynchronous](\.\./\.\./\.\./\.\./index\.md\#asynchronous),
+[cache](\.\./\.\./\.\./\.\./index\.md\#cache),
+[callback](\.\./\.\./\.\./\.\./index\.md\#callback),
+[synchronous](\.\./\.\./\.\./\.\./index\.md\#synchronous)
+
+# COPYRIGHT
+
+Copyright © 2008 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/clock/iso8601.md
Index: embedded/md/tcllib/files/modules/clock/iso8601.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/clock/iso8601.md
@@ -0,0 +1,74 @@
+
+[//000000001]: # (clock\_iso8601 \- Date/Time Utilities)
+[//000000002]: # (Generated from file 'iso8601\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (clock\_iso8601\(n\) 0\.1 tcllib "Date/Time Utilities")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+clock\_iso8601 \- Parsing ISO 8601 dates/times
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [Category](#category)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+package require clock::iso8601 ?0\.1?
+
+[__::clock::iso8601 parse\_date__ *date* *options\.\.\.*](#1)
+[__::clock::iso8601 parse\_time__ *time* *options\.\.\.*](#2)
+
+# DESCRIPTION
+
+This package provides functionality to parse dates and times in ISO 8601 format\.
+
+ - __::clock::iso8601 parse\_date__ *date* *options\.\.\.*
+
+ This command parses an ISO8601 date string in an unknown variant and returns
+ the given date/time in seconds since epoch\.
+
+ The acceptable options are __\-base__, __\-gmt__, __\-locale__, and
+ __\-timezone__ of the builtin command __clock scan__\.
+
+ - __::clock::iso8601 parse\_time__ *time* *options\.\.\.*
+
+ This command parses a full ISO8601 timestamp string \(date and time\) in an
+ unknown variant and returns the given time in seconds since epoch\.
+
+ The acceptable options are __\-base__, __\-gmt__, __\-locale__, and
+ __\-timezone__ of the builtin command __clock scan__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *clock::iso8601* of the
+[Tcllib Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report
+any ideas for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# CATEGORY
+
+Text processing
ADDED embedded/md/tcllib/files/modules/clock/rfc2822.md
Index: embedded/md/tcllib/files/modules/clock/rfc2822.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/clock/rfc2822.md
@@ -0,0 +1,63 @@
+
+[//000000001]: # (clock\_rfc2822 \- Date/Time Utilities)
+[//000000002]: # (Generated from file 'rfc2822\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (clock\_rfc2822\(n\) 0\.1 tcllib "Date/Time Utilities")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+clock\_rfc2822 \- Parsing ISO 8601 dates/times
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [Category](#category)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+package require clock::rfc2822 ?0\.1?
+
+[__::clock::rfc2822 parse\_date__ *date*](#1)
+
+# DESCRIPTION
+
+This package provides functionality to parse dates in RFC 2822 format\.
+
+ - __::clock::rfc2822 parse\_date__ *date*
+
+ This command parses an RFC2822 date string and returns the given date in
+ seconds since epoch\. An error is thrown if the command is unable to parse
+ the date\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *clock::rfc2822* of the
+[Tcllib Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report
+any ideas for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# CATEGORY
+
+Text processing
ADDED embedded/md/tcllib/files/modules/cmdline/cmdline.md
Index: embedded/md/tcllib/files/modules/cmdline/cmdline.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/cmdline/cmdline.md
@@ -0,0 +1,231 @@
+
+[//000000001]: # (cmdline \- Command line and option processing)
+[//000000002]: # (Generated from file 'cmdline\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (cmdline\(n\) 1\.5 tcllib "Command line and option processing")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+cmdline \- Procedures to process command lines and options\.
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [::argv handling](#section2)
+
+ - [API](#section3)
+
+ - [Error Codes](#subsection1)
+
+ - [EXAMPLES](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require cmdline ?1\.3\.3?
+
+[__::cmdline::getopt__ *argvVar* *optstring* *optVar* *valVar*](#1)
+[__::cmdline::getKnownOpt__ *argvVar* *optstring* *optVar* *valVar*](#2)
+[__::cmdline::getoptions__ *arglistVar* *optlist* ?*usage*?](#3)
+[__::cmdline::getKnownOptions__ *arglistVar* *optlist* ?*usage*?](#4)
+[__::cmdline::usage__ *optlist* ?*usage*?](#5)
+[__::cmdline::getfiles__ *patterns* *quiet*](#6)
+[__::cmdline::getArgv0__](#7)
+
+# DESCRIPTION
+
+This package provides commands to parse command lines and options\.
+
+# ::argv handling
+
+One of the most common variables this package will be used with is
+__::argv__, which holds the command line of the current application\. This
+variable has a companion __::argc__ which is initialized to the number of
+elements in __::argv__ at the beginning of the application\.
+
+The commands in this package will *not* modify the __::argc__ companion
+when called with __::argv__\. Keeping the value consistent, if such is
+desired or required, is the responsibility of the caller\.
+
+# API
+
+ - __::cmdline::getopt__ *argvVar* *optstring* *optVar* *valVar*
+
+ This command works in a fashion like the standard C based __getopt__
+ function\. Given an option string and a pointer to an array of args this
+ command will process the first argument and return info on how to proceed\.
+ The command returns 1 if an option was found, 0 if no more options were
+ found, and \-1 if an error occurred\.
+
+ *argvVar* contains the name of the list of arguments to process\. If
+ options are found the list is modified and the processed arguments are
+ removed from the start of the list\.
+
+ *optstring* contains a list of command options that the application will
+ accept\. If the option ends in "\.arg" the command will use the next argument
+ as an argument to the option, or extract it from the current argument, if it
+ is of the form "option=value"\. Otherwise the option is a boolean that is set
+ to 1 if present\.
+
+ *optVar* refers to the variable the command will store the found option
+ into \(without the leading '\-' and without the \.arg extension\)\.
+
+ *valVar* refers to the variable to store either the value for the
+ specified option into upon success or an error message in the case of
+ failure\. The stored value comes from the command line for \.arg options,
+ otherwise the value is 1\.
+
+ - __::cmdline::getKnownOpt__ *argvVar* *optstring* *optVar* *valVar*
+
+ Like __::cmdline::getopt__, but ignores any unknown options in the
+ input\.
+
+ - __::cmdline::getoptions__ *arglistVar* *optlist* ?*usage*?
+
+ Processes the set of command line options found in the list variable named
+ by *arglistVar* and fills in defaults for those not specified\. This also
+ generates an error message that lists the allowed flags if an incorrect flag
+ is specified\. The optional *usage*\-argument contains a string to include
+ in front of the generated message\. If not present it defaults to "options:"\.
+
+ *optlist* contains a list of lists where each element specifies an option
+ in the form: *flag* *default* *comment*\.
+
+ If *flag* ends in "\.arg" then the value is taken from the command line\.
+ Otherwise it is a boolean and appears in the result if present on the
+ command line\. If *flag* ends in "\.secret", it will not be displayed in the
+ usage\.
+
+ The options __\-?__, __\-help__, and __\-\-__ are implicitly
+ understood\. The first two abort option processing by throwing an error and
+ force the generation of the usage message, whereas the the last aborts
+ option processing without an error, leaving all arguments coming after for
+ regular processing, even if starting with a dash\.
+
+ The result of the command is a dictionary mapping all options to their
+ values, be they user\-specified or defaults\.
+
+ - __::cmdline::getKnownOptions__ *arglistVar* *optlist* ?*usage*?
+
+ Like __::cmdline::getoptions__, but ignores any unknown options in the
+ input\.
+
+ - __::cmdline::usage__ *optlist* ?*usage*?
+
+ Generates and returns an error message that lists the allowed flags\.
+ *optlist* is defined as for __::cmdline::getoptions__\. The optional
+ *usage*\-argument contains a string to include in front of the generated
+ message\. If not present it defaults to "options:"\.
+
+ - __::cmdline::getfiles__ *patterns* *quiet*
+
+ Given a list of file *patterns* this command computes the set of valid
+ files\. On windows, file globbing is performed on each argument\. On Unix,
+ only file existence is tested\. If a file argument produces no valid files, a
+ warning is optionally generated \(set *quiet* to true\)\.
+
+ This code also uses the full path for each file\. If not given it prepends
+ the current working directory to the filename\. This ensures that these files
+ will never conflict with files in a wrapped zip file\. The last sentence
+ refers to the pro\-tools\.
+
+ - __::cmdline::getArgv0__
+
+ This command returns the "sanitized" version of *argv0*\. It will strip off
+ the leading path and removes the extension "\.bin"\. The latter is used by the
+ pro\-apps because they must be wrapped by a shell script\.
+
+## Error Codes
+
+Starting with version 1\.5 all errors thrown by the package have a proper
+__::errorCode__ for use with Tcl's __[try](\.\./try/tcllib\_try\.md)__
+command\. This code always has the word __CMDLINE__ as its first element\.
+
+# EXAMPLES
+
+ package require Tcl 8\.5
+ package require try ;\# Tcllib\.
+ package require cmdline 1\.5 ;\# First version with proper error\-codes\.
+
+ \# Notes:
+ \# \- Tcl 8\.6\+ has 'try' as a builtin command and therefore does not
+ \# need the 'try' package\.
+ \# \- Before Tcl 8\.5 we cannot support 'try' and have to use 'catch'\.
+ \# This then requires a dedicated test \(if\) on the contents of
+ \# ::errorCode to separate the CMDLINE USAGE signal from actual errors\.
+
+ set options \{
+ \{a "set the atime only"\}
+ \{m "set the mtime only"\}
+ \{c "do not create non\-existent files"\}
+ \{r\.arg "" "use time from ref\_file"\}
+ \{t\.arg \-1 "use specified time"\}
+ \}
+ set usage ": MyCommandName \\\[options\] filename \.\.\.\\noptions:"
+
+ try \{
+ array set params \[::cmdline::getoptions argv $options $usage\]
+ \} trap \{CMDLINE USAGE\} \{msg o\} \{
+ \# Trap the usage signal, print the message, and exit the application\.
+ \# Note: Other errors are not caught and passed through to higher levels\!
+ puts $msg
+ exit 1
+ \}
+
+ if \{ $params\(a\) \} \{ set set\_atime "true" \}
+ set has\_t \[expr \{$params\(t\) \!= \-1\}\]
+ set has\_r \[expr \{\[string length $params\(r\)\] > 0\}\]
+ if \{$has\_t && $has\_r\} \{
+ return \-code error "Cannot specify both \-r and \-t"
+ \} elseif \{$has\_t\} \{
+ \.\.\.
+ \}
+
+This example, taken \(and slightly modified\) from the package
+__[fileutil](\.\./fileutil/fileutil\.md)__, shows how to use cmdline\.
+First, a list of options is created, then the 'args' list is passed to cmdline
+for processing\. Subsequently, different options are checked to see if they have
+been passed to the script, and what their value is\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *cmdline* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[argument processing](\.\./\.\./\.\./\.\./index\.md\#argument\_processing),
+[argv](\.\./\.\./\.\./\.\./index\.md\#argv), [argv0](\.\./\.\./\.\./\.\./index\.md\#argv0),
+[cmdline processing](\.\./\.\./\.\./\.\./index\.md\#cmdline\_processing), [command
+line processing](\.\./\.\./\.\./\.\./index\.md\#command\_line\_processing)
+
+# CATEGORY
+
+Programming tools
ADDED embedded/md/tcllib/files/modules/comm/comm.md
Index: embedded/md/tcllib/files/modules/comm/comm.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/comm/comm.md
@@ -0,0 +1,1109 @@
+
+[//000000001]: # (comm \- Remote communication)
+[//000000002]: # (Generated from file 'comm\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 1995\-1998 The Open Group\. All Rights Reserved\.
+Copyright © 2003\-2004 ActiveState Corporation\.
+Copyright © 2006\-2009 Andreas Kupries )
+[//000000004]: # (comm\(n\) 4\.6\.3 tcllib "Remote communication")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+comm \- A remote communication facility for Tcl \(8\.3 and later\)
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Commands](#subsection1)
+
+ - [Eval Semantics](#subsection2)
+
+ - [Multiple Channels](#subsection3)
+
+ - [Channel Configuration](#subsection4)
+
+ - [Id/port Assignments](#subsection5)
+
+ - [Execution Environment](#subsection6)
+
+ - [Remote Interpreters](#subsection7)
+
+ - [Closing Connections](#subsection8)
+
+ - [Callbacks](#subsection9)
+
+ - [Unsupported](#subsection10)
+
+ - [Security](#subsection11)
+
+ - [Blocking Semantics](#subsection12)
+
+ - [Asynchronous Result Generation](#subsection13)
+
+ - [Compatibility](#subsection14)
+
+ - [TLS Security Considerations](#section2)
+
+ - [Author](#section3)
+
+ - [License](#section4)
+
+ - [Bugs](#section5)
+
+ - [On Using Old Versions Of Tcl](#section6)
+
+ - [Related Work](#section7)
+
+ - [Bugs, Ideas, Feedback](#section8)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.3
+package require comm ?4\.6\.3?
+
+[__::comm::comm send__ ?\-async? ?\-command *callback*? *id* *cmd* ?*arg arg \.\.\.*?](#1)
+[__::comm::comm self__](#2)
+[__::comm::comm interps__](#3)
+[__::comm::comm connect__ ?*id*?](#4)
+[__::comm::comm new__ *chan* ?*name value \.\.\.*?](#5)
+[__::comm::comm channels__](#6)
+[__::comm::comm config__](#7)
+[__::comm::comm config__ *name*](#8)
+[__::comm::comm config__ ?*name* *value* *\.\.\.*?](#9)
+[__::comm::comm shutdown__ *id*](#10)
+[__::comm::comm abort__](#11)
+[__::comm::comm destroy__](#12)
+[__::comm::comm hook__ *event* ?__\+__? ?*script*?](#13)
+[__::comm::comm remoteid__](#14)
+[__::comm::comm\_send__](#15)
+[__::comm::comm return\_async__](#16)
+[__$future__ __return__ ?__\-code__ *code*? ?*value*?](#17)
+[__$future__ __configure__ ?__\-command__ ?*cmdprefix*??](#18)
+[__$future__ __cget__ __\-command__](#19)
+
+# DESCRIPTION
+
+The __comm__ command provides an inter\-interpreter remote execution facility
+much like Tk's __send\(n\)__, except that it uses sockets rather than the X
+server for the communication path\. As a result, __comm__ works with multiple
+interpreters, works on Windows and Macintosh systems, and provides control over
+the remote execution path\.
+
+These commands work just like __[send](\.\./\.\./\.\./\.\./index\.md\#send)__ and
+__winfo interps__ :
+
+ ::comm::comm send ?\-async? id cmd ?arg arg \.\.\.?
+ ::comm::comm interps
+
+This is all that is really needed to know in order to use __comm__
+
+## Commands
+
+The package initializes __::comm::comm__ as the default *chan*\.
+
+__comm__ names communication endpoints with an *id* unique to each
+machine\. Before sending commands, the *id* of another interpreter is needed\.
+Unlike Tk's send, __comm__ doesn't implicitly know the *id*'s of all the
+interpreters on the system\. The following four methods make up the basic
+__comm__ interface\.
+
+ - __::comm::comm send__ ?\-async? ?\-command *callback*? *id* *cmd* ?*arg arg \.\.\.*?
+
+ This invokes the given command in the interpreter named by *id*\. The
+ command waits for the result and remote errors are returned unless the
+ __\-async__ or __\-command__ option is given\. If __\-async__ is
+ given, send returns immediately and there is no further notification of
+ result\. If __\-command__ is used, *callback* specifies a command to
+ invoke when the result is received\. These options are mutually exclusive\.
+ The callback will receive arguments in the form *\-option value*, suitable
+ for __array set__\. The options are: *\-id*, the comm id of the
+ interpreter that received the command; *\-serial*, a unique serial for each
+ command sent to a particular comm interpreter; *\-chan*, the comm channel
+ name; *\-code*, the result code of the command; *\-errorcode*, the
+ errorcode, if any, of the command; *\-errorinfo*, the errorinfo, if any, of
+ the command; and *\-result*, the return value of the command\. If connection
+ is lost before a reply is received, the callback will be invoked with a
+ connection lost message with \-code equal to \-1\. When __\-command__ is
+ used, the command returns the unique serial for the command\.
+
+ - __::comm::comm self__
+
+ Returns the *id* for this channel\.
+
+ - __::comm::comm interps__
+
+ Returns a list of all the remote *id*'s to which this channel is
+ connected\. __comm__ learns a new remote *id* when a command is first
+ issued it, or when a remote *id* first issues a command to this comm
+ channel\. __::comm::comm ids__ is an alias for this method\.
+
+ - __::comm::comm connect__ ?*id*?
+
+ Whereas __::comm::comm send__ will automatically connect to the given
+ *id*, this forces a connection to a remote *id* without sending a
+ command\. After this, the remote *id* will appear in __::comm::comm
+ interps__\.
+
+## Eval Semantics
+
+The evaluation semantics of __::comm::comm send__ are intended to match Tk's
+__[send](\.\./\.\./\.\./\.\./index\.md\#send)__ *exactly*\. This means that
+__comm__ evaluates arguments on the remote side\.
+
+If you find that __::comm::comm send__ doesn't work for a particular
+command, try the same thing with Tk's send and see if the result is different\.
+If there is a problem, please report it\. For instance, there was had one report
+that this command produced an error\. Note that the equivalent
+__[send](\.\./\.\./\.\./\.\./index\.md\#send)__ command also produces the same
+error\.
+
+ % ::comm::comm send id llength \{a b c\}
+ wrong \# args: should be "llength list"
+ % send name llength \{a b c\}
+ wrong \# args: should be "llength list"
+
+The __eval__ hook \(described below\) can be used to change from
+__[send](\.\./\.\./\.\./\.\./index\.md\#send)__'s double eval semantics to single
+eval semantics\.
+
+## Multiple Channels
+
+More than one __comm__ channel \(or *listener*\) can be created in each Tcl
+interpreter\. This allows flexibility to create full and restricted channels\. For
+instance, *[hook](\.\./\.\./\.\./\.\./index\.md\#hook)* scripts are specific to the
+channel they are defined against\.
+
+ - __::comm::comm new__ *chan* ?*name value \.\.\.*?
+
+ This creates a new channel and Tcl command with the given channel name\. This
+ new command controls the new channel and takes all the same arguments as
+ __::comm::comm__\. Any remaining arguments are passed to the
+ __config__ method\. The fully qualified channel name is returned\.
+
+ - __::comm::comm channels__
+
+ This lists all the channels allocated in this Tcl interpreter\.
+
+The default configuration parameters for a new channel are:
+
+ "\-port 0 \-local 1 \-listen 0 \-silent 0"
+
+The default channel __::comm::comm__ is created with:
+
+ "::comm::comm new ::comm::comm \-port 0 \-local 1 \-listen 1 \-silent 0"
+
+## Channel Configuration
+
+The __config__ method acts similar to __fconfigure__ in that it sets or
+queries configuration variables associated with a channel\.
+
+ - __::comm::comm config__
+
+ - __::comm::comm config__ *name*
+
+ - __::comm::comm config__ ?*name* *value* *\.\.\.*?
+
+ When given no arguments, __config__ returns a list of all variables and
+ their value With one argument, __config__ returns the value of just that
+ argument\. With an even number of arguments, the given variables are set to
+ the given values\.
+
+These configuration variables can be changed \(descriptions of them are elsewhere
+in this manual page\):
+
+ - __\-listen__ ?*0|1*?
+
+ - __\-local__ ?*0|1*?
+
+ - __\-port__ ?*port*?
+
+ - __\-silent__ ?*0|1*?
+
+ - __\-socketcmd__ ?*commandname*?
+
+ - __\-interp__ ?*interpreter*?
+
+ - __\-events__ ?*eventlist*?
+
+These configuration variables are read only:
+
+ - __\-chan__ *chan*
+
+ - __\-serial__ *n*
+
+ - __\-socket__ sock*In*
+
+When __config__ changes the parameters of an existing channel \(with the
+exception of __\-interp__ and __\-events__\), it closes and reopens the
+listening socket\. An automatically assigned channel *id* will change when this
+happens\. Recycling the socket is done by invoking __::comm::comm abort__,
+which causes all active sends to terminate\.
+
+## Id/port Assignments
+
+__comm__ uses a TCP port for endpoint *id*\. The __interps__ \(or
+__ids__\) method merely lists all the TCP ports to which the channel is
+connected\. By default, each channel's *id* is randomly assigned by the
+operating system \(but usually starts at a low value around 1024 and increases
+each time a new socket is opened\)\. This behavior is accomplished by giving the
+__\-port__ config option a value of 0\. Alternately, a specific TCP port
+number may be provided for a given channel\. As a special case, comm contains
+code to allocate a a high\-numbered TCP port \(>10000\) by using __\-port \{\}__\.
+Note that a channel won't be created and initialized unless the specific port
+can be allocated\.
+
+As a special case, if the channel is configured with __\-listen 0__, then it
+will not create a listening socket and will use an id of __0__ for itself\.
+Such a channel is only good for outgoing connections \(although once a connection
+is established, it can carry send traffic in both directions\)\. As another
+special case, if the channel is configured with __\-silent 0__, then the
+listening side will ignore connection attempts where the protocol negotiation
+phase failed, instead of throwing an error\.
+
+## Execution Environment
+
+A communication channel in its default configuration will use the current
+interpreter for the execution of all received scripts, and of the event scripts
+associated with the various hooks\.
+
+This insecure setup can be changed by the user via the two options
+__\-interp__, and __\-events__\.
+
+When __\-interp__ is set all received scripts are executed in the slave
+interpreter specified as the value of the option\. This interpreter is expected
+to exist before configuration\. I\.e\. it is the responsibility of the user to
+create it\. However afterward the communication channel takes ownership of this
+interpreter, and will destroy it when the communication channel is destroyed\.
+Note that reconfiguration of the communication channel to either a different
+interpreter or the empty string will release the ownership *without*
+destroying the previously configured interpreter\. The empty string has a special
+meaning, it restores the default behaviour of executing received scripts in the
+current interpreter\.
+
+*Also of note* is that replies and callbacks \(a special form of reply\) are
+*not* considered as received scripts\. They are trusted, part of the internal
+machinery of comm, and therefore always executed in the current interpreter\.
+
+Even if an interpreter has been configured as the execution environment for
+received scripts the event scripts associated with the various hooks will by
+default still be executed in the current interpreter\. To change this use the
+option __\-events__ to declare a list of the events whose scripts should be
+executed in the declared interpreter as well\. The contents of this option are
+ignored if the communication channel is configured to execute received scripts
+in the current interpreter\.
+
+## Remote Interpreters
+
+By default, each channel is restricted to accepting connections from the local
+system\. This can be overridden by using the __\-local 0__ configuration
+option For such channels, the *id* parameter takes the form *\{ id host \}*\.
+
+*WARNING*: The *host* must always be specified in the same form \(e\.g\., as
+either a fully qualified domain name, plain hostname or an IP address\)\.
+
+## Closing Connections
+
+These methods give control over closing connections:
+
+ - __::comm::comm shutdown__ *id*
+
+ This closes the connection to *id*, aborting all outstanding commands in
+ progress\. Note that nothing prevents the connection from being immediately
+ reopened by another incoming or outgoing command\.
+
+ - __::comm::comm abort__
+
+ This invokes shutdown on all open connections in this comm channel\.
+
+ - __::comm::comm destroy__
+
+ This aborts all connections and then destroys the this comm channel itself,
+ including closing the listening socket\. Special code allows the default
+ __::comm::comm__ channel to be closed such that the __::comm::comm__
+ command it is not destroyed\. Doing so closes the listening socket,
+ preventing both incoming and outgoing commands on the channel\. This sequence
+ reinitializes the default channel:
+
+ "::comm::comm destroy; ::comm::comm new ::comm::comm"
+
+When a remote connection is lost \(because the remote exited or called
+__shutdown__\), __comm__ can invoke an application callback\. This can be
+used to cleanup or restart an ancillary process, for instance\. See the *lost*
+callback below\.
+
+## Callbacks
+
+This is a mechanism for setting hooks for particular events:
+
+ - __::comm::comm hook__ *event* ?__\+__? ?*script*?
+
+ This uses a syntax similar to Tk's
+ __[bind](\.\./\.\./\.\./\.\./index\.md\#bind)__ command\. Prefixing *script*
+ with a __\+__ causes the new script to be appended\. Without this, a new
+ *script* replaces any existing script\. When invoked without a script, no
+ change is made\. In all cases, the new hook script is returned by the
+ command\.
+
+ When an *event* occurs, the *script* associated with it is evaluated
+ with the listed variables in scope and available\. The return code \(*not*
+ the return value\) of the script is commonly used decide how to further
+ process after the hook\.
+
+ Common variables include:
+
+ * __chan__
+
+ the name of the comm channel \(and command\)
+
+ * __id__
+
+ the id of the remote in question
+
+ * __fid__
+
+ the file id for the socket of the connection
+
+These are the defined *events*:
+
+ - __connecting__
+
+ Variables: __chan__, __id__
+
+ This hook is invoked before making a connection to the remote named in
+ *id*\. An error return \(via
+ __[error](\.\./\.\./\.\./\.\./index\.md\#error)__\) will abort the connection
+ attempt with the error\. Example:
+
+ % ::comm::comm hook connecting \{
+ if \{\[string match \{\*\[02468\]\} $id\]\} \{
+ error "Can't connect to even ids"
+ \}
+ \}
+ % ::comm::comm send 10000 puts ok
+ Connect to remote failed: Can't connect to even ids
+ %
+
+ - __connected__
+
+ Variables: __chan__, __fid__, __id__, __host__, and
+ __port__\.
+
+ This hook is invoked immediately after making a remote connection to *id*,
+ allowing arbitrary authentication over the socket named by *fid*\. An error
+ return \(via __[error](\.\./\.\./\.\./\.\./index\.md\#error)__ \) will close the
+ connection with the error\. *host* and *port* are merely extracted from
+ the *id*; changing any of these will have no effect on the connection,
+ however\. It is also possible to substitute and replace *fid*\.
+
+ - __incoming__
+
+ Variables: __chan__, __fid__, __addr__, and __remport__\.
+
+ Hook invoked when receiving an incoming connection, allowing arbitrary
+ authentication over socket named by *fid*\. An error return \(via
+ __[error](\.\./\.\./\.\./\.\./index\.md\#error)__\) will close the connection
+ with the error\. Note that the peer is named by *remport* and *addr* but
+ that the remote *id* is still unknown\. Example:
+
+ ::comm::comm hook incoming \{
+ if \{\[string match 127\.0\.0\.1 $addr\]\} \{
+ error "I don't talk to myself"
+ \}
+ \}
+
+ - __eval__
+
+ Variables: __chan__, __id__, __cmd__, and __buffer__\.
+
+ This hook is invoked after collecting a complete script from a remote but
+ *before* evaluating it\. This allows complete control over the processing
+ of incoming commands\. *cmd* contains either __send__ or __async__\.
+ *buffer* holds the script to evaluate\. At the time the hook is called,
+ *$chan remoteid* is identical in value to *id*\.
+
+ By changing *buffer*, the hook can change the script to be evaluated\. The
+ hook can short circuit evaluation and cause a value to be immediately
+ returned by using __[return](\.\./\.\./\.\./\.\./index\.md\#return)__
+ *result* \(or, from within a procedure, __return \-code return__
+ *result*\)\. An error return \(via
+ __[error](\.\./\.\./\.\./\.\./index\.md\#error)__\) will return an error
+ result, as is if the script caused the error\. Any other return will evaluate
+ the script in *buffer* as normal\. For compatibility with 3\.2,
+ __break__ and __return \-code break__ *result* is supported, acting
+ similarly to __return \{\}__ and __return \-code return__ *result*\.
+
+ Examples:
+
+ augmenting a command
+
+ % ::comm::comm send \[::comm::comm self\] pid
+ 5013
+ % ::comm::comm hook eval \{puts "going to execute $buffer"\}
+ % ::comm::comm send \[::comm::comm self\] pid
+ going to execute pid
+ 5013
+
+ short circuiting a command
+
+ % ::comm::comm hook eval \{puts "would have executed $buffer"; return 0\}
+ % ::comm::comm send \[::comm::comm self\] pid
+ would have executed pid
+ 0
+
+ Replacing double eval semantics
+
+ % ::comm::comm send \[::comm::comm self\] llength \{a b c\}
+ wrong \# args: should be "llength list"
+ % ::comm::comm hook eval \{return \[uplevel \#0 $buffer\]\}
+ return \[uplevel \#0 $buffer\]
+ % ::comm::comm send \[::comm::comm self\] llength \{a b c\}
+ 3
+
+ Using a slave interpreter
+
+ % interp create foo
+ % ::comm::comm hook eval \{return \[foo eval $buffer\]\}
+ % ::comm::comm send \[::comm::comm self\] set myvar 123
+ 123
+ % set myvar
+ can't read "myvar": no such variable
+ % foo eval set myvar
+ 123
+
+ Using a slave interpreter \(double eval\)
+
+ % ::comm::comm hook eval \{return \[eval foo eval $buffer\]\}
+
+ Subverting the script to execute
+
+ % ::comm::comm hook eval \{
+ switch \-\- $buffer \{
+ a \{return A\-OK\}
+ b \{return B\-OK\}
+ default \{error "$buffer is a no\-no"\}
+ \}
+ \}
+ % ::comm::comm send \[::comm::comm self\] pid
+ pid is a no\-no
+ % ::comm::comm send \[::comm::comm self\] a
+ A\-OK
+
+ - __reply__
+
+ Variables: __chan__, __id__, __buffer__, __ret__, and
+ __return\(\)__\.
+
+ This hook is invoked after collecting a complete reply script from a remote
+ but *before* evaluating it\. This allows complete control over the
+ processing of replies to sent commands\. The reply *buffer* is in one of
+ the following forms
+
+ return result
+
+ return \-code code result
+
+ return \-code code \-errorinfo info \-errorcode ecode msg
+
+ For safety reasons, this is decomposed\. The return result is in *ret*, and
+ the return switches are in the return array:
+
+ *return\(\-code\)*
+
+ *return\(\-errorinfo\)*
+
+ *return\(\-errorcode\)*
+
+ Any of these may be the empty string\. Modifying these four variables can
+ change the return value, whereas modifying *buffer* has no effect\.
+
+ - __callback__
+
+ Variables: __chan__, __id__, __buffer__, __ret__, and
+ __return\(\)__\.
+
+ Similar to *reply*, but used for callbacks\.
+
+ - __lost__
+
+ Variables: __chan__, __id__, and __reason__\.
+
+ This hook is invoked when the connection to __id__ is lost\. Return value
+ \(or thrown error\) is ignored\. *reason* is an explanatory string indicating
+ why the connection was lost\. Example:
+
+ ::comm::comm hook lost \{
+ global myvar
+ if \{$myvar\(id\) == $id\} \{
+ myfunc
+ return
+ \}
+ \}
+
+## Unsupported
+
+These interfaces may change or go away in subsequence releases\.
+
+ - __::comm::comm remoteid__
+
+ Returns the *id* of the sender of the last remote command executed on this
+ channel\. If used by a proc being invoked remotely, it must be called before
+ any events are processed\. Otherwise, another command may get invoked and
+ change the value\.
+
+ - __::comm::comm\_send__
+
+ Invoking this procedure will substitute the Tk
+ __[send](\.\./\.\./\.\./\.\./index\.md\#send)__ and __winfo interps__
+ commands with these equivalents that use __::comm::comm__\.
+
+ proc send \{args\} \{
+ eval ::comm::comm send $args
+ \}
+ rename winfo tk\_winfo
+ proc winfo \{cmd args\} \{
+ if \{\!\[string match in\* $cmd\]\} \{
+ return \[eval \[list tk\_winfo $cmd\] $args\]
+ \}
+ return \[::comm::comm interps\]
+ \}
+
+## Security
+
+Starting with version 4\.6 of the package an option __\-socketcmd__ is
+supported, allowing the user of a comm channel to specify which command to use
+when opening a socket\. Anything which is API\-compatible with the builtin
+__::socket__ \(the default\) can be used\.
+
+The envisioned main use is the specification of the __tls::socket__ command,
+see package __[tls](\.\./\.\./\.\./\.\./index\.md\#tls)__, to secure the
+communication\.
+
+ \# Load and initialize tls
+ package require tls
+ tls::init \-cafile /path/to/ca/cert \-keyfile \.\.\.
+
+ \# Create secured comm channel
+ ::comm::comm new SECURE \-socketcmd tls::socket \-listen 1
+ \.\.\.
+
+The sections [Execution Environment](#subsection6) and
+[Callbacks](#subsection9) are also relevant to the security of the system,
+providing means to restrict the execution to a specific environment, perform
+additional authentication, and the like\.
+
+## Blocking Semantics
+
+There is one outstanding difference between __comm__ and
+__[send](\.\./\.\./\.\./\.\./index\.md\#send)__\. When blocking in a synchronous
+remote command, __[send](\.\./\.\./\.\./\.\./index\.md\#send)__ uses an internal C
+hook \(Tk\_RestrictEvents\) to the event loop to look ahead for send\-related events
+and only process those without processing any other events\. In contrast,
+__comm__ uses the __[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__ command as
+a semaphore to indicate the return message has arrived\. The difference is that a
+synchronous __[send](\.\./\.\./\.\./\.\./index\.md\#send)__ will block the
+application and prevent all events \(including window related ones\) from being
+processed, while a synchronous __::comm::comm send__ will block the
+application but still allow other events to get processed\. In particular,
+__after idle__ handlers will fire immediately when comm blocks\.
+
+What can be done about this? First, note that this behavior will come from any
+code using __[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__ to block and wait for
+an event to occur\. At the cost of multiple channel support, __comm__ could
+be changed to do blocking I/O on the socket, giving send\-like blocking
+semantics\. However, multiple channel support is a very useful feature of comm
+that it is deemed too important to lose\. The remaining approaches involve a new
+loadable module written in C \(which is somewhat against the philosophy of
+__comm__\) One way would be to create a modified version of the
+__[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__ command that allow the event
+flags passed to Tcl\_DoOneEvent to be specified\. For __comm__, just the
+TCL\_FILE\_EVENTS would be processed\. Another way would be to implement a
+mechanism like Tk\_RestrictEvents, but apply it to the Tcl event loop \(since
+__comm__ doesn't require Tk\)\. One of these approaches will be available in a
+future __comm__ release as an optional component\.
+
+## Asynchronous Result Generation
+
+By default the result returned by a remotely invoked command is the result sent
+back to the invoker\. This means that the result is generated synchronously, and
+the server handling the call is blocked for the duration of the command\.
+
+While this is tolerable as long as only short\-running commands are invoked on
+the server long\-running commands, like database queries make this a problem\. One
+command can prevent the processing requests of all other clients for an
+arbitrary period of time\.
+
+Before version 4\.5 of comm the only solution was to rewrite the server command
+to use the Tcl builtin command __[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__,
+or one of its relatives like __tkwait__, to open a new event loop which
+processes requests while the long\-running operation is executed\. This however
+has its own perils, as this makes it possible to both overflow the Tcl stack
+with a large number of event loop, and to have a newer requests block the return
+of older ones, as the eventloop have to be unwound in the order of their
+creation\.
+
+The proper solution is to have the invoked command indicate to __comm__ that
+it cannot or will not deliver an immediate, synchronous result, but will do so
+later\. At that point the framework can put sending the actual result on hold and
+continue processing requests using the main event loop\. No blocking, no nesting
+of event loops\. At some future date the long running operation delivers the
+result to comm, via the future object, which is then forwarded to the invoker as
+usual\.
+
+The necessary support for this solution has been added to comm since version
+4\.5, in the form of the new method __return\_async__\.
+
+ - __::comm::comm return\_async__
+
+ This command is used by a remotely invoked script to notify the comm channel
+ which invoked it that the result to send back to the invoker is not
+ generated synchronously\. If this command is not called the default/standard
+ behaviour of comm is to send the synchronously generated result of the
+ script itself to the invoker\.
+
+ The result of __return\_async__ is an object\. This object, called a
+ *future* is where the result of the script has to be delivered to when it
+ becomes ready\. When that happens it will take all the necessary actions to
+ deliver the result to the invoker of the script, and then destroy itself\.
+ Should comm have lost the connection to the invoker while the result is
+ being computed the future will not try to deliver the result it got, but
+ just destroy itself\. The future can be configured with a command to call
+ when the invoker is lost\. This enables the user to implement an early abort
+ of the long\-running operation, should this be supported by it\.
+
+ An example:
+
+ \# Procedure invoked by remote clients to run database operations\.
+ proc select \{sql\} \{
+ \# Signal the async generation of the result
+
+ set future \[::comm::comm return\_async\]
+
+ \# Generate an async db operation and tell it where to deliver the result\.
+
+ set query \[db query \-command \[list $future return\] $sql\]
+
+ \# Tell the database system which query to cancel if the connection
+ \# goes away while it is running\.
+
+ $future configure \-command \[list db cancel $query\]
+
+ \# Note: The above will work without problem only if the async
+ \# query will nover run its completion callback immediately, but
+ \# only from the eventloop\. Because otherwise the future we wish to
+ \# configure may already be gone\. If that is possible use 'catch'
+ \# to prevent the error from propagating\.
+ return
+ \}
+
+ The API of a future object is:
+
+ * __$future__ __return__ ?__\-code__ *code*? ?*value*?
+
+ Use this method to tell the future that long\-running operation has
+ completed\. Arguments are an optional return value \(defaults to the empty
+ string\), and the Tcl return code \(defaults to OK\)\.
+
+ The future will deliver this information to invoker, if the connection
+ was not lost in the meantime, and then destroy itself\. If the connection
+ was lost it will do nothing but destroy itself\.
+
+ * __$future__ __configure__ ?__\-command__ ?*cmdprefix*??
+
+ * __$future__ __cget__ __\-command__
+
+ These methods allow the user to retrieve and set a command to be called
+ if the connection the future belongs to has been lost\.
+
+## Compatibility
+
+__comm__ exports itself as a package\. The package version number is in the
+form *major \. minor*, where the major version will only change when a
+non\-compatible change happens to the API or protocol\. Minor bug fixes and
+changes will only affect the minor version\. To load __comm__ this command is
+usually used:
+
+ package require comm 3
+
+Note that requiring no version \(or a specific version\) can also be done\.
+
+The revision history of __comm__ includes these releases:
+
+ - 4\.6\.3
+
+ Fixed ticket \[ced0d60fc9\]\. Added proper detection of eof on a socket,
+ properly closing it\.
+
+ - 4\.6\.2
+
+ Fixed bugs 2972571 and 3066872, the first a misdetection of quoted brace
+ after double backslash, the other a blocking gets making for an obvious
+ \(hinsight\) DoS attack on comm channels\.
+
+ - 4\.6\.1
+
+ Changed the implementation of __comm::commCollect__ to emulate lindex's
+ pre\-Tcl 8 behaviour, i\.e\. it was given the ability to parse out the first
+ word of a list, even if the whole buffer is not a well\-formed list\. Without
+ this change the first word could only be extracted if the whole buffer was a
+ well\-formed list \(ever since Tcl 8\), and in a ver\-high\-load situation, i\.e\.
+ a server sending lots and/or large commands very fast, this may never
+ happen, eventually crashing the receiver when it runs out of memory\. With
+ the change the receiver is always able to process the first word when it
+ becomes well\-formed, regardless of the structure of the remainder of the
+ buffer\.
+
+ - 4\.6
+
+ Added the option __\-socketcmd__ enabling users to override how a socket
+ is opened\. The envisioned main use is the specification of the
+ __tls::socket__ command, see package
+ __[tls](\.\./\.\./\.\./\.\./index\.md\#tls)__, to secure the communication\.
+
+ - 4\.5\.7
+
+ Changed handling of ports already in use to provide a proper error message\.
+
+ - 4\.5\.6
+
+ Bugfix in the replacement for
+ __[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__, made robust against of
+ variable names containing spaces\.
+
+ - 4\.5\.5
+
+ Bugfix in the handling of hooks, typo in variable name\.
+
+ - 4\.5\.4
+
+ Bugfix in the handling of the result received by the __send__ method\.
+ Replaced an *after idle unset result* with an immediate __unset__,
+ with the information saved to a local variable\.
+
+ The __after idle__ can spill into a forked child process if there is no
+ event loop between its setup and the fork\. This may bork the child if the
+ next event loop is the __[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__ of
+ __comm__'s __send__ a few lines above the __after idle__, and
+ the child used the same serial number for its next request\. In that case the
+ parent's __after idle unset__ will delete the very array element the
+ child is waiting for, unlocking the
+ __[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__, causing it to access a now
+ missing array element, instead of the expected result\.
+
+ - 4\.5\.3
+
+ Bugfixes in the wrappers for the builtin
+ __[update](\.\./\.\./\.\./\.\./index\.md\#update)__ and
+ __[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__ commands\.
+
+ - 4\.5\.2
+
+ Bugfix in the wrapper for the builtin
+ __[update](\.\./\.\./\.\./\.\./index\.md\#update)__ command\.
+
+ - 4\.5\.1
+
+ Bugfixes in the handling of \-interp for regular scripts\. The handling of the
+ buffer was wrong for scripts which are a single statement as list\. Fixed
+ missing argument to new command __commSendReply__, introduced by version
+ 4\.5\. Affected debugging\.
+
+ - 4\.5
+
+ New server\-side feature\. The command invoked on the server can now switch
+ comm from the standard synchronous return of its result to an asynchronous
+ \(defered\) return\. Due to the use of snit to implement the *future* objects
+ used by this feature from this version on comm requires at least Tcl 8\.3 to
+ run\. Please read the section [Asynchronous Result
+ Generation](#subsection13) for more details\.
+
+ - 4\.4\.1
+
+ Bugfix in the execution of hooks\.
+
+ - 4\.4
+
+ Bugfixes in the handling of \-interp for regular and hook scripts\. Bugfixes
+ in channel cleanup\.
+
+ - 4\.3\.1
+
+ Introduced \-interp and \-events to enable easy use of a slave interp for
+ execution of received scripts, and of event scripts\.
+
+ - 4\.3
+
+ Bugfixes, and introduces \-silent to allow the user to force the
+ server/listening side to silently ignore connection attempts where the
+ protocol negotiation failed\.
+
+ - 4\.2
+
+ Bugfixes, and most important, switched to utf\-8 as default encoding for full
+ i18n without any problems\.
+
+ - 4\.1
+
+ Rewrite of internal code to remove old pseudo\-object model\. Addition of send
+ \-command asynchronous callback option\.
+
+ - 4\.0
+
+ Per request by John LoVerso\. Improved handling of error for async invoked
+ commands\.
+
+ - 3\.7
+
+ Moved into tcllib and placed in a proper namespace\.
+
+ - 3\.6
+
+ A bug in the looking up of the remoteid for a executed command could be
+ triggered when the connection was closed while several asynchronous sends
+ were queued to be executed\.
+
+ - 3\.5
+
+ Internal change to how reply messages from a
+ __[send](\.\./\.\./\.\./\.\./index\.md\#send)__ are handled\. Reply messages
+ are now decoded into the *value* to pass to
+ __[return](\.\./\.\./\.\./\.\./index\.md\#return)__; a new return statement is
+ then cons'd up to with this value\. Previously, the return code was passed in
+ from the remote as a command to evaluate\. Since the wire protocol has not
+ changed, this is still the case\. Instead, the reply handling code decodes
+ the __reply__ message\.
+
+ - 3\.4
+
+ Added more source commentary, as well as documenting config variables in
+ this man page\. Fixed bug were loss of connection would give error about a
+ variable named __pending__ rather than the message about the lost
+ connection\. __comm ids__ is now an alias for __comm interps__
+ \(previously, it an alias for __comm chans__\)\. Since the method
+ invocation change of 3\.0, break and other exceptional conditions were not
+ being returned correctly from __comm send__\. This has been fixed by
+ removing the extra level of indirection into the internal procedure
+ __commSend__\. Also added propagation of the *errorCode* variable\. This
+ means that these commands return exactly as they would with
+ __[send](\.\./\.\./\.\./\.\./index\.md\#send)__:
+
+ comm send id break
+ catch \{comm send id break\}
+ comm send id expr 1 / 0
+
+ Added a new hook for reply messages\. Reworked method invocation to avoid the
+ use of comm:\* procedures; this also cut the invocation time down by 40%\.
+ Documented __comm config__ \(as this manual page still listed the defunct
+ __comm init__\!\)
+
+ - 3\.3
+
+ Some minor bugs were corrected and the documentation was cleaned up\. Added
+ some examples for hooks\. The return semantics of the __eval__ hook were
+ changed\.
+
+ - 3\.2
+
+ A new wire protocol, version 3, was added\. This is backwards compatible with
+ version 2 but adds an exchange of supported protocol versions to allow
+ protocol negotiation in the future\. Several bugs with the hook
+ implementation were fixed\. A new section of the man page on blocking
+ semantics was added\.
+
+ - 3\.1
+
+ All the documented hooks were implemented\. __commLostHook__ was removed\.
+ A bug in __comm new__ was fixed\.
+
+ - 3\.0
+
+ This is a new version of __comm__ with several major changes\. There is a
+ new way of creating the methods available under the __comm__ command\.
+ The __comm init__ method has been retired and is replaced by __comm
+ configure__ which allows access to many of the well\-defined internal
+ variables\. This also generalizes the options available to __comm new__\.
+ Finally, there is now a protocol version exchanged when a connection is
+ established\. This will allow for future on\-wire protocol changes\. Currently,
+ the protocol version is set to 2\.
+
+ - 2\.3
+
+ __comm ids__ was renamed to __comm channels__\. General support for
+ __comm hook__ was fully implemented, but only the *lost* hook exists,
+ and it was changed to follow the general hook API\. __commLostHook__ was
+ unsupported \(replaced by __comm hook lost__\) and __commLost__ was
+ removed\.
+
+ - 2\.2
+
+ The *died* hook was renamed *lost*, to be accessed by
+ __commLostHook__ and an early implementation of __comm lost hook__\.
+ As such, __commDied__ is now __commLost__\.
+
+ - 2\.1
+
+ Unsupported method __comm remoteid__ was added\.
+
+ - 2\.0
+
+ __comm__ has been rewritten from scratch \(but is fully compatible with
+ Comm 1\.0, without the requirement to use obTcl\)\.
+
+# TLS Security Considerations
+
+This package uses the __[TLS](\.\./\.\./\.\./\.\./index\.md\#tls)__ package to
+handle the security for __https__ urls and other socket connections\.
+
+Policy decisions like the set of protocols to support and what ciphers to use
+are not the responsibility of __[TLS](\.\./\.\./\.\./\.\./index\.md\#tls)__, nor
+of this package itself however\. Such decisions are the responsibility of
+whichever application is using the package, and are likely influenced by the set
+of servers the application will talk to as well\.
+
+For example, in light of the recent [POODLE
+attack](http://googleonlinesecurity\.blogspot\.co\.uk/2014/10/this\-poodle\-bites\-exploiting\-ssl\-30\.html)
+discovered by Google many servers will disable support for the SSLv3 protocol\.
+To handle this change the applications using
+__[TLS](\.\./\.\./\.\./\.\./index\.md\#tls)__ must be patched, and not this
+package, nor __[TLS](\.\./\.\./\.\./\.\./index\.md\#tls)__ itself\. Such a patch
+may be as simple as generally activating __tls1__ support, as shown in the
+example below\.
+
+ package require tls
+ tls::init \-tls1 1 ;\# forcibly activate support for the TLS1 protocol
+
+ \.\.\. your own application code \.\.\.
+
+# Author
+
+John LoVerso, John@LoVerso\.Southborough\.MA\.US
+
+*http://www\.opengroup\.org/~loverso/tcl\-tk/\#comm*
+
+# License
+
+Please see the file *comm\.LICENSE* that accompanied this source, or
+[http://www\.opengroup\.org/www/dist\_client/caubweb/COPYRIGHT\.free\.html](http://www\.opengroup\.org/www/dist\_client/caubweb/COPYRIGHT\.free\.html)\.
+
+This license for __comm__, new as of version 3\.2, allows it to be used for
+free, without any licensing fee or royalty\.
+
+# Bugs
+
+ - If there is a failure initializing a channel created with __::comm::comm
+ new__, then the channel should be destroyed\. Currently, it is left in an
+ inconsistent state\.
+
+ - There should be a way to force a channel to quiesce when changing the
+ configuration\.
+
+The following items can be implemented with the existing hooks and are listed
+here as a reminder to provide a sample hook in a future version\.
+
+ - Allow easier use of a slave interp for actual command execution \(especially
+ when operating in "not local" mode\)\.
+
+ - Add host list \(xhost\-like\) or "magic cookie" \(xauth\-like\) authentication to
+ initial handshake\.
+
+The following are outstanding todo items\.
+
+ - Add an interp discovery and name\->port mapping\. This is likely to be in a
+ separate, optional nameserver\. \(See also the related work, below\.\)
+
+ - Fix the *\{id host\}* form so as not to be dependent upon canonical
+ hostnames\. This requires fixes to Tcl to resolve hostnames\!
+
+This man page is bigger than the source file\.
+
+# On Using Old Versions Of Tcl
+
+Tcl7\.5 under Windows contains a bug that causes the interpreter to hang when EOF
+is reached on non\-blocking sockets\. This can be triggered with a command such as
+this:
+
+ "comm send $other exit"
+
+Always make sure the channel is quiescent before closing/exiting or use at least
+Tcl7\.6 under Windows\.
+
+Tcl7\.6 on the Mac contains several bugs\. It is recommended you use at least
+Tcl7\.6p2\.
+
+Tcl8\.0 on UNIX contains a socket bug that can crash Tcl\. It is recommended you
+use Tcl8\.0p1 \(or Tcl7\.6p2\)\.
+
+# Related Work
+
+Tcl\-DP provides an RPC\-based remote execution interface, but is a compiled Tcl
+extension\. See
+[http://www\.cs\.cornell\.edu/Info/Projects/zeno/Projects/Tcl\-DP\.html](http://www\.cs\.cornell\.edu/Info/Projects/zeno/Projects/Tcl\-DP\.html)\.
+
+Michael Doyle has code that implements the Tcl\-DP RPC
+interface using standard Tcl sockets, much like __comm__\. The DpTcl package
+is available at
+[http://chiselapp\.com/user/gwlester/repository/DpTcl](http://chiselapp\.com/user/gwlester/repository/DpTcl)\.
+
+Andreas Kupries uses __comm__ and
+has built a simple nameserver as part of his Pool library\. See
+[http://www\.purl\.org/net/akupries/soft/pool/index\.htm](http://www\.purl\.org/net/akupries/soft/pool/index\.htm)\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *comm* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+send\(n\)
+
+# KEYWORDS
+
+[comm](\.\./\.\./\.\./\.\./index\.md\#comm),
+[communication](\.\./\.\./\.\./\.\./index\.md\#communication),
+[ipc](\.\./\.\./\.\./\.\./index\.md\#ipc),
+[message](\.\./\.\./\.\./\.\./index\.md\#message), [remote
+communication](\.\./\.\./\.\./\.\./index\.md\#remote\_communication), [remote
+execution](\.\./\.\./\.\./\.\./index\.md\#remote\_execution),
+[rpc](\.\./\.\./\.\./\.\./index\.md\#rpc), [secure](\.\./\.\./\.\./\.\./index\.md\#secure),
+[send](\.\./\.\./\.\./\.\./index\.md\#send),
+[socket](\.\./\.\./\.\./\.\./index\.md\#socket), [ssl](\.\./\.\./\.\./\.\./index\.md\#ssl),
+[tls](\.\./\.\./\.\./\.\./index\.md\#tls)
+
+# CATEGORY
+
+Programming tools
+
+# COPYRIGHT
+
+Copyright © 1995\-1998 The Open Group\. All Rights Reserved\.
+Copyright © 2003\-2004 ActiveState Corporation\.
+Copyright © 2006\-2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/comm/comm_wire.md
Index: embedded/md/tcllib/files/modules/comm/comm_wire.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/comm/comm_wire.md
@@ -0,0 +1,216 @@
+
+[//000000001]: # (comm\_wire \- Remote communication)
+[//000000002]: # (Generated from file 'comm\_wire\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2005 Docs\. Andreas Kupries )
+[//000000004]: # (comm\_wire\(n\) 3 tcllib "Remote communication")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+comm\_wire \- The comm wire protocol
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Wire Protocol Version 3](#section2)
+
+ - [Basic Layer](#subsection1)
+
+ - [Basic Message Layer](#subsection2)
+
+ - [Negotiation Messages \- Initial Handshake](#subsection3)
+
+ - [Script/Command Messages](#subsection4)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require comm
+
+# DESCRIPTION
+
+The __[comm](comm\.md)__ command provides an inter\-interpreter remote
+execution facility much like Tk's __send\(n\)__, except that it uses sockets
+rather than the X server for the communication path\. As a result,
+__[comm](comm\.md)__ works with multiple interpreters, works on Windows
+and Macintosh systems, and provides control over the remote execution path\.
+
+This document contains a specification of the various versions of the wire
+protocol used by comm internally for the communication between its endpoints\. It
+has no relevance to users of __[comm](comm\.md)__, only to developers who
+wish to modify the package, write a compatible facility in a different language,
+or some other facility based on the same protocol\.
+
+# Wire Protocol Version 3
+
+## Basic Layer
+
+The basic encoding for *all* data is UTF\-8\. Because of this binary data,
+including the NULL character, can be sent over the wire as is, without the need
+for armoring it\.
+
+## Basic Message Layer
+
+On top of the [Basic Layer](#subsection1) we have a *message oriented*
+exchange of data\. The totality of all characters written to the channel is a Tcl
+list, with each element a separate
+*[message](\.\./\.\./\.\./\.\./index\.md\#message)*, each itself a list\. The
+messages in the overall list are separated by EOL\. Note that EOL characters can
+occur within the list as well\. They can be distinguished from the
+message\-separating EOL by the fact that the data from the beginning up to their
+location is not a valid Tcl list\.
+
+EOL is signaled through the linefeed character, i\.e __LF__, or, hex
+__0x0a__\. This is following the unix convention for line\-endings\.
+
+As a list each message is composed of *words*\. Their meaning depends on when
+the message was sent in the overall exchange\. This is described in the upcoming
+sections\.
+
+## Negotiation Messages \- Initial Handshake
+
+The command protocol is defined like this:
+
+ - The first message send by a client to a server, when opening the connection,
+ contains two words\. The first word is a list as well, and contains the
+ versions of the wire protocol the client is willing to accept, with the most
+ preferred version first\. The second word is the TCP port the client is
+ listening on for connections to itself\. The value __0__ is used here to
+ signal that the client will not listen for connections, i\.e\. that it is
+ purely for sending commands, and not receiving them\.
+
+ - The first message sent by the server to the client, in response to the
+ message above contains only one word\. This word is a list, containing the
+ string __vers__ as its first element, and the version of the wire
+ protocol the server has selected from the offered versions as the second\.
+
+## Script/Command Messages
+
+All messages coming after the [initial handshake](#subsection3) consist of
+three words\. These are an instruction, a transaction id, and the payload\. The
+valid instructions are shown below\. The transaction ids are used by the client
+to match any incoming replies to the command messages it sent\. This means that a
+server has to copy the transaction id from a command message to the reply it
+sends for that message\.
+
+ - __send__
+
+ - __async__
+
+ - __command__
+
+ The payload is the Tcl script to execute on the server\. It is actually a
+ list containing the script fragments\. These fragment are
+ __concat__enated together by the server to form the full script to
+ execute on the server side\. This emulates the Tcl "eval" semantics\. In most
+ cases it is best to have only one word in the list, a list containing the
+ exact command\.
+
+ Examples:
+
+ \(a\) \{send 1 \{\{array get tcl\_platform\}\}\}
+ \(b\) \{send 1 \{array get tcl\_platform\}\}
+ \(c\) \{send 1 \{array \{get tcl\_platform\}\}\}
+
+ are all valid representations of the same command\. They are
+ generated via
+
+ \(a'\) send \{array get tcl\_platform\}
+ \(b'\) send array get tcl\_platform
+ \(c'\) send array \{get tcl\_platform\}
+
+ respectively
+
+ Note that \(a\), generated by \(a'\), is the usual form, if only single commands
+ are sent by the client\. For example constructed using
+ __[list](\.\./\.\./\.\./\.\./index\.md\#list)__, if the command contains
+ variable arguments\. Like
+
+ send \[list array get $the\_variable\]
+
+ These three instructions all invoke the script on the server side\. Their
+ difference is in the treatment of result values, and thus determines if a
+ reply is expected\.
+
+ * __send__
+
+ A reply is expected\. The sender is waiting for the result\.
+
+ * __async__
+
+ No reply is expected, the sender has no interest in the result and is
+ not waiting for any\.
+
+ * __command__
+
+ A reply is expected, but the sender is not waiting for it\. It has
+ arranged to get a process\-internal notification when the result arrives\.
+
+ - __reply__
+
+ Like the previous three command, however the tcl script in the payload is
+ highly restricted\. It has to be a syntactically valid Tcl
+ __[return](\.\./\.\./\.\./\.\./index\.md\#return)__ command\. This contains
+ result code, value, error code, and error info\.
+
+ Examples:
+
+ \{reply 1 \{return \-code 0 \{\}\}\}
+ \{reply 1 \{return \-code 0 \{osVersion 2\.4\.21\-99\-default byteOrder littleEndian machine i686 platform unix os Linux user andreask wordSize 4\}\}\}
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *comm* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[comm](comm\.md)
+
+# KEYWORDS
+
+[comm](\.\./\.\./\.\./\.\./index\.md\#comm),
+[communication](\.\./\.\./\.\./\.\./index\.md\#communication),
+[ipc](\.\./\.\./\.\./\.\./index\.md\#ipc),
+[message](\.\./\.\./\.\./\.\./index\.md\#message), [remote
+communication](\.\./\.\./\.\./\.\./index\.md\#remote\_communication), [remote
+execution](\.\./\.\./\.\./\.\./index\.md\#remote\_execution),
+[rpc](\.\./\.\./\.\./\.\./index\.md\#rpc), [socket](\.\./\.\./\.\./\.\./index\.md\#socket)
+
+# CATEGORY
+
+Programming tools
+
+# COPYRIGHT
+
+Copyright © 2005 Docs\. Andreas Kupries
ADDED embedded/md/tcllib/files/modules/control/control.md
Index: embedded/md/tcllib/files/modules/control/control.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/control/control.md
@@ -0,0 +1,190 @@
+
+[//000000001]: # (control \- Tcl Control Flow Commands)
+[//000000002]: # (Generated from file 'control\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (control\(n\) 0\.1\.3 tcllib "Tcl Control Flow Commands")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+control \- Procedures for control flow structures\.
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [LIMITATIONS](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require control ?0\.1\.3?
+
+[__control::control__ *command* *option* ?*arg arg \.\.\.*?](#1)
+[__control::assert__ *expr* ?*arg arg \.\.\.*?](#2)
+[__control::do__ *body* ?*option test*?](#3)
+[__control::no\-op__ ?*arg arg \.\.\.*?](#4)
+
+# DESCRIPTION
+
+The __control__ package provides a variety of commands that provide
+additional flow of control structures beyond the built\-in ones provided by Tcl\.
+These are commands that in many programming languages might be considered
+*keywords*, or a part of the language itself\. In Tcl, control flow structures
+are just commands like everything else\.
+
+# COMMANDS
+
+ - __control::control__ *command* *option* ?*arg arg \.\.\.*?
+
+ The __control__ command is used as a configuration command for
+ customizing the other public commands of the control package\. The
+ *command* argument names the command to be customized\. The set of valid
+ *option* and subsequent arguments are determined by the command being
+ customized, and are documented with the command\.
+
+ - __control::assert__ *expr* ?*arg arg \.\.\.*?
+
+ When disabled, the __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__ command
+ behaves exactly like the __[no\-op](\.\./\.\./\.\./\.\./index\.md\#no\_op)__
+ command\.
+
+ When enabled, the __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__ command
+ evaluates *expr* as an expression \(in the same way that __expr__
+ evaluates its argument\)\. If evaluation reveals that *expr* is not a valid
+ boolean expression \(according to \[__string is boolean \-strict__\]\), an
+ error is raised\. If *expr* evaluates to a true boolean value \(as
+ recognized by __if__\), then
+ __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__ returns an empty string\.
+ Otherwise, the remaining arguments to
+ __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__ are used to construct a
+ message string\. If there are no arguments, the message string is "assertion
+ failed: $expr"\. If there are arguments, they are joined by
+ __[join](\.\./\.\./\.\./\.\./index\.md\#join)__ to form the message string\.
+ The message string is then appended as an argument to a callback command,
+ and the completed callback command is evaluated in the global namespace\.
+
+ The __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__ command can be
+ customized by the __control__ command in two ways:
+
+ \[__control::control assert enabled__ ?*boolean*?\] queries or sets
+ whether __control::assert__ is enabled\. When called without a
+ *boolean* argument, a boolean value is returned indicating whether the
+ __control::assert__ command is enabled\. When called with a valid boolean
+ value as the *boolean* argument, the __control::assert__ command is
+ enabled or disabled to match the argument, and an empty string is returned\.
+
+ \[__control::control assert callback__ ?*command*?\] queries or sets the
+ callback command that will be called by an enabled
+ __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__ on assertion failure\. When
+ called without a *command* argument, the current callback command is
+ returned\. When called with a *command* argument, that argument becomes the
+ new assertion failure callback command\. Note that an assertion failure
+ callback command is always defined, even when
+ __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__ is disabled\. The default
+ callback command is \[__return \-code error__\]\.
+
+ Note that __control::assert__ has been written so that in combination
+ with \[__namespace import__\], it is possible to use enabled
+ __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__ commands in some
+ namespaces and disabled __[assert](\.\./\.\./\.\./\.\./index\.md\#assert)__
+ commands in other namespaces at the same time\. This capability is useful so
+ that debugging efforts can be independently controlled module by module\.
+
+ % package require control
+ % control::control assert enabled 1
+ % namespace eval one namespace import ::control::assert
+ % control::control assert enabled 0
+ % namespace eval two namespace import ::control::assert
+ % one::assert \{1 == 0\}
+ assertion failed: 1 == 0
+ % two::assert \{1 == 0\}
+
+ - __control::do__ *body* ?*option test*?
+
+ The __[do](\.\./\.\./\.\./\.\./index\.md\#do)__ command evaluates the script
+ *body* repeatedly *until* the expression *test* becomes true or as
+ long as \(*while*\) *test* is true, depending on the value of *option*
+ being __until__ or __while__\. If *option* and *test* are omitted
+ the body is evaluated exactly once\. After normal completion,
+ __[do](\.\./\.\./\.\./\.\./index\.md\#do)__ returns an empty string\.
+ Exceptional return codes \(__break__, __continue__,
+ __[error](\.\./\.\./\.\./\.\./index\.md\#error)__, etc\.\) during the evaluation
+ of *body* are handled in the same way the __while__ command handles
+ them, except as noted in [LIMITATIONS](#section3), below\.
+
+ - __control::no\-op__ ?*arg arg \.\.\.*?
+
+ The __[no\-op](\.\./\.\./\.\./\.\./index\.md\#no\_op)__ command takes any number
+ of arguments and does nothing\. It returns an empty string\.
+
+# LIMITATIONS
+
+Several of the commands provided by the __control__ package accept arguments
+that are scripts to be evaluated\. Due to fundamental limitations of Tcl's
+__catch__ and __[return](\.\./\.\./\.\./\.\./index\.md\#return)__ commands, it
+is not possible for these commands to properly evaluate the command \[__return
+\-code $code__\] within one of those script arguments for any value of *$code*
+other than *ok*\. In this way, the commands of the __control__ package are
+limited as compared to Tcl's built\-in control flow commands \(such as __if__,
+__while__, etc\.\) and those control flow commands that can be provided by
+packages coded in C\. An example of this difference:
+
+ % package require control
+ % proc a \{\} \{while 1 \{return \-code error a\}\}
+ % proc b \{\} \{control::do \{return \-code error b\} while 1\}
+ % catch a
+ 1
+ % catch b
+ 0
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *control* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+break, continue, expr, if, [join](\.\./\.\./\.\./\.\./index\.md\#join), namespace,
+[return](\.\./\.\./\.\./\.\./index\.md\#return),
+[string](\.\./\.\./\.\./\.\./index\.md\#string), while
+
+# KEYWORDS
+
+[assert](\.\./\.\./\.\./\.\./index\.md\#assert),
+[control](\.\./\.\./\.\./\.\./index\.md\#control), [do](\.\./\.\./\.\./\.\./index\.md\#do),
+[flow](\.\./\.\./\.\./\.\./index\.md\#flow), [no\-op](\.\./\.\./\.\./\.\./index\.md\#no\_op),
+[structure](\.\./\.\./\.\./\.\./index\.md\#structure)
+
+# CATEGORY
+
+Programming tools
ADDED embedded/md/tcllib/files/modules/coroutine/coro_auto.md
Index: embedded/md/tcllib/files/modules/coroutine/coro_auto.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/coroutine/coro_auto.md
@@ -0,0 +1,99 @@
+
+[//000000001]: # (coroutine::auto \- Coroutine utilities)
+[//000000002]: # (Generated from file 'coro\_auto\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2010\-2014 Andreas Kupries )
+[//000000004]: # (coroutine::auto\(n\) 1\.1\.3 tcllib "Coroutine utilities")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+coroutine::auto \- Automatic event and IO coroutine awareness
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.6
+package require coroutine::auto 1\.1\.3
+package require coroutine 1\.1
+
+# DESCRIPTION
+
+The __coroutine::auto__ package provides no commands or other directly
+visible functionality\. Built on top of the package
+__[coroutine](tcllib\_coroutine\.md)__, it intercepts various builtin
+commands of the Tcl core to make any code using them coroutine\-oblivious, i\.e\.
+able to run inside and outside of a coroutine without changes\.
+
+The commands so affected by this package are
+
+ - __[after](\.\./\.\./\.\./\.\./index\.md\#after)__
+
+ - __[exit](\.\./\.\./\.\./\.\./index\.md\#exit)__
+
+ - __[gets](\.\./\.\./\.\./\.\./index\.md\#gets)__
+
+ - __[global](\.\./\.\./\.\./\.\./index\.md\#global)__
+
+ - __[read](\.\./\.\./\.\./\.\./index\.md\#read)__
+
+ - __[update](\.\./\.\./\.\./\.\./index\.md\#update)__
+
+ - __[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)__
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *coroutine* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[after](\.\./\.\./\.\./\.\./index\.md\#after),
+[channel](\.\./\.\./\.\./\.\./index\.md\#channel),
+[coroutine](\.\./\.\./\.\./\.\./index\.md\#coroutine),
+[events](\.\./\.\./\.\./\.\./index\.md\#events),
+[exit](\.\./\.\./\.\./\.\./index\.md\#exit), [gets](\.\./\.\./\.\./\.\./index\.md\#gets),
+[global](\.\./\.\./\.\./\.\./index\.md\#global), [green
+threads](\.\./\.\./\.\./\.\./index\.md\#green\_threads),
+[read](\.\./\.\./\.\./\.\./index\.md\#read),
+[threads](\.\./\.\./\.\./\.\./index\.md\#threads),
+[update](\.\./\.\./\.\./\.\./index\.md\#update),
+[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)
+
+# CATEGORY
+
+Coroutine
+
+# COPYRIGHT
+
+Copyright © 2010\-2014 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/coroutine/tcllib_coroutine.md
Index: embedded/md/tcllib/files/modules/coroutine/tcllib_coroutine.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/coroutine/tcllib_coroutine.md
@@ -0,0 +1,168 @@
+
+[//000000001]: # (coroutine \- Coroutine utilities)
+[//000000002]: # (Generated from file 'tcllib\_coroutine\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2010\-2015 Andreas Kupries )
+[//000000004]: # (coroutine\(n\) 1\.2 tcllib "Coroutine utilities")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+coroutine \- Coroutine based event and IO handling
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.6
+package require coroutine 1\.2
+
+[__coroutine::util after__ *delay*](#1)
+[__coroutine::util await__ *varname*\.\.\.](#2)
+[__coroutine::util create__ *arg*\.\.\.](#3)
+[__coroutine::util exit__ ?*status*?](#4)
+[__coroutine::util gets__ *chan* ?*varname*?](#5)
+[__coroutine::util gets\_safety__ *chan* *limit* *varname*](#6)
+[__coroutine::util global__ *varname*\.\.\.](#7)
+[__coroutine::util read__ __\-nonewline__ *chan* ?*n*?](#8)
+[__coroutine::util update__ ?__idletasks__?](#9)
+[__coroutine::util vwait__ *varname*](#10)
+
+# DESCRIPTION
+
+The __coroutine__ package provides coroutine\-aware implementations of
+various event\- and channel related commands\. It can be in multiple modes:
+
+ 1. Call the commands through their ensemble, in code which is explicitly
+ written for use within coroutines\.
+
+ 1. Import the commands into a namespace, either directly, or through
+ __namespace path__\. This allows the use from within code which is not
+ coroutine\-aware per se and restricted to specific namespaces\.
+
+A more agressive form of making code coroutine\-oblivious than point 2 above is
+available through the package __[coroutine::auto](coro\_auto\.md)__, which
+intercepts the relevant builtin commands and changes their implementation
+dependending on the context they are run in, i\.e\. inside or outside of a
+coroutine\.
+
+# API
+
+All the commands listed below are synchronous with respect to the coroutine
+invoking them, i\.e\. this coroutine blocks until the result is available\. The
+overall eventloop is not blocked however\.
+
+ - __coroutine::util after__ *delay*
+
+ This command delays the coroutine invoking it by *delay* milliseconds\.
+
+ - __coroutine::util await__ *varname*\.\.\.
+
+ This command is an extension form of the __coroutine::util vwait__
+ command \(see below\) which waits on a write to one of many named namespace
+ variables\.
+
+ - __coroutine::util create__ *arg*\.\.\.
+
+ This command creates a new coroutine with an automatically assigned name and
+ causes it to run the code specified by the arguments\.
+
+ - __coroutine::util exit__ ?*status*?
+
+ This command exits the current coroutine, causing it to return *status*\.
+ If no status was specified the default *0* is returned\.
+
+ - __coroutine::util gets__ *chan* ?*varname*?
+
+ This command reads a line from the channel *chan* and returns it either as
+ its result, or, if a *varname* was specified, writes it to the named
+ variable and returns the number of characters read\.
+
+ - __coroutine::util gets\_safety__ *chan* *limit* *varname*
+
+ This command reads a line from the channel *chan* up to size *limit* and
+ stores the result in *varname*\. Of *limit* is reached before the set
+ first newline, an error is thrown\. The command returns the number of
+ characters read\.
+
+ - __coroutine::util global__ *varname*\.\.\.
+
+ This command imports the named global variables of the coroutine into the
+ current scope\. From the technical point of view these variables reside in
+ level __\#1__ of the Tcl stack\. I\.e\. these are not the regular global
+ variable in to the global namespace, and each coroutine can have their own
+ set, independent of all others\.
+
+ - __coroutine::util read__ __\-nonewline__ *chan* ?*n*?
+
+ This command reads *n* characters from the channel *chan* and returns
+ them as its result\. If *n* is not specified the command will read the
+ channel until EOF is reached\.
+
+ - __coroutine::util update__ ?__idletasks__?
+
+ This command causes the coroutine invoking it to run pending events or idle
+ handlers before proceeding\.
+
+ - __coroutine::util vwait__ *varname*
+
+ This command causes the coroutine calling it to wait for a write to the
+ named namespace variable *varname*\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *coroutine* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[after](\.\./\.\./\.\./\.\./index\.md\#after),
+[channel](\.\./\.\./\.\./\.\./index\.md\#channel),
+[coroutine](\.\./\.\./\.\./\.\./index\.md\#coroutine),
+[events](\.\./\.\./\.\./\.\./index\.md\#events),
+[exit](\.\./\.\./\.\./\.\./index\.md\#exit), [gets](\.\./\.\./\.\./\.\./index\.md\#gets),
+[global](\.\./\.\./\.\./\.\./index\.md\#global), [green
+threads](\.\./\.\./\.\./\.\./index\.md\#green\_threads),
+[read](\.\./\.\./\.\./\.\./index\.md\#read),
+[threads](\.\./\.\./\.\./\.\./index\.md\#threads),
+[update](\.\./\.\./\.\./\.\./index\.md\#update),
+[vwait](\.\./\.\./\.\./\.\./index\.md\#vwait)
+
+# CATEGORY
+
+Coroutine
+
+# COPYRIGHT
+
+Copyright © 2010\-2015 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/counter/counter.md
Index: embedded/md/tcllib/files/modules/counter/counter.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/counter/counter.md
@@ -0,0 +1,281 @@
+
+[//000000001]: # (counter \- Counters and Histograms)
+[//000000002]: # (Generated from file 'counter\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (counter\(n\) 2\.0\.4 tcllib "Counters and Histograms")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+counter \- Procedures for counters and histograms
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+# SYNOPSIS
+
+package require Tcl 8
+package require counter ?2\.0\.4?
+
+[__::counter::init__ *tag args*](#1)
+[__::counter::count__ *tag* ?*delta*? ?*instance*?](#2)
+[__::counter::start__ *tag instance*](#3)
+[__::counter::stop__ *tag instance*](#4)
+[__::counter::get__ *tag args*](#5)
+[__::counter::exists__ *tag*](#6)
+[__::counter::names__](#7)
+[__::counter::histHtmlDisplay__ *tag args*](#8)
+[__::counter::reset__ *tag args*](#9)
+
+# DESCRIPTION
+
+The __counter__ package provides a counter facility and can compute
+statistics and histograms over the collected data\.
+
+ - __::counter::init__ *tag args*
+
+ This defines a counter with the name *tag*\. The *args* determines the
+ characteristics of the counter\. The *args* are
+
+ * __\-group__ *name*
+
+ Keep a grouped counter where the name of the histogram bucket is passed
+ into __::counter::count__\.
+
+ * __\-hist__ *bucketsize*
+
+ Accumulate the counter into histogram buckets of size *bucketsize*\.
+ For example, if the samples are millisecond time values and
+ *bucketsize* is 10, then each histogram bucket represents time values
+ of 0 to 10 msec, 10 to 20 msec, 20 to 30 msec, and so on\.
+
+ * __\-hist2x__ *bucketsize*
+
+ Accumulate the statistic into histogram buckets\. The size of the first
+ bucket is *bucketsize*, each other bucket holds values 2 times the
+ size of the previous bucket\. For example, if *bucketsize* is 10, then
+ each histogram bucket represents time values of 0 to 10 msec, 10 to 20
+ msec, 20 to 40 msec, 40 to 80 msec, and so on\.
+
+ * __\-hist10x__ *bucketsize*
+
+ Accumulate the statistic into histogram buckets\. The size of the first
+ bucket is *bucketsize*, each other bucket holds values 10 times the
+ size of the previous bucket\. For example, if *bucketsize* is 10, then
+ each histogram bucket represents time values of 0 to 10 msec, 10 to 100
+ msec, 100 to 1000 msec, and so on\.
+
+ * __\-lastn__ *N*
+
+ Save the last *N* values of the counter to maintain a "running
+ average" over the last *N* values\.
+
+ * __\-timehist__ *secsPerMinute*
+
+ Keep a time\-based histogram\. The counter is summed into a histogram
+ bucket based on the current time\. There are 60 per\-minute buckets that
+ have a size determined by *secsPerMinute*, which is normally 60, but
+ for testing purposes can be less\. Every "hour" \(i\.e\., 60 "minutes"\) the
+ contents of the per\-minute buckets are summed into the next hourly
+ bucket\. Every 24 "hours" the contents of the per\-hour buckets are summed
+ into the next daily bucket\. The counter package keeps all time\-based
+ histograms in sync, so the first *secsPerMinute* value seen by the
+ package is used for all subsequent time\-based histograms\.
+
+ - __::counter::count__ *tag* ?*delta*? ?*instance*?
+
+ Increment the counter identified by *tag*\. The default increment is 1,
+ although you can increment by any value, integer or real, by specifying
+ *delta*\. You must declare each counter with __::counter::init__ to
+ define the characteristics of counter before you start to use it\. If the
+ counter type is __\-group__, then the counter identified by *instance*
+ is incremented\.
+
+ - __::counter::start__ *tag instance*
+
+ Record the starting time of an interval\. The *tag* is the name of the
+ counter defined as a __\-hist__ value\-based histogram\. The *instance*
+ is used to distinguish this interval from any other intervals that might be
+ overlapping this one\.
+
+ - __::counter::stop__ *tag instance*
+
+ Record the ending time of an interval\. The delta time since the
+ corresponding __::counter::start__ call for *instance* is recorded in
+ the histogram identified by *tag*\.
+
+ - __::counter::get__ *tag args*
+
+ Return statistics about a counter identified by *tag*\. The *args*
+ determine what value to return:
+
+ * __\-total__
+
+ Return the total value of the counter\. This is the default if *args*
+ is not specified\.
+
+ * __\-totalVar__
+
+ Return the name of the total variable\. Useful for specifying with
+ \-textvariable in a Tk widget\.
+
+ * __\-N__
+
+ Return the number of samples accumulated into the counter\.
+
+ * __\-avg__
+
+ Return the average of samples accumulated into the counter\.
+
+ * __\-avgn__
+
+ Return the average over the last *N* samples taken\. The *N* value is
+ set in the __::counter::init__ call\.
+
+ * __\-hist__ *bucket*
+
+ If *bucket* is specified, then the value in that bucket of the
+ histogram is returned\. Otherwise the complete histogram is returned in
+ array get format sorted by bucket\.
+
+ * __\-histVar__
+
+ Return the name of the histogram array variable\.
+
+ * __\-histHour__
+
+ Return the complete hourly histogram in array get format sorted by
+ bucket\.
+
+ * __\-histHourVar__
+
+ Return the name of the hourly histogram array variable\.
+
+ * __\-histDay__
+
+ Return the complete daily histogram in array get format sorted by
+ bucket\.
+
+ * __\-histDayVar__
+
+ Return the name of the daily histogram array variable\.
+
+ * __\-resetDate__
+
+ Return the clock seconds value recorded when the counter was last reset\.
+
+ * __\-all__
+
+ Return an array get of the array used to store the counter\. This
+ includes the total, the number of samples \(N\), and any type\-specific
+ information\. This does not include the histogram array\.
+
+ - __::counter::exists__ *tag*
+
+ Returns 1 if the counter is defined\.
+
+ - __::counter::names__
+
+ Returns a list of all counters defined\.
+
+ - __::counter::histHtmlDisplay__ *tag args*
+
+ Generate HTML to display a histogram for a counter\. The *args* control the
+ format of the display\. They are:
+
+ * __\-title__ *string*
+
+ Label to display above bar chart
+
+ * __\-unit__ *unit*
+
+ Specify __minutes__, __hours__, or __days__ for the
+ time\-base histograms\. For value\-based histograms, the *unit* is used
+ in the title\.
+
+ * __\-images__ *url*
+
+ URL of /images directory\.
+
+ * __\-gif__ *filename*
+
+ Image for normal histogram bars\. The *filename* is relative to the
+ __\-images__ directory\.
+
+ * __\-ongif__ *filename*
+
+ Image for the active histogram bar\. The *filename* is relative to the
+ __\-images__ directory\.
+
+ * __\-max__ *N*
+
+ Maximum number of value\-based buckets to display\.
+
+ * __\-height__ *N*
+
+ Pixel height of the highest bar\.
+
+ * __\-width__ *N*
+
+ Pixel width of each bar\.
+
+ * __\-skip__ *N*
+
+ Buckets to skip when labeling value\-based histograms\.
+
+ * __\-format__ *string*
+
+ Format used to display labels of buckets\.
+
+ * __\-text__ *boolean*
+
+ If 1, a text version of the histogram is dumped, otherwise a graphical
+ one is generated\.
+
+ - __::counter::reset__ *tag args*
+
+ Resets the counter with the name *tag* to an initial state\. The *args*
+ determine the new characteristics of the counter\. They have the same meaning
+ as described for __::counter::init__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *counter* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[counting](\.\./\.\./\.\./\.\./index\.md\#counting),
+[histogram](\.\./\.\./\.\./\.\./index\.md\#histogram),
+[statistics](\.\./\.\./\.\./\.\./index\.md\#statistics),
+[tallying](\.\./\.\./\.\./\.\./index\.md\#tallying)
+
+# CATEGORY
+
+Data structures
ADDED embedded/md/tcllib/files/modules/crc/cksum.md
Index: embedded/md/tcllib/files/modules/crc/cksum.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/crc/cksum.md
@@ -0,0 +1,171 @@
+
+[//000000001]: # (cksum \- Cyclic Redundancy Checks)
+[//000000002]: # (Generated from file 'cksum\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002, Pat Thoyts)
+[//000000004]: # (cksum\(n\) 1\.1\.4 tcllib "Cyclic Redundancy Checks")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+cksum \- Calculate a cksum\(1\) compatible checksum
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [OPTIONS](#section3)
+
+ - [PROGRAMMING INTERFACE](#section4)
+
+ - [EXAMPLES](#section5)
+
+ - [AUTHORS](#section6)
+
+ - [Bugs, Ideas, Feedback](#section7)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require cksum ?1\.1\.4?
+
+[__::crc::cksum__ ?*\-format format*? ?*\-chunksize size*? \[ *\-channel chan* | *\-filename file* | *string* \]](#1)
+[__::crc::CksumInit__](#2)
+[__::crc::CksumUpdate__ *token* *data*](#3)
+[__::crc::CksumFinal__ *token*](#4)
+
+# DESCRIPTION
+
+This package provides a Tcl implementation of the cksum\(1\) algorithm based upon
+information provided at in the GNU implementation of this program as part of the
+GNU Textutils 2\.0 package\.
+
+# COMMANDS
+
+ - __::crc::cksum__ ?*\-format format*? ?*\-chunksize size*? \[ *\-channel chan* | *\-filename file* | *string* \]
+
+ The command takes string data or a channel or file name and returns a
+ checksum value calculated using the __cksum\(1\)__ algorithm\. The result
+ is formatted using the *format*\(n\) specifier provided or as an unsigned
+ integer \(%u\) by default\.
+
+# OPTIONS
+
+ - \-channel *name*
+
+ Return a checksum for the data read from a channel\. The command will read
+ data from the channel until the __eof__ is true\. If you need to be able
+ to process events during this calculation see the [PROGRAMMING
+ INTERFACE](#section4) section
+
+ - \-filename *name*
+
+ This is a convenience option that opens the specified file, sets the
+ encoding to binary and then acts as if the *\-channel* option had been
+ used\. The file is closed on completion\.
+
+ - \-format *string*
+
+ Return the checksum using an alternative format template\.
+
+# PROGRAMMING INTERFACE
+
+The cksum package implements the checksum using a context variable to which
+additional data can be added at any time\. This is expecially useful in an event
+based environment such as a Tk application or a web server package\. Data to be
+checksummed may be handled incrementally during a __fileevent__ handler in
+discrete chunks\. This can improve the interactive nature of a GUI application
+and can help to avoid excessive memory consumption\.
+
+ - __::crc::CksumInit__
+
+ Begins a new cksum context\. Returns a token ID that must be used for the
+ remaining functions\. An optional seed may be specified if required\.
+
+ - __::crc::CksumUpdate__ *token* *data*
+
+ Add data to the checksum identified by token\. Calling *CksumUpdate $token
+ "abcd"* is equivalent to calling *CksumUpdate $token "ab"* followed by
+ *CksumUpdate $token "cb"*\. See [EXAMPLES](#section5)\.
+
+ - __::crc::CksumFinal__ *token*
+
+ Returns the checksum value and releases any resources held by this token\.
+ Once this command completes the token will be invalid\. The result is a 32
+ bit integer value\.
+
+# EXAMPLES
+
+ % crc::cksum "Hello, World\!"
+ 2609532967
+
+ % crc::cksum \-format 0x%X "Hello, World\!"
+ 0x9B8A5027
+
+ % crc::cksum \-file cksum\.tcl
+ 1828321145
+
+ % set tok \[crc::CksumInit\]
+ % crc::CksumUpdate $tok "Hello, "
+ % crc::CksumUpdate $tok "World\!"
+ % crc::CksumFinal $tok
+ 2609532967
+
+# AUTHORS
+
+Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *crc* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[crc32\(n\)](crc32\.md), [sum\(n\)](sum\.md)
+
+# KEYWORDS
+
+[checksum](\.\./\.\./\.\./\.\./index\.md\#checksum),
+[cksum](\.\./\.\./\.\./\.\./index\.md\#cksum), [crc](\.\./\.\./\.\./\.\./index\.md\#crc),
+[crc32](\.\./\.\./\.\./\.\./index\.md\#crc32), [cyclic redundancy
+check](\.\./\.\./\.\./\.\./index\.md\#cyclic\_redundancy\_check), [data
+integrity](\.\./\.\./\.\./\.\./index\.md\#data\_integrity),
+[security](\.\./\.\./\.\./\.\./index\.md\#security)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2002, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/crc/crc16.md
Index: embedded/md/tcllib/files/modules/crc/crc16.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/crc/crc16.md
@@ -0,0 +1,184 @@
+
+[//000000001]: # (crc16 \- Cyclic Redundancy Checks)
+[//000000002]: # (Generated from file 'crc16\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002, 2017, Pat Thoyts)
+[//000000004]: # (crc16\(n\) 1\.1\.3 tcllib "Cyclic Redundancy Checks")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+crc16 \- Perform a 16bit Cyclic Redundancy Check
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [OPTIONS](#section3)
+
+ - [EXAMPLES](#section4)
+
+ - [AUTHORS](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require crc16 ?1\.1\.3?
+
+[__::crc::crc16__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? __\-\-__ *message*](#1)
+[__::crc::crc16__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? \-filename *file*](#2)
+[__::crc::crc\-ccitt__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? __\-\-__ *message*](#3)
+[__::crc::crc\-ccitt__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? \-filename *file*](#4)
+[__::crc::xmodem__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? __\-\-__ *message*](#5)
+[__::crc::xmodem__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? \-filename *file*](#6)
+
+# DESCRIPTION
+
+This package provides a Tcl\-only implementation of the CRC algorithms based upon
+information provided at http://www\.microconsultants\.com/tips/crc/crc\.txt There
+are a number of permutations available for calculating CRC checksums and this
+package can handle all of them\. Defaults are set up for the most common cases\.
+
+# COMMANDS
+
+ - __::crc::crc16__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? __\-\-__ *message*
+
+ - __::crc::crc16__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? \-filename *file*
+
+ - __::crc::crc\-ccitt__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? __\-\-__ *message*
+
+ - __::crc::crc\-ccitt__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? \-filename *file*
+
+ - __::crc::xmodem__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? __\-\-__ *message*
+
+ - __::crc::xmodem__ ?\-format *format*? ?\-seed *value*? ?\-implementation *procname*? \-filename *file*
+
+ The command takes either string data or a file name and returns a checksum
+ value calculated using the CRC algorithm\. The command used sets up the CRC
+ polynomial, initial value and bit ordering for the desired standard checksum
+ calculation\. The result is formatted using the *format*\(n\) specifier
+ provided or as an unsigned integer \(%u\) by default\.
+
+ A number of common polynomials are in use with the CRC algorithm and the
+ most commonly used of these are included in this package\. For convenience
+ each of these has a command alias in the crc namespace\.
+
+ It is possible to implement the CRC\-32 checksum using this crc16 package as
+ the implementation is sufficiently generic to extend to 32 bit checksums\. As
+ an example this has been done already \- however this is not the fastest
+ method to implement this algorithm in Tcl and a separate
+ __[crc32](crc32\.md)__ package is available\.
+
+# OPTIONS
+
+ - \-filename *name*
+
+ Return a checksum for the file contents instead of for parameter data\.
+
+ - \-format *string*
+
+ Return the checksum using an alternative format template\.
+
+ - \-seed *value*
+
+ Select an alternative seed value for the CRC calculation\. The default is 0
+ for the CRC16 calculation and 0xFFFF for the CCITT version\. This can be
+ useful for calculating the CRC for data structures without first converting
+ the whole structure into a string\. The CRC of the previous member can be
+ used as the seed for calculating the CRC of the next member\. It is also used
+ for accumulating a checksum from fragments of a large message \(or file\)
+
+ - \-implementation *procname*
+
+ This hook is provided to allow users to provide their own implementation
+ \(perhaps a C compiled extension\)\. The procedure specfied is called with two
+ parameters\. The first is the data to be checksummed and the second is the
+ seed value\. An integer is expected as the result\.
+
+ The package provides some implementations of standard CRC polynomials for
+ the XMODEM, CCITT and the usual CRC\-16 checksum\. For convenience, additional
+ commands have been provided that make use of these implementations\.
+
+ - \-\-
+
+ Terminate option processing\. Please note that using the option termination
+ flag is important when processing data from parameters\. If the binary data
+ looks like one of the options given above then the data will be read as an
+ option if this marker is not included\. Always use the *\-\-* option
+ termination flag before giving the data argument\.
+
+# EXAMPLES
+
+ % crc::crc16 \-\- "Hello, World\!"
+ 64077
+
+ % crc::crc\-ccitt \-\- "Hello, World\!"
+ 26586
+
+ % crc::crc16 \-format 0x%X \-\- "Hello, World\!"
+ 0xFA4D
+
+ % crc::crc16 \-file crc16\.tcl
+ 51675
+
+# AUTHORS
+
+Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *crc* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[cksum\(n\)](cksum\.md), [crc32\(n\)](crc32\.md), [sum\(n\)](sum\.md)
+
+# KEYWORDS
+
+[checksum](\.\./\.\./\.\./\.\./index\.md\#checksum),
+[cksum](\.\./\.\./\.\./\.\./index\.md\#cksum), [crc](\.\./\.\./\.\./\.\./index\.md\#crc),
+[crc16](\.\./\.\./\.\./\.\./index\.md\#crc16),
+[crc32](\.\./\.\./\.\./\.\./index\.md\#crc32), [cyclic redundancy
+check](\.\./\.\./\.\./\.\./index\.md\#cyclic\_redundancy\_check), [data
+integrity](\.\./\.\./\.\./\.\./index\.md\#data\_integrity),
+[security](\.\./\.\./\.\./\.\./index\.md\#security)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2002, 2017, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/crc/crc32.md
Index: embedded/md/tcllib/files/modules/crc/crc32.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/crc/crc32.md
@@ -0,0 +1,185 @@
+
+[//000000001]: # (crc32 \- Cyclic Redundancy Checks)
+[//000000002]: # (Generated from file 'crc32\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002, Pat Thoyts)
+[//000000004]: # (crc32\(n\) 1\.3\.2 tcllib "Cyclic Redundancy Checks")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+crc32 \- Perform a 32bit Cyclic Redundancy Check
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [OPTIONS](#section3)
+
+ - [PROGRAMMING INTERFACE](#section4)
+
+ - [EXAMPLES](#section5)
+
+ - [AUTHORS](#section6)
+
+ - [Bugs, Ideas, Feedback](#section7)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require crc32 ?1\.3\.2?
+
+[__::crc::crc32__ ?\-format *format*? ?\-seed *value*? \[ *\-channel chan* | *\-filename file* | *message* \]](#1)
+[__::crc::Crc32Init__ ?*seed*?](#2)
+[__::crc::Crc32Update__ *token* *data*](#3)
+[__::crc::Crc32Final__ *token*](#4)
+
+# DESCRIPTION
+
+This package provides a Tcl implementation of the CRC\-32 algorithm based upon
+information provided at http://www\.naaccr\.org/standard/crc32/document\.html If
+either the __critcl__ package or the __Trf__ package are available then
+a compiled version may be used internally to accelerate the checksum
+calculation\.
+
+# COMMANDS
+
+ - __::crc::crc32__ ?\-format *format*? ?\-seed *value*? \[ *\-channel chan* | *\-filename file* | *message* \]
+
+ The command takes either string data or a channel or file name and returns a
+ checksum value calculated using the CRC\-32 algorithm\. The result is
+ formatted using the *format*\(n\) specifier provided\. The default is to
+ return the value as an unsigned integer \(format %u\)\.
+
+# OPTIONS
+
+ - \-channel *name*
+
+ Return a checksum for the data read from a channel\. The command will read
+ data from the channel until the __eof__ is true\. If you need to be able
+ to process events during this calculation see the [PROGRAMMING
+ INTERFACE](#section4) section
+
+ - \-filename *name*
+
+ This is a convenience option that opens the specified file, sets the
+ encoding to binary and then acts as if the *\-channel* option had been
+ used\. The file is closed on completion\.
+
+ - \-format *string*
+
+ Return the checksum using an alternative format template\.
+
+ - \-seed *value*
+
+ Select an alternative seed value for the CRC calculation\. The default is
+ 0xffffffff\. This can be useful for calculating the CRC for data structures
+ without first converting the whole structure into a string\. The CRC of the
+ previous member can be used as the seed for calculating the CRC of the next
+ member\. Note that the crc32 algorithm includes a final XOR step\. If
+ incremental processing is desired then this must be undone before using the
+ output of the algorithm as the seed for further processing\. A simpler
+ alternative is to use the [PROGRAMMING INTERFACE](#section4) which is
+ intended for this mode of operation\.
+
+# PROGRAMMING INTERFACE
+
+The CRC\-32 package implements the checksum using a context variable to which
+additional data can be added at any time\. This is expecially useful in an event
+based environment such as a Tk application or a web server package\. Data to be
+checksummed may be handled incrementally during a __fileevent__ handler in
+discrete chunks\. This can improve the interactive nature of a GUI application
+and can help to avoid excessive memory consumption\.
+
+ - __::crc::Crc32Init__ ?*seed*?
+
+ Begins a new CRC32 context\. Returns a token ID that must be used for the
+ remaining functions\. An optional seed may be specified if required\.
+
+ - __::crc::Crc32Update__ *token* *data*
+
+ Add data to the checksum identified by token\. Calling *Crc32Update $token
+ "abcd"* is equivalent to calling *Crc32Update $token "ab"* followed by
+ *Crc32Update $token "cb"*\. See [EXAMPLES](#section5)\.
+
+ - __::crc::Crc32Final__ *token*
+
+ Returns the checksum value and releases any resources held by this token\.
+ Once this command completes the token will be invalid\. The result is a 32
+ bit integer value\.
+
+# EXAMPLES
+
+ % crc::crc32 "Hello, World\!"
+ 3964322768
+
+ % crc::crc32 \-format 0x%X "Hello, World\!"
+ 0xEC4AC3D0
+
+ % crc::crc32 \-file crc32\.tcl
+ 483919716
+
+ % set tok \[crc::Crc32Init\]
+ % crc::Crc32Update $tok "Hello, "
+ % crc::Crc32Update $tok "World\!"
+ % crc::Crc32Final $tok
+ 3964322768
+
+# AUTHORS
+
+Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *crc* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[cksum\(n\)](cksum\.md), [crc16\(n\)](crc16\.md), [sum\(n\)](sum\.md)
+
+# KEYWORDS
+
+[checksum](\.\./\.\./\.\./\.\./index\.md\#checksum),
+[cksum](\.\./\.\./\.\./\.\./index\.md\#cksum), [crc](\.\./\.\./\.\./\.\./index\.md\#crc),
+[crc32](\.\./\.\./\.\./\.\./index\.md\#crc32), [cyclic redundancy
+check](\.\./\.\./\.\./\.\./index\.md\#cyclic\_redundancy\_check), [data
+integrity](\.\./\.\./\.\./\.\./index\.md\#data\_integrity),
+[security](\.\./\.\./\.\./\.\./index\.md\#security)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2002, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/crc/sum.md
Index: embedded/md/tcllib/files/modules/crc/sum.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/crc/sum.md
@@ -0,0 +1,149 @@
+
+[//000000001]: # (sum \- Cyclic Redundancy Checks)
+[//000000002]: # (Generated from file 'sum\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002, Pat Thoyts )
+[//000000004]: # (sum\(n\) 1\.1\.2 tcllib "Cyclic Redundancy Checks")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+sum \- Calculate a sum\(1\) compatible checksum
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [OPTIONS](#section3)
+
+ - [EXAMPLES](#section4)
+
+ - [AUTHORS](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require sum ?1\.1\.2?
+
+[__::crc::sum__ ?*\-bsd* | *\-sysv*? ?*\-format fmt*? ?*\-chunksize size*? \[ *\-filename file* | *\-channel chan* | *string* \]](#1)
+
+# DESCRIPTION
+
+This package provides a Tcl\-only implementation of the sum\(1\) command which
+calculates a 16 bit checksum value from the input data\. The BSD sum algorithm is
+used by default but the SysV algorithm is also available\.
+
+# COMMANDS
+
+ - __::crc::sum__ ?*\-bsd* | *\-sysv*? ?*\-format fmt*? ?*\-chunksize size*? \[ *\-filename file* | *\-channel chan* | *string* \]
+
+ The command takes string data or a file name or a channel and returns a
+ checksum value calculated using the __sum\(1\)__ algorithm\. The result is
+ formatted using the *format*\(n\) specifier provided or as an unsigned
+ integer \(%u\) by default\.
+
+# OPTIONS
+
+ - \-sysv
+
+ The SysV algorithm is fairly naive\. The byte values are summed and any
+ overflow is discarded\. The lowest 16 bits are returned as the checksum\.
+ Input with the same content but different ordering will give the same
+ result\.
+
+ - \-bsd
+
+ This algorithm is similar to the SysV version but includes a bit rotation
+ step which provides a dependency on the order of the data values\.
+
+ - \-filename *name*
+
+ Return a checksum for the file contents instead of for parameter data\.
+
+ - \-channel *chan*
+
+ Return a checksum for the contents of the specified channel\. The channel
+ must be open for reading and should be configured for binary translation\.
+ The channel will no be closed on completion\.
+
+ - \-chunksize *size*
+
+ Set the block size used when reading data from either files or channels\.
+ This value defaults to 4096\.
+
+ - \-format *string*
+
+ Return the checksum using an alternative format template\.
+
+# EXAMPLES
+
+ % crc::sum "Hello, World\!"
+ 37287
+
+ % crc::sum \-format 0x%X "Hello, World\!"
+ 0x91A7
+
+ % crc::sum \-file sum\.tcl
+ 13392
+
+# AUTHORS
+
+Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *crc* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[cksum\(n\)](cksum\.md), [crc32\(n\)](crc32\.md), sum\(1\)
+
+# KEYWORDS
+
+[checksum](\.\./\.\./\.\./\.\./index\.md\#checksum),
+[cksum](\.\./\.\./\.\./\.\./index\.md\#cksum), [crc](\.\./\.\./\.\./\.\./index\.md\#crc),
+[crc32](\.\./\.\./\.\./\.\./index\.md\#crc32), [cyclic redundancy
+check](\.\./\.\./\.\./\.\./index\.md\#cyclic\_redundancy\_check), [data
+integrity](\.\./\.\./\.\./\.\./index\.md\#data\_integrity),
+[security](\.\./\.\./\.\./\.\./index\.md\#security),
+[sum](\.\./\.\./\.\./\.\./index\.md\#sum)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2002, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/cron/cron.md
Index: embedded/md/tcllib/files/modules/cron/cron.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/cron/cron.md
@@ -0,0 +1,256 @@
+
+[//000000001]: # (cron \- cron)
+[//000000002]: # (Generated from file 'cron\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2016\-2018 Sean Woods )
+[//000000004]: # (cron\(n\) 2\.1 tcllib "cron")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+cron \- Tool for automating the period callback of commands
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Commands](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.6
+package require cron ?2\.1?
+
+[__::cron::at__ *?processname?* *timecode* *command*](#1)
+[__::cron::cancel__ *processname*](#2)
+[__::cron::every__ *processname* *frequency* *command*](#3)
+[__::cron::in__ *?processname?* *timecode* *command*](#4)
+[__::cron::object\_coroutine__ *object* *coroutine* *?info?*](#5)
+[__::cron::sleep__ *milliseconds*](#6)
+[__::cron::task delete__ *process*](#7)
+[__::cron::task exists__ *process*](#8)
+[__::cron::task info__ *process*](#9)
+[__::cron::task set__ *process* *field* *value* *?field\.\.\.?* *?value\.\.\.?*](#10)
+[__::cron::wake__ *?who?*](#11)
+[__::cron::clock\_step__ *milliseconds*](#12)
+[__::cron::clock\_delay__ *milliseconds*](#13)
+[__::cron::clock\_sleep__ *seconds* *?offset?*](#14)
+[__::cron::clock\_set__ *newtime*](#15)
+
+# DESCRIPTION
+
+The __cron__ package provides a Pure\-tcl set of tools to allow programs to
+schedule tasks to occur at regular intervals\. Rather than force each task to
+issue it's own call to the event loop, the cron system mimics the cron utility
+in Unix: on task periodically checks to see if something is to be done, and
+issues all commands for a given time step at once\.
+
+Changes in version 2\.0
+
+While cron was originally designed to handle time scales > 1 second, the latest
+version's internal understand time granularity down to the millisecond, making
+it easier to integrate with other timed events\. Version 2\.0 also understands how
+to properly integrate coroutines and objects\. It also adds a facility for an
+external \(or script driven\) clock\. Note that vwait style events won't work very
+well with an external clock\.
+
+# Commands
+
+ - __::cron::at__ *?processname?* *timecode* *command*
+
+ This command registers a *command* to be called at the time specified by
+ *timecode*\. If *timecode* is expressed as an integer, the timecode is
+ assumed to be in unixtime\. All other inputs will be interpreted by __clock
+ scan__ and converted to unix time\. This task can be modified by subsequent
+ calls to this package's commands by referencing *processname*\. If
+ *processname* exists, it will be replaced\. If *processname* is not
+ given, one is generated and returned by the command\.
+
+ ::cron::at start\_coffee \{Tomorrow at 9:00am\} \{remote::exec::coffeepot power on\}
+ ::cron::at shutdown\_coffee \{Tomorrow at 12:00pm\} \{remote::exec::coffeepot power off\}
+
+ - __::cron::cancel__ *processname*
+
+ This command unregisters the process *processname* and cancels any pending
+ commands\. Note: processname can be a process created by either
+ __::cron::at__ or __::cron::every__\.
+
+ ::cron::cancel check\_mail
+
+ - __::cron::every__ *processname* *frequency* *command*
+
+ This command registers a *command* to be called at the interval of
+ *frequency*\. *frequency* is given in seconds\. This task can be modified
+ by subsequent calls to this package's commands by referencing
+ *processname*\. If *processname* exists, it will be replaced\.
+
+ ::cron::every check\_mail 900 ::imap\_client::check\_mail
+ ::cron::every backup\_db 3600 \{::backup\_procedure ::mydb\}
+
+ - __::cron::in__ *?processname?* *timecode* *command*
+
+ This command registers a *command* to be called after a delay of time
+ specified by *timecode*\. *timecode* is expressed as an seconds\. This
+ task can be modified by subsequent calls to this package's commands by
+ referencing *processname*\. If *processname* exists, it will be replaced\.
+ If *processname* is not given, one is generated and returned by the
+ command\.
+
+ - __::cron::object\_coroutine__ *object* *coroutine* *?info?*
+
+ This command registers a *coroutine*, associated with *object* to be
+ called given the parameters of *info*\. If now parameters are given, the
+ coroutine is assumed to be an idle task which will self\-terminate\. *info*
+ can be given in any form compadible with __::cron::task set__
+
+ - __::cron::sleep__ *milliseconds*
+
+ When run within a coroutine, this command will register the coroutine for a
+ callback at the appointed time, and immediately yield\.
+
+ If the ::cron::time variable is > 0 this command will advance the internal
+ time, 100ms at a time\.
+
+ In all other cases this command will generate a fictious variable, generate
+ an after call, and vwait the variable:
+
+ set eventid \[incr ::cron::eventcount\]
+ set var ::cron::event\_\#$eventid
+ set $var 0
+ ::after $ms "set $var 1"
+ ::vwait $var
+ ::unset $var
+
+ Usage:
+
+ ::cron::sleep 250
+
+ - __::cron::task delete__ *process*
+
+ Delete the process specified the *process*
+
+ - __::cron::task exists__ *process*
+
+ Returns true if *process* is registered with cron\.
+
+ - __::cron::task info__ *process*
+
+ Returns a dict describing *process*\. See __::cron::task set__ for a
+ description of the options\.
+
+ - __::cron::task set__ *process* *field* *value* *?field\.\.\.?* *?value\.\.\.?*
+
+ If *process* does not exist, it is created\. Options Include:
+
+ * __[command](\.\./\.\./\.\./\.\./index\.md\#command)__
+
+ If __[coroutine](\.\./coroutine/tcllib\_coroutine\.md)__ is black, a
+ global command which implements this process\. If
+ __[coroutine](\.\./coroutine/tcllib\_coroutine\.md)__ is not black,
+ the command to invoke to create or recreate the coroutine\.
+
+ * __[coroutine](\.\./coroutine/tcllib\_coroutine\.md)__
+
+ The name of the coroutine \(if any\) which implements this process\.
+
+ * __frequency__
+
+ If \-1, this process is terminated after the next event\. If 0 this
+ process should be called during every idle event\. If positive, this
+ process should generate events periodically\. The frequency is an integer
+ number of milliseconds between events\.
+
+ * __[object](\.\./\.\./\.\./\.\./index\.md\#object)__
+
+ The object associated with this process or coroutine\.
+
+ * __scheduled__
+
+ If non\-zero, the absolute time from the epoch \(in milliseconds\) that
+ this process will trigger an event\. If zero, and the __frequency__
+ is also zero, this process is called every idle loop\.
+
+ * __[running](\.\./\.\./\.\./\.\./index\.md\#running)__
+
+ A boolean flag\. If true it indicates the process never returned or
+ yielded during the event loop, and will not be called again until it
+ does so\.
+
+ - __::cron::wake__ *?who?*
+
+ Wake up cron, and arrange for its event loop to be run during the next Idle
+ cycle\.
+
+ ::cron::wake \{I just did something important\}
+
+Several utility commands are provided that are used internally within cron and
+for testing cron, but may or may not be useful in the general cases\.
+
+ - __::cron::clock\_step__ *milliseconds*
+
+ Return a clock time absolute to the epoch which falls on the next border
+ between one second and the next for the value of *milliseconds*
+
+ - __::cron::clock\_delay__ *milliseconds*
+
+ Return a clock time absolute to the epoch which falls on the next border
+ between one second and the next *milliseconds* in the future\.
+
+ - __::cron::clock\_sleep__ *seconds* *?offset?*
+
+ Return a clock time absolute to the epoch which falls exactly *seconds* in
+ the future\. If offset is given it may be positive or negative, and will
+ shift the final time to before or after the second would flip\.
+
+ - __::cron::clock\_set__ *newtime*
+
+ Sets the internal clock for cron\. This command will advance the time in
+ 100ms increment, triggering events, until the internal time catches up with
+ *newtime*\.
+
+ *newtime* is expressed in absolute milliseconds since the beginning of the
+ epoch\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *odie* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[cron](\.\./\.\./\.\./\.\./index\.md\#cron), [odie](\.\./\.\./\.\./\.\./index\.md\#odie)
+
+# CATEGORY
+
+System
+
+# COPYRIGHT
+
+Copyright © 2016\-2018 Sean Woods
ADDED embedded/md/tcllib/files/modules/csv/csv.md
Index: embedded/md/tcllib/files/modules/csv/csv.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/csv/csv.md
@@ -0,0 +1,273 @@
+
+[//000000001]: # (csv \- CSV processing)
+[//000000002]: # (Generated from file 'csv\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002\-2015 Andreas Kupries )
+[//000000004]: # (csv\(n\) 0\.8\.1 tcllib "CSV processing")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+csv \- Procedures to handle CSV data\.
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [FORMAT](#section3)
+
+ - [EXAMPLE](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require csv ?0\.8\.1?
+
+[__::csv::iscomplete__ *data*](#1)
+[__::csv::join__ *values* ?*sepChar*? ?*delChar*? ?*delMode*?](#2)
+[__::csv::joinlist__ *values* ?*sepChar*? ?*delChar*? ?*delMode*?](#3)
+[__::csv::joinmatrix__ *matrix* ?*sepChar*? ?*delChar*? ?*delMode*?](#4)
+[__::csv::read2matrix__ ?__\-alternate__? *chan m* \{*sepChar* ,\} \{*expand* none\}](#5)
+[__::csv::read2queue__ ?__\-alternate__? *chan q* \{*sepChar* ,\}](#6)
+[__::csv::report__ *cmd matrix* ?*chan*?](#7)
+[__::csv::split__ ?__\-alternate__? *line* ?*sepChar*? ?*delChar*?](#8)
+[__::csv::split2matrix__ ?__\-alternate__? *m line* \{*sepChar* ,\} \{*expand* none\}](#9)
+[__::csv::split2queue__ ?__\-alternate__? *q line* \{*sepChar* ,\}](#10)
+[__::csv::writematrix__ *m chan* ?*sepChar*? ?*delChar*?](#11)
+[__::csv::writequeue__ *q chan* ?*sepChar*? ?*delChar*?](#12)
+
+# DESCRIPTION
+
+The __csv__ package provides commands to manipulate information in CSV
+[FORMAT](#section3) \(CSV = Comma Separated Values\)\.
+
+# COMMANDS
+
+The following commands are available:
+
+ - __::csv::iscomplete__ *data*
+
+ A predicate checking if the argument *data* is a complete csv record\. The
+ result is a boolean flag indicating the completeness of the data\. The result
+ is true if the data is complete\.
+
+ - __::csv::join__ *values* ?*sepChar*? ?*delChar*? ?*delMode*?
+
+ Takes a list of values and returns a string in CSV format containing these
+ values\. The separator character can be defined by the caller, but this is
+ optional\. The default is ","\. The quoting aka delimiting character can be
+ defined by the caller, but this is optional\. The default is '"'\. By default
+ the quoting mode *delMode* is "auto", surrounding values with *delChar*
+ only when needed\. When set to "always" however, values are always surrounded
+ by the *delChar* instead\.
+
+ - __::csv::joinlist__ *values* ?*sepChar*? ?*delChar*? ?*delMode*?
+
+ Takes a list of lists of values and returns a string in CSV format
+ containing these values\. The separator character can be defined by the
+ caller, but this is optional\. The default is ","\. The quoting character can
+ be defined by the caller, but this is optional\. The default is '"'\. By
+ default the quoting mode *delMode* is "auto", surrounding values with
+ *delChar* only when needed\. When set to "always" however, values are
+ always surrounded by the *delChar* instead\. Each element of the outer list
+ is considered a record, these are separated by newlines in the result\. The
+ elements of each record are formatted as usual \(via __::csv::join__\)\.
+
+ - __::csv::joinmatrix__ *matrix* ?*sepChar*? ?*delChar*? ?*delMode*?
+
+ Takes a *matrix* object following the API specified for the struct::matrix
+ package and returns a string in CSV format containing these values\. The
+ separator character can be defined by the caller, but this is optional\. The
+ default is ","\. The quoting character can be defined by the caller, but this
+ is optional\. The default is '"'\. By default the quoting mode *delMode* is
+ "auto", surrounding values with *delChar* only when needed\. When set to
+ "always" however, values are always surrounded by the *delChar* instead\.
+ Each row of the matrix is considered a record, these are separated by
+ newlines in the result\. The elements of each record are formatted as usual
+ \(via __::csv::join__\)\.
+
+ - __::csv::read2matrix__ ?__\-alternate__? *chan m* \{*sepChar* ,\} \{*expand* none\}
+
+ A wrapper around __::csv::split2matrix__ \(see below\) reading
+ CSV\-formatted lines from the specified channel \(until EOF\) and adding them
+ to the given matrix\. For an explanation of the *expand* argument see
+ __::csv::split2matrix__\.
+
+ - __::csv::read2queue__ ?__\-alternate__? *chan q* \{*sepChar* ,\}
+
+ A wrapper around __::csv::split2queue__ \(see below\) reading
+ CSV\-formatted lines from the specified channel \(until EOF\) and adding them
+ to the given queue\.
+
+ - __::csv::report__ *cmd matrix* ?*chan*?
+
+ A report command which can be used by the matrix methods __format
+ 2string__ and __format 2chan__\. For the latter this command delegates
+ the work to __::csv::writematrix__\. *cmd* is expected to be either
+ __printmatrix__ or __printmatrix2channel__\. The channel argument,
+ *chan*, has to be present for the latter and must not be present for the
+ first\.
+
+ - __::csv::split__ ?__\-alternate__? *line* ?*sepChar*? ?*delChar*?
+
+ converts a *line* in CSV format into a list of the values contained in the
+ line\. The character used to separate the values from each other can be
+ defined by the caller, via *sepChar*, but this is optional\. The default is
+ ","\. The quoting character can be defined by the caller, but this is
+ optional\. The default is '"'\.
+
+ If the option __\-alternate__ is specified a slightly different syntax is
+ used to parse the input\. This syntax is explained below, in the section
+ [FORMAT](#section3)\.
+
+ - __::csv::split2matrix__ ?__\-alternate__? *m line* \{*sepChar* ,\} \{*expand* none\}
+
+ The same as __::csv::split__, but appends the resulting list as a new
+ row to the matrix *m*, using the method __add row__\. The expansion
+ mode specified via *expand* determines how the command handles a matrix
+ with less columns than contained in *line*\. The allowed modes are:
+
+ * __none__
+
+ This is the default mode\. In this mode it is the responsibility of the
+ caller to ensure that the matrix has enough columns to contain the full
+ line\. If there are not enough columns the list of values is silently
+ truncated at the end to fit\.
+
+ * __empty__
+
+ In this mode the command expands an empty matrix to hold all columns of
+ the specified line, but goes no further\. The overall effect is that the
+ first of a series of lines determines the number of columns in the
+ matrix and all following lines are truncated to that size, as if mode
+ __none__ was set\.
+
+ * __auto__
+
+ In this mode the command expands the matrix as needed to hold all
+ columns contained in *line*\. The overall effect is that after adding a
+ series of lines the matrix will have enough columns to hold all columns
+ of the longest line encountered so far\.
+
+ - __::csv::split2queue__ ?__\-alternate__? *q line* \{*sepChar* ,\}
+
+ The same as __::csv::split__, but appending the resulting list as a
+ single item to the queue *q*, using the method __put__\.
+
+ - __::csv::writematrix__ *m chan* ?*sepChar*? ?*delChar*?
+
+ A wrapper around __::csv::join__ taking all rows in the matrix *m* and
+ writing them CSV formatted into the channel *chan*\.
+
+ - __::csv::writequeue__ *q chan* ?*sepChar*? ?*delChar*?
+
+ A wrapper around __::csv::join__ taking all items in the queue *q*
+ \(assumes that they are lists\) and writing them CSV formatted into the
+ channel *chan*\.
+
+# FORMAT
+
+The format of regular CSV files is specified as
+
+ 1. Each record of a csv file \(comma\-separated values, as exported e\.g\. by
+ Excel\) is a set of ASCII values separated by ","\. For other languages it
+ may be ";" however, although this is not important for this case as the
+ functions provided here allow any separator character\.
+
+ 1. If and only if a value contains itself the separator ",", then it \(the
+ value\) has to be put between ""\. If the value does not contain the
+ separator character then quoting is optional\.
+
+ 1. If a value contains the character ", that character is represented by ""\.
+
+ 1. The output string "" represents the value "\. In other words, it is assumed
+ that it was created through rule 3, and only this rule, i\.e\. that the value
+ was not quoted\.
+
+An alternate format definition mainly used by MS products specifies that the
+output string "" is a representation of the empty string\. In other words, it is
+assumed that the output was generated out of the empty string by quoting it
+\(i\.e\. rule 2\), and not through rule 3\. This is the only difference between the
+regular and the alternate format\.
+
+The alternate format is activated through specification of the option
+__\-alternate__ to the various split commands\.
+
+# EXAMPLE
+
+Using the regular format the record
+
+ 123,"123,521\.2","Mary says ""Hello, I am Mary""",""
+
+is parsed into the items
+
+ a\) 123
+ b\) 123,521\.2
+ c\) Mary says "Hello, I am Mary"
+ d\) "
+
+Using the alternate format the result is
+
+ a\) 123
+ b\) 123,521\.2
+ c\) Mary says "Hello, I am Mary"
+ d\) \(the empty string\)
+
+instead\. As can be seen only item \(d\) is different, now the empty string instead
+of a "\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *csv* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[matrix](\.\./\.\./\.\./\.\./index\.md\#matrix),
+[queue](\.\./\.\./\.\./\.\./index\.md\#queue)
+
+# KEYWORDS
+
+[csv](\.\./\.\./\.\./\.\./index\.md\#csv), [matrix](\.\./\.\./\.\./\.\./index\.md\#matrix),
+[package](\.\./\.\./\.\./\.\./index\.md\#package),
+[queue](\.\./\.\./\.\./\.\./index\.md\#queue),
+[tcllib](\.\./\.\./\.\./\.\./index\.md\#tcllib)
+
+# CATEGORY
+
+Text processing
+
+# COPYRIGHT
+
+Copyright © 2002\-2015 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/debug/debug.md
Index: embedded/md/tcllib/files/modules/debug/debug.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/debug/debug.md
@@ -0,0 +1,286 @@
+
+[//000000001]: # (debug \- debug narrative)
+[//000000002]: # (Generated from file 'debug\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 200?, Colin McCormack, Wub Server Utilities
+Copyright © 2012\-2014, Andreas Kupries )
+[//000000004]: # (debug\(n\) 1\.0\.6 tcllib "debug narrative")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+debug \- debug narrative \- core
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+package require debug ?1\.0\.6?
+
+[__debug\.____tag__ *message* ?*level*?](#1)
+[__debug__ __2array__](#2)
+[__debug__ __define__ *tag*](#3)
+[__debug__ __header__ *text*](#4)
+[__debug__ __level__ *tag* ?*level*? ?*fd*?](#5)
+[__debug__ __names__](#6)
+[__debug__ __off__ *tag*](#7)
+[__debug__ __on__ *tag*](#8)
+[__debug__ __parray__ *arrayvarname*](#9)
+[__debug__ __pdict__ *dict*](#10)
+[__debug__ __hexl__ *data* ?*prefix*?](#11)
+[__debug__ __nl__](#12)
+[__debug__ __tab__](#13)
+[__debug__ __prefix__ *tag* ?*text*?](#14)
+[__debug__ __setting__ \(*tag* *level*\) \.\.\. ?*fd*?](#15)
+[__debug__ __suffix__ *tag* ?*text*?](#16)
+[__debug__ __trailer__ *text*](#17)
+
+# DESCRIPTION
+
+Debugging areas of interest are represented by 'tags' which have independently
+settable levels of interest \(an integer, higher is more detailed\)\.
+
+# API
+
+ - __debug\.____tag__ *message* ?*level*?
+
+ For each known tag the package creates a command with this signature the
+ user can then use to provide the debug narrative of the tag\. The narrative
+ *message* is provided as a Tcl script whose value is
+ __[subst](\.\./\.\./\.\./\.\./index\.md\#subst)__ed in the caller's scope if
+ and only if the current level of interest for the *tag* matches or exceeds
+ the call's *level* of detail\. This is useful, as one can place arbitrarily
+ complex narrative in code without unnecessarily evaluating it\.
+
+ See methods __level__ and __setting__ for querying and manipulating
+ the current level of detail for tags\.
+
+ The actually printed text consists of not only the *message*, but also
+ global and tag\-specific prefix and suffix, should they exist, with each line
+ in the message having the specified headers and trailers\.
+
+ All these parts are __[subst](\.\./\.\./\.\./\.\./index\.md\#subst)__ableTcl
+ scripts, which are substituted once per message before assembly\.
+
+ - __debug__ __2array__
+
+ This method returns a dictionary mapping the names of all debug tags
+ currently known to the package to their state and log level\. The latter are
+ encoded in a single numeric value, where a negative number indicates an
+ inactive tag at the level given by the absolute value, and a positive number
+ is an active tag at that level\.
+
+ See also method __settings__ below\.
+
+ - __debug__ __define__ *tag*
+
+ This method registers the named *tag* with the package\. If the tag was not
+ known before it is placed in an inactive state\. The state of an already
+ known tag is left untouched\.
+
+ The result of the method is the empty string\.
+
+ - __debug__ __header__ *text*
+
+ This method defines a global
+ __[subst](\.\./\.\./\.\./\.\./index\.md\#subst)__able Tcl script which
+ provides a text printed before each line of output\.
+
+ Note how this is tag\-independent\.
+
+ Further note that the header substitution happens only once per actual
+ printed message, i\.e\. all lines of the same message will have the same
+ actual heading text\.
+
+ The result of the method is the specified text\.
+
+ - __debug__ __level__ *tag* ?*level*? ?*fd*?
+
+ This method sets the detail\-*level* for the *tag*, and the channel
+ *fd* to write the tags narration into\. The level is an integer value >= 0
+ defaulting to __1__\. The channel defaults to __stderr__\.
+
+ The result of the method is the new detail\-level for the tag\.
+
+ - __debug__ __names__
+
+ This method returns a list containing the names of all debug tags currently
+ known to the package\.
+
+ - __debug__ __off__ *tag*
+
+ This method registers the named *tag* with the package and sets it
+ inactive\.
+
+ The result of the method is the empty string\.
+
+ - __debug__ __on__ *tag*
+
+ This method registers the named *tag* with the package, as active\.
+
+ The result of the method is the empty string\.
+
+ - __debug__ __parray__ *arrayvarname*
+
+ This is a convenience method formatting the named array like the builtin
+ command __parray__, except it returns the resulting string instead of
+ writing it directly to __stdout__\.
+
+ This makes it suitable for use in debug messages\.
+
+ - __debug__ __pdict__ *dict*
+
+ This is a convenience method formatting the dictionary similarly to how the
+ builtin command __parray__ does for array, and returns the resulting
+ string\.
+
+ This makes it suitable for use in debug messages\.
+
+ - __debug__ __hexl__ *data* ?*prefix*?
+
+ This is a convenience method formatting arbitrary data into a hex\-dump and
+ returns the resulting string\.
+
+ This makes it suitable for use in debug messages\.
+
+ Each line of the dump is prefixed with *prefix*\. This prefix defaults to
+ the empty string\.
+
+ - __debug__ __nl__
+
+ This is a convenience method to insert a linefeed character \(ASCII 0x0a\)
+ into a debug message\.
+
+ - __debug__ __tab__
+
+ This is a convenience method to insert a TAB character \(ASCII 0x09\) into a
+ debug message\.
+
+ - __debug__ __prefix__ *tag* ?*text*?
+
+ This method is similar to the method __header__ above, in that it
+ defines __[subst](\.\./\.\./\.\./\.\./index\.md\#subst)__able Tcl script which
+ provides more text for debug messages\.
+
+ In contrast to __header__ the generated text is added to the user's
+ message before it is split into lines, making it a per\-message extension\.
+
+ Furthermore the script is tag\-dependent\.
+
+ In exception to that, a script for tag __::__ is applied to all
+ messages\.
+
+ If both global and tag\-dependent prefix exist, both are applied, with the
+ global prefix coming before the tag\-dependent prefix\.
+
+ Note that the prefix substitution happens only once per actual printed
+ message\.
+
+ The result of the method is the empty string\.
+
+ If the *tag* was not known at the time of the call it is registered, and
+ set inactive\.
+
+ - __debug__ __setting__ \(*tag* *level*\) \.\.\. ?*fd*?
+
+ This method is a multi\-tag variant of method __level__ above, with the
+ functionality of methods __on__, and __off__ also folded in\.
+
+ Each named *tag* is set to the detail\-*level* following it, with a
+ negative level deactivating the tag, and a positive level activating it\.
+
+ If the last argument is not followed by a level it is not treated as tag
+ name, but as the channel all the named tags should print their messages to\.
+
+ The result of the method is the empty string\.
+
+ - __debug__ __suffix__ *tag* ?*text*?
+
+ This method is similar to the method __trailer__ below, in that it
+ defines __[subst](\.\./\.\./\.\./\.\./index\.md\#subst)__able Tcl script which
+ provides more text for debug messages\.
+
+ In contrast to __trailer__ the generated text is added to the user's
+ message before it is split into lines, making it a per\-message extension\.
+
+ Furthermore the script is tag\-dependent\.
+
+ In exception to that, a script for tag __::__ is applied to all
+ messages\.
+
+ If both global and tag\-dependent suffix exist, both are applied, with the
+ global suffix coming after the tag\-dependent suffix\.
+
+ Note that the suffix substitution happens only once per actual printed
+ message\.
+
+ The result of the method is the empty string\.
+
+ If the *tag* was not known at the time of the call it is registered, and
+ set inactive\.
+
+ - __debug__ __trailer__ *text*
+
+ This method defines a global
+ __[subst](\.\./\.\./\.\./\.\./index\.md\#subst)__able Tcl script which
+ provides a text printed after each line of output \(before the EOL however\)\.
+
+ Note how this is tag\-independent\.
+
+ Further note that the trailer substitution happens only once per actual
+ printed message, i\.e\. all lines of the same message will have the same
+ actual trailing text\.
+
+ The result of the method is the specified text\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *debug* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[debug](\.\./\.\./\.\./\.\./index\.md\#debug), [log](\.\./\.\./\.\./\.\./index\.md\#log),
+[narrative](\.\./\.\./\.\./\.\./index\.md\#narrative),
+[trace](\.\./\.\./\.\./\.\./index\.md\#trace)
+
+# CATEGORY
+
+debugging, tracing, and logging
+
+# COPYRIGHT
+
+Copyright © 200?, Colin McCormack, Wub Server Utilities
+Copyright © 2012\-2014, Andreas Kupries
ADDED embedded/md/tcllib/files/modules/debug/debug_caller.md
Index: embedded/md/tcllib/files/modules/debug/debug_caller.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/debug/debug_caller.md
@@ -0,0 +1,92 @@
+
+[//000000001]: # (debug::caller \- debug narrative)
+[//000000002]: # (Generated from file 'debug\_caller\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2012\-2015, Andreas Kupries )
+[//000000004]: # (debug::caller\(n\) 1\.1 tcllib "debug narrative")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+debug::caller \- debug narrative \- caller
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+package require debug::caller ?1\.1?
+
+[__[debug](debug\.md)__ __caller__ ?*args*\.\.\.?](#1)
+
+# DESCRIPTION
+
+# API
+
+ - __[debug](debug\.md)__ __caller__ ?*args*\.\.\.?
+
+ This method is useful in a tag\-specific prefix to automatically provide
+ caller information for all uses of the tag\. Or in a message, when only
+ specific places need such detail\.
+
+ Beyond that it recognizing the various internal forms of method calls
+ generated by the __[snit](\.\./snit/snit\.md)__ OO system and rewrites
+ these to their original form, for better readability\. Similarly for
+ __[TclOO](\.\./\.\./\.\./\.\./index\.md\#tcloo)__\.
+
+ If *args* are specified then they are treated as the integer indices of
+ command arguments to *not* show in the output\. The referenced arguments
+ are replaced by __\*__ instead\. The main anticipiated use case for this
+ is the exclusion of arguments expected to contain large Tcl values, i\.e\.
+ long lists, large dictionaries, etc\. to prevent them from overwhelming the
+ narrative\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *debug* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[debug](\.\./\.\./\.\./\.\./index\.md\#debug), [log](\.\./\.\./\.\./\.\./index\.md\#log),
+[narrative](\.\./\.\./\.\./\.\./index\.md\#narrative),
+[trace](\.\./\.\./\.\./\.\./index\.md\#trace)
+
+# CATEGORY
+
+debugging, tracing, and logging
+
+# COPYRIGHT
+
+Copyright © 2012\-2015, Andreas Kupries
ADDED embedded/md/tcllib/files/modules/debug/debug_heartbeat.md
Index: embedded/md/tcllib/files/modules/debug/debug_heartbeat.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/debug/debug_heartbeat.md
@@ -0,0 +1,93 @@
+
+[//000000001]: # (debug::heartbeat \- debug narrative)
+[//000000002]: # (Generated from file 'debug\_heartbeat\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 200?, Colin McCormack, Wub Server Utilities
+Copyright © 2012, Andreas Kupries )
+[//000000004]: # (debug::heartbeat\(n\) 1 tcllib "debug narrative")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+debug::heartbeat \- debug narrative \- heartbeat
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+package require debug::heartbeat ?1?
+package require debug ?1?
+
+[__[debug](debug\.md)__ __heartbeat__ ?*delta*?](#1)
+
+# DESCRIPTION
+
+# API
+
+ - __[debug](debug\.md)__ __heartbeat__ ?*delta*?
+
+ This method activates or disables a heartbeat with which to monitor the
+ event loop of an event\-based Tcl application\.
+
+ It reserves the debug tag __heartbeat__ for its operation and writes a
+ message every *delta* milliseconds\.
+
+ A *delta*\-value <= 0 disables the heartbeat\.
+
+ The message produced by the heartbeat contains a sequence counter and the
+ time in milliseconds since the last beat, thus providing insight into timing
+ variationsn and deviations from the nominal *delta*\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *debug* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[debug](\.\./\.\./\.\./\.\./index\.md\#debug),
+[heartbeat](\.\./\.\./\.\./\.\./index\.md\#heartbeat),
+[log](\.\./\.\./\.\./\.\./index\.md\#log),
+[narrative](\.\./\.\./\.\./\.\./index\.md\#narrative),
+[trace](\.\./\.\./\.\./\.\./index\.md\#trace)
+
+# CATEGORY
+
+debugging, tracing, and logging
+
+# COPYRIGHT
+
+Copyright © 200?, Colin McCormack, Wub Server Utilities
+Copyright © 2012, Andreas Kupries
ADDED embedded/md/tcllib/files/modules/debug/debug_timestamp.md
Index: embedded/md/tcllib/files/modules/debug/debug_timestamp.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/debug/debug_timestamp.md
@@ -0,0 +1,85 @@
+
+[//000000001]: # (debug::timestamp \- debug narrative)
+[//000000002]: # (Generated from file 'debug\_timestamp\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 200?, Colin McCormack, Wub Server Utilities
+Copyright © 2012, Andreas Kupries )
+[//000000004]: # (debug::timestamp\(n\) 1 tcllib "debug narrative")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+debug::timestamp \- debug narrative \- timestamping
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+package require debug::timestamp ?1?
+package require debug ?1?
+
+[__[debug](debug\.md)__ __timestamp__](#1)
+
+# DESCRIPTION
+
+# API
+
+ - __[debug](debug\.md)__ __timestamp__
+
+ This method returns millisecond timing information since a baseline or last
+ call, making it useful in a tag\-specific prefix to automatically provide
+ caller information for all uses of the tag\. Or in a message, when only
+ specific places need such detail\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *debug* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[debug](\.\./\.\./\.\./\.\./index\.md\#debug), [log](\.\./\.\./\.\./\.\./index\.md\#log),
+[narrative](\.\./\.\./\.\./\.\./index\.md\#narrative),
+[timestamps](\.\./\.\./\.\./\.\./index\.md\#timestamps),
+[trace](\.\./\.\./\.\./\.\./index\.md\#trace)
+
+# CATEGORY
+
+debugging, tracing, and logging
+
+# COPYRIGHT
+
+Copyright © 200?, Colin McCormack, Wub Server Utilities
+Copyright © 2012, Andreas Kupries
ADDED embedded/md/tcllib/files/modules/defer/defer.md
Index: embedded/md/tcllib/files/modules/defer/defer.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/defer/defer.md
@@ -0,0 +1,133 @@
+
+[//000000001]: # (defer \- Defered execution ala Go)
+[//000000002]: # (Generated from file 'defer\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2017, Roy Keene)
+[//000000004]: # (defer\(n\) 1 tcllib "Defered execution ala Go")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+defer \- Defered execution
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [EXAMPLES](#section3)
+
+ - [REFERENCES](#section4)
+
+ - [AUTHORS](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.6
+package require defer ?1?
+
+[__::defer::defer__ ?*command*? ?*arg1*? ?*arg2*? ?*argN\.\.\.*?](#1)
+[__::defer::with__ *variableList* *script*](#2)
+[__::defer::autowith__ *script*](#3)
+[__::defer::cancel__ ?*id\.\.\.*?](#4)
+
+# DESCRIPTION
+
+The __defer__ commands allow a developer to schedule actions to happen as
+part of the current variable scope terminating\. This is most useful for dealing
+with cleanup activities\. Since the defered actions always execute, and always
+execute in the reverse order from which the defer statements themselves execute,
+the programmer can schedule the cleanup of a resource \(for example, a channel\)
+as soon as that resource is acquired\. Then, later if the procedure or lambda
+ends, either due to an error, or an explicit return, the cleanup of that
+resource will always occur\.
+
+# COMMANDS
+
+ - __::defer::defer__ ?*command*? ?*arg1*? ?*arg2*? ?*argN\.\.\.*?
+
+ Defers execution of some code until the current variable scope ends\. Each
+ argument is concatencated together to form the script to execute at deferal
+ time\. Multiple defer statements may be used, they are executed in the order
+ of last\-in, first\-out\. The return value is an identifier which can be used
+ later with __defer::cancel__
+
+ - __::defer::with__ *variableList* *script*
+
+ Defers execution of a script while copying the current value of some
+ variables, whose names specified in *variableList*, into the script\. The
+ script acts like a lambda but executes at the same level as the
+ __defer::with__ call\. The return value is the same as
+ __::defer::defer__
+
+ - __::defer::autowith__ *script*
+
+ The same as __::defer::with__ but uses all local variables in the
+ variable list\.
+
+ - __::defer::cancel__ ?*id\.\.\.*?
+
+ Cancels the execution of a defered action\. The *id* argument is the
+ identifier returned by __::defer::defer__, __::defer::with__, or
+ __::defer::autowith__\. Any number of arguments may be supplied, and all
+ of the IDs supplied will be cancelled\.
+
+# EXAMPLES
+
+ package require defer 1
+ apply \{\{\} \{
+ set fd \[open /dev/null\]
+ defer::defer close $fd
+ \}\}
+
+# REFERENCES
+
+# AUTHORS
+
+Roy Keene
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *defer* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[cleanup](\.\./\.\./\.\./\.\./index\.md\#cleanup),
+[golang](\.\./\.\./\.\./\.\./index\.md\#golang)
+
+# CATEGORY
+
+Utility
+
+# COPYRIGHT
+
+Copyright © 2017, Roy Keene
ADDED embedded/md/tcllib/files/modules/des/des.md
Index: embedded/md/tcllib/files/modules/des/des.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/des/des.md
@@ -0,0 +1,233 @@
+
+[//000000001]: # (des \- Data Encryption Standard \(DES\))
+[//000000002]: # (Generated from file 'des\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2005, Pat Thoyts )
+[//000000004]: # (des\(n\) 1\.1 tcllib "Data Encryption Standard \(DES\)")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+des \- Implementation of the DES and triple\-DES ciphers
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [PROGRAMMING INTERFACE](#section3)
+
+ - [MODES OF OPERATION](#section4)
+
+ - [EXAMPLES](#section5)
+
+ - [REFERENCES](#section6)
+
+ - [AUTHORS](#section7)
+
+ - [Bugs, Ideas, Feedback](#section8)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require des 1\.1
+
+[__::DES::des__ ?*\-mode \[ecb|cbc|cfb|ofb\]*? ?*\-dir \[encrypt|decrypt\]*? *\-key keydata* ?*\-iv vector*? ?*\-hex*? ?*\-weak*? ?*\-out channel*? ?*\-chunksize size*? \[ *\-in channel* | *data* \]](#1)
+[__::DES::Init__ *mode* *keydata* *iv* ?*weak*?](#2)
+[__::DES::Encrypt__ *Key* *data*](#3)
+[__::DES::Decrypt__ *Key* *data*](#4)
+[__::DES::Reset__ *Key* *iv*](#5)
+[__::DES::Final__ *Key*](#6)
+
+# DESCRIPTION
+
+This is an implementation in Tcl of the Data Encryption Standard \(DES\) as
+published by the U\.S\. National Institute of Standards and Technology \(NIST\) \[1\]\.
+This implementation also supports triple DES \(3DES\) extension to DES\. DES is a
+64\-bit block cipher that uses a 56\-bit key\. 3DES uses a 168\-bit key\. DES has now
+officially been superceeded by AES but is in common use in many protocols\.
+
+The tcllib implementation of DES and 3DES uses an implementation by Mac Cody and
+is available as a separate download from \[2\]\. For anyone concerned about the
+details of exporting this code please see the TclDES web pages\. The tcllib
+specific code is a wrapper to the TclDES API that presents same API for the DES
+cipher as for other ciphers in the library\.
+
+# COMMANDS
+
+ - __::DES::des__ ?*\-mode \[ecb|cbc|cfb|ofb\]*? ?*\-dir \[encrypt|decrypt\]*? *\-key keydata* ?*\-iv vector*? ?*\-hex*? ?*\-weak*? ?*\-out channel*? ?*\-chunksize size*? \[ *\-in channel* | *data* \]
+
+ Perform the __[DES](\.\./\.\./\.\./\.\./index\.md\#des)__ algorithm on either
+ the data provided by the argument or on the data read from the *\-in*
+ channel\. If an *\-out* channel is given then the result will be written to
+ this channel\.
+
+ The *\-key* option must be given\. This parameter takes a binary string of 8
+ bytes in length and is used to generate the key schedule\. In DES only 56
+ bits of key data are used\. The highest bit from each byte is discarded\.
+
+ The *\-mode* and *\-dir* options are optional and default to cbc mode and
+ encrypt respectively\. The initialization vector *\-iv* takes an 8 byte
+ binary argument\. This defaults to all zeros\. See [MODES OF
+ OPERATION](#section4) for more about *\-mode* and the use of the
+ initialization vector\.
+
+ DES is a 64\-bit block cipher\. This means that the data must be provided in
+ units that are a multiple of 8 bytes\.
+
+# PROGRAMMING INTERFACE
+
+Internal state is maintained in an opaque structure that is returned from the
+__Init__ function\. In ECB mode the state is not affected by the input but
+for other modes some input dependent state is maintained and may be reset by
+calling the __Reset__ function with a new initialization vector value\.
+
+ - __::DES::Init__ *mode* *keydata* *iv* ?*weak*?
+
+ Construct a new DES key schedule using the specified key data and the given
+ initialization vector\. The initialization vector is not used with ECB mode
+ but is important for other usage modes\. See [MODES OF
+ OPERATION](#section4)\.
+
+ There are a small number of keys that are known to be weak when used with
+ DES\. By default if such a key is passed in then an error will be raised\. If
+ there is a need to accept such keys then the *weak* parameter can be set
+ true to avoid the error being thrown\.
+
+ - __::DES::Encrypt__ *Key* *data*
+
+ Use a prepared key acquired by calling __Init__ to encrypt the provided
+ data\. The data argument should be a binary array that is a multiple of the
+ DES block size of 8 bytes\. The result is a binary array the same size as the
+ input of encrypted data\.
+
+ - __::DES::Decrypt__ *Key* *data*
+
+ Decipher data using the key\. Note that the same key may be used to encrypt
+ and decrypt data provided that the initialization vector is reset
+ appropriately for CBC mode\.
+
+ - __::DES::Reset__ *Key* *iv*
+
+ Reset the initialization vector\. This permits the programmer to re\-use a key
+ and avoid the cost of re\-generating the key schedule where the same key data
+ is being used multiple times\.
+
+ - __::DES::Final__ *Key*
+
+ This should be called to clean up resources associated with *Key*\. Once
+ this function has been called the key may not be used again\.
+
+# MODES OF OPERATION
+
+ - Electronic Code Book \(ECB\)
+
+ ECB is the basic mode of all block ciphers\. Each block is encrypted
+ independently and so identical plain text will produce identical output when
+ encrypted with the same key\. Any encryption errors will only affect a single
+ block however this is vulnerable to known plaintext attacks\.
+
+ - Cipher Block Chaining \(CBC\)
+
+ CBC mode uses the output of the last block encryption to affect the current
+ block\. An initialization vector of the same size as the cipher block size is
+ used to handle the first block\. The initialization vector should be chosen
+ randomly and transmitted as the first block of the output\. Errors in
+ encryption affect the current block and the next block after which the
+ cipher will correct itself\. CBC is the most commonly used mode in software
+ encryption\.
+
+ - Cipher Feedback \(CFB\)
+
+ CFB mode can be used to convert block ciphers into stream ciphers\. In CFB
+ mode the initialization vector is encrypted and the output is then xor'd
+ with the plaintext stream\. The result is then used as the initialization
+ vector for the next round\. Errors will affect the current block and the next
+ block\.
+
+ - Output Feedback \(OFB\)
+
+ OFB is similar to CFB except that the output of the cipher is fed back into
+ the next round and not the xor'd plain text\. This means that errors only
+ affect a single block but the cipher is more vulnerable to attack\.
+
+# EXAMPLES
+
+ % set ciphertext \[DES::des \-mode cbc \-dir encrypt \-key $secret $plaintext\]
+ % set plaintext \[DES::des \-mode cbc \-dir decrypt \-key $secret $ciphertext\]
+
+ set iv \[string repeat \\\\0 8\]
+ set Key \[DES::Init cbc \\\\0\\\\1\\\\2\\\\3\\\\4\\\\5\\\\6\\\\7 $iv\]
+ set ciphertext \[DES::Encrypt $Key "somedata"\]
+ append ciphertext \[DES::Encrypt $Key "moredata"\]
+ DES::Reset $Key $iv
+ set plaintext \[DES::Decrypt $Key $ciphertext\]
+ DES::Final $Key
+
+# REFERENCES
+
+ 1. "Data Encryption Standard", Federal Information Processing Standards
+ Publication 46\-3, 1999,
+ \([http://csrc\.nist\.gov/publications/fips/fips46\-3/fips46\-3\.pdf](http://csrc\.nist\.gov/publications/fips/fips46\-3/fips46\-3\.pdf)\)
+
+ 1. "TclDES: munitions\-grade Tcl scripting"
+ [http://tcldes\.sourceforge\.net/](http://tcldes\.sourceforge\.net/)
+
+# AUTHORS
+
+Jochen C Loewer, Mac Cody, Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *des* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[aes\(n\)](\.\./aes/aes\.md), [blowfish\(n\)](\.\./blowfish/blowfish\.md),
+[md5\(n\)](\.\./md5/md5\.md), [rc4\(n\)](\.\./rc4/rc4\.md),
+[sha1\(n\)](\.\./sha1/sha1\.md)
+
+# KEYWORDS
+
+[3DES](\.\./\.\./\.\./\.\./index\.md\#3des), [DES](\.\./\.\./\.\./\.\./index\.md\#des),
+[block cipher](\.\./\.\./\.\./\.\./index\.md\#block\_cipher), [data
+integrity](\.\./\.\./\.\./\.\./index\.md\#data\_integrity),
+[encryption](\.\./\.\./\.\./\.\./index\.md\#encryption),
+[security](\.\./\.\./\.\./\.\./index\.md\#security)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2005, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/des/tcldes.md
Index: embedded/md/tcllib/files/modules/des/tcldes.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/des/tcldes.md
@@ -0,0 +1,80 @@
+
+[//000000001]: # (tclDES \- Data Encryption Standard \(DES\))
+[//000000002]: # (Generated from file 'tcldes\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2005, Pat Thoyts )
+[//000000004]: # (tclDES\(n\) 1\.1 tcllib "Data Encryption Standard \(DES\)")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+tclDES \- Implementation of the DES and triple\-DES ciphers
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require tclDES 1\.1
+
+# DESCRIPTION
+
+The __tclDES__ package is a helper package for __[des](des\.md)__\.
+
+Please see the documentation of __[des](des\.md)__ for details\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *des* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[des\(n\)](des\.md)
+
+# KEYWORDS
+
+[3DES](\.\./\.\./\.\./\.\./index\.md\#3des), [DES](\.\./\.\./\.\./\.\./index\.md\#des),
+[block cipher](\.\./\.\./\.\./\.\./index\.md\#block\_cipher), [data
+integrity](\.\./\.\./\.\./\.\./index\.md\#data\_integrity),
+[encryption](\.\./\.\./\.\./\.\./index\.md\#encryption),
+[security](\.\./\.\./\.\./\.\./index\.md\#security)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2005, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/des/tcldesjr.md
Index: embedded/md/tcllib/files/modules/des/tcldesjr.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/des/tcldesjr.md
@@ -0,0 +1,80 @@
+
+[//000000001]: # (tclDESjr \- Data Encryption Standard \(DES\))
+[//000000002]: # (Generated from file 'tcldesjr\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2005, Pat Thoyts )
+[//000000004]: # (tclDESjr\(n\) 1\.1 tcllib "Data Encryption Standard \(DES\)")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+tclDESjr \- Implementation of the DES and triple\-DES ciphers
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require tclDESjr 1\.1
+
+# DESCRIPTION
+
+The __tclDESjr__ package is a helper package for __[des](des\.md)__\.
+
+Please see the documentation of __[des](des\.md)__ for details\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *des* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[des\(n\)](des\.md)
+
+# KEYWORDS
+
+[3DES](\.\./\.\./\.\./\.\./index\.md\#3des), [DES](\.\./\.\./\.\./\.\./index\.md\#des),
+[block cipher](\.\./\.\./\.\./\.\./index\.md\#block\_cipher), [data
+integrity](\.\./\.\./\.\./\.\./index\.md\#data\_integrity),
+[encryption](\.\./\.\./\.\./\.\./index\.md\#encryption),
+[security](\.\./\.\./\.\./\.\./index\.md\#security)
+
+# CATEGORY
+
+Hashes, checksums, and encryption
+
+# COPYRIGHT
+
+Copyright © 2005, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/dicttool/dicttool.md
Index: embedded/md/tcllib/files/modules/dicttool/dicttool.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/dicttool/dicttool.md
@@ -0,0 +1,132 @@
+
+[//000000001]: # (dicttool \- Extensions to the standard "dict" command)
+[//000000002]: # (Generated from file 'dicttool\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2017 Sean Woods )
+[//000000004]: # (dicttool\(n\) 1\.0 tcllib "Extensions to the standard "dict" command")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+dicttool \- Dictionary Tools
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Bugs, Ideas, Feedback](#section2)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.5
+
+[__ladd__ *varname* *args*](#1)
+[__ldelete__ *varname* *args*](#2)
+[__dict getnull__ *args*](#3)
+[__dict print__ *dict*](#4)
+[__dict is\_dict__ *value*](#5)
+[__rmerge__ *args*](#6)
+
+# DESCRIPTION
+
+The __dicttool__ package enhances the standard *dict* command with several
+new commands\. In addition, the package also defines several "creature comfort"
+list commands as well\. Each command checks to see if a command already exists of
+the same name before adding itself, just in case any of these slip into the
+core\.
+
+ - __ladd__ *varname* *args*
+
+ This command will add a new instance of each element in *args* to
+ *varname*, but only if that element is not already present\.
+
+ - __ldelete__ *varname* *args*
+
+ This command will add a delete all instances of each element in *args*
+ from *varname*\.
+
+ - __dict getnull__ *args*
+
+ Operates like __dict get__, however if the key *args* does not exist,
+ it returns an empty list instead of throwing an error\.
+
+ - __dict print__ *dict*
+
+ This command will produce a string representation of *dict*, with each
+ nested branch on a newline, and indented with two spaces for every level\.
+
+ - __dict is\_dict__ *value*
+
+ This command will return true if *value* can be interpreted as a dict\. The
+ command operates in such a way as to not force an existing dict
+ representation to shimmer into another internal rep\.
+
+ - __rmerge__ *args*
+
+ Return a dict which is the product of a recursive merge of all of the
+ arguments\. Unlike __dict merge__, this command descends into all of the
+ levels of a dict\. Dict keys which end in a : indicate a leaf, which will be
+ interpreted as a literal value, and not descended into further\.
+
+ set items \[dict merge \{
+ option \{color \{default: green\}\}
+ \} \{
+ option \{fruit \{default: mango\}\}
+ \} \{
+ option \{color \{default: blue\} fruit \{widget: select values: \{mango apple cherry grape\}\}\}
+ \}\]
+ puts \[dict print $items\]
+
+ Prints the following result:
+
+ option \{
+ color \{
+ default: blue
+ \}
+ fruit \{
+ widget: select
+ values: \{mango apple cherry grape\}
+ \}
+ \}
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *dict* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[dict](\.\./\.\./\.\./\.\./index\.md\#dict)
+
+# CATEGORY
+
+Utilities
+
+# COPYRIGHT
+
+Copyright © 2017 Sean Woods
ADDED embedded/md/tcllib/files/modules/dns/tcllib_dns.md
Index: embedded/md/tcllib/files/modules/dns/tcllib_dns.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/dns/tcllib_dns.md
@@ -0,0 +1,356 @@
+
+[//000000001]: # (dns \- Domain Name Service)
+[//000000002]: # (Generated from file 'tcllib\_dns\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002, Pat Thoyts)
+[//000000004]: # (dns\(n\) 1\.4\.0 tcllib "Domain Name Service")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+dns \- Tcl Domain Name Service Client
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [EXAMPLES](#section3)
+
+ - [REFERENCES](#section4)
+
+ - [AUTHORS](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require dns ?1\.4\.0?
+
+[__::dns::resolve__ *query* ?*options*?](#1)
+[__::dns::configure__ ?*options*?](#2)
+[__::dns::name__ *token*](#3)
+[__::dns::address__ *token*](#4)
+[__::dns::cname__ *token*](#5)
+[__::dns::result__ *token*](#6)
+[__::dns::status__ *token*](#7)
+[__::dns::error__ *token*](#8)
+[__::dns::reset__ *token*](#9)
+[__::dns::wait__ *token*](#10)
+[__::dns::cleanup__ *token*](#11)
+[__::dns::nameservers__](#12)
+
+# DESCRIPTION
+
+The dns package provides a Tcl only Domain Name Service client\. You should refer
+to \(1\) and \(2\) for information about the DNS protocol or read resolver\(3\) to
+find out how the C library resolves domain names\. The intention of this package
+is to insulate Tcl scripts from problems with using the system library resolver
+for slow name servers\. It may or may not be of practical use\. Internet name
+resolution is a complex business and DNS is only one part of the resolver\. You
+may find you are supposed to be using hosts files, NIS or WINS to name a few
+other systems\. This package is not a substitute for the C library resolver \- it
+does however implement name resolution over DNS\. The package also extends the
+package __[uri](\.\./uri/uri\.md)__ to support DNS URIs \(4\) of the form
+[dns:what\.host\.com](dns:what\.host\.com) or
+[dns://my\.nameserver/what\.host\.com](dns://my\.nameserver/what\.host\.com)\. The
+__dns::resolve__ command can handle DNS URIs or simple domain names as a
+query\.
+
+*Note:* The package defaults to using DNS over TCP connections\. If you wish to
+use UDP you will need to have the __tcludp__ package installed and have a
+version that correctly handles binary data \(> 1\.0\.4\)\. This is available at
+[http://tcludp\.sourceforge\.net/](http://tcludp\.sourceforge\.net/)\. If the
+__udp__ package is present then UDP will be used by default\.
+
+*Note:* The package supports DNS over TLS \(RFC 7858\) for enhanced privacy of
+DNS queries\. Using this feature requires the TLS package\.
+
+# COMMANDS
+
+ - __::dns::resolve__ *query* ?*options*?
+
+ Resolve a domain name using the *[DNS](\.\./\.\./\.\./\.\./index\.md\#dns)*
+ protocol\. *query* is the domain name to be lookup up\. This should be
+ either a fully qualified domain name or a DNS URI\.
+
+ * __\-nameserver__ *hostname* or __\-server__ *hostname*
+
+ Specify an alternative name server for this request\.
+
+ * __\-protocol__ *tcp|udp*
+
+ Specify the network protocol to use for this request\. Can be one of
+ *tcp* or *udp*\.
+
+ * __\-port__ *portnum*
+
+ Specify an alternative port\.
+
+ * __\-search__ *domainlist*
+
+ * __\-timeout__ *milliseconds*
+
+ Override the default timeout\.
+
+ * __\-type__ *TYPE*
+
+ Specify the type of DNS record you are interested in\. Valid values are
+ A, NS, MD, MF, CNAME, SOA, MB, MG, MR, NULL, WKS, PTR, HINFO, MINFO, MX,
+ TXT, SPF, SRV, AAAA, AXFR, MAILB, MAILA and \*\. See RFC1035 for details
+ about the return values\. See
+ [http://spf\.pobox\.com/](http://spf\.pobox\.com/) about SPF\. See \(3\)
+ about AAAA records and RFC2782 for details of SRV records\.
+
+ * __\-class__ *CLASS*
+
+ Specify the class of domain name\. This is usually IN but may be one of
+ IN for internet domain names, CS, CH, HS or \* for any class\.
+
+ * __\-recurse__ *boolean*
+
+ Set to *false* if you do not want the name server to recursively act
+ upon your request\. Normally set to *true*\.
+
+ * __\-command__ *procname*
+
+ Set a procedure to be called upon request completion\. The procedure will
+ be passed the token as its only argument\.
+
+ * __\-usetls__ *boolean*
+
+ Set the *true* to use DNS over TLS\. This will force the use of TCP and
+ change the default port to 853\. Certificate validation is required so a
+ source of trusted certificate authority certificates must be provided
+ using *\-cafile* or *\-cadir*\.
+
+ * __\-cafile__ *filepath*
+
+ Specify a file containing a collection of trusted certificate authority
+ certficates\. See the __update\-ca\-certificates__ command manual page
+ for details or the __\-CAfile__ option help from __openssl__\.
+
+ * __\-cadir__ *dirpath*
+
+ Specify a directory containing trusted certificate authority
+ certificates\. This must be provided if __\-cafile__ is not specified
+ for certificate validation to work when __\-usetls__ is enabled\. See
+ the __openssl__ documentation for the required structure of this
+ directory\.
+
+ - __::dns::configure__ ?*options*?
+
+ The __::dns::configure__ command is used to setup the dns package\. The
+ server to query, the protocol and domain search path are all set via this
+ command\. If no arguments are provided then a list of all the current
+ settings is returned\. If only one argument then it must the the name of an
+ option and the value for that option is returned\.
+
+ * __\-nameserver__ *hostname*
+
+ Set the default name server to be used by all queries\. The default is
+ *localhost*\.
+
+ * __\-protocol__ *tcp|udp*
+
+ Set the default network protocol to be used\. Default is *tcp*\.
+
+ * __\-port__ *portnum*
+
+ Set the default port to use on the name server\. The default is 53\.
+
+ * __\-search__ *domainlist*
+
+ Set the domain search list\. This is currently not used\.
+
+ * __\-timeout__ *milliseconds*
+
+ Set the default timeout value for DNS lookups\. Default is 30 seconds\.
+
+ * __\-loglevel__ *level*
+
+ Set the log level used for emitting diagnostic messages from this
+ package\. The default is *warn*\. See the
+ __[log](\.\./log/log\.md)__ package for details of the available
+ levels\.
+
+ * __\-cafile__ *filepath*
+
+ Set the default file path to be used for the __\-cafile__ option to
+ __dns::resolve__\.
+
+ * __\-cadir__ *dirpath*
+
+ Set the default directory path to be used for the __\-cadir__ option
+ to __dns::resolve__\.
+
+ - __::dns::name__ *token*
+
+ Returns a list of all domain names returned as an answer to your query\.
+
+ - __::dns::address__ *token*
+
+ Returns a list of the address records that match your query\.
+
+ - __::dns::cname__ *token*
+
+ Returns a list of canonical names \(usually just one\) matching your query\.
+
+ - __::dns::result__ *token*
+
+ Returns a list of all the decoded answer records provided for your query\.
+ This permits you to extract the result for more unusual query types\.
+
+ - __::dns::status__ *token*
+
+ Returns the status flag\. For a successfully completed query this will be
+ *ok*\. May be *error* or *timeout* or *eof*\. See also
+ __::dns::error__
+
+ - __::dns::error__ *token*
+
+ Returns the error message provided for requests whose status is *error*\.
+ If there is no error message then an empty string is returned\.
+
+ - __::dns::reset__ *token*
+
+ Reset or cancel a DNS query\.
+
+ - __::dns::wait__ *token*
+
+ Wait for a DNS query to complete and return the status upon completion\.
+
+ - __::dns::cleanup__ *token*
+
+ Remove all state variables associated with the request\.
+
+ - __::dns::nameservers__
+
+ Attempts to return a list of the nameservers currently configured for the
+ users system\. On a unix machine this parses the /etc/resolv\.conf file for
+ nameservers \(if it exists\) and on Windows systems we examine certain parts
+ of the registry\. If no nameserver can be found then the loopback address
+ \(127\.0\.0\.1\) is used as a default\.
+
+# EXAMPLES
+
+ % set tok \[dns::resolve www\.tcl\.tk\]
+ ::dns::1
+ % dns::status $tok
+ ok
+ % dns::address $tok
+ 199\.175\.6\.239
+ % dns::name $tok
+ www\.tcl\.tk
+ % dns::cleanup $tok
+
+Using DNS URIs as queries:
+
+ % set tok \[dns::resolve "dns:tcl\.tk;type=MX"\]
+ % set tok \[dns::resolve "dns://l\.root\-servers\.net/www\.tcl\.tk"\]
+
+Reverse address lookup:
+
+ % set tok \[dns::resolve 127\.0\.0\.1\]
+ ::dns::1
+ % dns::name $tok
+ localhost
+ % dns::cleanup $tok
+
+Using DNS over TLS \(RFC 7858\):
+
+ % set tok \[dns::resolve www\.tcl\.tk \-nameserver dns\-tls\.bitwiseshift\.net \-usetls 1 \-cafile /etc/ssl/certs/ca\-certificates\.crt\]
+ ::dns::12
+ % dns::wait $tok
+ ok
+ % dns::address $tok
+ 104\.25\.119\.118 104\.25\.120\.118
+
+# REFERENCES
+
+ 1. Mockapetris, P\., "Domain Names \- Concepts and Facilities", RFC 1034,
+ November 1987\.
+ \([http://www\.ietf\.org/rfc/rfc1034\.txt](http://www\.ietf\.org/rfc/rfc1034\.txt)\)
+
+ 1. Mockapetris, P\., "Domain Names \- Implementation and Specification", RFC
+ 1035, November 1087\.
+ \([http://www\.ietf\.org/rfc/rfc1035\.txt](http://www\.ietf\.org/rfc/rfc1035\.txt)\)
+
+ 1. Thompson, S\. and Huitema, C\., "DNS Extensions to support IP version 6", RFC
+ 1886, December 1995\.
+ \([http://www\.ietf\.org/rfc/rfc1886\.txt](http://www\.ietf\.org/rfc/rfc1886\.txt)\)
+
+ 1. Josefsson, S\., "Domain Name System Uniform Resource Identifiers",
+ Internet\-Draft, October 2003,
+ \([http://www\.ietf\.org/internet\-drafts/draft\-josefsson\-dns\-url\-09\.txt](http://www\.ietf\.org/internet\-drafts/draft\-josefsson\-dns\-url\-09\.txt)\)
+
+ 1. Gulbrandsen, A\., Vixie, P\. and Esibov, L\., "A DNS RR for specifying the
+ location of services \(DNS SRV\)", RFC 2782, February 2000,
+ \([http://www\.ietf\.org/rfc/rfc2782\.txt](http://www\.ietf\.org/rfc/rfc2782\.txt)\)
+
+ 1. Ohta, M\. "Incremental Zone Transfer in DNS", RFC 1995, August 1996,
+ \([http://www\.ietf\.org/rfc/rfc1995\.txt](http://www\.ietf\.org/rfc/rfc1995\.txt)\)
+
+ 1. Hu, Z\., etc al\. "Specification for DNS over Transport Layer Security
+ \(TLS\)", RFC 7858, May 2016,
+ \([http://www\.ietf\.org/rfc/rfc7858\.txt](http://www\.ietf\.org/rfc/rfc7858\.txt)\)
+
+# AUTHORS
+
+Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *dns* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+resolver\(5\)
+
+# KEYWORDS
+
+[DNS](\.\./\.\./\.\./\.\./index\.md\#dns), [domain name
+service](\.\./\.\./\.\./\.\./index\.md\#domain\_name\_service),
+[resolver](\.\./\.\./\.\./\.\./index\.md\#resolver), [rfc
+1034](\.\./\.\./\.\./\.\./index\.md\#rfc\_1034), [rfc
+1035](\.\./\.\./\.\./\.\./index\.md\#rfc\_1035), [rfc
+1886](\.\./\.\./\.\./\.\./index\.md\#rfc\_1886), [rfc
+7858](\.\./\.\./\.\./\.\./index\.md\#rfc\_7858)
+
+# CATEGORY
+
+Networking
+
+# COPYRIGHT
+
+Copyright © 2002, Pat Thoyts
ADDED embedded/md/tcllib/files/modules/dns/tcllib_ip.md
Index: embedded/md/tcllib/files/modules/dns/tcllib_ip.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/dns/tcllib_ip.md
@@ -0,0 +1,424 @@
+
+[//000000001]: # (tcllib\_ip \- Domain Name Service)
+[//000000002]: # (Generated from file 'tcllib\_ip\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2004, Pat Thoyts
+Copyright © 2005 Aamer Akhter )
+[//000000004]: # (tcllib\_ip\(n\) 1\.4 tcllib "Domain Name Service")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+tcllib\_ip \- IPv4 and IPv6 address manipulation
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [COMMANDS](#section2)
+
+ - [EXAMPLES](#section3)
+
+ - [REFERENCES](#section4)
+
+ - [AUTHORS](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require ip ?1\.4?
+
+[__::ip::version__ *address*](#1)
+[__::ip::is__ *class* *address*](#2)
+[__::ip::equal__ *address* *address*](#3)
+[__::ip::normalize__ *address*](#4)
+[__::ip::contract__ *address*](#5)
+[__::ip::distance__ *ipaddr1* *ipaddr2*](#6)
+[__::ip::nextIp__ *ipaddr* ?*offset*?](#7)
+[__::ip::prefix__ *address*](#8)
+[__::ip::type__ *address*](#9)
+[__::ip::mask__ *address*](#10)
+[__::ip::prefixToNative__ *prefix*](#11)
+[__::ip::nativeToPrefix__ *nativeList*|*native* ?__\-ipv4__?](#12)
+[__::ip::intToString__ *number* ?__\-ipv4__?](#13)
+[__::ip::toInteger__ *ipaddr*](#14)
+[__::ip::toHex__ *ipaddr*](#15)
+[__::ip::maskToInt__ *ipmask*](#16)
+[__::ip::broadcastAddress__ *prefix* ?__\-ipv4__?](#17)
+[__::ip::maskToLength__ *dottedMask*|*integerMask*|*hexMask* ?__\-ipv4__?](#18)
+[__::ip::lengthToMask__ *maskLength* ?__\-ipv4__?](#19)
+[__::ip::nextNet__ *ipaddr* *ipmask* ?*count*? ?__\-ipv4__?](#20)
+[__::ip::isOverlap__ *prefix* *prefix*\.\.\.](#21)
+[__::ip::isOverlapNative__ ?__\-all__? ?__\-inline__? ?__\-ipv4__? *hexipaddr* *hexipmask* *hexiplist*](#22)
+[__::ip::ipToLayer2Multicast__ *ipaddr*](#23)
+[__::ip::ipHostFromPrefix__ *prefix* ?__\-exclude__ *prefixExcludeList*?](#24)
+[__::ip::reduceToAggregates__ *prefixlist*](#25)
+[__::ip::longestPrefixMatch__ *ipaddr* *prefixlist* ?__\-ipv4__?](#26)
+[__::ip::collapse__ *prefixlist*](#27)
+[__::ip::subtract__ *prefixlist*](#28)
+
+# DESCRIPTION
+
+This package provides a set of commands to help in parsing, displaying and
+comparing internet addresses\. The package can handle both IPv4 \(1\) and IPv6 \(2\)
+address types\.
+
+# COMMANDS
+
+ - __::ip::version__ *address*
+
+ Returns the protocol version of the address \(__4__ or __6__\), or
+ __\-1__ if the address is neither IPv4 or IPv6\.
+
+ - __::ip::is__ *class* *address*
+
+ Returns true if the address is a member of the given protocol class\. The
+ class parameter may be either __ipv4__ or __ipv6__ This is
+ effectively a boolean equivalent of the __version__ command\. The
+ *class* argument may be shortened to __4__ or __6__\.
+
+ - __::ip::equal__ *address* *address*
+
+ Compare two address specifications for equivalence\. The arguments are
+ normalized and the address prefix determined \(if a mask is supplied\)\. The
+ normalized addresses are then compared bit\-by\-bit and the procedure returns
+ true if they match\.
+
+ - __::ip::normalize__ *address*
+
+ Convert an IPv4 or IPv6 address into a fully expanded version\. There are
+ various shorthand ways to write internet addresses, missing out redundant
+ parts or digits\. This procedure is the opposite of __contract__\.
+
+ - __::ip::contract__ *address*
+
+ Convert a __normalize__d internet address into a more compact form
+ suitable for displaying to users\.
+
+ - __::ip::distance__ *ipaddr1* *ipaddr2*
+
+ This command computes the \(integer\) distance from IPv4 address *ipaddr1*
+ to IPv4 address *ipaddr2*, i\.e\. "ipaddr2 \- ipaddr1"
+
+ % ::ip::distance 1\.1\.1\.1 1\.1\.1\.5
+ 4
+
+ - __::ip::nextIp__ *ipaddr* ?*offset*?
+
+ This command adds the integer *offset* to the IPv4 address *ipaddr* and
+ returns the new IPv4 address\.
+
+ % ::ip::distance 1\.1\.1\.1 4
+ 1\.1\.1\.5
+
+ - __::ip::prefix__ *address*
+
+ Returns the address prefix generated by masking the address part with the
+ mask if provided\. If there is no mask then it is equivalent to calling
+ __normalize__
+
+ - __::ip::type__ *address*
+
+ - __::ip::mask__ *address*
+
+ If the address supplied includes a mask then this is returned otherwise
+ returns an empty string\.
+
+ - __::ip::prefixToNative__ *prefix*
+
+ This command converts the string *prefix* from dotted form
+ \(/ format\) to native \(hex\) form\. Returns a list containing two
+ elements, ipaddress and mask, in this order, in hexadecimal notation\.
+
+ % ip::prefixToNative 1\.1\.1\.0/24
+ 0x01010100 0xffffff00
+
+ - __::ip::nativeToPrefix__ *nativeList*|*native* ?__\-ipv4__?
+
+ This command converts from native \(hex\) form to dotted form\. It is the
+ complement of __::ip::prefixToNative__\.
+
+ * list *nativeList* \(in\)
+
+ List of several ip addresses in native form\. The native form is a list
+ as returned by __::ip::prefixToNative__\.
+
+ * list *native* \(in\)
+
+ A list as returned by __::ip::prefixToNative__\.
+
+ The command returns a list of addresses in dotted form if it was called with
+ a list of addresses\. Otherwise a single address in dotted form is returned\.
+
+ % ip::nativeToPrefix \{0x01010100 0xffffff00\} \-ipv4
+ 1\.1\.1\.0/24
+
+ - __::ip::intToString__ *number* ?__\-ipv4__?
+
+ This command converts from an ip address specified as integer number to
+ dotted form\.
+
+ ip::intToString 4294967295
+ 255\.255\.255\.255
+
+ - __::ip::toInteger__ *ipaddr*
+
+ This command converts a dotted form ip into an integer number\.
+
+ % ::ip::toInteger 1\.1\.1\.0
+ 16843008
+
+ - __::ip::toHex__ *ipaddr*
+
+ This command converts dotted form ip into a hexadecimal number\.
+
+ % ::ip::toHex 1\.1\.1\.0
+ 0x01010100
+
+ - __::ip::maskToInt__ *ipmask*
+
+ This command convert an ipmask in either dotted \(255\.255\.255\.0\) form or mask
+ length form \(24\) into an integer number\.
+
+ ::ip::maskToInt 24
+ 4294967040
+
+ - __::ip::broadcastAddress__ *prefix* ?__\-ipv4__?
+
+ This commands returns a broadcast address in dotted form for the given route
+ *prefix*, either in the form "addr/mask", or in native form\. The result is
+ in dotted form\.
+
+ ::ip::broadcastAddress 1\.1\.1\.0/24
+ 1\.1\.1\.255
+
+ ::ip::broadcastAddress \{0x01010100 0xffffff00\}
+ 0x010101ff
+
+ - __::ip::maskToLength__ *dottedMask*|*integerMask*|*hexMask* ?__\-ipv4__?
+
+ This command converts the dotted or integer form of an ipmask to the mask
+ length form\.
+
+ ::ip::maskToLength 0xffffff00 \-ipv4
+ 24
+
+ % ::ip::maskToLength 255\.255\.255\.0
+ 24
+
+ - __::ip::lengthToMask__ *maskLength* ?__\-ipv4__?
+
+ This command converts an ipmask in mask length form to its dotted form\.
+
+ ::ip::lengthToMask 24
+ 255\.255\.255\.0
+
+ - __::ip::nextNet__ *ipaddr* *ipmask* ?*count*? ?__\-ipv4__?
+
+ This command returns an ipaddress in the same position in the *count* next
+ network\. The default value for *count* is __1__\.
+
+ The address can be specified as either integer number or in dotted form\. The
+ mask can be specified as either integer number, dotted form, or mask length
+ form\.
+
+ The result is in hex form\.
+
+ - __::ip::isOverlap__ *prefix* *prefix*\.\.\.
+
+ This command checks if the given ip prefixes overlap\. All arguments are in
+ dotted "addr/mask" form\. All arguments after the first prefix are compared
+ against the first prefix\. The result is a boolean value\. It is true if an
+ overlap was found for any of the prefixes\.
+
+ % ::ip::isOverlap 1\.1\.1\.0/24 2\.1\.0\.1/32
+ 0
+
+ ::ip::isOverlap 1\.1\.1\.0/24 2\.1\.0\.1/32 1\.1\.1\.1/32
+ 1
+
+ - __::ip::isOverlapNative__ ?__\-all__? ?__\-inline__? ?__\-ipv4__? *hexipaddr* *hexipmask* *hexiplist*
+
+ This command is similar to __::ip::isOverlap__, however the arguments
+ are in the native form, and the form of the result is under greater control
+ of the caller\. If the option __\-all__ is specified it checks all
+ addresses for overlap, not only until the first one is found\. If the option
+ __\-inline__ is specified the command returns the overlapping prefix
+ instead of index values\.
+
+ The result of the command is, depending on the specified options,
+
+ * no options
+
+ The index of the first overlap found, or 0 if there is none\.
+
+ * \-all
+
+ A list containing the indices of all overlaps found, or an empty list if
+ there are none\.
+
+ * \-inline
+
+ The first overlapping prefix, or an empoty string if there is none\.
+
+ * \-all \-inline
+
+ A list containing the prefixes of all overlaps found, or an empty list
+ if there are none\.
+
+ % ::ip::isOverlapNative 0x01010100 0xffffff00 \{\{0x02010001 0xffffffff\}\}
+ 0
+
+ % ::ip::isOverlapNative 0x01010100 0xffffff00 \{\{0x02010001 0xffffffff\} \{0x01010101 0xffffffff\}\}
+ 2
+
+ - __::ip::ipToLayer2Multicast__ *ipaddr*
+
+ This command an converts ipv4 address in dotted form into a layer 2
+ multicast address, also in dotted form\.
+
+ % ::ip::ipToLayer2Multicast 224\.0\.0\.2
+ 01\.00\.5e\.00\.00\.02
+
+ - __::ip::ipHostFromPrefix__ *prefix* ?__\-exclude__ *prefixExcludeList*?
+
+ This command returns a host address from a prefix in the form
+ "ipaddr/masklen", also making sure that the result is not an address found
+ in the *prefixExcludeList*\. The result is an ip address in dotted form\.
+
+ %::ip::ipHostFromPrefix 1\.1\.1\.5/24
+ 1\.1\.1\.1
+
+ %::ip::ipHostFromPrefix 1\.1\.1\.1/32
+ 1\.1\.1\.1
+
+ - __::ip::reduceToAggregates__ *prefixlist*
+
+ This command finds nets that overlap and filters out the more specific nets\.
+ The prefixes are in either addr/mask form or in native format\. The result is
+ a list containing the non\-overlapping ip prefixes from the input\.
+
+ % ::ip::reduceToAggregates \{1\.1\.1\.0/24 1\.1\.0\.0/8 2\.1\.1\.0/24 1\.1\.1\.1/32 \}
+ 1\.0\.0\.0/8 2\.1\.1\.0/24
+
+ - __::ip::longestPrefixMatch__ *ipaddr* *prefixlist* ?__\-ipv4__?
+
+ This command finds longest prefix match from set of prefixes, given a
+ specific host address\. The prefixes in the list are in either native or
+ dotted form, whereas the host address is in either ipprefix format, dotted
+ form, or integer form\. The result is the prefix which is the most specific
+ match to the host address\.
+
+ % ::ip::longestPrefixMatch 1\.1\.1\.1 \{1\.1\.1\.0/24 1\.0\.0\.0/8 2\.1\.1\.0/24 1\.1\.1\.0/28 \}
+ 1\.1\.1\.0/28
+
+ - __::ip::collapse__ *prefixlist*
+
+ This commands takes a list of prefixes and returns a list prefixes with the
+ largest possible subnet masks covering the input, in this manner collapsing
+ adjacent prefixes into larger ranges\.
+
+ This is different from __::ip::reduceToAggregates__ in that the latter
+ only removes specific nets from a list when they are covered by other
+ elements of the input whereas this command actively merges nets into larger
+ ranges when they are adjacent to each other\.
+
+ % ::ip::collapse \{1\.2\.2\.0/24 1\.2\.3\.0/24\}
+ 1\.2\.2\.0/23
+
+ - __::ip::subtract__ *prefixlist*
+
+ This command takes a list of prefixes, some of which are prefixed by a dash\.
+ These latter *negative* prefixes are used to punch holes into the ranges
+ described by the other, *positive*, prefixes\. I\.e\. the negative prefixes
+ are subtracted frrom the positive ones, resulting in a larger list of
+ describes describing the covered ranges only as positives\.
+
+# EXAMPLES
+
+ % ip::version ::1
+ 6
+ % ip::version 127\.0\.0\.1
+ 4
+
+ % ip::normalize 127/8
+ 127\.0\.0\.0/8
+ % ip::contract 192\.168\.0\.0
+ 192\.168
+ %
+ % ip::normalize fec0::1
+ fec0:0000:0000:0000:0000:0000:0000:0001
+ % ip::contract fec0:0000:0000:0000:0000:0000:0000:0001
+ fec0::1
+
+ % ip::equal 192\.168\.0\.4/16 192\.168\.0\.0/16
+ 1
+ % ip::equal fec0::1/10 fec0::fe01/10
+ 1
+
+# REFERENCES
+
+ 1. Postel, J\. "Internet Protocol\." RFC 791, September 1981,
+ \([http://www\.ietf\.org/rfc/rfc791\.txt](http://www\.ietf\.org/rfc/rfc791\.txt)\)
+
+ 1. Hinden, R\. and Deering, S\., "Internet Protocol Version 6 \(IPv6\) Addressing
+ Architecture", RFC 3513, April 2003
+ \([http://www\.ietf\.org/rfc/rfc3513\.txt](http://www\.ietf\.org/rfc/rfc3513\.txt)\)
+
+# AUTHORS
+
+Pat Thoyts
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *dns* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+inet\(3\), ip\(7\), ipv6\(7\)
+
+# KEYWORDS
+
+[internet address](\.\./\.\./\.\./\.\./index\.md\#internet\_address),
+[ip](\.\./\.\./\.\./\.\./index\.md\#ip), [ipv4](\.\./\.\./\.\./\.\./index\.md\#ipv4),
+[ipv6](\.\./\.\./\.\./\.\./index\.md\#ipv6), [rfc
+3513](\.\./\.\./\.\./\.\./index\.md\#rfc\_3513)
+
+# CATEGORY
+
+Networking
+
+# COPYRIGHT
+
+Copyright © 2004, Pat Thoyts
+Copyright © 2005 Aamer Akhter
ADDED embedded/md/tcllib/files/modules/docstrip/docstrip.md
Index: embedded/md/tcllib/files/modules/docstrip/docstrip.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/docstrip/docstrip.md
@@ -0,0 +1,449 @@
+
+[//000000001]: # (docstrip \- Literate programming tool)
+[//000000002]: # (Generated from file 'docstrip\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2003–2010 Lars Hellström )
+[//000000004]: # (docstrip\(n\) 1\.2 tcllib "Literate programming tool")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+docstrip \- Docstrip style source code extraction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [File format](#section2)
+
+ - [Commands](#section3)
+
+ - [Document structure](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require docstrip ?1\.2?
+
+[__docstrip::extract__ *text* *terminals* ?*option* *value* \.\.\.?](#1)
+[__docstrip::sourcefrom__ *filename* *terminals* ?*option* *value* \.\.\.?](#2)
+
+# DESCRIPTION
+
+__Docstrip__ is a tool created to support a brand of Literate Programming\.
+It is most common in the \(La\)TeX community, where it is being used for pretty
+much everything from the LaTeX core and up, but there is nothing about
+__docstrip__ which prevents using it for other types of software\.
+
+In short, the basic principle of literate programming is that program source
+should primarily be written and structured to suit the developers \(and advanced
+users who want to peek "under the hood"\), not to suit the whims of a compiler or
+corresponding source code consumer\. This means literate sources often need some
+kind of "translation" to an illiterate form that dumb software can understand\.
+The __docstrip__ Tcl package handles this translation\.
+
+Even for those who do not whole\-hartedly subscribe to the philosophy behind
+literate programming, __docstrip__ can bring greater clarity to in
+particular:
+
+ - programs employing non\-obvious mathematics
+
+ - projects where separate pieces of code, perhaps in different languages, need
+ to be closely coordinated\.
+
+The first is by providing access to much more powerful typographical features
+for source code comments than are possible in plain text\. The second is because
+all the separate pieces of code can be kept next to each other in the same
+source file\.
+
+The way it works is that the programmer edits directly only one or several
+"master" source code files, from which __docstrip__ generates the more
+traditional "source" files compilers or the like would expect\. The master
+sources typically contain a large amount of documentation of the code, sometimes
+even in places where the code consumers would not allow any comments\. The
+etymology of "docstrip" is that this *doc*umentation was *strip*ped away
+\(although "code extraction" might be a better description, as it has always been
+a matter of copying selected pieces of the master source rather than deleting
+text from it\)\. The __docstrip__ Tcl package contains a reimplementation of
+the basic extraction functionality from the __docstrip__ program, and thus
+makes it possible for a Tcl interpreter to read and interpret the master source
+files directly\.
+
+Readers who are not previously familiar with __docstrip__ but want to know
+more about it may consult the following sources\.
+
+ 1. *The tclldoc package and class*,
+ [http://ctan\.org/tex\-archive/macros/latex/contrib/tclldoc/](http://ctan\.org/tex\-archive/macros/latex/contrib/tclldoc/)\.
+
+ 1. *The DocStrip utility*,
+ [http://ctan\.org/tex\-archive/macros/latex/base/docstrip\.dtx](http://ctan\.org/tex\-archive/macros/latex/base/docstrip\.dtx)\.
+
+ 1. *The doc and shortvrb Packages*,
+ [http://ctan\.org/tex\-archive/macros/latex/base/doc\.dtx](http://ctan\.org/tex\-archive/macros/latex/base/doc\.dtx)\.
+
+ 1. Chapter 14 of *The LaTeX Companion* \(second edition\), Addison\-Wesley,
+ 2004; ISBN 0\-201\-36299\-6\.
+
+# File format
+
+The basic unit __docstrip__ operates on are the *lines* of a master source
+file\. Extraction consists of selecting some of these lines to be copied from
+input text to output text\. The basic distinction is that between *code lines*
+\(which are copied and do not begin with a percent character\) and *comment
+lines* \(which begin with a percent character and are not copied\)\.
+
+ docstrip::extract \[join \{
+ \{% comment\}
+ \{% more comment \!"\#$%&/\(\}
+ \{some command\}
+ \{ % blah $blah "Not a comment\."\}
+ \{% abc; this is comment\}
+ \{\# def; this is code\}
+ \{ghi\}
+ \{% jkl\}
+ \} \\n\] \{\}
+
+returns the same sequence of lines as
+
+ join \{
+ \{some command\}
+ \{ % blah $blah "Not a comment\."\}
+ \{\# def; this is code\}
+ \{ghi\} ""
+ \} \\n
+
+It does not matter to __docstrip__ what format is used for the documentation
+in the comment lines, but in order to do better than plain text comments, one
+typically uses some markup language\. Most commonly LaTeX is used, as that is a
+very established standard and also provides the best support for mathematical
+formulae, but the __docstrip::util__ package also gives some support for
+*[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)*\-like markup\.
+
+Besides the basic code and comment lines, there are also *guard lines*, which
+begin with the two characters '%<', and *meta\-comment lines*, which begin with
+the two characters '%%'\. Within guard lines there is furthermore the distinction
+between *verbatim guard lines*, which begin with '%<<', and ordinary guard
+lines, where the '%<' is not followed by another '<'\. The last category is by
+far the most common\.
+
+Ordinary guard lines conditions extraction of the code line\(s\) they guard by the
+value of a boolean expression; the guarded block of code lines will only be
+included if the expression evaluates to true\. The syntax of an ordinary guard
+line is one of
+
+ '%' '<' STARSLASH EXPRESSION '>'
+ '%' '<' PLUSMINUS EXPRESSION '>' CODE
+
+where
+
+ STARSLASH ::= '\*' | '/'
+ PLUSMINUS ::= | '\+' | '\-'
+ EXPRESSION ::= SECONDARY | SECONDARY ',' EXPRESSION
+ | SECONDARY '|' EXPRESSION
+ SECONDARY ::= PRIMARY | PRIMARY '&' SECONDARY
+ PRIMARY ::= TERMINAL | '\!' PRIMARY | '\(' EXPRESSION '\)'
+ CODE ::= \{ any character except end\-of\-line \}
+
+Comma and vertical bar both denote 'or'\. Ampersand denotes 'and'\. Exclamation
+mark denotes 'not'\. A TERMINAL can be any nonempty string of characters not
+containing '>', '&', '|', comma, '\(', or '\)', although the __docstrip__
+manual is a bit restrictive and only guarantees proper operation for strings of
+letters \(although even the LaTeX core sources make heavy use also of digits in
+TERMINALs\)\. The second argument of __docstrip::extract__ is the list of
+those TERMINALs that should count as having the value 'true'; all other
+TERMINALs count as being 'false' when guard expressions are evaluated\.
+
+In the case of a '%<\**EXPRESSION*>' guard, the lines guarded are all lines up
+to the next '%*EXPRESSION*>' guard with the same *EXPRESSION* \(compared as
+strings\)\. The blocks of code delimited by such '\*' and '/' guard lines must be
+properly nested\.
+
+ set text \[join \{
+ \{begin\}
+ \{%<\*foo>\}
+ \{1\}
+ \{%<\*bar>\}
+ \{2\}
+ \{%\}
+ \{%<\*\!bar>\}
+ \{3\}
+ \{%\!bar>\}
+ \{4\}
+ \{%\}
+ \{5\}
+ \{%<\*bar>\}
+ \{6\}
+ \{%\}
+ \{end\}
+ \} \\n\]
+ set res \[docstrip::extract $text foo\]
+ append res \[docstrip::extract $text \{foo bar\}\]
+ append res \[docstrip::extract $text bar\]
+
+sets $res to the result of
+
+ join \{
+ \{begin\}
+ \{1\}
+ \{3\}
+ \{4\}
+ \{5\}
+ \{end\}
+ \{begin\}
+ \{1\}
+ \{2\}
+ \{4\}
+ \{5\}
+ \{6\}
+ \{end\}
+ \{begin\}
+ \{5\}
+ \{6\}
+ \{end\} ""
+ \} \\n
+
+In guard lines without a '\*', '/', '\+', or '\-' modifier after the '%<', the
+guard applies only to the CODE following the '>' on that single line\. A '\+'
+modifier is equivalent to no modifier\. A '\-' modifier is like the case with no
+modifier, but the expression is implicitly negated, i\.e\., the CODE of a '%<\-'
+guard line is only included if the expression evaluates to false\.
+
+Metacomment lines are "comment lines which should not be stripped away", but be
+extracted like code lines; these are sometimes used for copyright notices and
+similar material\. The '%%' prefix is however not kept, but substituted by the
+current __\-metaprefix__, which is customarily set to some "comment until end
+of line" character \(or character sequence\) of the language of the code being
+extracted\.
+
+ set text \[join \{
+ \{begin\}
+ \{% foo\}
+ \{%<\+foo>plusfoo\}
+ \{%<\-foo>minusfoo\}
+ \{middle\}
+ \{%% some metacomment\}
+ \{%<\*foo>\}
+ \{%%another metacomment\}
+ \{%\}
+ \{end\}
+ \} \\n\]
+ set res \[docstrip::extract $text foo \-metaprefix \{\# \}\]
+ append res \[docstrip::extract $text bar \-metaprefix \{\#\}\]
+
+sets $res to the result of
+
+ join \{
+ \{begin\}
+ \{ foo\}
+ \{plusfoo\}
+ \{middle\}
+ \{\# some metacomment\}
+ \{\# another metacomment\}
+ \{end\}
+ \{begin\}
+ \{minusfoo\}
+ \{middle\}
+ \{\# some metacomment\}
+ \{end\} ""
+ \} \\n
+
+Verbatim guards can be used to force code line interpretation of a block of
+lines even if some of them happen to look like any other type of lines to
+docstrip\. A verbatim guard has the form '%<<*END\-TAG*' and the verbatim block
+is terminated by the first line that is exactly '%*END\-TAG*'\.
+
+ set text \[join \{
+ \{begin\}
+ \{%<\*myblock>\}
+ \{some stupid\(\)\}
+ \{ \#computer\}
+ \{%<\}
+ \{%QQQ\-98765\}
+ \{ using\*strange@programming\}
+ \{%\}
+ \{end\}
+ \} \\n\]
+ set res \[docstrip::extract $text myblock \-metaprefix \{\# \}\]
+ append res \[docstrip::extract $text \{\}\]
+
+sets $res to the result of
+
+ join \{
+ \{begin\}
+ \{some stupid\(\)\}
+ \{ \#computer\}
+ \{% These three lines are copied verbatim \(including percents\}
+ \{%% even if \-metaprefix is something different than %%\)\.\}
+ \{%\}
+ \{ using\*strange@programming\}
+ \{end\}
+ \{begin\}
+ \{end\} ""
+ \} \\n
+
+The processing of verbatim guards takes place also inside blocks of lines which
+due to some outer block guard will not be copied\.
+
+The final piece of __docstrip__ syntax is that extraction stops at a line
+that is exactly "\\endinput"; this is often used to avoid copying random
+whitespace at the end of a file\. In the unlikely case that one wants such a code
+line, one can protect it with a verbatim guard\.
+
+# Commands
+
+The package defines two commands\.
+
+ - __docstrip::extract__ *text* *terminals* ?*option* *value* \.\.\.?
+
+ The __extract__ command docstrips the *text* and returns the extracted
+ lines of code, as a string with each line terminated with a newline\. The
+ *terminals* is the list of those guard expression terminals which should
+ evaluate to true\. The available options are:
+
+ * __\-annotate__ *lines*
+
+ Requests the specified number of lines of annotation to follow each
+ extracted line in the result\. Defaults to 0\. Annotation lines are mostly
+ useful when the extracted lines are to undergo some further
+ transformation\. A first annotation line is a list of three elements:
+ line type, prefix removed in extraction, and prefix inserted in
+ extraction\. The line type is one of: 'V' \(verbatim\), 'M' \(metacomment\),
+ '\+' \(\+ or no modifier guard line\), '\-' \(\- modifier guard line\), '\.'
+ \(normal line\)\. A second annotation line is the source line number\. A
+ third annotation line is the current stack of block guards\. Requesting
+ more than three lines of annotation is currently not supported\.
+
+ * __\-metaprefix__ *string*
+
+ The string by which the '%%' prefix of a metacomment line will be
+ replaced\. Defaults to '%%'\. For Tcl code this would typically be '\#'\.
+
+ * __\-onerror__ *keyword*
+
+ Controls what will be done when a format error in the *text* being
+ processed is detected\. The settings are:
+
+ + __ignore__
+
+ Just ignore the error; continue as if nothing happened\.
+
+ + __puts__
+
+ Write an error message to __stderr__, then continue processing\.
+
+ + __throw__
+
+ Throw an error\. The __\-errorcode__ is set to a list whose first
+ element is __DOCSTRIP__, second element is the type of error,
+ and third element is the line number where the error is detected\.
+ This is the default\.
+
+ * __\-trimlines__ *boolean*
+
+ Controls whether *spaces* at the end of a line should be trimmed away
+ before the line is processed\. Defaults to true\.
+
+ It should be remarked that the *terminals* are often called "options" in
+ the context of the __docstrip__ program, since these specify which
+ optional code fragments should be included\.
+
+ - __docstrip::sourcefrom__ *filename* *terminals* ?*option* *value* \.\.\.?
+
+ The __sourcefrom__ command is a docstripping emulation of
+ __[source](\.\./\.\./\.\./\.\./index\.md\#source)__\. It opens the file
+ *filename*, reads it, closes it, docstrips the contents as specified by
+ the *terminals*, and evaluates the result in the local context of the
+ caller, during which time the __[info](\.\./\.\./\.\./\.\./index\.md\#info)__
+ __script__ value will be the *filename*\. The options are passed on to
+ __fconfigure__ to configure the file before its contents are read\. The
+ __\-metaprefix__ is set to '\#', all other __extract__ options have
+ their default values\.
+
+# Document structure
+
+The file format \(as described above\) determines whether a master source code
+file can be processed correctly by __docstrip__, but the usefulness of the
+format is to no little part also dependent on that the code and comment lines
+together constitute a well\-formed document\.
+
+For a document format that does not require any non\-Tcl software, see the
+__ddt2man__ command in the __docstrip::util__ package\. It is suggested
+that files employing that document format are given the suffix "\.ddt", to
+distinguish them from the more traditional LaTeX\-based "\.dtx" files\.
+
+Master source files with "\.dtx" extension are usually set up so that they can be
+typeset directly by __[latex](\.\./\.\./\.\./\.\./index\.md\#latex)__ without any
+support from other files\. This is achieved by beginning the file with the lines
+
+ % \\iffalse
+ %<\*driver>
+ \\documentclass\{tclldoc\}
+ \\begin\{document\}
+ \\DocInput\{*filename\.dtx*\}
+ \\end\{document\}
+ %
+ % \\fi
+
+or some variation thereof\. The trick is that the file gets read twice\. With
+normal LaTeX reading rules, the first two lines are comments and therefore
+ignored\. The third line is the document preamble, the fourth line begins the
+document body, and the sixth line ends the document, so LaTeX stops there —
+non\-comments below that point in the file are never subjected to the normal
+LaTeX reading rules\. Before that, however, the \\DocInput command on the fifth
+line is processed, and that does two things: it changes the interpretation of
+'%' from "comment" to "ignored", and it inputs the file specified in the
+argument \(which is normally the name of the file the command is in\)\. It is this
+second time that the file is being read that the comments and code in it are
+typeset\.
+
+The function of the \\iffalse \.\.\. \\fi is to skip lines two to seven on this
+second time through; this is similar to the "if 0 \{ \.\.\. \}" idiom for block
+comments in Tcl code, and it is needed here because \(amongst other things\) the
+\\documentclass command may only be executed once\. The function of the
+guards is to prevent this short piece of LaTeX code from being extracted by
+__docstrip__\. The total effect is that the file can function both as a LaTeX
+document and as a __docstrip__ master source code file\.
+
+It is not necessary to use the tclldoc document class, but that does provide a
+number of features that are convenient for "\.dtx" files containing Tcl code\.
+More information on this matter can be found in the references above\.
+
+# SEE ALSO
+
+[docstrip\_util](docstrip\_util\.md)
+
+# KEYWORDS
+
+[\.dtx](\.\./\.\./\.\./\.\./index\.md\#\_dtx), [LaTeX](\.\./\.\./\.\./\.\./index\.md\#latex),
+[docstrip](\.\./\.\./\.\./\.\./index\.md\#docstrip),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation), [literate
+programming](\.\./\.\./\.\./\.\./index\.md\#literate\_programming),
+[source](\.\./\.\./\.\./\.\./index\.md\#source)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2003–2010 Lars Hellström
ADDED embedded/md/tcllib/files/modules/docstrip/docstrip_util.md
Index: embedded/md/tcllib/files/modules/docstrip/docstrip_util.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/docstrip/docstrip_util.md
@@ -0,0 +1,672 @@
+
+[//000000001]: # (docstrip\_util \- Literate programming tool)
+[//000000002]: # (Generated from file 'docstrip\_util\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2003–2010 Lars Hellström )
+[//000000004]: # (docstrip\_util\(n\) 1\.3\.1 tcllib "Literate programming tool")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+docstrip\_util \- Docstrip\-related utilities
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Package indexing commands](#section2)
+
+ - [Source processing commands](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require docstrip ?1\.2?
+package require docstrip::util ?1\.3\.1?
+
+[__pkgProvide__ *name* *version* *terminals*](#1)
+[__pkgIndex__ ?*terminal* \.\.\.?](#2)
+[__fileoptions__ ?*option* *value* \.\.\.?](#3)
+[__docstrip::util::index\_from\_catalogue__ *dir* *pattern* ?*option* *value* \.\.\.?](#4)
+[__docstrip::util::modules\_from\_catalogue__ *target* *source* ?*option* *value* \.\.\.?](#5)
+[__docstrip::util::classical\_preamble__ *metaprefix* *message* *target* ?*source* *terminals* \.\.\.?](#6)
+[__docstrip::util::classical\_postamble__ *metaprefix* *message* *target* ?*source* *terminals* \.\.\.?](#7)
+[__docstrip::util::packages\_provided__ *text* ?*setup\-script*?](#8)
+[__docstrip::util::ddt2man__ *text*](#9)
+[__docstrip::util::guards__ *subcmd* *text*](#10)
+[__docstrip::util::patch__ *source\-var* *terminals* *fromtext* *diff* ?*option* *value* \.\.\.?](#11)
+[__docstrip::util::thefile__ *filename* ?*option* *value* \.\.\.?](#12)
+[__docstrip::util::import\_unidiff__ *diff\-text* ?*warning\-var*?](#13)
+
+# DESCRIPTION
+
+The __docstrip::util__ package is meant for collecting various utility
+procedures that are mainly useful at installation or development time\. It is
+separate from the base package to avoid overhead when the latter is used to
+__[source](\.\./\.\./\.\./\.\./index\.md\#source)__ code\.
+
+# Package indexing commands
+
+Like raw "\.tcl" files, code lines in docstrip source files can be searched for
+package declarations and corresponding indices constructed\. A complication is
+however that one cannot tell from the code blocks themselves which will fit
+together to make a working package; normally that information would be found in
+an accompanying "\.ins" file, but parsing one of those is not an easy task\.
+Therefore __docstrip::util__ introduces an alternative encoding of such
+information, in the form of a declarative Tcl script: the
+*[catalogue](\.\./\.\./\.\./\.\./index\.md\#catalogue)* \(of the contents in a source
+file\)\.
+
+The special commands which are available inside a catalogue are:
+
+ - __pkgProvide__ *name* *version* *terminals*
+
+ Declares that the code for a package with name *name* and version
+ *version* is made up from those modules in the source file which are
+ selected by the *terminals* list of guard expression terminals\. This code
+ should preferably not contain a
+ __[package](\.\./\.\./\.\./\.\./index\.md\#package)__ __provide__ command
+ for the package, as one will be provided by the package loading mechanisms\.
+
+ - __pkgIndex__ ?*terminal* \.\.\.?
+
+ Declares that the code for a package is made up from those modules in the
+ source file which are selected by the listed guard expression *terminal*s\.
+ The name and version of this package is determined from
+ __[package](\.\./\.\./\.\./\.\./index\.md\#package)__ __provide__
+ command\(s\) found in that code \(hence there must be such a command in there\)\.
+
+ - __fileoptions__ ?*option* *value* \.\.\.?
+
+ Declares the __fconfigure__ options that should be in force when reading
+ the source; this can usually be ignored for pure ASCII files, but if the
+ file needs to be interpreted according to some other __\-encoding__ then
+ this is how to specify it\. The command should normally appear first in the
+ catalogue, as it takes effect only for commands following it\.
+
+Other Tcl commands are supported too — a catalogue is parsed by being evaluated
+in a safe interpreter — but they are rarely needed\. To allow for future
+extensions, unknown commands in the catalogue are silently ignored\.
+
+To simplify distribution of catalogues together with their source files, the
+catalogue is stored *in the source file itself* as a module selected by the
+terminal '__docstrip\.tcl::catalogue__'\. This supports both the style of
+collecting all catalogue lines in one place and the style of putting each
+catalogue line in close proximity of the code that it declares\.
+
+Putting catalogue entries next to the code they declare may look as follows
+
+ % First there's the catalogue entry
+ % \\begin\{tcl\}
+ %pkgProvide foo::bar 1\.0 \{foobar load\}
+ % \\end\{tcl\}
+ % second a metacomment used to include a copyright message
+ % \\begin\{macrocode\}
+ %<\*foobar>
+ %% This file is placed in the public domain\.
+ % \\end\{macrocode\}
+ % third the package implementation
+ % \\begin\{tcl\}
+ namespace eval foo::bar \{
+ \# \.\.\. some clever piece of Tcl code elided \.\.\.
+ % \\end\{tcl\}
+ % which at some point may have variant code to make use of a
+ % |load|able extension
+ % \\begin\{tcl\}
+ %<\*load>
+ load \[file rootname \[info script\]\]\[info sharedlibextension\]
+ %
+ %<\*\!load>
+ \# \.\.\. even more clever scripted counterpart of the extension
+ \# also elided \.\.\.
+ %\!load>
+ \}
+ %
+ % \\end\{tcl\}
+ % and that's it\!
+
+The corresponding set\-up with __pkgIndex__ would be
+
+ % First there's the catalogue entry
+ % \\begin\{tcl\}
+ %pkgIndex foobar load
+ % \\end\{tcl\}
+ % second a metacomment used to include a copyright message
+ % \\begin\{tcl\}
+ %<\*foobar>
+ %% This file is placed in the public domain\.
+ % \\end\{tcl\}
+ % third the package implementation
+ % \\begin\{tcl\}
+ package provide foo::bar 1\.0
+ namespace eval foo::bar \{
+ \# \.\.\. some clever piece of Tcl code elided \.\.\.
+ % \\end\{tcl\}
+ % which at some point may have variant code to make use of a
+ % |load|able extension
+ % \\begin\{tcl\}
+ %<\*load>
+ load \[file rootname \[info script\]\]\[info sharedlibextension\]
+ %
+ %<\*\!load>
+ \# \.\.\. even more clever scripted counterpart of the extension
+ \# also elided \.\.\.
+ %\!load>
+ \}
+ %
+ % \\end\{tcl\}
+ % and that's it\!
+
+ - __docstrip::util::index\_from\_catalogue__ *dir* *pattern* ?*option* *value* \.\.\.?
+
+ This command is a sibling of the standard __pkg\_mkIndex__ command, in
+ that it adds package entries to "pkgIndex\.tcl" files\. The difference is that
+ it indexes __[docstrip](docstrip\.md)__\-style source files rather
+ than raw "\.tcl" or loadable library files\. Only packages listed in the
+ catalogue of a file are considered\.
+
+ The *dir* argument is the directory in which to look for files \(and whose
+ "pkgIndex\.tcl" file should be amended\)\. The *pattern* argument is a
+ __glob__ pattern of files to look into; a typical value would be
+ __\*\.dtx__ or __\*\.\{dtx,ddt\}__\. Remaining arguments are option\-value
+ pairs, where the supported options are:
+
+ * __\-recursein__ *dirpattern*
+
+ If this option is given, then the __index\_from\_catalogue__ operation
+ will be repeated in each subdirectory whose name matches the
+ *dirpattern*\. __\-recursein__ __\*__ will cause the entire
+ subtree rooted at *dir* to be indexed\.
+
+ * __\-sourceconf__ *dictionary*
+
+ Specify __fileoptions__ to use when reading the catalogues of files
+ \(and also for reading the packages if the catalogue does not contain a
+ __fileoptions__ command\)\. Defaults to being empty\. Primarily useful
+ if your system encoding is very different from that of the source file
+ \(e\.g\., one is a two\-byte encoding and the other is a one\-byte encoding\)\.
+ __ascii__ and __utf\-8__ are not very different in that sense\.
+
+ * __\-options__ *terminals*
+
+ The *terminals* is a list of terminals in addition to
+ __docstrip\.tcl::catalogue__ that should be held as true when
+ extracting the catalogue\. Defaults to being empty\. This makes it
+ possible to make use of "variant sections" in the catalogue itself, e\.g\.
+ gaurd some entries with an extra "experimental" and thus prevent them
+ from appearing in the index unless that is generated with "experimental"
+ among the __\-options__\.
+
+ * __\-report__ *boolean*
+
+ If the *boolean* is true then the return value will be a textual,
+ probably multiline, report on what was done\. Defaults to false, in which
+ case there is no particular return value\.
+
+ * __\-reportcmd__ *commandPrefix*
+
+ Every item in the report is handed as an extra argument to the command
+ prefix\. Since __index\_from\_catalogue__ would typically be used at a
+ rather high level in installation scripts and the like, the
+ *commandPrefix* defaults to "__puts__ __stdout__"\. Use
+ __[list](\.\./\.\./\.\./\.\./index\.md\#list)__ to effectively disable
+ this feature\. The return values from the prefix are ignored\.
+
+ The __package ifneeded__ scripts that are generated contain one
+ __package require docstrip__ command and one
+ __docstrip::sourcefrom__ command\. If the catalogue entry was of the
+ __pkgProvide__ kind then the __package ifneeded__ script also
+ contains the __package provide__ command\.
+
+ Note that __index\_from\_catalogue__ never removes anything from an
+ existing "pkgIndex\.tcl" file\. Hence you may need to delete it \(or have
+ __pkg\_mkIndex__ recreate it from scratch\) before running
+ __index\_from\_catalogue__ to update some piece of information, such as a
+ package version number\.
+
+ - __docstrip::util::modules\_from\_catalogue__ *target* *source* ?*option* *value* \.\.\.?
+
+ This command is an alternative to __index\_from\_catalogue__ which creates
+ Tcl Module \("\.tm"\) files rather than "pkgIndex\.tcl" entries\. Since this
+ action is more similar to what __[docstrip](docstrip\.md)__
+ classically does, it has features for putting pre\- and postambles on the
+ generated files\.
+
+ The *source* argument is the name of the source file to generate "\.tm"
+ files from\. The *target* argument is the directory which should count as a
+ module path, i\.e\., this is what the relative paths derived from package
+ names are joined to\. The supported options are:
+
+ * __\-preamble__ *message*
+
+ A message to put in the preamble \(initial block of comments\) of
+ generated files\. Defaults to a space\. May be several lines, which are
+ then separated by newlines\. Traditionally used for copyright notices or
+ the like, but metacomment lines provide an alternative to that\.
+
+ * __\-postamble__ *message*
+
+ Like __\-preamble__, but the message is put at the end of the file
+ instead of the beginning\. Defaults to being empty\.
+
+ * __\-sourceconf__ *dictionary*
+
+ Specify __fileoptions__ to use when reading the catalogue of the
+ *source* \(and also for reading the packages if the catalogue does not
+ contain a __fileoptions__ command\)\. Defaults to being empty\.
+ Primarily useful if your system encoding is very different from that of
+ the source file \(e\.g\., one is a two\-byte encoding and the other is a
+ one\-byte encoding\)\. __ascii__ and __utf\-8__ are not very
+ different in that sense\.
+
+ * __\-options__ *terminals*
+
+ The *terminals* is a list of terminals in addition to
+ __docstrip\.tcl::catalogue__ that should be held as true when
+ extracting the catalogue\. Defaults to being empty\. This makes it
+ possible to make use of "variant sections" in the catalogue itself, e\.g\.
+ gaurd some entries with an extra "experimental" guard and thus prevent
+ them from contributing packages unless those are generated with
+ "experimental" among the __\-options__\.
+
+ * __\-formatpreamble__ *commandPrefix*
+
+ Command prefix used to actually format the preamble\. Takes four
+ additional arguments *message*, *targetFilename*,
+ *sourceFilename*, and *terminalList* and returns a fully formatted
+ preamble\. Defaults to using __classical\_preamble__ with a
+ *metaprefix* of '\#\#'\.
+
+ * __\-formatpostamble__ *commandPrefix*
+
+ Command prefix used to actually format the postamble\. Takes four
+ additional arguments *message*, *targetFilename*,
+ *sourceFilename*, and *terminalList* and returns a fully formatted
+ postamble\. Defaults to using __classical\_postamble__ with a
+ *metaprefix* of '\#\#'\.
+
+ * __\-report__ *boolean*
+
+ If the *boolean* is true \(which is the default\) then the return value
+ will be a textual, probably multiline, report on what was done\. If it is
+ false then there is no particular return value\.
+
+ * __\-reportcmd__ *commandPrefix*
+
+ Every item in the report is handed as an extra argument to this command
+ prefix\. Defaults to __[list](\.\./\.\./\.\./\.\./index\.md\#list)__, which
+ effectively disables this feature\. The return values from the prefix are
+ ignored\. Use for example "__puts__ __stdout__" to get report
+ items written immediately to the terminal\.
+
+ An existing file of the same name as one to be created will be overwritten\.
+
+ - __docstrip::util::classical\_preamble__ *metaprefix* *message* *target* ?*source* *terminals* \.\.\.?
+
+ This command returns a preamble in the classical
+ __[docstrip](docstrip\.md)__ style
+
+ \#\#
+ \#\# This is \`TARGET',
+ \#\# generated by the docstrip::util package\.
+ \#\#
+ \#\# The original source files were:
+ \#\#
+ \#\# SOURCE \(with options: \`foo,bar'\)
+ \#\#
+ \#\# Some message line 1
+ \#\# line2
+ \#\# line3
+
+ if called as
+
+ docstrip::util::classical\_preamble \{\#\#\}\\
+ "\\nSome message line 1\\nline2\\nline3" TARGET SOURCE \{foo bar\}
+
+ The command supports preambles for files generated from multiple sources,
+ even though __modules\_from\_catalogue__ at present does not need that\.
+
+ - __docstrip::util::classical\_postamble__ *metaprefix* *message* *target* ?*source* *terminals* \.\.\.?
+
+ This command returns a postamble in the classical
+ __[docstrip](docstrip\.md)__ style
+
+ \#\# Some message line 1
+ \#\# line2
+ \#\# line3
+ \#\#
+ \#\# End of file \`TARGET'\.
+
+ if called as
+
+ docstrip::util::classical\_postamble \{\#\#\}\\
+ "Some message line 1\\nline2\\nline3" TARGET SOURCE \{foo bar\}
+
+ In other words, the *source* and *terminals* arguments are ignored, but
+ supported for symmetry with __classical\_preamble__\.
+
+ - __docstrip::util::packages\_provided__ *text* ?*setup\-script*?
+
+ This command returns a list where every even index element is the name of a
+ package __provide__d by *text* when that is evaluated as a Tcl script,
+ and the following odd index element is the corresponding version\. It is used
+ to do package indexing of extracted pieces of code, in the manner of
+ __pkg\_mkIndex__\.
+
+ One difference to __pkg\_mkIndex__ is that the *text* gets evaluated in
+ a safe interpreter\. __package require__ commands are silently ignored,
+ as are unknown commands \(which includes
+ __[source](\.\./\.\./\.\./\.\./index\.md\#source)__ and __load__\)\. Other
+ errors cause processing of the *text* to stop, in which case only those
+ package declarations that had been encountered before the error will be
+ included in the return value\.
+
+ The *setup\-script* argument can be used to customise the evaluation
+ environment, if the code in *text* has some very special needs\. The
+ *setup\-script* is evaluated in the local context of the
+ __packages\_provided__ procedure just before the *text* is processed\.
+ At that time, the name of the slave command for the safe interpreter that
+ will do this processing is kept in the local variable __c__\. To for
+ example copy the contents of the __::env__ array to the safe
+ interpreter, one might use a *setup\-script* of
+
+ $c eval \[list array set env \[array get ::env\]\]
+
+# Source processing commands
+
+Unlike the previous group of commands, which would use __docstrip::extract__
+to extract some code lines and then process those further, the following
+commands operate on text consisting of all types of lines\.
+
+ - __docstrip::util::ddt2man__ *text*
+
+ The __ddt2man__ command reformats *text* from the general
+ __[docstrip](docstrip\.md)__ format to
+ __[doctools](\.\./doctools/doctools\.md)__ "\.man" format \(Tcl Markup
+ Language for Manpages\)\. The different line types are treated as follows:
+
+ * comment and metacomment lines
+
+ The '%' and '%%' prefixes are removed, the rest of the text is kept as
+ it is\.
+
+ * empty lines
+
+ These are kept as they are\. \(Effectively this means that they will count
+ as comment lines after a comment line and as code lines after a code
+ line\.\)
+
+ * code lines
+
+ __example\_begin__ and __example\_end__ commands are placed at the
+ beginning and end of every block of consecutive code lines\. Brackets in
+ a code line are converted to __lb__ and __rb__ commands\.
+
+ * verbatim guards
+
+ These are processed as usual, so they do not show up in the result but
+ every line in a verbatim block is treated as a code line\.
+
+ * other guards
+
+ These are treated as code lines, except that the actual guard is
+ __emph__asised\.
+
+ At the time of writing, no project has employed
+ __[doctools](\.\./doctools/doctools\.md)__ markup in master source
+ files, so experience of what works well is not available\. A source file
+ could however look as follows
+
+ % \[manpage\_begin gcd n 1\.0\]
+ % \[keywords divisor\]
+ % \[keywords math\]
+ % \[moddesc \{Greatest Common Divisor\}\]
+ % \[require gcd \[opt 1\.0\]\]
+ % \[description\]
+ %
+ % \[list\_begin definitions\]
+ % \[call \[cmd gcd\] \[arg a\] \[arg b\]\]
+ % The \[cmd gcd\] procedure takes two arguments \[arg a\] and \[arg b\] which
+ % must be integers and returns their greatest common divisor\.
+ proc gcd \{a b\} \{
+ % The first step is to take the absolute values of the arguments\.
+ % This relieves us of having to worry about how signs will be treated
+ % by the remainder operation\.
+ set a \[expr \{abs\($a\)\}\]
+ set b \[expr \{abs\($b\)\}\]
+ % The next line does all of Euclid's algorithm\! We can make do
+ % without a temporary variable, since $a is substituted before the
+ % \[lb\]set a $b\[rb\] and thus continues to hold a reference to the
+ % "old" value of \[var a\]\.
+ while \{$b>0\} \{ set b \[expr \{ $a % \[set a $b\] \}\] \}
+ % In Tcl 8\.3 we might want to use \[cmd set\] instead of \[cmd return\]
+ % to get the slight advantage of byte\-compilation\.
+ % set a
+ %<\!tcl83> return $a
+ \}
+ % \[list\_end\]
+ %
+ % \[manpage\_end\]
+
+ If the above text is fed through __docstrip::util::ddt2man__ then the
+ result will be a syntactically correct
+ __[doctools](\.\./doctools/doctools\.md)__ manpage, even though its
+ purpose is a bit different\.
+
+ It is suggested that master source code files with
+ __[doctools](\.\./doctools/doctools\.md)__ markup are given the suffix
+ "\.ddt", hence the "ddt" in __ddt2man__\.
+
+ - __docstrip::util::guards__ *subcmd* *text*
+
+ The __guards__ command returns information \(mostly of a statistical
+ nature\) about the ordinary docstrip guards that occur in the *text*\. The
+ *subcmd* selects what is returned\.
+
+ * __counts__
+
+ List the guard expression terminals with counts\. The format of the
+ return value is a dictionary which maps the terminal name to the number
+ of occurencies of it in the file\.
+
+ * __exprcount__
+
+ List the guard expressions with counts\. The format of the return value
+ is a dictionary which maps the expression to the number of occurencies
+ of it in the file\.
+
+ * __exprerr__
+
+ List the syntactically incorrect guard expressions \(e\.g\. parentheses do
+ not match, or a terminal is missing\)\. The return value is a list, with
+ the elements in no particular order\.
+
+ * __expressions__
+
+ List the guard expressions\. The return value is a list, with the
+ elements in no particular order\.
+
+ * __exprmods__
+
+ List the guard expressions with modifiers\. The format of the return
+ value is a dictionary where each index is a guard expression and each
+ entry is a string with one character for every guard line that has this
+ expression\. The characters in the entry specify what modifier was used
+ in that line: \+, \-, \*, /, or \(for guard without modifier:\) space\. This
+ is the most primitive form of the information gathered by
+ __guards__\.
+
+ * __names__
+
+ List the guard expression terminals\. The return value is a list, with
+ the elements in no particular order\.
+
+ * __rotten__
+
+ List the malformed guard lines \(this does not include lines where only
+ the expression is malformed, though\)\. The format of the return value is
+ a dictionary which maps line numbers to their contents\.
+
+ - __docstrip::util::patch__ *source\-var* *terminals* *fromtext* *diff* ?*option* *value* \.\.\.?
+
+ This command tries to apply a __[diff](\.\./\.\./\.\./\.\./index\.md\#diff)__
+ file \(for example a contributed patch\) that was computed for a generated
+ file to the __[docstrip](docstrip\.md)__ source\. This can be useful
+ if someone has edited a generated file, thus mistaking it for being the
+ source\. This command makes no presumptions which are specific for the case
+ that the generated file is a Tcl script\.
+
+ __[patch](\.\./\.\./\.\./\.\./index\.md\#patch)__ requires that the source
+ file to patch is kept as a list of lines in a variable, and the name of that
+ variable in the calling context is what goes into the *source\-var*
+ argument\. The *terminals* is the list of terminals used to extract the
+ file that has been patched\. The *diff* is the actual diff to apply \(in a
+ format as explained below\) and the *fromtext* is the contents of the file
+ which served as "from" when the diff was computed\. Options can be used to
+ further control the process\.
+
+ The process works by "lifting" the hunks in the *diff* from generated to
+ source file, and then applying them to the elements of the *source\-var*\.
+ In order to do this lifting, it is necessary to determine how lines in the
+ *fromtext* correspond to elements of the *source\-var*, and that is where
+ the *terminals* come in; the source is first __extract__ed under the
+ given *terminals*, and the result of that is then matched against the
+ *fromtext*\. This produces a map which translates line numbers stated in
+ the *diff* to element numbers in *source\-var*, which is what is needed
+ to lift the hunks\.
+
+ The reason that both the *terminals* and the *fromtext* must be given is
+ twofold\. First, it is very difficult to keep track of how many lines of
+ preamble are supplied some other way than by copying lines from source
+ files\. Second, a generated file might contain material from several source
+ files\. Both make it impossible to predict what line number an extracted file
+ would have in the generated file, so instead the algorithm for computing the
+ line number map looks for a block of lines in the *fromtext* which matches
+ what can be extracted from the source\. This matching is affected by the
+ following options:
+
+ * __\-matching__ *mode*
+
+ How equal must two lines be in order to match? The supported *mode*s
+ are:
+
+ + __exact__
+
+ Lines must be equal as strings\. This is the default\.
+
+ + __anyspace__
+
+ All sequences of whitespace characters are converted to single
+ spaces before comparing\.
+
+ + __nonspace__
+
+ Only non\-whitespace characters are considered when comparing\.
+
+ + __none__
+
+ Any two lines are considered to be equal\.
+
+ * __\-metaprefix__ *string*
+
+ The __\-metaprefix__ value to use when extracting\. Defaults to "%%",
+ but for Tcl code it is more likely that "\#" or "\#\#" had been used for
+ the generated file\.
+
+ * __\-trimlines__ *boolean*
+
+ The __\-trimlines__ value to use when extracting\. Defaults to true\.
+
+ The return value is in the form of a unified diff, containing only those
+ hunks which were not applied or were only partially applied; a comment in
+ the header of each hunk specifies which case is at hand\. It is normally
+ necessary to manually review both the return value from
+ __[patch](\.\./\.\./\.\./\.\./index\.md\#patch)__ and the patched text itself,
+ as this command cannot adjust comment lines to match new content\.
+
+ An example use would look like
+
+ set sourceL \[split \[docstrip::util::thefile from\.dtx\] \\n\]
+ set terminals \{foo bar baz\}
+ set fromtext \[docstrip::util::thefile from\.tcl\]
+ set difftext \[exec diff \-\-unified from\.tcl to\.tcl\]
+ set leftover \[docstrip::util::patch sourceL $terminals $fromtext\\
+ \[docstrip::util::import\_unidiff $difftext\] \-metaprefix \{\#\}\]
+ set F \[open to\.dtx w\]; puts $F \[join $sourceL \\n\]; close $F
+ return $leftover
+
+ Here, "from\.dtx" was used as source for "from\.tcl", which someone modified
+ into "to\.tcl"\. We're trying to construct a "to\.dtx" which can be used as
+ source for "to\.tcl"\.
+
+ - __docstrip::util::thefile__ *filename* ?*option* *value* \.\.\.?
+
+ The __thefile__ command opens the file *filename*, reads it to end,
+ closes it, and returns the contents \(dropping a final newline if there is
+ one\)\. The option\-value pairs are passed on to __fconfigure__ to
+ configure the open file channel before anything is read from it\.
+
+ - __docstrip::util::import\_unidiff__ *diff\-text* ?*warning\-var*?
+
+ This command parses a unified \(__[diff](\.\./\.\./\.\./\.\./index\.md\#diff)__
+ flags __\-U__ and __\-\-unified__\) format diff into the list\-of\-hunks
+ format expected by __docstrip::util::patch__\. The *diff\-text* argument
+ is the text to parse and the *warning\-var* is, if specified, the name in
+ the calling context of a variable to which any warnings about parsing
+ problems will be __append__ed\.
+
+ The return value is a list of *hunks*\. Each hunk is a list of five
+ elements "*start1* *end1* *start2* *end2* *lines*"\. *start1* and
+ *end1* are line numbers in the "from" file of the first and last
+ respectively lines of the hunk\. *start2* and *end2* are the
+ corresponding line numbers in the "to" file\. Line numbers start at 1\. The
+ *lines* is a list with two elements for each line in the hunk; the first
+ specifies the type of a line and the second is the actual line contents\. The
+ type is __\-__ for lines only in the "from" file, __\+__ for lines
+ that are only in the "to" file, and __0__ for lines that are in both\.
+
+# SEE ALSO
+
+[docstrip](docstrip\.md), [doctools](\.\./doctools/doctools\.md),
+doctools\_fmt
+
+# KEYWORDS
+
+[\.ddt](\.\./\.\./\.\./\.\./index\.md\#\_ddt), [\.dtx](\.\./\.\./\.\./\.\./index\.md\#\_dtx),
+[LaTeX](\.\./\.\./\.\./\.\./index\.md\#latex), [Tcl
+module](\.\./\.\./\.\./\.\./index\.md\#tcl\_module),
+[catalogue](\.\./\.\./\.\./\.\./index\.md\#catalogue),
+[diff](\.\./\.\./\.\./\.\./index\.md\#diff),
+[docstrip](\.\./\.\./\.\./\.\./index\.md\#docstrip),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation), [literate
+programming](\.\./\.\./\.\./\.\./index\.md\#literate\_programming),
+[module](\.\./\.\./\.\./\.\./index\.md\#module), [package
+indexing](\.\./\.\./\.\./\.\./index\.md\#package\_indexing),
+[patch](\.\./\.\./\.\./\.\./index\.md\#patch),
+[source](\.\./\.\./\.\./\.\./index\.md\#source)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2003–2010 Lars Hellström
ADDED embedded/md/tcllib/files/modules/doctools/changelog.md
Index: embedded/md/tcllib/files/modules/doctools/changelog.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/changelog.md
@@ -0,0 +1,136 @@
+
+[//000000001]: # (doctools::changelog \- Documentation tools)
+[//000000002]: # (Generated from file 'changelog\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2003\-2013 Andreas Kupries )
+[//000000004]: # (doctools::changelog\(n\) 1\.1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::changelog \- Processing text in Emacs ChangeLog format
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require textutil
+package require doctools::changelog ?1\.1?
+
+[__::doctools::changelog::scan__ *text*](#1)
+[__::doctools::changelog::flatten__ *entries*](#2)
+[__::doctools::changelog::toDoctools__ *title* *module* *version* *entries*](#3)
+[__::doctools::changelog::merge__ *entries*\.\.\.](#4)
+
+# DESCRIPTION
+
+This package provides Tcl commands for the processing and reformatting of text
+in the "ChangeLog" format generated by
+__[emacs](\.\./\.\./\.\./\.\./index\.md\#emacs)__\.
+
+# API
+
+ - __::doctools::changelog::scan__ *text*
+
+ The command takes the *text* and parses it under the assumption that it
+ contains a ChangeLog as generated by
+ __[emacs](\.\./\.\./\.\./\.\./index\.md\#emacs)__\. It returns a data structure
+ describing the contents of this ChangeLog\.
+
+ This data structure is a list where each element describes one entry in the
+ ChangeLog\. Each element/entry is then a list of three elements describing
+ the date of the entry, its author, and the comments made, in this order\. The
+ last item in each element/entry, the comments, is a list of sections\. Each
+ section is described by a list containing two elements, a list of file
+ names, and a string containing the true comment associated with the files of
+ the section\.
+
+ \{
+ \{
+ date
+ author
+ \{
+ \{
+ \{file \.\.\.\}
+ commenttext
+ \}
+ \.\.\.
+ \}
+ \}
+ \{\.\.\.\}
+ \}
+
+ - __::doctools::changelog::flatten__ *entries*
+
+ This command converts a list of entries as generated by __change::scan__
+ above into a simpler list of plain text blocks each containing all the
+ information of a single entry\.
+
+ - __::doctools::changelog::toDoctools__ *title* *module* *version* *entries*
+
+ This command converts the pre\-parsed ChangeLog *entries* as generated by
+ the command __::doctools::changelog::scan__ into a document in
+ *[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)* format and returns it as
+ the result of the command\.
+
+ The other three arguments supply the information for the header of that
+ document which is not available from the changelog itself\.
+
+ - __::doctools::changelog::merge__ *entries*\.\.\.
+
+ Each argument of the command is assumed to be a pre\-parsed Changelog as
+ generated by the command __::doctools::changelog::scan__\. This command
+ merges all of them into a single structure, and collapses multiple entries
+ for the same date and author into a single entry\. The new structure is
+ returned as the result of the command\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[changelog](\.\./\.\./\.\./\.\./index\.md\#changelog),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[emacs](\.\./\.\./\.\./\.\./index\.md\#emacs)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2003\-2013 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/cvs.md
Index: embedded/md/tcllib/files/modules/doctools/cvs.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/cvs.md
@@ -0,0 +1,143 @@
+
+[//000000001]: # (doctools::cvs \- Documentation tools)
+[//000000002]: # (Generated from file 'cvs\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2003\-2008 Andreas Kupries )
+[//000000004]: # (doctools::cvs\(n\) 1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::cvs \- Processing text in 'cvs log' format
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require textutil
+package require doctools::cvs ?1?
+
+[__::doctools::cvs::scanLog__ *text* *evar* *cvar* *fvar*](#1)
+[__::doctools::cvs::toChangeLog__ *evar* *cvar* *fvar*](#2)
+
+# DESCRIPTION
+
+This package provides Tcl commands for the processing and reformatting text in
+the format generated by the __[cvs log](\.\./\.\./\.\./\.\./index\.md\#cvs\_log)__
+command\.
+
+The commands __::doctools::cvs::scanLog__ and
+__::doctools::cvs::toChangeLog__ are derived from code found on the
+[Tcl'ers Wiki](http://wiki\.tcl\.tk)\. See the references at the end of the
+page\.
+
+# API
+
+ - __::doctools::cvs::scanLog__ *text* *evar* *cvar* *fvar*
+
+ The command takes the *text* and parses it under the assumption that it
+ contains a CVS log as generated by __[cvs
+ log](\.\./\.\./\.\./\.\./index\.md\#cvs\_log)__\. The resulting information is
+ stored in the variables whose names were specified via *evar*, *cvar*,
+ and *fvar*\.
+
+ Already existing information in the referenced variables is preserved,
+ allowing the caller to merge data from multiple logs into one database\.
+
+ * varname *evar* \(in\)
+
+ Has to refer to a scalar variable\. After the call this variable will
+ contain a list of all the entries found in the log file\. An entry is
+ identified through the combination of date and author, and can be split
+ over multiple physical entries, one per touched file\.
+
+ It should be noted that the entries are listed in the same order as they
+ were found in the *text*\. This is not necessarily sorted by date or
+ author\.
+
+ Each item in the list is a list containing two elements, the date of the
+ entry, and its author, in this order\. The date is formatted as
+ __year__/__month__/__day__\.
+
+ * varname *cvar* \(in\)
+
+ Has to refer to an array variable\. Keys are strings containing the date
+ and author of log entries, in this order, separated by a comma\.
+
+ The values are lists of comments made for the entry\.
+
+ * varname *fvar* \(in\)
+
+ Has to refer to an array variable\. Keys are strings containing date,
+ author of a log entry, and a comment for that entry, in this order,
+ separated by commas\.
+
+ The values are lists of the files the entry is touching\.
+
+ - __::doctools::cvs::toChangeLog__ *evar* *cvar* *fvar*
+
+ The three arguments for this command are the same as the last three
+ arguments of the command __::doctools::cvs::scanLog__\. This command
+ however expects them to be filled with information about one or more logs\.
+ It takes this information and converts it into a text in the format of a
+ ChangeLog as accepted and generated by
+ __[emacs](\.\./\.\./\.\./\.\./index\.md\#emacs)__\. The constructed text is
+ returned as the result of the command\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+\[uri, http://wiki\.tcl\.tk/log2changelog
+
+# KEYWORDS
+
+[changelog](\.\./\.\./\.\./\.\./index\.md\#changelog),
+[cvs](\.\./\.\./\.\./\.\./index\.md\#cvs), [cvs
+log](\.\./\.\./\.\./\.\./index\.md\#cvs\_log), [emacs](\.\./\.\./\.\./\.\./index\.md\#emacs),
+[log](\.\./\.\./\.\./\.\./index\.md\#log)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2003\-2008 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/docidx.md
Index: embedded/md/tcllib/files/modules/doctools/docidx.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/docidx.md
@@ -0,0 +1,410 @@
+
+[//000000001]: # (doctools::idx \- Documentation tools)
+[//000000002]: # (Generated from file 'docidx\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2003\-2019 Andreas Kupries )
+[//000000004]: # (doctools::idx\(n\) 1\.1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx \- docidx \- Processing indices
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [PACKAGE COMMANDS](#subsection1)
+
+ - [OBJECT COMMAND](#subsection2)
+
+ - [OBJECT METHODS](#subsection3)
+
+ - [OBJECT CONFIGURATION](#subsection4)
+
+ - [FORMAT MAPPING](#subsection5)
+
+ - [PREDEFINED ENGINES](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require doctools::idx ?1\.1?
+
+[__::doctools::idx::new__ *objectName* ?__\-option__ *value* \.\.\.?](#1)
+[__::doctools::idx::help__](#2)
+[__::doctools::idx::search__ *path*](#3)
+[__objectName__ __method__ ?*arg arg \.\.\.*?](#4)
+[*objectName* __configure__](#5)
+[*objectName* __configure__ *option*](#6)
+[*objectName* __configure__ __\-option__ *value*\.\.\.](#7)
+[*objectName* __cget__ __\-option__](#8)
+[*objectName* __destroy__](#9)
+[*objectName* __format__ *text*](#10)
+[*objectName* __map__ *symbolic* *actual*](#11)
+[*objectName* __parameters__](#12)
+[*objectName* __search__ *path*](#13)
+[*objectName* __setparam__ *name* *value*](#14)
+[*objectName* __warnings__](#15)
+
+# DESCRIPTION
+
+This package provides a class for the creation of objects able to process and
+convert text written in the *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* markup
+language into any output format X for which a *[formatting
+engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine)* is available\.
+
+A reader interested in the markup language itself should start with the
+*[docidx language introduction](docidx\_lang\_intro\.md)* and proceed from
+there to the formal specifications, i\.e\. the *[docidx language
+syntax](docidx\_lang\_syntax\.md)* and the *[docidx language command
+reference](docidx\_lang\_cmdref\.md)*\.
+
+If on the other hand the reader wishes to write her own formatting engine for
+some format, i\.e\. is a *plugin writer* then reading and understanding the
+*[docidx plugin API reference](docidx\_plugin\_apiref\.md)* is an absolute
+necessity, as that document specifies the interaction between this package and
+its plugins, i\.e\. the formatting engines, in detail\.
+
+# PUBLIC API
+
+## PACKAGE COMMANDS
+
+ - __::doctools::idx::new__ *objectName* ?__\-option__ *value* \.\.\.?
+
+ This command creates a new docidx object with an associated Tcl command
+ whose name is *objectName*\. This
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)* command is explained in full
+ detail in the sections [OBJECT COMMAND](#subsection2) and [OBJECT
+ METHODS](#subsection3)\. The object command will be created under the
+ current namespace if the *objectName* is not fully qualified, and in the
+ specified namespace otherwise\.
+
+ The options and their values coming after the name of the object are used to
+ set the initial configuration of the object\.
+
+ - __::doctools::idx::help__
+
+ This is a convenience command for applications wishing to provide their user
+ with a short description of the available formatting commands and their
+ meanings\. It returns a string containing a standard help text\.
+
+ - __::doctools::idx::search__ *path*
+
+ Whenever an object created by this the package has to map the name of a
+ format to the file containing the code for its formatting engine it will
+ search for the file in a number of directories stored in a list\. See section
+ [FORMAT MAPPING](#subsection5) for more explanations\.
+
+ This list not only contains three default directories which are declared by
+ the package itself, but is also extensible user of the package\. This command
+ is the means to do so\. When given a *path* to an existing and readable
+ directory it will prepend that directory to the list of directories to
+ search\. This means that the *path* added last is later searched through
+ first\.
+
+ An error will be thrown if the *path* either does not exist, is not a
+ directory, or is not readable\.
+
+## OBJECT COMMAND
+
+All commands created by __::doctools::idx::new__ have the following general
+form and may be used to invoke various operations on their docidx converter
+object\.
+
+ - __objectName__ __method__ ?*arg arg \.\.\.*?
+
+ The method __method__ and its *arg*'uments determine the exact
+ behavior of the command\. See section [OBJECT METHODS](#subsection3) for
+ the detailed specifications\.
+
+## OBJECT METHODS
+
+ - *objectName* __configure__
+
+ The method returns a list of all known options and their current values when
+ called without any arguments\.
+
+ - *objectName* __configure__ *option*
+
+ The method behaves like the method __cget__ when called with a single
+ argument and returns the value of the option specified by said argument\.
+
+ - *objectName* __configure__ __\-option__ *value*\.\.\.
+
+ The method reconfigures the specified __option__s of the object, setting
+ them to the associated *value*s, when called with an even number of
+ arguments, at least two\.
+
+ The legal options are described in the section [OBJECT
+ CONFIGURATION](#subsection4)\.
+
+ - *objectName* __cget__ __\-option__
+
+ This method expects a legal configuration option as argument and will return
+ the current value of that option for the object the method was invoked for\.
+
+ The legal configuration options are described in section [OBJECT
+ CONFIGURATION](#subsection4)\.
+
+ - *objectName* __destroy__
+
+ This method destroys the object it is invoked for\.
+
+ - *objectName* __format__ *text*
+
+ This method runs the *text* through the configured formatting engine and
+ returns the generated string as its result\. An error will be thrown if no
+ __\-format__ was configured for the object\.
+
+ The method assumes that the *text* is in
+ *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* format as specified in the
+ companion document *docidx\_fmt*\. Errors will be thrown otherwise\.
+
+ - *objectName* __map__ *symbolic* *actual*
+
+ This methods add one entry to the per\-object mapping from *symbolic*
+ filenames to the *actual* uris\. The object just stores this mapping and
+ makes it available to the configured formatting engine through the command
+ __dt\_fmap__\. This command is described in more detail in the *[docidx
+ plugin API reference](docidx\_plugin\_apiref\.md)* which specifies the
+ interaction between the objects created by this package and index formatting
+ engines\.
+
+ - *objectName* __parameters__
+
+ This method returns a list containing the names of all engine parameters
+ provided by the configured formatting engine\. It will return an empty list
+ if the object is not yet configured for a specific format\.
+
+ - *objectName* __search__ *path*
+
+ This method extends the per\-object list of paths searched for index
+ formatting engines\. See also the command __::doctools::idx::search__ on
+ how to extend the per\-package list of paths\. Note that the path entered last
+ will be searched first\. For more details see section [FORMAT
+ MAPPING](#subsection5)\.
+
+ - *objectName* __setparam__ *name* *value*
+
+ This method sets the *name*d engine parameter to the specified *value*\.
+ It will throw an error if the object is either not yet configured for a
+ specific format, or if the formatting engine for the configured format does
+ not provide a parameter with the given *name*\. The list of parameters
+ provided by the configured formatting engine can be retrieved through the
+ method __parameters__\.
+
+ - *objectName* __warnings__
+
+ This method returns a list containing all the warnings which were generated
+ by the configured formatting engine during the last invocation of the method
+ __format__\.
+
+## OBJECT CONFIGURATION
+
+All docidx objects understand the following configuration options:
+
+ - __\-file__ *file*
+
+ The argument of this option is stored in the object and made available to
+ the configured formatting engine through the command __dt\_file__\. This
+ command is described in more detail in the companion document *docidx\_api*
+ which specifies the API between the object and formatting engines\.
+
+ The default value of this option is the empty string\.
+
+ The configured formatting engine should interpret the value as the name of
+ the file containing the document which is currently processed\.
+
+ - __\-format__ *text*
+
+ The argument of this option specifies the format to generate and by
+ implication the formatting engine to use when converting text via the method
+ __format__\. Its default value is the empty string\. The method
+ __format__ cannot be used if this option is not set to a valid value at
+ least once\.
+
+ The package will immediately try to map the given name to a file containing
+ the code for a formatting engine generating that format\. An error will be
+ thrown if this mapping fails\. In that case a previously configured format is
+ left untouched\.
+
+ The section [FORMAT MAPPING](#subsection5) explains in detail how the
+ package and object will look for engine implementations\.
+
+## FORMAT MAPPING
+
+The package and object will perform the following algorithm when trying to map a
+format name *foo* to a file containing an implementation of a formatting
+engine for *foo*:
+
+ 1. If *foo* is the name of an existing file then this file is directly taken
+ as the implementation\.
+
+ 1. If not, the list of per\-object search paths is searched\. For each directory
+ in the list the package checks if that directory contains a file
+ "idx\.*foo*"\. If yes, then that file is taken as the implementation\.
+
+ Note that this list of paths is initially empty and can be extended through
+ the object method __search__\.
+
+ 1. If not, the list of package paths is searched\. For each directory in the
+ list the package checks if that directory contains a file "idx\.*foo*"\. If
+ yes, then that file is taken as the implementation\.
+
+ This list of paths can be extended through the command
+ __::doctools::idx::search__\. It contains initially one path, the
+ subdirectory "mpformats" of the directory the package itself is located in\.
+ In other words, if the package implementation "docidx\.tcl" is installed in
+ the directory "/usr/local/lib/tcllib/doctools" then it will by default
+ search the directory "/usr/local/lib/tcllib/doctools/mpformats" for format
+ implementations\.
+
+ 1. The mapping fails\.
+
+# PREDEFINED ENGINES
+
+The package provides predefined formatting engines for the following formats\.
+Some of the formatting engines support engine parameters\. These will be
+explicitly highlighted\.
+
+ - html
+
+ This engine generates HTML markup, for processing by web browsers and the
+ like\. This engine supports three parameters:
+
+ * footer
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the body section of a HTML document\. The default value is the empty
+ string\. The value is inserted into the generated output just before the
+ ____ tag, closing the body of the generated HTML\.
+
+ This can be used to insert boilerplate footer markup into the generated
+ document\.
+
+ * header
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the body section of a HTML document\. The default value is the empty
+ string\. The value is inserted into the generated output just after the
+ ____ tag, starting the body of the generated HTML\.
+
+ This can be used to insert boilerplate header markup into the generated
+ document\.
+
+ * meta
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the header section of a HTML document\. The default value is the
+ empty string\. The value is inserted into the generated output just after
+ the ____ tag, starting the header section of the generated
+ HTML\.
+
+ This can be used to insert boilerplate meta data markup into the
+ generated document, like references to a stylesheet, standard meta
+ keywords, etc\.
+
+ - latex
+
+ This engine generates output suitable for the
+ __[latex](\.\./\.\./\.\./\.\./index\.md\#latex)__ text processor coming out of
+ the TeX world\.
+
+ - list
+
+ This engine retrieves version, section and title of the manpage from the
+ document\. As such it can be used to generate a directory listing for a set
+ of manpages\.
+
+ - markdown
+
+ This engine generates *[Markdown](\.\./\.\./\.\./\.\./index\.md\#markdown)*
+ markup\.
+
+ - nroff
+
+ This engine generates nroff output, for processing by
+ __[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff)__, or __groff__\. The
+ result will be standard man pages as they are known in the unix world\.
+
+ - null
+
+ This engine generates no outout at all\. This can be used if one just wants
+ to validate some input\.
+
+ - tmml
+
+ This engine generates TMML markup as specified by Joe English\. The Tcl
+ Manpage Markup Language is a derivate of XML\.
+
+ - wiki
+
+ This engine generates Wiki markup as understood by Jean Claude Wippler's
+ __wikit__ application\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_intro](docidx\_intro\.md),
+[docidx\_lang\_cmdref](docidx\_lang\_cmdref\.md),
+[docidx\_lang\_intro](docidx\_lang\_intro\.md),
+[docidx\_lang\_syntax](docidx\_lang\_syntax\.md),
+[docidx\_plugin\_apiref](docidx\_plugin\_apiref\.md)
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html), [TMML](\.\./\.\./\.\./\.\./index\.md\#tmml),
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation),
+[index](\.\./\.\./\.\./\.\./index\.md\#index), [keyword
+index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index),
+[latex](\.\./\.\./\.\./\.\./index\.md\#latex),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markdown](\.\./\.\./\.\./\.\./index\.md\#markdown),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff), [wiki](\.\./\.\./\.\./\.\./index\.md\#wiki)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2003\-2019 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/docidx_intro.md
Index: embedded/md/tcllib/files/modules/doctools/docidx_intro.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/docidx_intro.md
@@ -0,0 +1,137 @@
+
+[//000000001]: # (docidx\_intro \- Documentation tools)
+[//000000002]: # (Generated from file 'docidx\_intro\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (docidx\_intro\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+docidx\_intro \- docidx introduction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [RELATED FORMATS](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+*[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* \(short for *documentation tables
+of contents*\) stands for a set of related, yet different, entities which are
+working together for the easy creation and transformation of keyword\-based
+indices for documentation\. These are
+
+ 1. A tcl based language for the semantic markup of a keyword index\. Markup is
+ represented by Tcl commands\.
+
+ 1. A package providing the ability to read and transform texts written in that
+ markup language\. It is important to note that the actual transformation of
+ the input text is delegated to plugins\.
+
+ 1. An API describing the interface between the package above and a plugin\.
+
+Which of the more detailed documents are relevant to the reader of this
+introduction depends on their role in the documentation process\.
+
+ 1. A *writer* of documentation has to understand the markup language itself\.
+ A beginner to docidx should read the more informally written *[docidx
+ language introduction](docidx\_lang\_intro\.md)* first\. Having digested
+ this the formal *[docidx language syntax](docidx\_lang\_syntax\.md)*
+ specification should become understandable\. A writer experienced with
+ docidx may only need the *[docidx language command
+ reference](docidx\_lang\_cmdref\.md)* from time to time to refresh her
+ memory\.
+
+ While a document is written the __dtp__ application can be used to
+ validate it, and after completion it also performs the conversion into the
+ chosen system of visual markup, be it \*roff, HTML, plain text, wiki, etc\.
+ The simpler __[dtplite](\.\./\.\./apps/dtplite\.md)__ application makes
+ internal use of docidx when handling directories of documentation,
+ automatically generating a proper keyword index for them\.
+
+ 1. A *processor* of documentation written in the
+ *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* markup language has to know
+ which tools are available for use\.
+
+ The main tool is the aforementioned __dtp__ application provided by
+ Tcllib\. The simpler __[dtplite](\.\./\.\./apps/dtplite\.md)__ does not
+ expose docidx to the user\. At the bottom level, common to both
+ applications, however sits the package __doctoools::idx__, providing
+ the basic facilities to read and process files containing text in the
+ docidx format\.
+
+ 1. At last, but not least, *plugin writers* have to understand the
+ interaction between the
+ __[doctools::idx](\.\./doctools2idx/idx\_container\.md)__ package and
+ its plugins, as described in the *[docidx plugin API
+ reference](docidx\_plugin\_apiref\.md)*\.
+
+# RELATED FORMATS
+
+docidx does not stand alone, it has two companion formats\. These are called
+*[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)* and
+*[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)*, and they are for the markup
+of *tables of contents*, and general documentation, respectively\. They are
+described in their own sets of documents, starting at the *[doctoc
+introduction](doctoc\_intro\.md)* and the *[doctools
+introduction](doctools\_intro\.md)*, respectively\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_lang\_cmdref](docidx\_lang\_cmdref\.md),
+[docidx\_lang\_faq](docidx\_lang\_faq\.md),
+[docidx\_lang\_intro](docidx\_lang\_intro\.md),
+[docidx\_lang\_syntax](docidx\_lang\_syntax\.md),
+[docidx\_plugin\_apiref](docidx\_plugin\_apiref\.md),
+[doctoc\_intro](doctoc\_intro\.md),
+[doctools::idx](\.\./doctools2idx/idx\_container\.md),
+[doctools\_intro](doctools\_intro\.md)
+
+# KEYWORDS
+
+[index](\.\./\.\./\.\./\.\./index\.md\#index), [keyword
+index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/docidx_lang_cmdref.md
Index: embedded/md/tcllib/files/modules/doctools/docidx_lang_cmdref.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/docidx_lang_cmdref.md
@@ -0,0 +1,168 @@
+
+[//000000001]: # (docidx\_lang\_cmdref \- Documentation tools)
+[//000000002]: # (Generated from file 'docidx\_lang\_cmdref\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (docidx\_lang\_cmdref\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+docidx\_lang\_cmdref \- docidx language command reference
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Commands](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ *plaintext*](#1)
+[__include__ *filename*](#2)
+[__index\_begin__ *text* *title*](#3)
+[__index\_end__](#4)
+[__key__ *text*](#5)
+[__lb__](#6)
+[__[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage)__ *file* *text*](#7)
+[__rb__](#8)
+[__[url](\.\./\.\./\.\./\.\./index\.md\#url)__ *url* *label*](#9)
+[__vset__ *varname* *value*](#10)
+[__vset__ *varname*](#11)
+
+# DESCRIPTION
+
+This document specifies both names and syntax of all the commands which together
+are the docidx markup language, version 1\. As this document is intended to be a
+reference the commands are listed in alphabetical order, and the descriptions
+are relatively short\. A beginner should read the much more informally written
+*[docidx language introduction](docidx\_lang\_intro\.md)* first\.
+
+# Commands
+
+ - __[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ *plaintext*
+
+ Index markup\. The argument text is marked up as a comment standing outside
+ of the actual text of the document\. Main use is in free\-form text\.
+
+ - __include__ *filename*
+
+ Templating\. The contents of the named file are interpreted as text written
+ in the docidx markup and processed in the place of the include command\. The
+ markup in the file has to be self\-contained\. It is not possible for a markup
+ command to cross the file boundaries\.
+
+ - __index\_begin__ *text* *title*
+
+ Document structure\. The command to start an index\. The arguments are a label
+ for the whole group of documents the index refers to \(*text*\) and the
+ overall title text for the index \(*title*\), without markup\.
+
+ The label often is the name of the package \(or extension\) the documents
+ belong to\.
+
+ - __index\_end__
+
+ Document structure\. Command to end an index\. Anything in the document coming
+ after this command is in error\.
+
+ - __key__ *text*
+
+ Index structure\. This command adds the keyword *text* to the index\.
+
+ - __lb__
+
+ Text\. The command is replaced with a left bracket\. Use in free\-form text\.
+ Required to avoid interpretation of a left bracket as the start of a markup
+ command\. Its usage is restricted to the arguments of other markup commands\.
+
+ - __[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage)__ *file* *text*
+
+ Index structure\. This command adds an element to the index which refers to a
+ document\. The document is specified through the symbolic name *file*\. The
+ *text* argument is used to label the reference\.
+
+ Symbolic names are used to preserve the convertibility of this format to any
+ output format\. The actual name of the file will be inserted by the chosen
+ formatting engine when converting the input\. This will be based on a mapping
+ from symbolic to actual names given to the engine\.
+
+ - __rb__
+
+ Text\. The command is replaced with a right bracket\. Use in free\-form text\.
+ Required to avoid interpretation of a right bracket as the end of a markup
+ command\. Its usage is restricted to the arguments of other commands\.
+
+ - __[url](\.\./\.\./\.\./\.\./index\.md\#url)__ *url* *label*
+
+ Index structure\. This is the second command to add an element to the index\.
+ To refer to a document it is not using a symbolic name however, but a
+ \(possibly format\-specific\) url describing the exact location of the document
+ indexed here\.
+
+ - __vset__ *varname* *value*
+
+ Templating\. In this form the command sets the named document variable to the
+ specified *value*\. It does not generate output\. I\.e\. the command is
+ replaced by the empty string\.
+
+ - __vset__ *varname*
+
+ Templating\. In this form the command is replaced by the value of the named
+ document variable
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_intro](docidx\_intro\.md), [docidx\_lang\_faq](docidx\_lang\_faq\.md),
+[docidx\_lang\_intro](docidx\_lang\_intro\.md),
+[docidx\_lang\_syntax](docidx\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[docidx commands](\.\./\.\./\.\./\.\./index\.md\#docidx\_commands), [docidx
+language](\.\./\.\./\.\./\.\./index\.md\#docidx\_language), [docidx
+markup](\.\./\.\./\.\./\.\./index\.md\#docidx\_markup),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/docidx_lang_faq.md
Index: embedded/md/tcllib/files/modules/doctools/docidx_lang_faq.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/docidx_lang_faq.md
@@ -0,0 +1,112 @@
+
+[//000000001]: # (docidx\_lang\_faq \- Documentation tools)
+[//000000002]: # (Generated from file 'docidx\_lang\_faq\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (docidx\_lang\_faq\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+docidx\_lang\_faq \- docidx language faq
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [OVERVIEW](#section2)
+
+ - [What is this document?](#subsection1)
+
+ - [EXAMPLES](#section3)
+
+ - [Where do I find docidx examples?](#subsection2)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+# OVERVIEW
+
+## What is this document?
+
+This document is currently mainly a placeholder, to be filled with commonly
+asked questions about the docidx markup language and companions, and their
+answers\.
+
+Please report any questions \(and, if possible, answers\) we should consider for
+this document as explained in the section [Bugs, Ideas,
+Feedback](#section4) below\.
+
+# EXAMPLES
+
+## Where do I find docidx examples?
+
+We have no direct examples of documents written using docidx markup\. However the
+doctools processor __[dtplite](\.\./\.\./apps/dtplite\.md)__ does generate a
+table of contents when processing a set of documents written in doctools markup\.
+The intermediate file for it uses docidx markup and is not deleted when
+generation completes\. Such files can therefore serve as examples\.
+
+__[dtplite](\.\./\.\./apps/dtplite\.md)__ is distributed as part of Tcllib,
+so to get it you need one of
+
+ 1. A snapshot of Tcllib\. How to retrieve such a snapshot and the tools
+ required for this are described at [Development
+ Snapshots](/wiki?name=Development\+Snapshots)
+
+ 1. A Tcllib release archive\. They are available at the [home](/home) page\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_lang\_cmdref](docidx\_lang\_cmdref\.md),
+[docidx\_lang\_intro](docidx\_lang\_intro\.md),
+[docidx\_lang\_syntax](docidx\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[docidx commands](\.\./\.\./\.\./\.\./index\.md\#docidx\_commands), [docidx
+language](\.\./\.\./\.\./\.\./index\.md\#docidx\_language), [docidx
+markup](\.\./\.\./\.\./\.\./index\.md\#docidx\_markup), [docidx
+syntax](\.\./\.\./\.\./\.\./index\.md\#docidx\_syntax),
+[examples](\.\./\.\./\.\./\.\./index\.md\#examples),
+[faq](\.\./\.\./\.\./\.\./index\.md\#faq), [markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[semantic markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/docidx_lang_intro.md
Index: embedded/md/tcllib/files/modules/doctools/docidx_lang_intro.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/docidx_lang_intro.md
@@ -0,0 +1,228 @@
+
+[//000000001]: # (docidx\_lang\_intro \- Documentation tools)
+[//000000002]: # (Generated from file 'docidx\_lang\_intro\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007\-2009 Andreas Kupries )
+[//000000004]: # (docidx\_lang\_intro\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+docidx\_lang\_intro \- docidx language introduction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [Fundamentals](#subsection1)
+
+ - [Basic structure](#subsection2)
+
+ - [Advanced structure](#subsection3)
+
+ - [Escapes](#subsection4)
+
+ - [FURTHER READING](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+This document is an informal introduction to version 1 of the docidx markup
+language based on a multitude of examples\. After reading this a writer should be
+ready to understand the two parts of the formal specification, i\.e\. the
+*[docidx language syntax](docidx\_lang\_syntax\.md)* specification and the
+*[docidx language command reference](docidx\_lang\_cmdref\.md)*\.
+
+## Fundamentals
+
+While the *docidx markup language* is quite similar to the *doctools markup
+language*, in the broadest terms possible, there is one key difference\. An
+index consists essentially only of markup commands, with no plain text
+interspersed between them, except for whitespace\.
+
+Each markup command is a Tcl command surrounded by a matching pair of __\[__
+and __\]__\. Inside of these delimiters the usual rules for a Tcl command
+apply with regard to word quotation, nested commands, continuation lines, etc\.
+I\.e\.
+
+ \.\.\. \[key \{markup language\}\] \.\.\.
+
+ \.\.\. \[manpage thefile \\\\
+ \{file description\}\] \.\.\.
+
+## Basic structure
+
+The most simple document which can be written in docidx is
+
+ \[index\_begin GROUPTITLE TITLE\]
+ \[index\_end\]
+
+Not very useful, but valid\. This also shows us that all docidx documents consist
+of only one part where we will list all keys and their references\.
+
+A more useful index will contain at least keywords, or short 'keys', i\.e\. the
+phrases which were indexed\. So:
+
+ \[index\_begin GROUPTITLE TITLE\]
+ \[__key markup__\]
+ \[__key \{semantic markup\}\]__\]
+ \[__key \{docidx markup\}__\]
+ \[__key \{docidx language\}__\]
+ \[__key \{docidx commands\}__\]
+ \[index\_end\]
+
+In the above example the command __key__ is used to declare the keyword
+phrases we wish to be part of the index\.
+
+However a truly useful index does not only list the keyword phrases, but will
+also contain references to documents associated with the keywords\. Here is a
+made\-up index for all the manpages in the module
+*[base64](\.\./\.\./\.\./\.\./index\.md\#base64)*:
+
+ \[index\_begin tcllib/base64 \{De\- & Encoding\}\]
+ \[key base64\]
+ \[__manpage base64__\]
+ \[key encoding\]
+ \[__manpage base64__\]
+ \[__manpage uuencode__\]
+ \[__manpage yencode__\]
+ \[key uuencode\]
+ \[__manpage uuencode__\]
+ \[key yEnc\]
+ \[__manpage yencode__\]
+ \[key ydecode\]
+ \[__manpage yencode__\]
+ \[key yencode\]
+ \[__manpage yencode__\]
+ \[index\_end\]
+
+In the above example the command
+__[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage)__ is used to insert references
+to documents, using symbolic file names, with each command belonging to the last
+__key__ command coming before it\.
+
+The other command to insert references is
+__[url](\.\./\.\./\.\./\.\./index\.md\#url)__\. In contrast to
+__[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage)__ it uses explicit \(possibly
+format\-specific\) urls to describe the location of the referenced document\. As
+such this command is intended for the creation of references to external
+documents which could not be handled in any other way\.
+
+## Advanced structure
+
+In all previous examples we fudged a bit regarding the markup actually allowed
+to be used before the __index\_begin__ command opening the document\.
+
+Instead of only whitespace the two templating commands __include__ and
+__vset__ are also allowed, to enable the writer to either set and/or import
+configuration settings relevant to the table of contents\. I\.e\. it is possible to
+write
+
+ \[__include FILE__\]
+ \[__vset VAR VALUE__\]
+ \[index\_begin GROUPTITLE TITLE\]
+ \.\.\.
+ \[index\_end\]
+
+Even more important, these two commands are allowed anywhere where a markup
+command is allowed, without regard for any other structure\.
+
+ \[index\_begin GROUPTITLE TITLE\]
+ \[__include FILE__\]
+ \[__vset VAR VALUE__\]
+ \.\.\.
+ \[index\_end\]
+
+The only restriction __include__ has to obey is that the contents of the
+included file must be valid at the place of the inclusion\. I\.e\. a file included
+before __index\_begin__ may contain only the templating commands __vset__
+and __include__, a file included after a key may contain only manape or url
+references, and other keys, etc\.
+
+## Escapes
+
+Beyond the 6 commands shown so far we have two more available\. However their
+function is not the marking up of index structure, but the insertion of
+characters, namely __\[__ and __\]__\. These commands, __lb__ and
+__rb__ respectively, are required because our use of \[ and \] to bracket
+markup commands makes it impossible to directly use \[ and \] within the text\.
+
+Our example of their use are the sources of the last sentence in the previous
+paragraph, with some highlighting added\.
+
+ \.\.\.
+ These commands, \[cmd lb\] and \[cmd lb\] respectively, are required
+ because our use of \[__lb__\] and \[__rb__\] to bracket markup commands makes it
+ impossible to directly use \[__lb__\] and \[__rb__\] within the text\.
+ \.\.\.
+
+# FURTHER READING
+
+Now that this document has been digested the reader, assumed to be a *writer*
+of documentation should be fortified enough to be able to understand the formal
+*[docidx language syntax](docidx\_lang\_syntax\.md)* specification as well\.
+From here on out the *[docidx language command
+reference](docidx\_lang\_cmdref\.md)* will also serve as the detailed
+specification and cheat sheet for all available commands and their syntax\.
+
+To be able to validate a document while writing it, it is also recommended to
+familiarize oneself with Tclapps' ultra\-configurable __dtp__\.
+
+On the other hand, docidx is perfectly suited for the automatic generation from
+doctools documents, and this is the route Tcllib's easy and simple
+__[dtplite](\.\./\.\./apps/dtplite\.md)__ goes, creating an index for a set
+of documents behind the scenes, without the writer having to do so on their own\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_intro](docidx\_intro\.md),
+[docidx\_lang\_cmdref](docidx\_lang\_cmdref\.md),
+[docidx\_lang\_syntax](docidx\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[docidx commands](\.\./\.\./\.\./\.\./index\.md\#docidx\_commands), [docidx
+language](\.\./\.\./\.\./\.\./index\.md\#docidx\_language), [docidx
+markup](\.\./\.\./\.\./\.\./index\.md\#docidx\_markup), [docidx
+syntax](\.\./\.\./\.\./\.\./index\.md\#docidx\_syntax),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007\-2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/docidx_lang_syntax.md
Index: embedded/md/tcllib/files/modules/doctools/docidx_lang_syntax.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/docidx_lang_syntax.md
@@ -0,0 +1,152 @@
+
+[//000000001]: # (docidx\_lang\_syntax \- Documentation tools)
+[//000000002]: # (Generated from file 'docidx\_lang\_syntax\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007\-2009 Andreas Kupries )
+[//000000004]: # (docidx\_lang\_syntax\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+docidx\_lang\_syntax \- docidx language syntax
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [Fundamentals](#section2)
+
+ - [Lexical definitions](#section3)
+
+ - [Syntax](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+This document contains the formal specification of the syntax of the docidx
+markup language, version 1 in Backus\-Naur\-Form\. This document is intended to be
+a reference, complementing the *[docidx language command
+reference](docidx\_lang\_cmdref\.md)*\. A beginner should read the much more
+informally written *[docidx language introduction](docidx\_lang\_intro\.md)*
+first before trying to understand either this document or the command reference\.
+
+# Fundamentals
+
+In the broadest terms possible the *docidx markup language* is like SGML and
+similar languages\. A document written in this language consists primarily of
+markup commands, with text embedded into it at some places\.
+
+Each markup command is a just Tcl command surrounded by a matching pair of
+__\[__ and __\]__\. Which commands are available, and their arguments, i\.e\.
+syntax is specified in the *[docidx language command
+reference](docidx\_lang\_cmdref\.md)*\.
+
+In this document we specify first the lexeme, and then the syntax, i\.e\. how we
+can mix text and markup commands with each other\.
+
+# Lexical definitions
+
+In the syntax rules listed in the next section
+
+ 1. stands for all text except markup commands\.
+
+ 1. Any XXX stands for the markup command \[xxx\] including its arguments\. Each
+ markup command is a Tcl command surrounded by a matching pair of __\[__
+ and __\]__\. Inside of these delimiters the usual rules for a Tcl command
+ apply with regard to word quotation, nested commands, continuation lines,
+ etc\.
+
+ 1. stands for all text consisting only of spaces, newlines, tabulators
+ and the __[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ markup command\.
+
+# Syntax
+
+The rules listed here specify only the syntax of docidx documents\. The lexical
+level of the language was covered in the previous section\.
+
+Regarding the syntax of the \(E\)BNF itself
+
+ 1. The construct \{ X \} stands for zero or more occurrences of X\.
+
+ 1. The construct \[ X \] stands for zero or one occurrence of X\.
+
+The syntax:
+
+ index = defs
+ INDEX\_BEGIN
+ \[ contents \]
+ INDEX\_END
+ \{ \}
+
+ defs = \{ INCLUDE | VSET | \}
+ contents = keyword \{ keyword \}
+
+ keyword = defs KEY ref \{ ref \}
+ ref = MANPAGE | URL | defs
+
+At last a rule we were unable to capture in the EBNF syntax, as it is about the
+arguments of the markup commands, something which is not modeled here\.
+
+ 1. The arguments of all markup commands have to be plain text, and/or text
+ markup commands, i\.e\. one of
+
+ 1) __lb__,
+
+ 1) __rb__, or
+
+ 1) __vset__ \(1\-argument form\)\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_intro](docidx\_intro\.md),
+[docidx\_lang\_cmdref](docidx\_lang\_cmdref\.md),
+[docidx\_lang\_faq](docidx\_lang\_faq\.md),
+[docidx\_lang\_intro](docidx\_lang\_intro\.md)
+
+# KEYWORDS
+
+[docidx commands](\.\./\.\./\.\./\.\./index\.md\#docidx\_commands), [docidx
+language](\.\./\.\./\.\./\.\./index\.md\#docidx\_language), [docidx
+markup](\.\./\.\./\.\./\.\./index\.md\#docidx\_markup), [docidx
+syntax](\.\./\.\./\.\./\.\./index\.md\#docidx\_syntax),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007\-2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/docidx_plugin_apiref.md
Index: embedded/md/tcllib/files/modules/doctools/docidx_plugin_apiref.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/docidx_plugin_apiref.md
@@ -0,0 +1,420 @@
+
+[//000000001]: # (docidx\_plugin\_apiref \- Documentation tools)
+[//000000002]: # (Generated from file 'docidx\_plugin\_apiref\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (docidx\_plugin\_apiref\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+docidx\_plugin\_apiref \- docidx plugin API reference
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [OVERVIEW](#section2)
+
+ - [FRONTEND COMMANDS](#section3)
+
+ - [PLUGIN COMMANDS](#section4)
+
+ - [Management commands](#subsection1)
+
+ - [Formatting commands](#subsection2)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__dt\_fmap__ *symfname*](#1)
+[__dt\_format__](#2)
+[__dt\_read__ *file*](#3)
+[__dt\_source__ *file*](#4)
+[__ex\_cappend__ *text*](#5)
+[__ex\_cget__ *varname*](#6)
+[__ex\_cis__ *cname*](#7)
+[__ex\_cname__](#8)
+[__ex\_cpop__ *cname*](#9)
+[__ex\_cpush__ *cname*](#10)
+[__ex\_cset__ *varname* *value*](#11)
+[__ex\_lb__ ?*newbracket*?](#12)
+[__ex\_rb__ ?*newbracket*?](#13)
+[__idx\_initialize__](#14)
+[__idx\_listvariables__](#15)
+[__idx\_numpasses__](#16)
+[__idx\_postprocess__ *text*](#17)
+[__idx\_setup__ *n*](#18)
+[__idx\_shutdown__](#19)
+[__idx\_varset__ *varname* *text*](#20)
+[__fmt\_plain\_text__ *text*](#21)
+
+# DESCRIPTION
+
+This document is intended for *plugin writers*, i\.e\. developers wishing to
+write an index *[formatting
+engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine)* for some output format X\.
+
+It specifies the interaction between the
+__[doctools::idx](\.\./doctools2idx/idx\_container\.md)__ package and its
+plugins, i\.e\. the interface any index formatting engine has to comply with\.
+
+This document deals with version 1 of the interface\.
+
+A reader who is on the other hand more interested in the markup language itself
+should start with the *[docidx language
+introduction](docidx\_lang\_intro\.md)* and proceed from there to the formal
+specifications, i\.e\. the *[docidx language syntax](docidx\_lang\_syntax\.md)*
+and the *[docidx language command reference](docidx\_lang\_cmdref\.md)*\.
+
+# OVERVIEW
+
+The API for an index formatting engine consists of two major sections\.
+
+On the one side we have a set of commands through which the plugin is able to
+query the frontend\. These commands are provided by the frontend and linked into
+the plugin interpreter\. Please see section [FRONTEND COMMANDS](#section3)
+for their detailed specification\.
+
+And on the other side the plugin has to provide its own set of commands which
+will then be called by the frontend in a specific sequence while processing
+input\. They, again, fall into two categories, management and formatting\. Please
+see section [PLUGIN COMMANDS](#section4) and its subsections for their
+detailed specification\.
+
+# FRONTEND COMMANDS
+
+This section specifies the set of commands through which a plugin, also known as
+an index formatting engine, is able to query the frontend\. These commands are
+provided by the frontend and linked into the plugin interpreter\.
+
+I\.e\. an index formatting engine can assume that all of the following commands
+are present when any of its own commands \(as specified in section [PLUGIN
+COMMANDS](#section4)\) are executed\.
+
+Beyond that it can also assume that it has full access to its own safe
+interpreter and thus is not able to damage the other parts of the processor, nor
+can it damage the filesystem\. It is however able to either kill or hang the
+whole process, by exiting, or running an infinite loop\.
+
+Coming back to the imported commands, all the commands with prefix *dt\_*
+provide limited access to specific parts of the frontend, whereas the commands
+with prefix *ex\_* provide access to the state of the
+__[textutil::expander](\.\./textutil/expander\.md)__ object which does the
+main parsing of the input within the frontend\. These commands should not be
+except under very special circumstances\.
+
+ - __dt\_fmap__ *symfname*
+
+ Query command\. It returns the actual pathname to use in the output in place
+ of the symbolic filename *symfname*\. It will return the unchanged input if
+ no mapping was established for *symfname*\.
+
+ The required mappings are established with the method __map__ of a
+ frontend, as explained in section __OBJECT METHODS__ of the
+ documentation for the package
+ __[doctools::idx](\.\./doctools2idx/idx\_container\.md)__\.
+
+ - __dt\_format__
+
+ Query command\. It returns the name of the format associated with the index
+ formatting engine\.
+
+ - __dt\_read__ *file*
+
+ Controlled filesystem access\. Returns contents of *file* for whatever use
+ desired by the plugin\. Only files which are either in the same directory as
+ the file containing the engine, or below it, can be loaded\. Trying to load a
+ file outside of this directory causes an error\.
+
+ - __dt\_source__ *file*
+
+ Controlled filesystem access\. This command allows the index formatting
+ engine to load additional Tcl code it may need\. Only files which are either
+ in the same directory as the file containing the engine, or below it, can be
+ loaded\. Trying to load a file outside of this directory causes an error\.
+
+ - __ex\_cappend__ *text*
+
+ Appends a string to the output in the current context\. This command should
+ rarely be used by macros or application code\.
+
+ - __ex\_cget__ *varname*
+
+ Retrieves the value of variable *varname*, defined in the current context\.
+
+ - __ex\_cis__ *cname*
+
+ Determines whether or not the name of the current context is *cname*\.
+
+ - __ex\_cname__
+
+ Returns the name of the current context\.
+
+ - __ex\_cpop__ *cname*
+
+ Pops a context from the context stack, returning all accumulated output in
+ that context\. The context must be named *cname*, or an error results\.
+
+ - __ex\_cpush__ *cname*
+
+ Pushes a context named *cname* onto the context stack\. The context must be
+ popped by __cpop__ before expansion ends or an error results\.
+
+ - __ex\_cset__ *varname* *value*
+
+ Sets variable *varname* to *value* in the current context\.
+
+ - __ex\_lb__ ?*newbracket*?
+
+ Returns the current value of the left macro expansion bracket; this is for
+ use as or within a macro, when the bracket needs to be included in the
+ output text\. If *newbracket* is specified, it becomes the new bracket, and
+ is returned\.
+
+ - __ex\_rb__ ?*newbracket*?
+
+ Returns the current value of the right macro expansion bracket; this is for
+ use as or within a macro, when the bracket needs to be included in the
+ output text\. If *newbracket* is specified, it becomes the new bracket, and
+ is returned\.
+
+# PLUGIN COMMANDS
+
+The plugin has to provide its own set of commands which will then be called by
+the frontend in a specific sequence while processing input\. They fall into two
+categories, management and formatting\. Their expected names, signatures, and
+responsibilities are specified in the following two subsections\.
+
+## Management commands
+
+The management commands a plugin has to provide are used by the frontend to
+
+ 1. initialize and shutdown the plugin
+
+ 1. determine the number of passes it has to make over the input
+
+ 1. initialize and shutdown each pass
+
+ 1. query and initialize engine parameters
+
+After the plugin has been loaded and the frontend commands are established the
+commands will be called in the following sequence:
+
+ idx\_numpasses \-> n
+ idx\_listvariables \-> vars
+
+ idx\_varset var1 value1
+ idx\_varset var2 value2
+ \.\.\.
+ idx\_varset varK valueK
+ idx\_initialize
+ idx\_setup 1
+ \.\.\.
+ idx\_setup 2
+ \.\.\.
+ \.\.\.
+ idx\_setup n
+ \.\.\.
+ idx\_postprocess
+ idx\_shutdown
+ \.\.\.
+
+I\.e\. first the number of passes and the set of available engine parameters is
+established, followed by calls setting the parameters\. That second part is
+optional\.
+
+After that the plugin is initialized, the specified number of passes executed,
+the final result run through a global post processing step and at last the
+plugin is shutdown again\. This can be followed by more conversions, restarting
+the sequence at __idx\_varset__\.
+
+In each of the passes, i\.e\. after the calls of __idx\_setup__ the frontend
+will process the input and call the formatting commands as markup is
+encountered\. This means that the sequence of formatting commands is determined
+by the grammar of the docidx markup language, as specified in the *[docidx
+language syntax](docidx\_lang\_syntax\.md)* specification\.
+
+A different way of looking at the sequence is:
+
+ - First some basic parameters are determined\.
+
+ - Then everything starting at the first __idx\_varset__ to
+ __idx\_shutdown__ forms a *run*, the formatting of a single input\. Each
+ run can be followed by more\.
+
+ - Embedded within each run we have one or more *passes*, each starting with
+ __idx\_setup__ and going until either the next __idx\_setup__ or
+ __idx\_postprocess__ is reached\.
+
+ If more than one pass is required to perform the formatting only the output
+ of the last pass is relevant\. The output of all the previous, preparatory
+ passes is ignored\.
+
+The commands, their names, signatures, and responsibilities are, in detail:
+
+ - __idx\_initialize__
+
+ *Initialization/Shutdown*\. This command is called at the beginning of
+ every conversion run, as the first command of that run\. Note that a run is
+ not a pass, but may consist of multiple passes\. It has to initialize the
+ general state of the plugin, beyond the initialization done during the load\.
+ No return value is expected, and any returned value is ignored\.
+
+ - __idx\_listvariables__
+
+ *Initialization/Shutdown* and *Engine parameters*\. Second command is
+ called after the plugin code has been loaded, i\.e\. immediately after
+ __idx\_numpasses__\. It has to return a list containing the names of the
+ parameters the frontend can set to configure the engine\. This list can be
+ empty\.
+
+ - __idx\_numpasses__
+
+ *Initialization/Shutdown* and *Pass management*\. First command called
+ after the plugin code has been loaded\. No other command of the engine will
+ be called before it\. It has to return the number of passes this engine
+ requires to fully process the input document\. This value has to be an
+ integer number greater or equal to one\.
+
+ - __idx\_postprocess__ *text*
+
+ *Initialization/Shutdown*\. This command is called immediately after the
+ last pass in a run\. Its argument is the result of the conversion generated
+ by that pass\. It is provided to allow the engine to perform any global
+ modifications of the generated document\. If no post\-processing is required
+ for a specific format the command has to just return the argument\.
+
+ Expected to return a value, the final result of formatting the input\.
+
+ - __idx\_setup__ *n*
+
+ *Initialization/Shutdown* and *Pass management*\. This command is called
+ at the beginning of each pass over the input in a run\. Its argument is the
+ number of the pass which has begun\. Passes are counted from __1__
+ upward\. The command has to set up the internal state of the plugin for this
+ particular pass\. No return value is expected, and any returned value is
+ ignored\.
+
+ - __idx\_shutdown__
+
+ *Initialization/Shutdown*\. This command is called at the end of every
+ conversion run\. It is the last command called in a run\. It has to clean up
+ of all the run\-specific state in the plugin\. After the call the engine has
+ to be in a state which allows the initiation of another run without fear
+ that information from the last run is leaked into this new run\. No return
+ value is expected, and any returned value is ignored\.
+
+ - __idx\_varset__ *varname* *text*
+
+ *Engine parameters*\. This command is called by the frontend to set an
+ engine parameter to a particular value\. The parameter to change is specified
+ by *varname*, the value to set in *text*\.
+
+ The command has to throw an error if an unknown *varname* is used\. Only
+ the names returned by __idx\_listvariables__ have to be considered as
+ known\.
+
+ The values of all engine parameters have to persist between passes and runs\.
+
+## Formatting commands
+
+The formatting commands have to implement the formatting for the output format,
+for all the markup commands of the docidx markup language, except __lb__,
+__rb__, __vset__, __include__, and
+__[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__\. These exceptions are
+processed by the frontend and are never seen by the plugin\. In return a command
+for the formatting of plain text has to be provided, something which has no
+markup in the input at all\.
+
+This means, that each of the five markup commands specified in the *[docidx
+language command reference](docidx\_lang\_cmdref\.md)* and outside of the set
+of exceptions listed above has an equivalent formatting command which takes the
+same arguments as the markup command and whose name is the name of markup
+command with the prefix *fmt\_* added to it\.
+
+All commands are expected to format their input in some way per the semantics
+specified in the command reference and to return whatever part of this that they
+deem necessary as their result, which will be added to the output\.
+
+To avoid essentially duplicating the command reference we do not list any of the
+command here and simply refer the reader to the *[docidx language command
+reference](docidx\_lang\_cmdref\.md)* for their signature and description\. The
+sole exception is the plain text formatter, which has no equivalent markup
+command\.
+
+The calling sequence of formatting commands is not as rigid as for the
+management commands, but determined by the grammar of the docidx markup
+language, as specified in the *[docidx language
+syntax](docidx\_lang\_syntax\.md)* specification\.
+
+ - __fmt\_plain\_text__ *text*
+
+ *No associated markup command*\.
+
+ Called by the frontend for any plain text encountered in the input\. It has
+ to perform any and all special processing required for plain text\.
+
+ The formatted text is expected as the result of the command, and added to
+ the output\. If no special processing is required it has to simply return its
+ argument without change\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_intro](docidx\_intro\.md),
+[docidx\_lang\_cmdref](docidx\_lang\_cmdref\.md),
+[docidx\_lang\_faq](docidx\_lang\_faq\.md),
+[docidx\_lang\_intro](docidx\_lang\_intro\.md),
+[docidx\_lang\_syntax](docidx\_lang\_syntax\.md),
+[doctools::idx](\.\./doctools2idx/idx\_container\.md)
+
+# KEYWORDS
+
+[formatting engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine),
+[index](\.\./\.\./\.\./\.\./index\.md\#index), [index
+formatter](\.\./\.\./\.\./\.\./index\.md\#index\_formatter),
+[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctoc.md
Index: embedded/md/tcllib/files/modules/doctools/doctoc.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctoc.md
@@ -0,0 +1,410 @@
+
+[//000000001]: # (doctools::toc \- Documentation tools)
+[//000000002]: # (Generated from file 'doctoc\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2003\-2019 Andreas Kupries )
+[//000000004]: # (doctools::toc\(n\) 1\.2 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::toc \- doctoc \- Processing tables of contents
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [PACKAGE COMMANDS](#subsection1)
+
+ - [OBJECT COMMAND](#subsection2)
+
+ - [OBJECT METHODS](#subsection3)
+
+ - [OBJECT CONFIGURATION](#subsection4)
+
+ - [FORMAT MAPPING](#subsection5)
+
+ - [PREDEFINED ENGINES](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require doctools::toc ?1\.2?
+
+[__::doctools::toc::new__ *objectName* ?__\-option__ *value* \.\.\.?](#1)
+[__::doctools::toc::help__](#2)
+[__::doctools::toc::search__ *path*](#3)
+[__objectName__ __method__ ?*arg arg \.\.\.*?](#4)
+[*objectName* __configure__](#5)
+[*objectName* __configure__ *option*](#6)
+[*objectName* __configure__ __\-option__ *value*\.\.\.](#7)
+[*objectName* __cget__ __\-option__](#8)
+[*objectName* __destroy__](#9)
+[*objectName* __format__ *text*](#10)
+[*objectName* __map__ *symbolic* *actual*](#11)
+[*objectName* __parameters__](#12)
+[*objectName* __search__ *path*](#13)
+[*objectName* __setparam__ *name* *value*](#14)
+[*objectName* __warnings__](#15)
+
+# DESCRIPTION
+
+This package provides a class for the creation of objects able to process and
+convert text written in the *[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)* markup
+language into any output format X for which a *[formatting
+engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine)* is available\.
+
+A reader interested in the markup language itself should start with the
+*[doctoc language introduction](doctoc\_lang\_intro\.md)* and proceed from
+there to the formal specifications, i\.e\. the *[doctoc language
+syntax](doctoc\_lang\_syntax\.md)* and the *[doctoc language command
+reference](doctoc\_lang\_cmdref\.md)*\.
+
+If on the other hand the reader wishes to write her own formatting engine for
+some format, i\.e\. is a *plugin writer* then reading and understanding the
+*[doctoc plugin API reference](doctoc\_plugin\_apiref\.md)* is an absolute
+necessity, as that document specifies the interaction between this package and
+its plugins, i\.e\. the formatting engines, in detail\.
+
+# PUBLIC API
+
+## PACKAGE COMMANDS
+
+ - __::doctools::toc::new__ *objectName* ?__\-option__ *value* \.\.\.?
+
+ This command creates a new doctoc object with an associated Tcl command
+ whose name is *objectName*\. This
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)* command is explained in full
+ detail in the sections [OBJECT COMMAND](#subsection2) and [OBJECT
+ METHODS](#subsection3)\. The object command will be created under the
+ current namespace if the *objectName* is not fully qualified, and in the
+ specified namespace otherwise\.
+
+ The options and their values coming after the name of the object are used to
+ set the initial configuration of the object\.
+
+ - __::doctools::toc::help__
+
+ This is a convenience command for applications wishing to provide their user
+ with a short description of the available formatting commands and their
+ meanings\. It returns a string containing a standard help text\.
+
+ - __::doctools::toc::search__ *path*
+
+ Whenever an object created by this the package has to map the name of a
+ format to the file containing the code for its formatting engine it will
+ search for the file in a number of directories stored in a list\. See section
+ [FORMAT MAPPING](#subsection5) for more explanations\.
+
+ This list not only contains three default directories which are declared by
+ the package itself, but is also extensible user of the package\. This command
+ is the means to do so\. When given a *path* to an existing and readable
+ directory it will prepend that directory to the list of directories to
+ search\. This means that the *path* added last is later searched through
+ first\.
+
+ An error will be thrown if the *path* either does not exist, is not a
+ directory, or is not readable\.
+
+## OBJECT COMMAND
+
+All commands created by __::doctools::toc::new__ have the following general
+form and may be used to invoke various operations on their doctoc converter
+object\.
+
+ - __objectName__ __method__ ?*arg arg \.\.\.*?
+
+ The method __method__ and its *arg*'uments determine the exact
+ behavior of the command\. See section [OBJECT METHODS](#subsection3) for
+ the detailed specifications\.
+
+## OBJECT METHODS
+
+ - *objectName* __configure__
+
+ The method returns a list of all known options and their current values when
+ called without any arguments\.
+
+ - *objectName* __configure__ *option*
+
+ The method behaves like the method __cget__ when called with a single
+ argument and returns the value of the option specified by said argument\.
+
+ - *objectName* __configure__ __\-option__ *value*\.\.\.
+
+ The method reconfigures the specified __option__s of the object, setting
+ them to the associated *value*s, when called with an even number of
+ arguments, at least two\.
+
+ The legal options are described in the section [OBJECT
+ CONFIGURATION](#subsection4)\.
+
+ - *objectName* __cget__ __\-option__
+
+ This method expects a legal configuration option as argument and will return
+ the current value of that option for the object the method was invoked for\.
+
+ The legal configuration options are described in section [OBJECT
+ CONFIGURATION](#subsection4)\.
+
+ - *objectName* __destroy__
+
+ This method destroys the object it is invoked for\.
+
+ - *objectName* __format__ *text*
+
+ This method runs the *text* through the configured formatting engine and
+ returns the generated string as its result\. An error will be thrown if no
+ __\-format__ was configured for the object\.
+
+ The method assumes that the *text* is in
+ *[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)* format as specified in the
+ companion document *doctoc\_fmt*\. Errors will be thrown otherwise\.
+
+ - *objectName* __map__ *symbolic* *actual*
+
+ This methods add one entry to the per\-object mapping from *symbolic*
+ filenames to the *actual* uris\. The object just stores this mapping and
+ makes it available to the configured formatting engine through the command
+ __dt\_fmap__\. This command is described in more detail in the *[doctoc
+ plugin API reference](doctoc\_plugin\_apiref\.md)* which specifies the
+ interaction between the objects created by this package and toc formatting
+ engines\.
+
+ - *objectName* __parameters__
+
+ This method returns a list containing the names of all engine parameters
+ provided by the configured formatting engine\. It will return an empty list
+ if the object is not yet configured for a specific format\.
+
+ - *objectName* __search__ *path*
+
+ This method extends the per\-object list of paths searched for toc formatting
+ engines\. See also the command __::doctools::toc::search__ on how to
+ extend the per\-package list of paths\. Note that the path entered last will
+ be searched first\. For more details see section [FORMAT
+ MAPPING](#subsection5)\.
+
+ - *objectName* __setparam__ *name* *value*
+
+ This method sets the *name*d engine parameter to the specified *value*\.
+ It will throw an error if the object is either not yet configured for a
+ specific format, or if the formatting engine for the configured format does
+ not provide a parameter with the given *name*\. The list of parameters
+ provided by the configured formatting engine can be retrieved through the
+ method __parameters__\.
+
+ - *objectName* __warnings__
+
+ This method returns a list containing all the warnings which were generated
+ by the configured formatting engine during the last invocation of the method
+ __format__\.
+
+## OBJECT CONFIGURATION
+
+All doctoc objects understand the following configuration options:
+
+ - __\-file__ *file*
+
+ The argument of this option is stored in the object and made available to
+ the configured formatting engine through the command __dt\_file__\. This
+ command is described in more detail in the companion document *doctoc\_api*
+ which specifies the API between the object and formatting engines\.
+
+ The default value of this option is the empty string\.
+
+ The configured formatting engine should interpret the value as the name of
+ the file containing the document which is currently processed\.
+
+ - __\-format__ *text*
+
+ The argument of this option specifies the format to generate and by
+ implication the formatting engine to use when converting text via the method
+ __format__\. Its default value is the empty string\. The method
+ __format__ cannot be used if this option is not set to a valid value at
+ least once\.
+
+ The package will immediately try to map the given name to a file containing
+ the code for a formatting engine generating that format\. An error will be
+ thrown if this mapping fails\. In that case a previously configured format is
+ left untouched\.
+
+ The section [FORMAT MAPPING](#subsection5) explains in detail how the
+ package and object will look for engine implementations\.
+
+## FORMAT MAPPING
+
+The package and object will perform the following algorithm when trying to map a
+format name *foo* to a file containing an implementation of a formatting
+engine for *foo*:
+
+ 1. If *foo* is the name of an existing file then this file is directly taken
+ as the implementation\.
+
+ 1. If not, the list of per\-object search paths is searched\. For each directory
+ in the list the package checks if that directory contains a file
+ "toc\.*foo*"\. If yes, then that file is taken as the implementation\.
+
+ Note that this list of paths is initially empty and can be extended through
+ the object method __search__\.
+
+ 1. If not, the list of package paths is searched\. For each directory in the
+ list the package checks if that directory contains a file "toc\.*foo*"\. If
+ yes, then that file is taken as the implementation\.
+
+ This list of paths can be extended through the command
+ __::doctools::toc::search__\. It contains initially one path, the
+ subdirectory "mpformats" of the directory the package itself is located in\.
+ In other words, if the package implementation "doctoc\.tcl" is installed in
+ the directory "/usr/local/lib/tcllib/doctools" then it will by default
+ search the directory "/usr/local/lib/tcllib/doctools/mpformats" for format
+ implementations\.
+
+ 1. The mapping fails\.
+
+# PREDEFINED ENGINES
+
+The package provides predefined formatting engines for the following formats\.
+Some of the formatting engines support engine parameters\. These will be
+explicitly highlighted\.
+
+ - html
+
+ This engine generates HTML markup, for processing by web browsers and the
+ like\. This engine supports three parameters:
+
+ * footer
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the body section of a HTML document\. The default value is the empty
+ string\. The value is inserted into the generated output just before the
+ ____ tag, closing the body of the generated HTML\.
+
+ This can be used to insert boilerplate footer markup into the generated
+ document\.
+
+ * header
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the body section of a HTML document\. The default value is the empty
+ string\. The value is inserted into the generated output just after the
+ ____ tag, starting the body of the generated HTML\.
+
+ This can be used to insert boilerplate header markup into the generated
+ document\.
+
+ * meta
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the header section of a HTML document\. The default value is the
+ empty string\. The value is inserted into the generated output just after
+ the ____ tag, starting the header section of the generated
+ HTML\.
+
+ This can be used to insert boilerplate meta data markup into the
+ generated document, like references to a stylesheet, standard meta
+ keywords, etc\.
+
+ - latex
+
+ This engine generates output suitable for the
+ __[latex](\.\./\.\./\.\./\.\./index\.md\#latex)__ text processor coming out of
+ the TeX world\.
+
+ - list
+
+ This engine retrieves version, section and title of the manpage from the
+ document\. As such it can be used to generate a directory listing for a set
+ of manpages\.
+
+ - markdown
+
+ This engine generates *[Markdown](\.\./\.\./\.\./\.\./index\.md\#markdown)*
+ markup\.
+
+ - nroff
+
+ This engine generates nroff output, for processing by
+ __[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff)__, or __groff__\. The
+ result will be standard man pages as they are known in the unix world\.
+
+ - null
+
+ This engine generates no outout at all\. This can be used if one just wants
+ to validate some input\.
+
+ - tmml
+
+ This engine generates TMML markup as specified by Joe English\. The Tcl
+ Manpage Markup Language is a derivate of XML\.
+
+ - wiki
+
+ This engine generates Wiki markup as understood by Jean Claude Wippler's
+ __wikit__ application\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctoc\_intro](doctoc\_intro\.md),
+[doctoc\_lang\_cmdref](doctoc\_lang\_cmdref\.md),
+[doctoc\_lang\_intro](doctoc\_lang\_intro\.md),
+[doctoc\_lang\_syntax](doctoc\_lang\_syntax\.md),
+[doctoc\_plugin\_apiref](doctoc\_plugin\_apiref\.md)
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html), [TMML](\.\./\.\./\.\./\.\./index\.md\#tmml),
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion),
+[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation),
+[latex](\.\./\.\./\.\./\.\./index\.md\#latex),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markdown](\.\./\.\./\.\./\.\./index\.md\#markdown),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff), [table of
+contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents),
+[toc](\.\./\.\./\.\./\.\./index\.md\#toc), [wiki](\.\./\.\./\.\./\.\./index\.md\#wiki)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2003\-2019 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctoc_intro.md
Index: embedded/md/tcllib/files/modules/doctools/doctoc_intro.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctoc_intro.md
@@ -0,0 +1,135 @@
+
+[//000000001]: # (doctoc\_intro \- Documentation tools)
+[//000000002]: # (Generated from file 'doctoc\_intro\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctoc\_intro\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctoc\_intro \- doctoc introduction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [RELATED FORMATS](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+*[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)* \(short for *documentation tables
+of contents*\) stands for a set of related, yet different, entities which are
+working together for the easy creation and transformation of tables of contents
+for documentation\. These are
+
+ 1. A tcl based language for the semantic markup of a table of contents\. Markup
+ is represented by Tcl commands\.
+
+ 1. A package providing the ability to read and transform texts written in that
+ markup language\. It is important to note that the actual transformation of
+ the input text is delegated to plugins\.
+
+ 1. An API describing the interface between the package above and a plugin\.
+
+Which of the more detailed documents are relevant to the reader of this
+introduction depends on their role in the documentation process\.
+
+ 1. A *writer* of documentation has to understand the markup language itself\.
+ A beginner to doctoc should read the more informally written *[doctoc
+ language introduction](doctoc\_lang\_intro\.md)* first\. Having digested
+ this the formal *[doctoc language syntax](doctoc\_lang\_syntax\.md)*
+ specification should become understandable\. A writer experienced with
+ doctoc may only need the *[doctoc language command
+ reference](doctoc\_lang\_cmdref\.md)* from time to time to refresh her
+ memory\.
+
+ While a document is written the __dtp__ application can be used to
+ validate it, and after completion it also performs the conversion into the
+ chosen system of visual markup, be it \*roff, HTML, plain text, wiki, etc\.
+ The simpler __[dtplite](\.\./\.\./apps/dtplite\.md)__ application makes
+ internal use of doctoc when handling directories of documentation,
+ automatically generating a proper table of contents for them\.
+
+ 1. A *processor* of documentation written in the
+ *[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)* markup language has to know
+ which tools are available for use\.
+
+ The main tool is the aforementioned __dtp__ application provided by
+ Tcllib\. The simpler __[dtplite](\.\./\.\./apps/dtplite\.md)__ does not
+ expose doctoc to the user\. At the bottom level, common to both
+ applications, however sits the package __doctoools::toc__, providing
+ the basic facilities to read and process files containing text in the
+ doctoc format\.
+
+ 1. At last, but not least, *plugin writers* have to understand the
+ interaction between the __[doctools::toc](doctoc\.md)__ package and
+ its plugins, as described in the *[doctoc plugin API
+ reference](doctoc\_plugin\_apiref\.md)*\.
+
+# RELATED FORMATS
+
+doctoc does not stand alone, it has two companion formats\. These are called
+*[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* and
+*[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)*, and they are for the markup
+of *keyword indices*, and general documentation, respectively\. They are
+described in their own sets of documents, starting at the *[docidx
+introduction](docidx\_intro\.md)* and the *[doctools
+introduction](doctools\_intro\.md)*, respectively\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_intro](docidx\_intro\.md),
+[doctoc\_lang\_cmdref](doctoc\_lang\_cmdref\.md),
+[doctoc\_lang\_faq](doctoc\_lang\_faq\.md),
+[doctoc\_lang\_intro](doctoc\_lang\_intro\.md),
+[doctoc\_lang\_syntax](doctoc\_lang\_syntax\.md),
+[doctoc\_plugin\_apiref](doctoc\_plugin\_apiref\.md),
+[doctools::toc](doctoc\.md), [doctools\_intro](doctools\_intro\.md)
+
+# KEYWORDS
+
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup), [table of
+contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents),
+[toc](\.\./\.\./\.\./\.\./index\.md\#toc)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctoc_lang_cmdref.md
Index: embedded/md/tcllib/files/modules/doctools/doctoc_lang_cmdref.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctoc_lang_cmdref.md
@@ -0,0 +1,176 @@
+
+[//000000001]: # (doctoc\_lang\_cmdref \- Documentation tools)
+[//000000002]: # (Generated from file 'doctoc\_lang\_cmdref\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctoc\_lang\_cmdref\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctoc\_lang\_cmdref \- doctoc language command reference
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Commands](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ *plaintext*](#1)
+[__division\_end__](#2)
+[__division\_start__ *text* ?*symfile*?](#3)
+[__include__ *filename*](#4)
+[__item__ *file* *text* *desc*](#5)
+[__lb__](#6)
+[__rb__](#7)
+[__toc\_begin__ *text* *title*](#8)
+[__toc\_end__](#9)
+[__vset__ *varname* *value*](#10)
+[__vset__ *varname*](#11)
+
+# DESCRIPTION
+
+This document specifies both names and syntax of all the commands which together
+are the doctoc markup language, version 1\. As this document is intended to be a
+reference the commands are listed in alphabetical order, and the descriptions
+are relatively short\. A beginner should read the much more informally written
+*[doctoc language introduction](doctoc\_lang\_intro\.md)* first\.
+
+# Commands
+
+ - __[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ *plaintext*
+
+ Toc markup\. The argument text is marked up as a comment standing outside of
+ the actual text of the document\. Main use is in free\-form text\.
+
+ - __division\_end__
+
+ Toc structure\. This command closes the division opened by the last
+ __division\_begin__ command coming before it, and not yet closed\.
+
+ - __division\_start__ *text* ?*symfile*?
+
+ Toc structure\. This command opens a division in the table of contents\. Its
+ counterpart is __division\_end__\. Together they allow a user to give a
+ table of contents additional structure\.
+
+ The title of the new division is provided by the argument *text*\.
+
+ If the symbolic filename *symfile* is present then the section title
+ should link to the referenced document, if links are supported by the output
+ format\.
+
+ - __include__ *filename*
+
+ Templating\. The contents of the named file are interpreted as text written
+ in the doctoc markup and processed in the place of the include command\. The
+ markup in the file has to be self\-contained\. It is not possible for a markup
+ command to cross the file boundaries\.
+
+ - __item__ *file* *text* *desc*
+
+ Toc structure\. This command adds an individual element to the table of
+ contents\. Each such element refers to a document\. The document is specified
+ through the symbolic name *file*\. The *text* argument is used to label
+ the reference, whereas the *desc* provides a short descriptive text of
+ that document\.
+
+ The symbolic names are used to preserve the convertibility of this format to
+ any output format\. The actual name of the file will be inserted by the
+ chosen formatting engine when converting the input\. This will be based on a
+ mapping from symbolic to actual names given to the engine\.
+
+ - __lb__
+
+ Text\. The command is replaced with a left bracket\. Use in free\-form text\.
+ Required to avoid interpretation of a left bracket as the start of a markup
+ command\. Its usage is restricted to the arguments of other markup commands\.
+
+ - __rb__
+
+ Text\. The command is replaced with a right bracket\. Use in free\-form text\.
+ Required to avoid interpretation of a right bracket as the end of a markup
+ command\. Its usage is restricted to the arguments of other commands\.
+
+ - __toc\_begin__ *text* *title*
+
+ Document structure\. The command to start a table of contents\. The arguments
+ are a label for the whole group of documents the index refers to \(*text*\)
+ and the overall title text for the index \(*title*\), without markup\.
+
+ The label often is the name of the package \(or extension\) the documents
+ belong to\.
+
+ - __toc\_end__
+
+ Document structure\. Command to end a table of contents\. Anything in the
+ document coming after this command is in error\.
+
+ - __vset__ *varname* *value*
+
+ Templating\. In this form the command sets the named document variable to the
+ specified *value*\. It does not generate output\. I\.e\. the command is
+ replaced by the empty string\.
+
+ - __vset__ *varname*
+
+ Templating\. In this form the command is replaced by the value of the named
+ document variable
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctoc\_intro](doctoc\_intro\.md), [doctoc\_lang\_faq](doctoc\_lang\_faq\.md),
+[doctoc\_lang\_intro](doctoc\_lang\_intro\.md),
+[doctoc\_lang\_syntax](doctoc\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[doctoc commands](\.\./\.\./\.\./\.\./index\.md\#doctoc\_commands), [doctoc
+language](\.\./\.\./\.\./\.\./index\.md\#doctoc\_language), [doctoc
+markup](\.\./\.\./\.\./\.\./index\.md\#doctoc\_markup),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctoc_lang_faq.md
Index: embedded/md/tcllib/files/modules/doctools/doctoc_lang_faq.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctoc_lang_faq.md
@@ -0,0 +1,112 @@
+
+[//000000001]: # (doctoc\_lang\_faq \- Documentation tools)
+[//000000002]: # (Generated from file 'doctoc\_lang\_faq\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctoc\_lang\_faq\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctoc\_lang\_faq \- doctoc language faq
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [OVERVIEW](#section2)
+
+ - [What is this document?](#subsection1)
+
+ - [EXAMPLES](#section3)
+
+ - [Where do I find doctoc examples?](#subsection2)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+# OVERVIEW
+
+## What is this document?
+
+This document is currently mainly a placeholder, to be filled with commonly
+asked questions about the doctoc markup language and companions, and their
+answers\.
+
+Please report any questions \(and, if possible, answers\) we should consider for
+this document as explained in the section [Bugs, Ideas,
+Feedback](#section4) below\.
+
+# EXAMPLES
+
+## Where do I find doctoc examples?
+
+We have no direct examples of documents written using doctoc markup\. However the
+doctools processor __[dtplite](\.\./\.\./apps/dtplite\.md)__ does generate a
+table of contents when processing a set of documents written in doctools markup\.
+The intermediate file for it uses doctoc markup and is not deleted when
+generation completes\. Such files can therefore serve as examples\.
+
+__[dtplite](\.\./\.\./apps/dtplite\.md)__ is distributed as part of Tcllib,
+so to get it you need one of
+
+ 1. A snapshot of Tcllib\. How to retrieve such a snapshot and the tools
+ required for this are described at [Development
+ Snapshots](/wiki?name=Development\+Snapshots)
+
+ 1. A Tcllib release archive\. They are available at the [home](/home) page\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctoc\_lang\_cmdref](doctoc\_lang\_cmdref\.md),
+[doctoc\_lang\_intro](doctoc\_lang\_intro\.md),
+[doctoc\_lang\_syntax](doctoc\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[doctoc commands](\.\./\.\./\.\./\.\./index\.md\#doctoc\_commands), [doctoc
+language](\.\./\.\./\.\./\.\./index\.md\#doctoc\_language), [doctoc
+markup](\.\./\.\./\.\./\.\./index\.md\#doctoc\_markup), [doctoc
+syntax](\.\./\.\./\.\./\.\./index\.md\#doctoc\_syntax),
+[examples](\.\./\.\./\.\./\.\./index\.md\#examples),
+[faq](\.\./\.\./\.\./\.\./index\.md\#faq), [markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[semantic markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctoc_lang_intro.md
Index: embedded/md/tcllib/files/modules/doctools/doctoc_lang_intro.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctoc_lang_intro.md
@@ -0,0 +1,299 @@
+
+[//000000001]: # (doctoc\_lang\_intro \- Documentation tools)
+[//000000002]: # (Generated from file 'doctoc\_lang\_intro\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctoc\_lang\_intro\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctoc\_lang\_intro \- doctoc language introduction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [Fundamentals](#subsection1)
+
+ - [Basic structure](#subsection2)
+
+ - [Items](#subsection3)
+
+ - [Divisions](#subsection4)
+
+ - [Advanced structure](#subsection5)
+
+ - [Escapes](#subsection6)
+
+ - [FURTHER READING](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+This document is an informal introduction to version 1\.1 of the doctoc markup
+language based on a multitude of examples\. After reading this a writer should be
+ready to understand the two parts of the formal specification, i\.e\. the
+*[doctoc language syntax](doctoc\_lang\_syntax\.md)* specification and the
+*[doctoc language command reference](doctoc\_lang\_cmdref\.md)*\.
+
+## Fundamentals
+
+While the *doctoc markup language* is quite similar to the *doctools markup
+language*, in the broadest terms possible, there is one key difference\. A table
+of contents consists essentially only of markup commands, with no plain text
+interspersed between them, except for whitespace\.
+
+Each markup command is a Tcl command surrounded by a matching pair of __\[__
+and __\]__\. Inside of these delimiters the usual rules for a Tcl command
+apply with regard to word quotation, nested commands, continuation lines, etc\.
+I\.e\.
+
+ \.\.\. \[division\_start \{Appendix 1\}\] \.\.\.
+
+ \.\.\. \[item thefile \\\\
+ label \{file description\}\] \.\.\.
+
+## Basic structure
+
+The most simple document which can be written in doctoc is
+
+ \[toc\_begin GROUPTITLE TITLE\]
+ \[toc\_end\]
+
+This also shows us that all doctoc documents consist of only one part where we
+will list *items* and *divisions*\.
+
+The user is free to mix these as she sees fit\. This is a change from version 1
+of the language, which did not allow this mixing, but only the use of either a
+series of items or a series of divisions\.
+
+We will discuss the commands for each of these two possibilities in the next
+sections\.
+
+## Items
+
+Use the command __item__ to put an *item* into a table of contents\. This
+is essentially a reference to a section, subsection, etc\. in the document, or
+set of documents, the table of contents is for\. The command takes three
+arguments, a symbolic name for the file the item is for and two text to label
+the item and describe the referenced section\.
+
+Symbolic names are used to preserve the convertibility of this format to any
+output format\. The actual name of any file will be inserted by the chosen
+formatting engine when converting the input, based on a mapping from symbolic to
+actual names given to the engine\.
+
+Here a made up example for a table of contents of this document:
+
+ \[toc\_begin Doctoc \{Language Introduction\}\]
+ \[__item 1 DESCRIPTION__\]
+ \[__item 1\.1 \{Basic structure\}__\]
+ \[__item 1\.2 Items__\]
+ \[__item 1\.3 Divisions__\]
+ \[__item 2 \{FURTHER READING\}__\]
+ \[toc\_end\]
+
+## Divisions
+
+One thing of notice in the last example in the previous section is that the
+referenced sections actually had a nested structure, something which was
+expressed in the item labels, by using a common prefix for all the sections
+nested under section 1\.
+
+This kind of structure can be made more explicit in the doctoc language by using
+divisions\. Instead of using a series of plain items we use a series of divisions
+for the major references, and then place the nested items inside of these\.
+
+Of course, instead of the nested items we can again use divisions and thus nest
+arbitrarily deep\.
+
+A division is marked by two commands instead of one, one to start it, the other
+to close the last opened division\. They are:
+
+ - __division\_start__
+
+ This command opens a new division\. It takes one or two arguments, the title
+ of the division, and the symbolic name of the file it refers to\. The latter
+ is optional\. If the symbolic filename is present then the section title
+ should link to the referenced document, if links are supported by the output
+ format\.
+
+ - __division\_end__
+
+ This command closes the last opened and not yet closed division\.
+
+Using this we can recast the last example like this
+
+ \[toc\_begin Doctoc \{Language Introduction\}\]
+ \[__division\_start DESCRIPTION__\]
+ \[item 1 \{Basic structure\}\]
+ \[item 2 Items\]
+ \[item 3 Divisions\]
+ \[__division\_end__\]
+ \[__division\_start \{FURTHER READING\}__\]
+ \[__division\_end__\]
+ \[toc\_end\]
+
+Or, to demonstrate deeper nesting
+
+ \[toc\_begin Doctoc \{Language Introduction\}\]
+ \[__division\_start DESCRIPTION__\]
+ \[__division\_start \{Basic structure\}__\]
+ \[item 1 Do\]
+ \[item 2 Re\]
+ \[__division\_end__\]
+ \[__division\_start Items__\]
+ \[item a Fi\]
+ \[item b Fo\]
+ \[item c Fa\]
+ \[__division\_end__\]
+ \[__division\_start Divisions__\]
+ \[item 1 Sub\]
+ \[item 1 Zero\]
+ \[__division\_end__\]
+ \[__division\_end__\]
+ \[__division\_start \{FURTHER READING\}__\]
+ \[__division\_end__\]
+ \[toc\_end\]
+
+And do not forget, it is possible to freely mix items and divisions, and to have
+empty divisions\.
+
+ \[toc\_begin Doctoc \{Language Introduction\}\]
+ \[item 1 Do\]
+ \[__division\_start DESCRIPTION__\]
+ \[__division\_start \{Basic structure\}__\]
+ \[item 2 Re\]
+ \[__division\_end__\]
+ \[item a Fi\]
+ \[__division\_start Items__\]
+ \[item b Fo\]
+ \[item c Fa\]
+ \[__division\_end__\]
+ \[__division\_start Divisions__\]
+ \[__division\_end__\]
+ \[__division\_end__\]
+ \[__division\_start \{FURTHER READING\}__\]
+ \[__division\_end__\]
+ \[toc\_end\]
+
+## Advanced structure
+
+In all previous examples we fudged a bit regarding the markup actually allowed
+to be used before the __toc\_begin__ command opening the document\.
+
+Instead of only whitespace the two templating commands __include__ and
+__vset__ are also allowed, to enable the writer to either set and/or import
+configuration settings relevant to the table of contents\. I\.e\. it is possible to
+write
+
+ \[__include FILE__\]
+ \[__vset VAR VALUE__\]
+ \[toc\_begin GROUPTITLE TITLE\]
+ \.\.\.
+ \[toc\_end\]
+
+Even more important, these two commands are allowed anywhere where a markup
+command is allowed, without regard for any other structure\.
+
+ \[toc\_begin GROUPTITLE TITLE\]
+ \[__include FILE__\]
+ \[__vset VAR VALUE__\]
+ \.\.\.
+ \[toc\_end\]
+
+The only restriction __include__ has to obey is that the contents of the
+included file must be valid at the place of the inclusion\. I\.e\. a file included
+before __toc\_begin__ may contain only the templating commands __vset__
+and __include__, a file included in a division may contain only items or
+divisions commands, etc\.
+
+## Escapes
+
+Beyond the 6 commands shown so far we have two more available\. However their
+function is not the marking up of toc structure, but the insertion of
+characters, namely __\[__ and __\]__\. These commands, __lb__ and
+__rb__ respectively, are required because our use of \[ and \] to bracket
+markup commands makes it impossible to directly use \[ and \] within the text\.
+
+Our example of their use are the sources of the last sentence in the previous
+paragraph, with some highlighting added\.
+
+ \.\.\.
+ These commands, \[cmd lb\] and \[cmd lb\] respectively, are required
+ because our use of \[__lb__\] and \[__rb__\] to bracket markup commands makes it
+ impossible to directly use \[__lb__\] and \[__rb__\] within the text\.
+ \.\.\.
+
+# FURTHER READING
+
+Now that this document has been digested the reader, assumed to be a *writer*
+of documentation should be fortified enough to be able to understand the formal
+*[doctoc language syntax](doctoc\_lang\_syntax\.md)* specification as well\.
+From here on out the *[doctoc language command
+reference](doctoc\_lang\_cmdref\.md)* will also serve as the detailed
+specification and cheat sheet for all available commands and their syntax\.
+
+To be able to validate a document while writing it, it is also recommended to
+familiarize oneself with Tclapps' ultra\-configurable __dtp__\.
+
+On the other hand, doctoc is perfectly suited for the automatic generation from
+doctools documents, and this is the route Tcllib's easy and simple
+__[dtplite](\.\./\.\./apps/dtplite\.md)__ goes, creating a table of contents
+for a set of documents behind the scenes, without the writer having to do so on
+their own\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctoc\_intro](doctoc\_intro\.md),
+[doctoc\_lang\_cmdref](doctoc\_lang\_cmdref\.md),
+[doctoc\_lang\_syntax](doctoc\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[doctoc commands](\.\./\.\./\.\./\.\./index\.md\#doctoc\_commands), [doctoc
+language](\.\./\.\./\.\./\.\./index\.md\#doctoc\_language), [doctoc
+markup](\.\./\.\./\.\./\.\./index\.md\#doctoc\_markup), [doctoc
+syntax](\.\./\.\./\.\./\.\./index\.md\#doctoc\_syntax),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctoc_lang_syntax.md
Index: embedded/md/tcllib/files/modules/doctools/doctoc_lang_syntax.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctoc_lang_syntax.md
@@ -0,0 +1,143 @@
+
+[//000000001]: # (doctoc\_lang\_syntax \- Documentation tools)
+[//000000002]: # (Generated from file 'doctoc\_lang\_syntax\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007\-2009 Andreas Kupries )
+[//000000004]: # (doctoc\_lang\_syntax\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctoc\_lang\_syntax \- doctoc language syntax
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [Fundamentals](#section2)
+
+ - [Lexical definitions](#section3)
+
+ - [Syntax](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+This document contains the formal specification of the syntax of the doctoc
+markup language, version 1\.1 in Backus\-Naur\-Form\. This document is intended to
+be a reference, complementing the *[doctoc language command
+reference](doctoc\_lang\_cmdref\.md)*\. A beginner should read the much more
+informally written *[doctoc language introduction](doctoc\_lang\_intro\.md)*
+first before trying to understand either this document or the command reference\.
+
+# Fundamentals
+
+In the broadest terms possible the *doctoc markup language* is like SGML and
+similar languages\. A document written in this language consists primarily of
+markup commands, with text embedded into it at some places\.
+
+Each markup command is a just Tcl command surrounded by a matching pair of
+__\[__ and __\]__\. Which commands are available, and their arguments, i\.e\.
+syntax is specified in the *[doctoc language command
+reference](doctoc\_lang\_cmdref\.md)*\.
+
+In this document we specify first the lexeme, and then the syntax, i\.e\. how we
+can mix text and markup commands with each other\.
+
+# Lexical definitions
+
+In the syntax rules listed in the next section
+
+ 1. stands for all text except markup commands\.
+
+ 1. Any XXX stands for the markup command \[xxx\] including its arguments\. Each
+ markup command is a Tcl command surrounded by a matching pair of __\[__
+ and __\]__\. Inside of these delimiters the usual rules for a Tcl command
+ apply with regard to word quotation, nested commands, continuation lines,
+ etc\.
+
+ 1. stands for all text consisting only of spaces, newlines, tabulators
+ and the __[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ markup command\.
+
+# Syntax
+
+The rules listed here specify only the syntax of doctoc documents\. The lexical
+level of the language was covered in the previous section\.
+
+Regarding the syntax of the \(E\)BNF itself
+
+ 1. The construct \{ X \} stands for zero or more occurrences of X\.
+
+ 1. The construct \[ X \] stands for zero or one occurrence of X\.
+
+The syntax:
+
+ toc = defs
+ TOC\_BEGIN
+ contents
+ TOC\_END
+ \{ \}
+
+ defs = \{ INCLUDE | VSET | \}
+ contents = \{ defs entry \} \[ defs \]
+
+ entry = ITEM | division
+
+ division = DIVISION\_START
+ contents
+ DIVISION\_END
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctoc\_intro](doctoc\_intro\.md),
+[doctoc\_lang\_cmdref](doctoc\_lang\_cmdref\.md),
+[doctoc\_lang\_faq](doctoc\_lang\_faq\.md),
+[doctoc\_lang\_intro](doctoc\_lang\_intro\.md)
+
+# KEYWORDS
+
+[doctoc commands](\.\./\.\./\.\./\.\./index\.md\#doctoc\_commands), [doctoc
+language](\.\./\.\./\.\./\.\./index\.md\#doctoc\_language), [doctoc
+markup](\.\./\.\./\.\./\.\./index\.md\#doctoc\_markup), [doctoc
+syntax](\.\./\.\./\.\./\.\./index\.md\#doctoc\_syntax),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007\-2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctoc_plugin_apiref.md
Index: embedded/md/tcllib/files/modules/doctools/doctoc_plugin_apiref.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctoc_plugin_apiref.md
@@ -0,0 +1,418 @@
+
+[//000000001]: # (doctoc\_plugin\_apiref \- Documentation tools)
+[//000000002]: # (Generated from file 'doctoc\_plugin\_apiref\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctoc\_plugin\_apiref\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctoc\_plugin\_apiref \- doctoc plugin API reference
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [OVERVIEW](#section2)
+
+ - [FRONTEND COMMANDS](#section3)
+
+ - [PLUGIN COMMANDS](#section4)
+
+ - [Management commands](#subsection1)
+
+ - [Formatting commands](#subsection2)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__dt\_fmap__ *symfname*](#1)
+[__dt\_format__](#2)
+[__dt\_read__ *file*](#3)
+[__dt\_source__ *file*](#4)
+[__ex\_cappend__ *text*](#5)
+[__ex\_cget__ *varname*](#6)
+[__ex\_cis__ *cname*](#7)
+[__ex\_cname__](#8)
+[__ex\_cpop__ *cname*](#9)
+[__ex\_cpush__ *cname*](#10)
+[__ex\_cset__ *varname* *value*](#11)
+[__ex\_lb__ ?*newbracket*?](#12)
+[__ex\_rb__ ?*newbracket*?](#13)
+[__toc\_initialize__](#14)
+[__toc\_listvariables__](#15)
+[__toc\_numpasses__](#16)
+[__toc\_postprocess__ *text*](#17)
+[__toc\_setup__ *n*](#18)
+[__toc\_shutdown__](#19)
+[__toc\_varset__ *varname* *text*](#20)
+[__fmt\_plain\_text__ *text*](#21)
+
+# DESCRIPTION
+
+This document is intended for *plugin writers*, i\.e\. developers wishing to
+write a toc *[formatting engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine)*
+for some output format X\.
+
+It specifies the interaction between the __[doctools::toc](doctoc\.md)__
+package and its plugins, i\.e\. the interface any toc formatting engine has to
+comply with\.
+
+This document deals with version 1 of the interface\.
+
+A reader who is on the other hand more interested in the markup language itself
+should start with the *[doctoc language
+introduction](doctoc\_lang\_intro\.md)* and proceed from there to the formal
+specifications, i\.e\. the *[doctoc language syntax](doctoc\_lang\_syntax\.md)*
+and the *[doctoc language command reference](doctoc\_lang\_cmdref\.md)*\.
+
+# OVERVIEW
+
+The API for a toc formatting engine consists of two major sections\.
+
+On the one side we have a set of commands through which the plugin is able to
+query the frontend\. These commands are provided by the frontend and linked into
+the plugin interpreter\. Please see section [FRONTEND COMMANDS](#section3)
+for their detailed specification\.
+
+And on the other side the plugin has to provide its own set of commands which
+will then be called by the frontend in a specific sequence while processing
+input\. They, again, fall into two categories, management and formatting\. Please
+see section [PLUGIN COMMANDS](#section4) and its subsections for their
+detailed specification\.
+
+# FRONTEND COMMANDS
+
+This section specifies the set of commands through which a plugin, also known as
+a toc formatting engine, is able to query the frontend\. These commands are
+provided by the frontend and linked into the plugin interpreter\.
+
+I\.e\. a toc formatting engine can assume that all of the following commands are
+present when any of its own commands \(as specified in section [PLUGIN
+COMMANDS](#section4)\) are executed\.
+
+Beyond that it can also assume that it has full access to its own safe
+interpreter and thus is not able to damage the other parts of the processor, nor
+can it damage the filesystem\. It is however able to either kill or hang the
+whole process, by exiting, or running an infinite loop\.
+
+Coming back to the imported commands, all the commands with prefix *dt\_*
+provide limited access to specific parts of the frontend, whereas the commands
+with prefix *ex\_* provide access to the state of the
+__[textutil::expander](\.\./textutil/expander\.md)__ object which does the
+main parsing of the input within the frontend\. These commands should not be
+except under very special circumstances\.
+
+ - __dt\_fmap__ *symfname*
+
+ Query command\. It returns the actual pathname to use in the output in place
+ of the symbolic filename *symfname*\. It will return the unchanged input if
+ no mapping was established for *symfname*\.
+
+ The required mappings are established with the method __map__ of a
+ frontend, as explained in section __OBJECT METHODS__ of the
+ documentation for the package __[doctools::toc](doctoc\.md)__\.
+
+ - __dt\_format__
+
+ Query command\. It returns the name of the format associated with the toc
+ formatting engine\.
+
+ - __dt\_read__ *file*
+
+ Controlled filesystem access\. Returns contents of *file* for whatever use
+ desired by the plugin\. Only files which are either in the same directory as
+ the file containing the engine, or below it, can be loaded\. Trying to load a
+ file outside of this directory causes an error\.
+
+ - __dt\_source__ *file*
+
+ Controlled filesystem access\. This command allows the toc formatting engine
+ to load additional Tcl code it may need\. Only files which are either in the
+ same directory as the file containing the engine, or below it, can be
+ loaded\. Trying to load a file outside of this directory causes an error\.
+
+ - __ex\_cappend__ *text*
+
+ Appends a string to the output in the current context\. This command should
+ rarely be used by macros or application code\.
+
+ - __ex\_cget__ *varname*
+
+ Retrieves the value of variable *varname*, defined in the current context\.
+
+ - __ex\_cis__ *cname*
+
+ Determines whether or not the name of the current context is *cname*\.
+
+ - __ex\_cname__
+
+ Returns the name of the current context\.
+
+ - __ex\_cpop__ *cname*
+
+ Pops a context from the context stack, returning all accumulated output in
+ that context\. The context must be named *cname*, or an error results\.
+
+ - __ex\_cpush__ *cname*
+
+ Pushes a context named *cname* onto the context stack\. The context must be
+ popped by __cpop__ before expansion ends or an error results\.
+
+ - __ex\_cset__ *varname* *value*
+
+ Sets variable *varname* to *value* in the current context\.
+
+ - __ex\_lb__ ?*newbracket*?
+
+ Returns the current value of the left macro expansion bracket; this is for
+ use as or within a macro, when the bracket needs to be included in the
+ output text\. If *newbracket* is specified, it becomes the new bracket, and
+ is returned\.
+
+ - __ex\_rb__ ?*newbracket*?
+
+ Returns the current value of the right macro expansion bracket; this is for
+ use as or within a macro, when the bracket needs to be included in the
+ output text\. If *newbracket* is specified, it becomes the new bracket, and
+ is returned\.
+
+# PLUGIN COMMANDS
+
+The plugin has to provide its own set of commands which will then be called by
+the frontend in a specific sequence while processing input\. They fall into two
+categories, management and formatting\. Their expected names, signatures, and
+responsibilities are specified in the following two subsections\.
+
+## Management commands
+
+The management commands a plugin has to provide are used by the frontend to
+
+ 1. initialize and shutdown the plugin
+
+ 1. determine the number of passes it has to make over the input
+
+ 1. initialize and shutdown each pass
+
+ 1. query and initialize engine parameters
+
+After the plugin has been loaded and the frontend commands are established the
+commands will be called in the following sequence:
+
+ toc\_numpasses \-> n
+ toc\_listvariables \-> vars
+
+ toc\_varset var1 value1
+ toc\_varset var2 value2
+ \.\.\.
+ toc\_varset varK valueK
+ toc\_initialize
+ toc\_setup 1
+ \.\.\.
+ toc\_setup 2
+ \.\.\.
+ \.\.\.
+ toc\_setup n
+ \.\.\.
+ toc\_postprocess
+ toc\_shutdown
+ \.\.\.
+
+I\.e\. first the number of passes and the set of available engine parameters is
+established, followed by calls setting the parameters\. That second part is
+optional\.
+
+After that the plugin is initialized, the specified number of passes executed,
+the final result run through a global post processing step and at last the
+plugin is shutdown again\. This can be followed by more conversions, restarting
+the sequence at __toc\_varset__\.
+
+In each of the passes, i\.e\. after the calls of __toc\_setup__ the frontend
+will process the input and call the formatting commands as markup is
+encountered\. This means that the sequence of formatting commands is determined
+by the grammar of the doctoc markup language, as specified in the *[doctoc
+language syntax](doctoc\_lang\_syntax\.md)* specification\.
+
+A different way of looking at the sequence is:
+
+ - First some basic parameters are determined\.
+
+ - Then everything starting at the first __toc\_varset__ to
+ __toc\_shutdown__ forms a *run*, the formatting of a single input\. Each
+ run can be followed by more\.
+
+ - Embedded within each run we have one or more *passes*, each starting with
+ __toc\_setup__ and going until either the next __toc\_setup__ or
+ __toc\_postprocess__ is reached\.
+
+ If more than one pass is required to perform the formatting only the output
+ of the last pass is relevant\. The output of all the previous, preparatory
+ passes is ignored\.
+
+The commands, their names, signatures, and responsibilities are, in detail:
+
+ - __toc\_initialize__
+
+ *Initialization/Shutdown*\. This command is called at the beginning of
+ every conversion run, as the first command of that run\. Note that a run is
+ not a pass, but may consist of multiple passes\. It has to initialize the
+ general state of the plugin, beyond the initialization done during the load\.
+ No return value is expected, and any returned value is ignored\.
+
+ - __toc\_listvariables__
+
+ *Initialization/Shutdown* and *Engine parameters*\. Second command is
+ called after the plugin code has been loaded, i\.e\. immediately after
+ __toc\_numpasses__\. It has to return a list containing the names of the
+ parameters the frontend can set to configure the engine\. This list can be
+ empty\.
+
+ - __toc\_numpasses__
+
+ *Initialization/Shutdown* and *Pass management*\. First command called
+ after the plugin code has been loaded\. No other command of the engine will
+ be called before it\. It has to return the number of passes this engine
+ requires to fully process the input document\. This value has to be an
+ integer number greater or equal to one\.
+
+ - __toc\_postprocess__ *text*
+
+ *Initialization/Shutdown*\. This command is called immediately after the
+ last pass in a run\. Its argument is the result of the conversion generated
+ by that pass\. It is provided to allow the engine to perform any global
+ modifications of the generated document\. If no post\-processing is required
+ for a specific format the command has to just return the argument\.
+
+ Expected to return a value, the final result of formatting the input\.
+
+ - __toc\_setup__ *n*
+
+ *Initialization/Shutdown* and *Pass management*\. This command is called
+ at the beginning of each pass over the input in a run\. Its argument is the
+ number of the pass which has begun\. Passes are counted from __1__
+ upward\. The command has to set up the internal state of the plugin for this
+ particular pass\. No return value is expected, and any returned value is
+ ignored\.
+
+ - __toc\_shutdown__
+
+ *Initialization/Shutdown*\. This command is called at the end of every
+ conversion run\. It is the last command called in a run\. It has to clean up
+ of all the run\-specific state in the plugin\. After the call the engine has
+ to be in a state which allows the initiation of another run without fear
+ that information from the last run is leaked into this new run\. No return
+ value is expected, and any returned value is ignored\.
+
+ - __toc\_varset__ *varname* *text*
+
+ *Engine parameters*\. This command is called by the frontend to set an
+ engine parameter to a particular value\. The parameter to change is specified
+ by *varname*, the value to set in *text*\.
+
+ The command has to throw an error if an unknown *varname* is used\. Only
+ the names returned by __toc\_listvariables__ have to be considered as
+ known\.
+
+ The values of all engine parameters have to persist between passes and runs\.
+
+## Formatting commands
+
+The formatting commands have to implement the formatting for the output format,
+for all the markup commands of the doctoc markup language, except __lb__,
+__rb__, __vset__, __include__, and
+__[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__\. These exceptions are
+processed by the frontend and are never seen by the plugin\. In return a command
+for the formatting of plain text has to be provided, something which has no
+markup in the input at all\.
+
+This means, that each of the five markup commands specified in the *[doctoc
+language command reference](doctoc\_lang\_cmdref\.md)* and outside of the set
+of exceptions listed above has an equivalent formatting command which takes the
+same arguments as the markup command and whose name is the name of markup
+command with the prefix *fmt\_* added to it\.
+
+All commands are expected to format their input in some way per the semantics
+specified in the command reference and to return whatever part of this that they
+deem necessary as their result, which will be added to the output\.
+
+To avoid essentially duplicating the command reference we do not list any of the
+command here and simply refer the reader to the *[doctoc language command
+reference](doctoc\_lang\_cmdref\.md)* for their signature and description\. The
+sole exception is the plain text formatter, which has no equivalent markup
+command\.
+
+The calling sequence of formatting commands is not as rigid as for the
+management commands, but determined by the grammar of the doctoc markup
+language, as specified in the *[doctoc language
+syntax](doctoc\_lang\_syntax\.md)* specification\.
+
+ - __fmt\_plain\_text__ *text*
+
+ *No associated markup command*\.
+
+ Called by the frontend for any plain text encountered in the input\. It has
+ to perform any and all special processing required for plain text\.
+
+ The formatted text is expected as the result of the command, and added to
+ the output\. If no special processing is required it has to simply return its
+ argument without change\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctoc\_intro](doctoc\_intro\.md),
+[doctoc\_lang\_cmdref](doctoc\_lang\_cmdref\.md),
+[doctoc\_lang\_faq](doctoc\_lang\_faq\.md),
+[doctoc\_lang\_intro](doctoc\_lang\_intro\.md),
+[doctoc\_lang\_syntax](doctoc\_lang\_syntax\.md), [doctools::toc](doctoc\.md)
+
+# KEYWORDS
+
+[formatting engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup), [table of
+contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents),
+[toc](\.\./\.\./\.\./\.\./index\.md\#toc), [toc
+formatter](\.\./\.\./\.\./\.\./index\.md\#toc\_formatter)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctools.md
Index: embedded/md/tcllib/files/modules/doctools/doctools.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctools.md
@@ -0,0 +1,539 @@
+
+[//000000001]: # (doctools \- Documentation tools)
+[//000000002]: # (Generated from file 'doctools\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2003\-2019 Andreas Kupries )
+[//000000004]: # (doctools\(n\) 1\.5 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools \- doctools \- Processing documents
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [PUBLIC API](#section2)
+
+ - [PACKAGE COMMANDS](#subsection1)
+
+ - [OBJECT COMMAND](#subsection2)
+
+ - [OBJECT METHODS](#subsection3)
+
+ - [OBJECT CONFIGURATION](#subsection4)
+
+ - [FORMAT MAPPING](#subsection5)
+
+ - [PREDEFINED ENGINES](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.2
+package require doctools ?1\.5?
+
+[__::doctools::new__ *objectName* ?*option value*\.\.\.?](#1)
+[__::doctools::help__](#2)
+[__::doctools::search__ *path*](#3)
+[__objectName__ __method__ ?*arg arg \.\.\.*?](#4)
+[*objectName* __configure__](#5)
+[*objectName* __configure__ *option*](#6)
+[*objectName* __configure__ __\-option__ *value*\.\.\.](#7)
+[*objectName* __cget__ __\-option__](#8)
+[*objectName* __destroy__](#9)
+[*objectName* __format__ *text*](#10)
+[*objectName* __map__ *symbolic* *actual*](#11)
+[*objectName* __parameters__](#12)
+[*objectName* __search__ *path*](#13)
+[*objectName* __setparam__ *name* *value*](#14)
+[*objectName* __warnings__](#15)
+
+# DESCRIPTION
+
+This package provides a class for the creation of objects able to process and
+convert text written in the *[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)*
+markup language into any output format X for which a *[formatting
+engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine)* is available\.
+
+A reader interested in the markup language itself should start with the
+*[doctools language introduction](doctools\_lang\_intro\.md)* and proceed
+from there to the formal specifications, i\.e\. the *[doctools language
+syntax](doctools\_lang\_syntax\.md)* and the *[doctools language command
+reference](doctools\_lang\_cmdref\.md)*\.
+
+If on the other hand the reader wishes to write her own formatting engine for
+some format, i\.e\. is a *plugin writer* then reading and understanding the
+*[doctools plugin API reference](doctools\_plugin\_apiref\.md)* is an
+absolute necessity, as that document specifies the interaction between this
+package and its plugins, i\.e\. the formatting engines, in detail\.
+
+# PUBLIC API
+
+## PACKAGE COMMANDS
+
+ - __::doctools::new__ *objectName* ?*option value*\.\.\.?
+
+ This command creates a new doctools object with an associated Tcl command
+ whose name is *objectName*\. This
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)* command is explained in full
+ detail in the sections [OBJECT COMMAND](#subsection2) and [OBJECT
+ METHODS](#subsection3)\. The object command will be created under the
+ current namespace if the *objectName* is not fully qualified, and in the
+ specified namespace otherwise\.
+
+ The options and their values coming after the name of the object are used to
+ set the initial configuration of the object\.
+
+ - __::doctools::help__
+
+ This is a convenience command for applications wishing to provide their user
+ with a short description of the available formatting commands and their
+ meanings\. It returns a string containing a standard help text\.
+
+ - __::doctools::search__ *path*
+
+ Whenever an object created by this the package has to map the name of a
+ format to the file containing the code for its formatting engine it will
+ search for the file in a number of directories stored in a list\. See section
+ [FORMAT MAPPING](#subsection5) for more explanations\.
+
+ This list not only contains three default directories which are declared by
+ the package itself, but is also extensible user of the package\. This command
+ is the means to do so\. When given a *path* to an existing and readable
+ directory it will prepend that directory to the list of directories to
+ search\. This means that the *path* added last is later searched through
+ first\.
+
+ An error will be thrown if the *path* either does not exist, is not a
+ directory, or is not readable\.
+
+## OBJECT COMMAND
+
+All commands created by __::doctools::new__ have the following general form
+and may be used to invoke various operations on their doctools converter object\.
+
+ - __objectName__ __method__ ?*arg arg \.\.\.*?
+
+ The method __method__ and its *arg*'uments determine the exact
+ behavior of the command\. See section [OBJECT METHODS](#subsection3) for
+ the detailed specifications\.
+
+## OBJECT METHODS
+
+ - *objectName* __configure__
+
+ The method returns a list of all known options and their current values when
+ called without any arguments\.
+
+ - *objectName* __configure__ *option*
+
+ The method behaves like the method __cget__ when called with a single
+ argument and returns the value of the option specified by said argument\.
+
+ - *objectName* __configure__ __\-option__ *value*\.\.\.
+
+ The method reconfigures the specified __option__s of the object, setting
+ them to the associated *value*s, when called with an even number of
+ arguments, at least two\.
+
+ The legal options are described in the section [OBJECT
+ CONFIGURATION](#subsection4)\.
+
+ - *objectName* __cget__ __\-option__
+
+ This method expects a legal configuration option as argument and will return
+ the current value of that option for the object the method was invoked for\.
+
+ The legal configuration options are described in section [OBJECT
+ CONFIGURATION](#subsection4)\.
+
+ - *objectName* __destroy__
+
+ This method destroys the object it is invoked for\.
+
+ - *objectName* __format__ *text*
+
+ This method runs the *text* through the configured formatting engine and
+ returns the generated string as its result\. An error will be thrown if no
+ __\-format__ was configured for the object\.
+
+ The method assumes that the *text* is in
+ *[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)* format as specified in the
+ companion document *doctools\_fmt*\. Errors will be thrown otherwise\.
+
+ - *objectName* __map__ *symbolic* *actual*
+
+ This methods add one entry to the per\-object mapping from *symbolic*
+ filenames to the *actual* uris\. The object just stores this mapping and
+ makes it available to the configured formatting engine through the command
+ __dt\_fmap__\. This command is described in more detail in the
+ *[doctools plugin API reference](doctools\_plugin\_apiref\.md)* which
+ specifies the interaction between the objects created by this package and
+ doctools formatting engines\.
+
+ - *objectName* __parameters__
+
+ This method returns a list containing the names of all engine parameters
+ provided by the configured formatting engine\. It will return an empty list
+ if the object is not yet configured for a specific format\.
+
+ - *objectName* __search__ *path*
+
+ This method extends the per\-object list of paths searched for doctools
+ formatting engines\. See also the command __::doctools::search__ on how
+ to extend the per\-package list of paths\. Note that the path entered last
+ will be searched first\. For more details see section [FORMAT
+ MAPPING](#subsection5)\.
+
+ - *objectName* __setparam__ *name* *value*
+
+ This method sets the *name*d engine parameter to the specified *value*\.
+ It will throw an error if the object is either not yet configured for a
+ specific format, or if the formatting engine for the configured format does
+ not provide a parameter with the given *name*\. The list of parameters
+ provided by the configured formatting engine can be retrieved through the
+ method __parameters__\.
+
+ - *objectName* __warnings__
+
+ This method returns a list containing all the warnings which were generated
+ by the configured formatting engine during the last invocation of the method
+ __format__\.
+
+## OBJECT CONFIGURATION
+
+All doctools objects understand the following configuration options:
+
+ - __\-file__ *file*
+
+ The argument of this option is stored in the object and made available to
+ the configured formatting engine through the commands __dt\_file__ and
+ __dt\_mainfile__\. These commands are described in more detail in the
+ companion document *doctools\_api* which specifies the API between the
+ object and formatting engines\.
+
+ The default value of this option is the empty string\.
+
+ The configured formatting engine should interpret the value as the name of
+ the file containing the document which is currently processed\.
+
+ - __\-ibase__ *file*
+
+ The argument of this option is stored in the object and used as the base
+ path for resolution of relative include paths\. If this option is not set
+ \(empty string\) the value of __\-file__ is used instead\.
+
+ Note that __\-file__ and __\-ibase__, while similar looking, are
+ actually very different\. The value of __\-file__ is used by some engines
+ for the generation of proper relative references between output documents
+ \(HTML\)\. As such this is a *destination* path\. The __\-ibase__ on the
+ other hand is used to resolve relative include paths, and as such deals with
+ *[source](\.\./\.\./\.\./\.\./index\.md\#source)* paths\.
+
+ The default value of this option is the empty string\.
+
+ - __\-module__ *text*
+
+ The argument of this option is stored in the object and made available to
+ the configured formatting engine through the command __dt\_module__\. This
+ command is described in more detail in the companion document
+ *doctools\_api* which specifies the API between the object and formatting
+ engines\.
+
+ The default value of this option is the empty string\.
+
+ The configured formatting engine should interpret the value as the name of
+ the module the file containing the document which is currently processed
+ belongs to\.
+
+ - __\-format__ *text*
+
+ The argument of this option specifies the format to generate and by
+ implication the formatting engine to use when converting text via the method
+ __format__\. Its default value is the empty string\. The method
+ __format__ cannot be used if this option is not set to a valid value at
+ least once\.
+
+ The package will immediately try to map the given name to a file containing
+ the code for a formatting engine generating that format\. An error will be
+ thrown if this mapping fails\. In that case a previously configured format is
+ left untouched\.
+
+ The section [FORMAT MAPPING](#subsection5) explains in detail how the
+ package and object will look for engine implementations\.
+
+ - __\-deprecated__ *boolean*
+
+ This option is a boolean flag\. The object will generate warnings if this
+ flag is set and the text given to method __format__ contains the
+ deprecated markup command __strong__\. Its default value is
+ __FALSE__\. In other words, no warnings will be generated\.
+
+ - __\-copyright__ *text*
+
+ The argument of this option is stored in the object and made available to
+ the configured formatting engine through the command __dt\_copyright__\.
+ This command is described in more detail in the companion document
+ *doctools\_api* which specifies the API between the object and formatting
+ engines\.
+
+ The default value of this option is the empty string\.
+
+ The configured formatting engine should interpret the value as a copyright
+ assignment for the document which is currently processed, or the package
+ described by it\.
+
+ This information must be used if and only if the engine is unable to find
+ any copyright assignments within the document itself\. Such are specified by
+ the formatting command __copyright__\. This command is described in more
+ detail in the companion document *doctools\_fmt* which specifies the
+ *[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)* format itself\.
+
+## FORMAT MAPPING
+
+The package and object will perform the following algorithm when trying to map a
+format name *foo* to a file containing an implementation of a formatting
+engine for *foo*:
+
+ 1. If *foo* is the name of an existing file then this file is directly taken
+ as the implementation\.
+
+ 1. If not, the list of per\-object search paths is searched\. For each directory
+ in the list the package checks if that directory contains a file
+ "fmt\.*foo*"\. If yes, then that file is taken as the implementation\.
+
+ Note that this list of paths is initially empty and can be extended through
+ the object method __search__\.
+
+ 1. If not, the list of package paths is searched\. For each directory in the
+ list the package checks if that directory contains a file "fmt\.*foo*"\. If
+ yes, then that file is taken as the implementation\.
+
+ This list of paths can be extended through the command
+ __::doctools::search__\. It contains initially one path, the
+ subdirectory "mpformats" of the directory the package itself is located in\.
+ In other words, if the package implementation "doctools\.tcl" is installed
+ in the directory "/usr/local/lib/tcllib/doctools" then it will by default
+ search the directory "/usr/local/lib/tcllib/doctools/mpformats" for format
+ implementations\.
+
+ 1. The mapping fails\.
+
+# PREDEFINED ENGINES
+
+The package provides predefined engines for the following formats\. Some of the
+engines support parameters\. These will be explained below as well\.
+
+ - html
+
+ This engine generates HTML markup, for processing by web browsers and the
+ like\. This engine supports four parameters:
+
+ * footer
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the body section of a HTML document\. The default value is the empty
+ string\. The value is inserted into the generated output just before the
+ ____ tag, closing the body of the generated HTML\.
+
+ This can be used to insert boilerplate footer markup into the generated
+ document\.
+
+ * header
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the body section of a HTML document\. The default value is the empty
+ string\. The value is inserted into the generated output just after the
+ ____ tag, starting the body of the generated HTML\.
+
+ This can be used to insert boilerplate header markup into the generated
+ document\.
+
+ * meta
+
+ The value for this parameter has to be valid selfcontained HTML markup
+ for the header section of a HTML document\. The default value is the
+ empty string\. The value is inserted into the generated output just after
+ the ____ tag, starting the header section of the generated
+ HTML\.
+
+ This can be used to insert boilerplate meta data markup into the
+ generated document, like references to a stylesheet, standard meta
+ keywords, etc\.
+
+ * xref
+
+ The value for this parameter has to be a list of triples specifying
+ cross\-reference information\. This information is used by the engine to
+ create more hyperlinks\. Each triple is a list containing a pattern,
+ symbolic filename and fragment reference, in this order\. If a pattern is
+ specified multiple times the last occurrence of the pattern will be
+ used\.
+
+ The engine will consult the xref database when encountering specific
+ commands and will create a link if the relevant text matches one of the
+ patterns\. No link will be created if no match was found\. The link will
+ go to the uri __file\#fragment__ listed in the relevant triple, after
+ conversion of the symbolic file name to the actual uri via
+ __dt\_fmap__ \(see the *[doctools plugin API
+ reference](doctools\_plugin\_apiref\.md)*\)\. This file\-to\-uri mapping
+ was build by calls to the method __map__ of the doctools object \(See
+ section [OBJECT METHODS](#subsection3)\)\.
+
+ The following formatting commands will consult the xref database:
+
+ + __cmd__ *word*
+
+ The command will look for the patterns __sa,__*word*, and
+ *word*, in this order\. If this fails if it will convert *word*
+ to all lowercase and try again\.
+
+ + __syscmd__ *word*
+
+ The command will look for the patterns __sa,__*word*, and
+ *word*, in this order\. If this fails if it will convert *word*
+ to all lowercase and try again\.
+
+ + __[term](\.\./term/term\.md)__ *word*
+
+ The command will look for the patterns __kw,__*word*,
+ __sa,__*word*, and *word*, in this order\. If this fails if
+ it will convert *word* to all lowercase and try again\.
+
+ + __[package](\.\./\.\./\.\./\.\./index\.md\#package)__ *word*
+
+ The command will look for the patterns __sa,__*word*,
+ __kw,__*word*, and *word*, in this order\. If this fails if
+ it will convert *word* to all lowercase and try again\.
+
+ + __see\_also__ *word*\.\.\.
+
+ The command will look for the patterns __sa,__*word*, and
+ *word*, in this order, for each *word* given to the command\. If
+ this fails if it will convert *word* to all lowercase and try
+ again\.
+
+ + __[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords)__ *word*\.\.\.
+
+ The command will look for the patterns __kw,__*word*, and
+ *word*, in this order, for each *word* given to the command\. If
+ this fails if it will convert *word* to all lowercase and try
+ again\.
+
+ - latex
+
+ This engine generates output suitable for the
+ __[latex](\.\./\.\./\.\./\.\./index\.md\#latex)__ text processor coming out of
+ the TeX world\.
+
+ - list
+
+ This engine retrieves version, section and title of the manpage from the
+ document\. As such it can be used to generate a directory listing for a set
+ of manpages\.
+
+ - nroff
+
+ This engine generates nroff output, for processing by
+ __[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff)__, or __groff__\. The
+ result will be standard man pages as they are known in the unix world\.
+
+ - markdown
+
+ This engine generates *[Markdown](\.\./\.\./\.\./\.\./index\.md\#markdown)*
+ markup\. This engine supports two parameters:
+
+ * header
+
+ The value for this parameter has to be valid selfcontained markdown
+ markup for the body section of a markdown document\. The default value is
+ the empty string\. The value is inserted into the generated output just
+ before the table of contents\.
+
+ This can be used to insert boilerplate header markup into the generated
+ document\.
+
+ * xref
+
+ The value for this parameter has to be a list of triples specifying
+ cross\-reference information\.
+
+ The full details of expected syntax and engine\-internal use are
+ explained above for the *[html](\.\./\.\./\.\./\.\./index\.md\#html)*
+ engine\.
+
+ - null
+
+ This engine generates no outout at all\. This can be used if one just wants
+ to validate some input\.
+
+ - tmml
+
+ This engine generates TMML markup as specified by Joe English\. The Tcl
+ Manpage Markup Language is a derivate of XML\.
+
+ - wiki
+
+ This engine generates Wiki markup as understood by Jean Claude Wippler's
+ __wikit__ application\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctools\_intro](doctools\_intro\.md),
+[doctools\_lang\_cmdref](doctools\_lang\_cmdref\.md),
+[doctools\_lang\_intro](doctools\_lang\_intro\.md),
+[doctools\_lang\_syntax](doctools\_lang\_syntax\.md),
+[doctools\_plugin\_apiref](doctools\_plugin\_apiref\.md)
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html), [TMML](\.\./\.\./\.\./\.\./index\.md\#tmml),
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markdown](\.\./\.\./\.\./\.\./index\.md\#markdown),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2003\-2019 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctools_intro.md
Index: embedded/md/tcllib/files/modules/doctools/doctools_intro.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctools_intro.md
@@ -0,0 +1,131 @@
+
+[//000000001]: # (doctools\_intro \- Documentation tools)
+[//000000002]: # (Generated from file 'doctools\_intro\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctools\_intro\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools\_intro \- doctools introduction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [RELATED FORMATS](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+*[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)* \(short for *documentation
+tools*\) stands for a set of related, yet different, entities which are working
+together for the easy creation and transformation of documentation\. These are
+
+ 1. A tcl based language for the semantic markup of text\. Markup is represented
+ by Tcl commands interspersed with the actual text\.
+
+ 1. A package providing the ability to read and transform texts written in that
+ markup language\. It is important to note that the actual transformation of
+ the input text is delegated to plugins\.
+
+ 1. An API describing the interface between the package above and a plugin\.
+
+Which of the more detailed documents are relevant to the reader of this
+introduction depends on their role in the documentation process\.
+
+ 1. A *writer* of documentation has to understand the markup language itself\.
+ A beginner to doctools should read the more informally written *[doctools
+ language introduction](doctools\_lang\_intro\.md)* first\. Having digested
+ this the formal *[doctools language syntax](doctools\_lang\_syntax\.md)*
+ specification should become understandable\. A writer experienced with
+ doctools may only need the *[doctools language command
+ reference](doctools\_lang\_cmdref\.md)* from time to time to refresh her
+ memory\.
+
+ While a document is written the
+ __[dtplite](\.\./\.\./apps/dtplite\.md)__ application can be used to
+ validate it, and after completion it also performs the conversion into the
+ chosen system of visual markup, be it \*roff, HTML, plain text, wiki, etc\.
+
+ 1. A *processor* of documentation written in the
+ *[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)* markup language has to
+ know which tools are available for use\.
+
+ The main tool is the aforementioned
+ __[dtplite](\.\./\.\./apps/dtplite\.md)__ application provided by
+ Tcllib\. A more powerful one \(in terms of options and ability to configure
+ it\) is the __dtp__ application, provided by Tclapps\. At the bottom
+ level, common to both applications, however sits the package
+ __[doctools](doctools\.md)__, providing the basic facilities to read
+ and process files containing text in the doctools format\.
+
+ 1. At last, but not least, *plugin writers* have to understand the
+ interaction between the __[doctools](doctools\.md)__ package and its
+ plugins, as described in the *[doctools plugin API
+ reference](doctools\_plugin\_apiref\.md)*\.
+
+# RELATED FORMATS
+
+doctools does not stand alone, it has two companion formats\. These are called
+*[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* and
+*[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)*, and they are for the markup of
+*keyword indices*, and *tables of contents*, respectively\. They are
+described in their own sets of documents, starting at the *[docidx
+introduction](docidx\_intro\.md)* and the *[doctoc
+introduction](doctoc\_intro\.md)*, respectively\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_intro](docidx\_intro\.md), [doctoc\_intro](doctoc\_intro\.md),
+[doctools](doctools\.md),
+[doctools\_lang\_cmdref](doctools\_lang\_cmdref\.md),
+[doctools\_lang\_faq](doctools\_lang\_faq\.md),
+[doctools\_lang\_intro](doctools\_lang\_intro\.md),
+[doctools\_lang\_syntax](doctools\_lang\_syntax\.md),
+[doctools\_plugin\_apiref](doctools\_plugin\_apiref\.md)
+
+# KEYWORDS
+
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctools_lang_cmdref.md
Index: embedded/md/tcllib/files/modules/doctools/doctools_lang_cmdref.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctools_lang_cmdref.md
@@ -0,0 +1,601 @@
+
+[//000000001]: # (doctools\_lang\_cmdref \- Documentation tools)
+[//000000002]: # (Generated from file 'doctools\_lang\_cmdref\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007\-2010 Andreas Kupries )
+[//000000004]: # (doctools\_lang\_cmdref\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools\_lang\_cmdref \- doctools language command reference
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Commands](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__arg__ *text*](#1)
+[__arg\_def__ *type* *name* ?*mode*?](#2)
+[__bullet__](#3)
+[__call__ *args*](#4)
+[__category__ *text*](#5)
+[__[class](\.\./\.\./\.\./\.\./index\.md\#class)__ *text*](#6)
+[__cmd__ *text*](#7)
+[__cmd\_def__ *command*](#8)
+[__[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ *plaintext*](#9)
+[__const__ *text*](#10)
+[__copyright__ *text*](#11)
+[__def__ *text*](#12)
+[__description__](#13)
+[__enum__](#14)
+[__emph__ *text*](#15)
+[__example__ *text*](#16)
+[__example\_begin__](#17)
+[__example\_end__](#18)
+[__[file](\.\./\.\./\.\./\.\./index\.md\#file)__ *text*](#19)
+[__fun__ *text*](#20)
+[__[image](\.\./\.\./\.\./\.\./index\.md\#image)__ *name* ?*label*?](#21)
+[__include__ *filename*](#22)
+[__item__](#23)
+[__[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords)__ *args*](#24)
+[__lb__](#25)
+[__list\_begin__ *what*](#26)
+[__list\_end__](#27)
+[__lst\_item__ *text*](#28)
+[__manpage\_begin__ *command* *section* *version*](#29)
+[__manpage\_end__](#30)
+[__[method](\.\./\.\./\.\./\.\./index\.md\#method)__ *text*](#31)
+[__moddesc__ *text*](#32)
+[__namespace__ *text*](#33)
+[__nl__](#34)
+[__opt__ *text*](#35)
+[__opt\_def__ *name* ?*arg*?](#36)
+[__option__ *text*](#37)
+[__[package](\.\./\.\./\.\./\.\./index\.md\#package)__ *text*](#38)
+[__para__](#39)
+[__rb__](#40)
+[__require__ *package* ?*version*?](#41)
+[__section__ *name*](#42)
+[__sectref__ *id* ?*text*?](#43)
+[__sectref\-external__ *text*](#44)
+[__see\_also__ *args*](#45)
+[__strong__ *text*](#46)
+[__subsection__ *name*](#47)
+[__syscmd__ *text*](#48)
+[__[term](\.\./term/term\.md)__ *text*](#49)
+[__titledesc__ *desc*](#50)
+[__tkoption\_def__ *name* *dbname* *dbclass*](#51)
+[__[type](\.\./\.\./\.\./\.\./index\.md\#type)__ *text*](#52)
+[__[uri](\.\./uri/uri\.md)__ *text* ?*text*?](#53)
+[__usage__ *args*](#54)
+[__var__ *text*](#55)
+[__vset__ *varname* *value*](#56)
+[__vset__ *varname*](#57)
+[__[widget](\.\./\.\./\.\./\.\./index\.md\#widget)__ *text*](#58)
+
+# DESCRIPTION
+
+This document specifies both names and syntax of all the commands which together
+are the doctools markup language, version 1\. As this document is intended to be
+a reference the commands are listed in alphabetical order, and the descriptions
+are relatively short\. A beginner should read the much more informally written
+*[doctools language introduction](doctools\_lang\_intro\.md)* first\.
+
+# Commands
+
+ - __arg__ *text*
+
+ Text markup\. The argument text is marked up as the *argument* of a
+ command\. Main uses are the highlighting of command arguments in free\-form
+ text, and for the argument parameters of the markup commands __call__
+ and __usage__\.
+
+ - __arg\_def__ *type* *name* ?*mode*?
+
+ Text structure\. List element\. Argument list\. Automatically closes the
+ previous list element\. Specifies the data\-*type* of the described argument
+ of a command, its *name* and its i/o\-*mode*\. The latter is optional\.
+
+ - __bullet__
+
+ *Deprecated*\. Text structure\. List element\. Itemized list\. See
+ __item__ for the canonical command to open a list item in an itemized
+ list\.
+
+ - __call__ *args*
+
+ Text structure\. List element\. Definition list\. Automatically closes the
+ previous list element\. Defines the term as a command and its arguments\. The
+ first argument is the name of the command described by the following
+ free\-form text, and all arguments coming after that are descriptions of the
+ command's arguments\. It is expected that the arguments are marked up with
+ __arg__, __[method](\.\./\.\./\.\./\.\./index\.md\#method)__,
+ __option__ etc\., as is appropriate, and that the command itself is
+ marked up with __cmd__\. It is expected that the formatted term is not
+ only printed in place, but also in the table of contents of the document, or
+ synopsis, depending on the output format\.
+
+ - __category__ *text*
+
+ Document information\. Anywhere\. This command registers its plain text
+ arguments as the category this document belongs to\. If this command is used
+ multiple times the last value specified is used\.
+
+ - __[class](\.\./\.\./\.\./\.\./index\.md\#class)__ *text*
+
+ Text markup\. The argument is marked up as the name of a
+ *[class](\.\./\.\./\.\./\.\./index\.md\#class)*\. The text may have other markup
+ already applied to it\. Main use is the highlighting of class names in
+ free\-form text\.
+
+ - __cmd__ *text*
+
+ Text markup\. The argument text is marked up as the name of a *Tcl
+ command*\. The text may have other markup already applied to it\. Main uses
+ are the highlighting of commands in free\-form text, and for the command
+ parameters of the markup commands __call__ and __usage__\.
+
+ - __cmd\_def__ *command*
+
+ Text structure\. List element\. Command list\. Automatically closes the
+ previous list element\. The argument specifies the name of the *Tcl
+ command* to be described by the list element\. Expected to be marked up in
+ the output as if it had been formatted with __cmd__\.
+
+ - __[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ *plaintext*
+
+ Text markup\. The argument text is marked up as a comment standing outside of
+ the actual text of the document\. Main use is in free\-form text\.
+
+ - __const__ *text*
+
+ Text markup\. The argument is marked up as a *constant* value\. The text may
+ have other markup already applied to it\. Main use is the highlighting of
+ constants in free\-form text\.
+
+ - __copyright__ *text*
+
+ Document information\. Anywhere\. The command registers the plain text
+ argument as a copyright assignment for the manpage\. When invoked more than
+ once the assignments are accumulated\.
+
+ - __def__ *text*
+
+ Text structure\. List element\. Definition list\. Automatically closes the
+ previous list element\. The argument text is the term defined by the new list
+ element\. Text markup can be applied to it\.
+
+ - __description__
+
+ Document structure\. This command separates the header from the document
+ body\. Implicitly starts a section named "DESCRIPTION" \(See command
+ __section__\)\.
+
+ - __enum__
+
+ Text structure\. List element\. Enumerated list\. Automatically closes the
+ previous list element\.
+
+ - __emph__ *text*
+
+ Text markup\. The argument text is marked up as emphasized\. Main use is for
+ general highlighting of pieces of free\-form text without attaching special
+ meaning to the pieces\.
+
+ - __example__ *text*
+
+ Text structure, Text markup\. This command marks its argument up as an
+ *example*\. Main use is the simple embedding of examples in free\-form text\.
+ It should be used if the example does *not* need special markup of its
+ own\. Otherwise use a sequence of __example\_begin__ \.\.\.
+ __example\_end__\.
+
+ - __example\_begin__
+
+ Text structure\. This commands starts an example\. All text until the next
+ __example\_end__ belongs to the example\. Line breaks, spaces, and tabs
+ have to be preserved literally\. Examples cannot be nested\.
+
+ - __example\_end__
+
+ Text structure\. This command closes the example started by the last
+ __example\_begin__\.
+
+ - __[file](\.\./\.\./\.\./\.\./index\.md\#file)__ *text*
+
+ Text markup\. The argument is marked up as a
+ *[file](\.\./\.\./\.\./\.\./index\.md\#file)* or *directory*, i\.e\. in general
+ a *path*\. The text may have other markup already applied to it\. Main use
+ is the highlighting of paths in free\-form text\.
+
+ - __fun__ *text*
+
+ Text markup\. The argument is marked up as the name of a *function*\. The
+ text may have other markup already applied to it\. Main use is the
+ highlighting of function names in free\-form text\.
+
+ - __[image](\.\./\.\./\.\./\.\./index\.md\#image)__ *name* ?*label*?
+
+ Text markup\. The argument is the symbolic name of an
+ *[image](\.\./\.\./\.\./\.\./index\.md\#image)* and replaced with the image
+ itself, if a suitable variant is found by the backend\. The second argument,
+ should it be present, will be interpreted the human\-readable description of
+ the image, and put into the output in a suitable position, if such is
+ supported by the format\. The HTML format, for example, can place it into the
+ *alt* attribute of image references\.
+
+ - __include__ *filename*
+
+ Templating\. The contents of the named file are interpreted as text written
+ in the doctools markup and processed in the place of the include command\.
+ The markup in the file has to be self\-contained\. It is not possible for a
+ markup command to cross the file boundaries\.
+
+ - __item__
+
+ Text structure\. List element\. Itemized list\. Automatically closes the
+ previous list element\.
+
+ - __[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords)__ *args*
+
+ Document information\. Anywhere\. This command registers all its plain text
+ arguments as keywords applying to this document\. Each argument is a single
+ keyword\. If this command is used multiple times all the arguments
+ accumulate\.
+
+ - __lb__
+
+ Text\. The command is replaced with a left bracket\. Use in free\-form text\.
+ Required to avoid interpretation of a left bracket as the start of a markup
+ command\.
+
+ - __list\_begin__ *what*
+
+ Text structure\. This command starts a list\. The exact nature of the list is
+ determined by the argument *what* of the command\. This further determines
+ which commands are have to be used to start the list elements\. Lists can be
+ nested, i\.e\. it is allowed to start a new list within a list element\.
+
+ The allowed types \(and their associated item commands\) are:
+
+ * __arguments__
+
+ __arg\_def__\.
+
+ * __commands__
+
+ __cmd\_def__\.
+
+ * __definitions__
+
+ __def__ and __call__\.
+
+ * __enumerated__
+
+ __enum__
+
+ * __itemized__
+
+ __item__
+
+ * __options__
+
+ __opt\_def__
+
+ * __tkoptions__
+
+ __tkoption\_def__
+
+ Additionally the following names are recognized as shortcuts for some of the
+ regular types:
+
+ * __args__
+
+ Short for __arguments__\.
+
+ * __cmds__
+
+ Short for __commands__\.
+
+ * __enum__
+
+ Short for __enumerated__\.
+
+ * __item__
+
+ Short for __itemized__\.
+
+ * __opts__
+
+ Short for __options__\.
+
+ At last the following names are still recognized for backward compatibility,
+ but are otherwise considered to be *deprecated*\.
+
+ * __arg__
+
+ *Deprecated*\. See __arguments__\.
+
+ * __bullet__
+
+ *Deprecated*\. See __itemized__\.
+
+ * __cmd__
+
+ *Deprecated*\. See __commands__\.
+
+ * __opt__
+
+ *Deprecated*\. See __options__\.
+
+ * __tkoption__
+
+ *Deprecated*\. See __tkoptions__\.
+
+ - __list\_end__
+
+ Text structure\. This command closes the list opened by the last
+ __list\_begin__ command coming before it\.
+
+ - __lst\_item__ *text*
+
+ *Deprecated*\. Text structure\. List element\. Definition list\. See
+ __def__ for the canonical command to open a general list item in a
+ definition list\.
+
+ - __manpage\_begin__ *command* *section* *version*
+
+ Document structure\. The command to start a manpage\. The arguments are the
+ name of the *command* described by the manpage, the *section* of the
+ manpages this manpage resides in, and the *version* of the module
+ containing the command\. All arguments have to be plain text, without markup\.
+
+ - __manpage\_end__
+
+ Document structure\. Command to end a manpage/document\. Anything in the
+ document coming after this command is in error\.
+
+ - __[method](\.\./\.\./\.\./\.\./index\.md\#method)__ *text*
+
+ Text markup\. The argument text is marked up as the name of an
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)*
+ *[method](\.\./\.\./\.\./\.\./index\.md\#method)*, i\.e\. subcommand of a Tcl
+ command\. The text may have other markup already applied to it\. Main uses are
+ the highlighting of method names in free\-form text, and for the command
+ parameters of the markup commands __call__ and __usage__\.
+
+ - __moddesc__ *text*
+
+ Document information\. Header\. Registers the plain text argument as a short
+ description of the module the manpage resides in\.
+
+ - __namespace__ *text*
+
+ Text markup\. The argument text is marked up as a namespace name\. The text
+ may have other markup already applied to it\. Main use is the highlighting of
+ namespace names in free\-form text\.
+
+ - __nl__
+
+ *Deprecated*\. Text structure\. See __para__ for the canonical command
+ to insert paragraph breaks into the text\.
+
+ - __opt__ *text*
+
+ Text markup\. The argument text is marked up as *optional*\. The text may
+ have other markup already applied to it\. Main use is the highlighting of
+ optional arguments, see the command arg __arg__\.
+
+ - __opt\_def__ *name* ?*arg*?
+
+ Text structure\. List element\. Option list\. Automatically closes the previous
+ list element\. Specifies *name* and arguments of the *option* described
+ by the list element\. It is expected that the name is marked up using
+ __option__\.
+
+ - __option__ *text*
+
+ Text markup\. The argument is marked up as *option*\. The text may have
+ other markup already applied to it\. Main use is the highlighting of options,
+ also known as command\-switches, in either free\-form text, or the arguments
+ of the __call__ and __usage__ commands\.
+
+ - __[package](\.\./\.\./\.\./\.\./index\.md\#package)__ *text*
+
+ Text markup\. The argument is marked up as the name of a
+ *[package](\.\./\.\./\.\./\.\./index\.md\#package)*\. The text may have other
+ markup already applied to it\. Main use is the highlighting of package names
+ in free\-form text\.
+
+ - __para__
+
+ Text structure\. This command breaks free\-form text into paragraphs\. Each
+ command closes the paragraph coming before it and starts a new paragraph for
+ the text coming after it\. Higher\-level forms of structure are sections and
+ subsections\.
+
+ - __rb__
+
+ Text\. The command is replaced with a right bracket\. Use in free\-form text\.
+ Required to avoid interpretation of a right bracket as the end of a markup
+ command\.
+
+ - __require__ *package* ?*version*?
+
+ Document information\. Header\. This command registers its argument
+ *package* as the name of a package or application required by the
+ described package or application\. A minimum version can be provided as well\.
+ This argument can be marked up\. The usual markup is __opt__\.
+
+ - __section__ *name*
+
+ Text structure\. This command starts a new named document section\. The
+ argument has to be plain text\. Implicitly closes the last paragraph coming
+ before it and also implicitly opens the first paragraph of the new section\.
+
+ - __sectref__ *id* ?*text*?
+
+ Text markup\. Formats a reference to the section identified by *id*\. If no
+ *text* is specified the title of the referenced section is used in the
+ output, otherwise *text* is used\.
+
+ - __sectref\-external__ *text*
+
+ Text markup\. Like __sectref__, except that the section is assumed to be
+ in a different document and therefore doesn't need to be identified, nor are
+ any checks for existence made\. Only the text to format is needed\.
+
+ - __see\_also__ *args*
+
+ Document information\. Anywhere\. The command defines direct cross\-references
+ to other documents\. Each argument is a plain text label identifying the
+ referenced document\. If this command is used multiple times all the
+ arguments accumulate\.
+
+ - __strong__ *text*
+
+ *Deprecated*\. Text markup\. See __emph__ for the canonical command to
+ emphasize text\.
+
+ - __subsection__ *name*
+
+ Text structure\. This command starts a new named subsection of a section\. The
+ argument has to be plain text\. Implicitly closes the last paragraph coming
+ before it and also implicitly opens the first paragraph of the new
+ subsection\.
+
+ - __syscmd__ *text*
+
+ Text markup\. The argument text is marked up as the name of an external
+ command\. The text may have other markup already applied to it\. Main use is
+ the highlighting of external commands in free\-form text\.
+
+ - __[term](\.\./term/term\.md)__ *text*
+
+ Text markup\. The argument is marked up as unspecific terminology\. The text
+ may have other markup already applied to it\. Main use is the highlighting of
+ important terms and concepts in free\-form text\.
+
+ - __titledesc__ *desc*
+
+ Document information\. Header\. Optional\. Registers the plain text argument as
+ the title of the manpage\. Defaults to the value registered by
+ __moddesc__\.
+
+ - __tkoption\_def__ *name* *dbname* *dbclass*
+
+ Text structure\. List element\. Widget option list\. Automatically closes the
+ previous list element\. Specifies the *name* of the option as used in
+ scripts, the name used by the option database \(*dbname*\), and its class
+ \(*dbclass*\), i\.e\. its type\. It is expected that the name is marked up
+ using __option__\.
+
+ - __[type](\.\./\.\./\.\./\.\./index\.md\#type)__ *text*
+
+ Text markup\. The argument is marked up as the name of a *data type*\. The
+ text may have other markup already applied to it\. Main use is the
+ highlighting of data types in free\-form text\.
+
+ - __[uri](\.\./uri/uri\.md)__ *text* ?*text*?
+
+ Text markup\. The argument is marked up as an
+ *[uri](\.\./\.\./\.\./\.\./index\.md\#uri)* \(i\.e\. a *uniform resource
+ identifier*\. The text may have other markup already applied to it\. Main use
+ is the highlighting of uris in free\-form text\. The second argument, should
+ it be present, will be interpreted the human\-readable description of the
+ uri\. In other words, as its label\. Without an explicit label the uri will be
+ its own label\.
+
+ - __usage__ *args*
+
+ Text markup\. See __call__ for the full description, this command is
+ syntactically identical, as it is in its expectations for the markup of its
+ arguments\. In contrast to __call__ it is however not allowed to generate
+ output where this command occurs in the text\. The command is *silent*\. The
+ formatted text may only appear in a different section of the output, for
+ example a table of contents, or synopsis, depending on the output format\.
+
+ - __var__ *text*
+
+ Text markup\. The argument is marked up as the name of a *variable*\. The
+ text may have other markup already applied to it\. Main use is the
+ highlighting of variables in free\-form text\.
+
+ - __vset__ *varname* *value*
+
+ Templating\. In this form the command sets the named document variable to the
+ specified *value*\. It does not generate output\. I\.e\. the command is
+ replaced by the empty string\.
+
+ - __vset__ *varname*
+
+ Templating\. In this form the command is replaced by the value of the named
+ document variable
+
+ - __[widget](\.\./\.\./\.\./\.\./index\.md\#widget)__ *text*
+
+ Text markup\. The argument is marked up as the name of a
+ *[widget](\.\./\.\./\.\./\.\./index\.md\#widget)*\. The text may have other
+ markup already applied to it\. Main use is the highlighting of widget names
+ in free\-form text\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctools\_intro](doctools\_intro\.md),
+[doctools\_lang\_faq](doctools\_lang\_faq\.md),
+[doctools\_lang\_intro](doctools\_lang\_intro\.md),
+[doctools\_lang\_syntax](doctools\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[doctools commands](\.\./\.\./\.\./\.\./index\.md\#doctools\_commands), [doctools
+language](\.\./\.\./\.\./\.\./index\.md\#doctools\_language), [doctools
+markup](\.\./\.\./\.\./\.\./index\.md\#doctools\_markup),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007\-2010 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctools_lang_faq.md
Index: embedded/md/tcllib/files/modules/doctools/doctools_lang_faq.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctools_lang_faq.md
@@ -0,0 +1,112 @@
+
+[//000000001]: # (doctools\_lang\_faq \- Documentation tools)
+[//000000002]: # (Generated from file 'doctools\_lang\_faq\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctools\_lang\_faq\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools\_lang\_faq \- doctools language faq
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [OVERVIEW](#section2)
+
+ - [What is this document?](#subsection1)
+
+ - [EXAMPLES](#section3)
+
+ - [Where do I find doctools examples?](#subsection2)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+# OVERVIEW
+
+## What is this document?
+
+This document is currently mainly a placeholder, to be filled with commonly
+asked questions about the doctools markup language and companions, and their
+answers\.
+
+Please report any questions \(and, if possible, answers\) we should consider for
+this document as explained in the section [Bugs, Ideas,
+Feedback](#section4) below\.
+
+# EXAMPLES
+
+## Where do I find doctools examples?
+
+We have no direct examples of documents written using doctools markup\. However
+the doctools processor __[dtplite](\.\./\.\./apps/dtplite\.md)__ does
+generate a table of contents when processing a set of documents written in
+doctools markup\. The intermediate file for it uses doctools markup and is not
+deleted when generation completes\. Such files can therefore serve as examples\.
+
+__[dtplite](\.\./\.\./apps/dtplite\.md)__ is distributed as part of Tcllib,
+so to get it you need one of
+
+ 1. A snapshot of Tcllib\. How to retrieve such a snapshot and the tools
+ required for this are described at [Development
+ Snapshots](/wiki?name=Development\+Snapshots)
+
+ 1. A Tcllib release archive\. They are available at the [home](/home) page\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctools\_lang\_cmdref](doctools\_lang\_cmdref\.md),
+[doctools\_lang\_intro](doctools\_lang\_intro\.md),
+[doctools\_lang\_syntax](doctools\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[doctools commands](\.\./\.\./\.\./\.\./index\.md\#doctools\_commands), [doctools
+language](\.\./\.\./\.\./\.\./index\.md\#doctools\_language), [doctools
+markup](\.\./\.\./\.\./\.\./index\.md\#doctools\_markup), [doctools
+syntax](\.\./\.\./\.\./\.\./index\.md\#doctools\_syntax),
+[examples](\.\./\.\./\.\./\.\./index\.md\#examples),
+[faq](\.\./\.\./\.\./\.\./index\.md\#faq), [markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[semantic markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctools_lang_intro.md
Index: embedded/md/tcllib/files/modules/doctools/doctools_lang_intro.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctools_lang_intro.md
@@ -0,0 +1,626 @@
+
+[//000000001]: # (doctools\_lang\_intro \- Documentation tools)
+[//000000002]: # (Generated from file 'doctools\_lang\_intro\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctools\_lang\_intro\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools\_lang\_intro \- doctools language introduction
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [Fundamentals](#subsection1)
+
+ - [Basic structure](#subsection2)
+
+ - [Advanced structure](#subsection3)
+
+ - [Text structure](#subsection4)
+
+ - [Text markup](#subsection5)
+
+ - [Escapes](#subsection6)
+
+ - [Cross\-references](#subsection7)
+
+ - [Examples](#subsection8)
+
+ - [Lists](#subsection9)
+
+ - [FURTHER READING](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+This document is an informal introduction to version 1 of the doctools markup
+language based on a multitude of examples\. After reading this a writer should be
+ready to understand the two parts of the formal specification, i\.e\. the
+*[doctools language syntax](doctools\_lang\_syntax\.md)* specification and
+the *[doctools language command reference](doctools\_lang\_cmdref\.md)*\.
+
+## Fundamentals
+
+In the broadest terms possible the *doctools markup language* is LaTeX\-like,
+instead of like SGML and similar languages\. A document written in this language
+consists primarily of text, with markup commands embedded into it\.
+
+Each markup command is a Tcl command surrounded by a matching pair of __\[__
+and __\]__\. Inside of these delimiters the usual rules for a Tcl command
+apply with regard to word quotation, nested commands, continuation lines, etc\.
+I\.e\.
+
+ \.\.\. \[list\_begin enumerated\] \.\.\.
+
+ \.\.\. \[call \[cmd foo\] \\\\
+ \[arg bar\]\] \.\.\.
+
+ \.\.\. \[term \{complex concept\}\] \.\.\.
+
+ \.\.\. \[opt "\[arg key\] \[arg value\]"\] \.\.\.
+
+## Basic structure
+
+The most simple document which can be written in doctools is
+
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[see\_also doctools\_intro\]
+ \[see\_also doctools\_lang\_cmdref\]
+ \[see\_also doctools\_lang\_faq\]
+ \[see\_also doctools\_lang\_syntax\]
+ \[keywords \{doctools commands\}\]
+ \[keywords \{doctools language\}\]
+ \[keywords \{doctools markup\}\]
+ \[keywords \{doctools syntax\}\]
+ \[keywords markup\]
+ \[keywords \{semantic markup\}\]
+ \[description\]
+ \[vset CATEGORY doctools\]
+ \[include \.\./doctools2base/include/feedback\.inc\]
+ \[manpage\_end\]
+
+This also shows us that all doctools documents are split into two parts, the
+*header* and the *body*\. Everything coming before \[__description__\]
+belongs to the header, and everything coming after belongs to the body, with the
+whole document bracketed by the two __manpage\_\*__ commands\. Before and after
+these opening and closing commands we have only *whitespace*\.
+
+In the remainder of this section we will discuss only the contents of the
+header, the structure of the body will be discussed in the section [Text
+structure](#subsection4)\.
+
+The header section can be empty, and otherwise may contain only an arbitrary
+sequence of the four so\-called *header* commands, plus *whitespace*\. These
+commands are
+
+ - __titledesc__
+
+ - __moddesc__
+
+ - __require__
+
+ - __copyright__
+
+They provide, through their arguments, additional information about the
+document, like its title, the title of the larger group the document belongs to
+\(if applicable\), the requirements of the documented packages \(if applicable\),
+and copyright assignments\. All of them can occur multiple times, including none,
+and they can be used in any order\. However for __titledesc__ and
+__moddesc__ only the last occurrence is taken\. For the other two the
+specified information is accumulated, in the given order\. Regular text is not
+allowed within the header\.
+
+Given the above a less minimal example of a document is
+
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[__copyright \{YEAR AUTHOR\}__\]
+ \[__titledesc TITLE__\]
+ \[__moddesc MODULE\_TITLE__\]
+ \[__require PACKAGE VERSION__\]
+ \[__require PACKAGE__\]
+ \[description\]
+ \[manpage\_end\]
+
+Remember that the whitespace is optional\. The document
+
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[copyright \{YEAR AUTHOR\}\]\[titledesc TITLE\]\[moddesc MODULE\_TITLE\]
+ \[require PACKAGE VERSION\]\[require PACKAGE\]\[description\]
+ \[vset CATEGORY doctools\]
+ \[include \.\./doctools2base/include/feedback\.inc\]
+ \[manpage\_end\]
+
+has the same meaning as the example before\.
+
+On the other hand, if *whitespace* is present it consists not only of any
+sequence of characters containing the space character, horizontal and vertical
+tabs, carriage return, and newline, but it may contain comment markup as well,
+in the form of the __[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ command\.
+
+ \[__comment \{ \.\.\. \}__\]
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[copyright \{YEAR AUTHOR\}\]
+ \[titledesc TITLE\]
+ \[moddesc MODULE\_TITLE\]\[__comment \{ \.\.\. \}__\]
+ \[require PACKAGE VERSION\]
+ \[require PACKAGE\]
+ \[description\]
+ \[manpage\_end\]
+ \[__comment \{ \.\.\. \}__\]
+
+## Advanced structure
+
+In the simple examples of the last section we fudged a bit regarding the markup
+actually allowed to be used before the __manpage\_begin__ command opening the
+document\.
+
+Instead of only whitespace the two templating commands __include__ and
+__vset__ are also allowed, to enable the writer to either set and/or import
+configuration settings relevant to the document\. I\.e\. it is possible to write
+
+ \[__include FILE__\]
+ \[__vset VAR VALUE__\]
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[description\]
+ \[manpage\_end\]
+
+Even more important, these two commands are allowed anywhere where a markup
+command is allowed, without regard for any other structure\. I\.e\. for example in
+the header as well\.
+
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[__include FILE__\]
+ \[__vset VAR VALUE__\]
+ \[description\]
+ \[manpage\_end\]
+
+The only restriction __include__ has to obey is that the contents of the
+included file must be valid at the place of the inclusion\. I\.e\. a file included
+before __manpage\_begin__ may contain only the templating commands
+__vset__ and __include__, a file included in the header may contain only
+header commands, etc\.
+
+## Text structure
+
+The body of the document consists mainly of text, possibly split into sections,
+subsections, and paragraphs, with parts marked up to highlight various semantic
+categories of text, and additional structure through the use of examples and
+\(nested\) lists\.
+
+This section explains the high\-level structural commands, with everything else
+deferred to the following sections\.
+
+The simplest way of structuring the body is through the introduction of
+paragraphs\. The command for doing so is __para__\. Each occurrence of this
+command closes the previous paragraph and automatically opens the next\. The
+first paragraph is automatically opened at the beginning of the body, by
+__description__\. In the same manner the last paragraph automatically ends at
+__manpage\_end__\.
+
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[description\]
+ \.\.\.
+ \[__para__\]
+ \.\.\.
+ \[__para__\]
+ \.\.\.
+ \[manpage\_end\]
+
+Empty paragraphs are ignored\.
+
+A structure coarser than paragraphs are sections, which allow the writer to
+split a document into larger, and labeled, pieces\. The command for doing so is
+__section__\. Each occurrence of this command closes the previous section and
+automatically opens the next, including its first paragraph\. The first section
+is automatically opened at the beginning of the body, by __description__
+\(This section is labeled "DESCRIPTION"\)\. In the same manner the last section
+automatically ends at __manpage\_end__\.
+
+Empty sections are *not* ignored\. We are free to \(not\) use paragraphs within
+sections\.
+
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[description\]
+ \.\.\.
+ \[__section \{Section A\}__\]
+ \.\.\.
+ \[para\]
+ \.\.\.
+ \[__section \{Section B\}__\]
+ \.\.\.
+ \[manpage\_end\]
+
+Between sections and paragraphs we have subsections, to split sections\. The
+command for doing so is __subsection__\. Each occurrence of this command
+closes the previous subsection and automatically opens the next, including its
+first paragraph\. A subsection is automatically opened at the beginning of the
+body, by __description__, and at the beginning of each section\. In the same
+manner the last subsection automatically ends at __manpage\_end__\.
+
+Empty subsections are *not* ignored\. We are free to \(not\) use paragraphs
+within subsections\.
+
+ \[manpage\_begin NAME SECTION VERSION\]
+ \[description\]
+ \.\.\.
+ \[section \{Section A\}\]
+ \.\.\.
+ \[__subsection \{Sub 1\}__\]
+ \.\.\.
+ \[para\]
+ \.\.\.
+ \[__subsection \{Sub 2\}__\]
+ \.\.\.
+ \[section \{Section B\}\]
+ \.\.\.
+ \[manpage\_end\]
+
+## Text markup
+
+Having handled the overall structure a writer can impose on the document we now
+take a closer at the text in a paragraph\.
+
+While most often this is just the unadorned content of the document we do have
+situations where we wish to highlight parts of it as some type of thing or
+other, like command arguments, command names, concepts, uris, etc\.
+
+For this we have a series of markup commands which take the text to highlight as
+their single argument\. It should be noted that while their predominant use is
+the highlighting of parts of a paragraph they can also be used to mark up the
+arguments of list item commands, and of other markup commands\.
+
+The commands available to us are
+
+ - __arg__
+
+ Its argument is a the name of a command argument\.
+
+ - __[class](\.\./\.\./\.\./\.\./index\.md\#class)__
+
+ Its argument is a class name\.
+
+ - __cmd__
+
+ Its argument is a command name \(Tcl command\)\.
+
+ - __const__
+
+ Its argument is a constant\.
+
+ - __emph__
+
+ General, non\-semantic emphasis\.
+
+ - __[file](\.\./\.\./\.\./\.\./index\.md\#file)__
+
+ Its argument is a filename / path\.
+
+ - __fun__
+
+ Its argument is a function name\.
+
+ - __[method](\.\./\.\./\.\./\.\./index\.md\#method)__
+
+ Its argument is a method name
+
+ - __namespace__
+
+ Its argument is namespace name\.
+
+ - __opt__
+
+ Its argument is some optional syntax element\.
+
+ - __option__
+
+ Its argument is a command line switch / widget option\.
+
+ - __[package](\.\./\.\./\.\./\.\./index\.md\#package)__
+
+ Its argument is a package name\.
+
+ - __sectref__
+
+ Its argument is the title of a section or subsection, i\.e\. a section
+ reference\.
+
+ - __syscmd__
+
+ Its argument is a command name \(external, system command\)\.
+
+ - __[term](\.\./term/term\.md)__
+
+ Its argument is a concept, or general terminology\.
+
+ - __[type](\.\./\.\./\.\./\.\./index\.md\#type)__
+
+ Its argument is a type name\.
+
+ - __[uri](\.\./uri/uri\.md)__
+
+ Its argument is a uniform resource identifier, i\.e an external reference\. A
+ second argument can be used to specify an explicit label for the reference
+ in question\.
+
+ - __usage__
+
+ The arguments describe the syntax of a Tcl command\.
+
+ - __var__
+
+ Its argument is a variable\.
+
+ - __[widget](\.\./\.\./\.\./\.\./index\.md\#widget)__
+
+ Its argument is a widget name\.
+
+The example demonstrating the use of text markup is an excerpt from the
+*[doctools language command reference](doctools\_lang\_cmdref\.md)*, with
+some highlighting added\. It shows their use within a block of text, as the
+arguments of a list item command \(__call__\), and our ability to nest them\.
+
+ \.\.\.
+ \[call \[__cmd arg\_def__\] \[__arg type__\] \[__arg name__\] \[__opt__ \[__arg mode__\]\]\]
+
+ Text structure\. List element\. Argument list\. Automatically closes the
+ previous list element\. Specifies the data\-\[__arg type__\] of the described
+ argument of a command, its \[__arg name__\] and its i/o\-\[__arg mode__\]\. The
+ latter is optional\.
+ \.\.\.
+
+## Escapes
+
+Beyond the 20 commands for simple markup shown in the previous section we have
+two more available which are technically simple markup\. However their function
+is not the marking up of phrases as specific types of things, but the insertion
+of characters, namely __\[__ and __\]__\. These commands, __lb__ and
+__rb__ respectively, are required because our use of \[ and \] to bracket
+markup commands makes it impossible to directly use \[ and \] within the text\.
+
+Our example of their use are the sources of the last sentence in the previous
+paragraph, with some highlighting added\.
+
+ \.\.\.
+ These commands, \[cmd lb\] and \[cmd lb\] respectively, are required
+ because our use of \[__lb__\] and \[__rb__\] to bracket markup commands makes it
+ impossible to directly use \[__lb__\] and \[__rb__\] within the text\.
+ \.\.\.
+
+## Cross\-references
+
+The last two commands we have to discuss are for the declaration of
+cross\-references between documents, explicit and implicit\. They are
+__[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords)__ and __see\_also__\. Both
+take an arbitrary number of arguments, all of which have to be plain unmarked
+text\. I\.e\. it is not allowed to use markup on them\. Both commands can be used
+multiple times in a document\. If that is done all arguments of all occurrences
+of one of them are put together into a single set\.
+
+ - __[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords)__
+
+ The arguments of this command are interpreted as keywords describing the
+ document\. A processor can use this information to create an index indirectly
+ linking the containing document to all documents with the same keywords\.
+
+ - __see\_also__
+
+ The arguments of this command are interpreted as references to other
+ documents\. A processor can format them as direct links to these documents\.
+
+All the cross\-reference commands can occur anywhere in the document between
+__manpage\_begin__ and __manpage\_end__\. As such the writer can choose
+whether she wants to have them at the beginning of the body, or at its end,
+maybe near the place a keyword is actually defined by the main content, or
+considers them as meta data which should be in the header, etc\.
+
+Our example shows the sources for the cross\-references of this document, with
+some highlighting added\. Incidentally they are found at the end of the body\.
+
+ \.\.\.
+ \[__see\_also doctools\_intro__\]
+ \[__see\_also doctools\_lang\_syntax__\]
+ \[__see\_also doctools\_lang\_cmdref__\]
+ \[__keywords markup \{semantic markup\}__\]
+ \[__keywords \{doctools markup\} \{doctools language\}__\]
+ \[__keywords \{doctools syntax\} \{doctools commands\}__\]
+ \[manpage\_end\]
+
+## Examples
+
+Where ever we can write plain text we can write examples too\. For simple
+examples we have the command __example__ which takes a single argument, the
+text of the argument\. The example text must not contain markup\. If we wish to
+have markup within an example we have to use the 2\-command combination
+__example\_begin__ / __example\_end__ instead\.
+
+The first opens an example block, the other closes it, and in between we can
+write plain text and use all the regular text markup commands\. Note that text
+structure commands are not allowed\. This also means that it is not possible to
+embed examples and lists within an example\. On the other hand, we *can* use
+templating commands within example blocks to read their contents from a file
+\(Remember section [Advanced structure](#subsection3)\)\.
+
+The source for the very first example in this document \(see section
+[Fundamentals](#subsection1)\), with some highlighting added, is
+
+ \[__example__ \{
+ \.\.\. \[list\_begin enumerated\] \.\.\.
+ \}\]
+
+Using __example\_begin__ / __example\_end__ this would look like
+
+ \[__example\_begin__\]
+ \.\.\. \[list\_begin enumerated\] \.\.\.
+ \[__example\_end__\]
+
+## Lists
+
+Where ever we can write plain text we can write lists too\. The main commands are
+__list\_begin__ to start a list, and __list\_end__ to close one\. The
+opening command takes an argument specifying the type of list started it, and
+this in turn determines which of the eight existing list item commands are
+allowed within the list to start list items\.
+
+After the opening command only whitespace is allowed, until the first list item
+command opens the first item of the list\. Each item is a regular series of
+paragraphs and is closed by either the next list item command, or the end of the
+list\. If closed by a list item command this command automatically opens the next
+list item\. A consequence of a list item being a series of paragraphs is that all
+regular text markup can be used within a list item, including examples and other
+lists\.
+
+The list types recognized by __list\_begin__ and their associated list item
+commands are:
+
+ - __arguments__
+
+ \(__arg\_def__\) This opens an *argument \(declaration\) list*\. It is a
+ specialized form of a term definition list where the term is an argument
+ name, with its type and i/o\-mode\.
+
+ - __commands__
+
+ \(__cmd\_def__\) This opens a *command \(declaration\) list*\. It is a
+ specialized form of a term definition list where the term is a command name\.
+
+ - __definitions__
+
+ \(__def__ and __call__\) This opens a general *term definition
+ list*\. The terms defined by the list items are specified through the
+ argument\(s\) of the list item commands, either general terms, possibly with
+ markup \(__def__\), or Tcl commands with their syntax \(__call__\)\.
+
+ - __enumerated__
+
+ \(__enum__\) This opens a general *enumerated list*\.
+
+ - __itemized__
+
+ \(__item__\) This opens a general *itemized list*\.
+
+ - __options__
+
+ \(__opt\_def__\) This opens an *option \(declaration\) list*\. It is a
+ specialized form of a term definition list where the term is an option name,
+ possibly with the option's arguments\.
+
+ - __tkoptions__
+
+ \(__tkoption\_def__\) This opens a *widget option \(declaration\) list*\. It
+ is a specialized form of a term definition list where the term is the name
+ of a configuration option for a widget, with its name and class in the
+ option database\.
+
+Our example is the source of the definition list in the previous paragraph, with
+most of the content in the middle removed\.
+
+ \.\.\.
+ \[__list\_begin__ definitions\]
+ \[__def__ \[const arg\]\]
+
+ \(\[cmd arg\_def\]\) This opens an argument \(declaration\) list\. It is a
+ specialized form of a definition list where the term is an argument
+ name, with its type and i/o\-mode\.
+
+ \[__def__ \[const itemized\]\]
+
+ \(\[cmd item\]\)
+ This opens a general itemized list\.
+
+ \.\.\.
+ \[__def__ \[const tkoption\]\]
+
+ \(\[cmd tkoption\_def\]\) This opens a widget option \(declaration\) list\. It
+ is a specialized form of a definition list where the term is the name
+ of a configuration option for a widget, with its name and class in the
+ option database\.
+
+ \[__list\_end__\]
+ \.\.\.
+
+Note that a list cannot begin in one \(sub\)section and end in another\.
+Differently said, \(sub\)section breaks are not allowed within lists and list
+items\. An example of this *illegal* construct is
+
+ \.\.\.
+ \[list\_begin itemized\]
+ \[item\]
+ \.\.\.
+ \[__section \{ILLEGAL WITHIN THE LIST\}__\]
+ \.\.\.
+ \[list\_end\]
+ \.\.\.
+
+# FURTHER READING
+
+Now that this document has been digested the reader, assumed to be a *writer*
+of documentation should be fortified enough to be able to understand the formal
+*[doctools language syntax](doctools\_lang\_syntax\.md)* specification as
+well\. From here on out the *[doctools language command
+reference](doctools\_lang\_cmdref\.md)* will also serve as the detailed
+specification and cheat sheet for all available commands and their syntax\.
+
+To be able to validate a document while writing it, it is also recommended to
+familiarize oneself with one of the applications for the processing and
+conversion of doctools documents, i\.e\. either Tcllib's easy and simple
+__[dtplite](\.\./\.\./apps/dtplite\.md)__, or Tclapps' ultra\-configurable
+__dtp__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctools\_intro](doctools\_intro\.md),
+[doctools\_lang\_cmdref](doctools\_lang\_cmdref\.md),
+[doctools\_lang\_faq](doctools\_lang\_faq\.md),
+[doctools\_lang\_syntax](doctools\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[doctools commands](\.\./\.\./\.\./\.\./index\.md\#doctools\_commands), [doctools
+language](\.\./\.\./\.\./\.\./index\.md\#doctools\_language), [doctools
+markup](\.\./\.\./\.\./\.\./index\.md\#doctools\_markup), [doctools
+syntax](\.\./\.\./\.\./\.\./index\.md\#doctools\_syntax),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctools_lang_syntax.md
Index: embedded/md/tcllib/files/modules/doctools/doctools_lang_syntax.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctools_lang_syntax.md
@@ -0,0 +1,180 @@
+
+[//000000001]: # (doctools\_lang\_syntax \- Documentation tools)
+[//000000002]: # (Generated from file 'doctools\_lang\_syntax\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007 Andreas Kupries )
+[//000000004]: # (doctools\_lang\_syntax\(n\) 1\.0 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools\_lang\_syntax \- doctools language syntax
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [Fundamentals](#section2)
+
+ - [Lexical definitions](#section3)
+
+ - [Syntax](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+This document contains the formal specification of the syntax of the doctools
+markup language, version 1 in Backus\-Naur\-Form\. This document is intended to be
+a reference, complementing the *[doctools language command
+reference](doctools\_lang\_cmdref\.md)*\. A beginner should read the much more
+informally written *[doctools language
+introduction](doctools\_lang\_intro\.md)* first before trying to understand
+either this document or the command reference\.
+
+# Fundamentals
+
+In the broadest terms possible the *doctools markup language* is LaTeX\-like,
+instead of like SGML and similar languages\. A document written in this language
+consists primarily of text, with markup commands embedded into it\.
+
+Each markup command is a just Tcl command surrounded by a matching pair of
+__\[__ and __\]__\. Which commands are available, and their arguments, i\.e\.
+syntax is specified in the *[doctools language command
+reference](doctools\_lang\_cmdref\.md)*\.
+
+In this document we specify first the lexeme, and then the syntax, i\.e\. how we
+can mix text and markup commands with each other\.
+
+# Lexical definitions
+
+In the syntax rules listed in the next section
+
+ 1. stands for all text except markup commands\.
+
+ 1. Any XXX stands for the markup command \[xxx\] including its arguments\. Each
+ markup command is a Tcl command surrounded by a matching pair of __\[__
+ and __\]__\. Inside of these delimiters the usual rules for a Tcl command
+ apply with regard to word quotation, nested commands, continuation lines,
+ etc\.
+
+ 1. stands for all text consisting only of spaces, newlines, tabulators
+ and the __[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__ markup command\.
+
+# Syntax
+
+The rules listed here specify only the syntax of doctools documents\. The lexical
+level of the language was covered in the previous section\.
+
+Regarding the syntax of the \(E\)BNF itself
+
+ 1. The construct \{ X \} stands for zero or more occurrences of X\.
+
+ 1. The construct \[ X \] stands for zero or one occurrence of X\.
+
+ 1. The construct LIST\_BEGIN stands for the markup command
+ __list\_begin__ with __X__ as its type argument\.
+
+The syntax:
+
+ manpage = defs
+ MANPAGE\_BEGIN
+ header
+ DESCRIPTION
+ body
+ MANPAGE\_END
+ \{ \}
+
+ defs = \{ INCLUDE | VSET | \}
+
+ header = \{ TITLEDESC | MODDESC | COPYRIGHT | REQUIRE | defs | xref \}
+
+ xref = KEYWORDS | SEE\_ALSO | CATEGORY
+
+ body = paras \{ SECTION sbody \}
+ sbody = paras \{ SUBSECTION ssbody \}
+ ssbody = paras
+
+ paras = tblock \{ \(PARA | NL\) tblock \}
+
+ tblock = \{ | defs | markup | xref | an\_example | a\_list \}
+
+ markup = ARG | CLASS | CMD | CONST | EMPH | FILE
+ | FUN | LB | METHOD | NAMESPACE | OPT | OPTION
+ | PACKAGE | RB | SECTREF | STRONG | SYSCMD | TERM
+ | TYPE | URI | USAGE | VAR | WIDGET
+
+ example = EXAMPLE
+ | EXAMPLE\_BEGIN extext EXAMPLE\_END
+
+ extext = \{ | defs | markup \}
+
+ a\_list = LIST\_BEGIN argd\_list LIST\_END
+ | LIST\_BEGIN cmdd\_list LIST\_END
+ | LIST\_BEGIN def\_list LIST\_END
+ | LIST\_BEGIN enum\_list LIST\_END
+ | LIST\_BEGIN item\_list LIST\_END
+ | LIST\_BEGIN optd\_list LIST\_END
+ | LIST\_BEGIN tkoptd\_list LIST\_END
+
+ argd\_list = \[ \] \{ ARG\_DEF paras \}
+ cmdd\_list = \[ \] \{ CMD\_DEF paras \}
+ def\_list = \[ \] \{ \(DEF|CALL\) paras \}
+ enum\_list = \[ \] \{ ENUM paras \}
+ item\_list = \[ \] \{ ITEM paras \}
+ optd\_list = \[ \] \{ OPT\_DEF paras \}
+ tkoptd\_list = \[ \] \{ TKOPTION\_DEF paras \}
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctools\_intro](doctools\_intro\.md),
+[doctools\_lang\_cmdref](doctools\_lang\_cmdref\.md),
+[doctools\_lang\_faq](doctools\_lang\_faq\.md),
+[doctools\_lang\_intro](doctools\_lang\_intro\.md)
+
+# KEYWORDS
+
+[doctools commands](\.\./\.\./\.\./\.\./index\.md\#doctools\_commands), [doctools
+language](\.\./\.\./\.\./\.\./index\.md\#doctools\_language), [doctools
+markup](\.\./\.\./\.\./\.\./index\.md\#doctools\_markup), [doctools
+syntax](\.\./\.\./\.\./\.\./index\.md\#doctools\_syntax),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/doctools_plugin_apiref.md
Index: embedded/md/tcllib/files/modules/doctools/doctools_plugin_apiref.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/doctools_plugin_apiref.md
@@ -0,0 +1,484 @@
+
+[//000000001]: # (doctools\_plugin\_apiref \- Documentation tools)
+[//000000002]: # (Generated from file 'doctools\_plugin\_apiref\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2007\-2010 Andreas Kupries )
+[//000000004]: # (doctools\_plugin\_apiref\(n\) 1\.1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools\_plugin\_apiref \- doctools plugin API reference
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [OVERVIEW](#section2)
+
+ - [FRONTEND COMMANDS](#section3)
+
+ - [PLUGIN COMMANDS](#section4)
+
+ - [Management commands](#subsection1)
+
+ - [Formatting commands](#subsection2)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__dt\_copyright__](#1)
+[__dt\_file__](#2)
+[__dt\_mainfile__](#3)
+[__dt\_fileid__](#4)
+[__dt\_fmap__ *symfname*](#5)
+[__dt\_format__](#6)
+[__dt\_imgdata__ *key* *extensions*](#7)
+[__dt\_imgdst__ *key* *extensions*](#8)
+[__dt\_imgsrc__ *key* *extensions*](#9)
+[__dt\_lnesting__](#10)
+[__dt\_module__](#11)
+[__dt\_read__ *file*](#12)
+[__dt\_source__ *file*](#13)
+[__dt\_user__](#14)
+[__ex\_cappend__ *text*](#15)
+[__ex\_cget__ *varname*](#16)
+[__ex\_cis__ *cname*](#17)
+[__ex\_cname__](#18)
+[__ex\_cpop__ *cname*](#19)
+[__ex\_cpush__ *cname*](#20)
+[__ex\_cset__ *varname* *value*](#21)
+[__ex\_lb__ ?*newbracket*?](#22)
+[__ex\_rb__ ?*newbracket*?](#23)
+[__fmt\_initialize__](#24)
+[__fmt\_listvariables__](#25)
+[__fmt\_numpasses__](#26)
+[__fmt\_postprocess__ *text*](#27)
+[__fmt\_setup__ *n*](#28)
+[__fmt\_shutdown__](#29)
+[__fmt\_varset__ *varname* *text*](#30)
+[__fmt\_plain\_text__ *text*](#31)
+
+# DESCRIPTION
+
+This document is intended for *plugin writers*, i\.e\. developers wishing to
+write a doctools *[formatting
+engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine)* for some output format X\.
+
+It specifies the interaction between the __[doctools](doctools\.md)__
+package and its plugins, i\.e\. the interface any doctools formatting engine has
+to comply with\.
+
+This document deals with version 1 of the interface\.
+
+A reader who is on the other hand more interested in the markup language itself
+should start with the *[doctools language
+introduction](doctools\_lang\_intro\.md)* and proceed from there to the formal
+specifications, i\.e\. the *[doctools language
+syntax](doctools\_lang\_syntax\.md)* and the *[doctools language command
+reference](doctools\_lang\_cmdref\.md)*\.
+
+# OVERVIEW
+
+The API for a doctools formatting engine consists of two major sections\.
+
+On the one side we have a set of commands through which the plugin is able to
+query the frontend\. These commands are provided by the frontend and linked into
+the plugin interpreter\. Please see section [FRONTEND COMMANDS](#section3)
+for their detailed specification\.
+
+And on the other side the plugin has to provide its own set of commands which
+will then be called by the frontend in a specific sequence while processing
+input\. They, again, fall into two categories, management and formatting\. Please
+see section [PLUGIN COMMANDS](#section4) and its subsections for their
+detailed specification\.
+
+# FRONTEND COMMANDS
+
+This section specifies the set of commands through which a plugin, also known as
+a doctools formatting engine, is able to query the frontend\. These commands are
+provided by the frontend and linked into the plugin interpreter\.
+
+I\.e\. a doctools formatting engine can assume that all of the following commands
+are present when any of its own commands \(as specified in section [PLUGIN
+COMMANDS](#section4)\) are executed\.
+
+Beyond that it can also assume that it has full access to its own safe
+interpreter and thus is not able to damage the other parts of the processor, nor
+can it damage the filesystem\. It is however able to either kill or hang the
+whole process, by exiting, or running an infinite loop\.
+
+Coming back to the imported commands, all the commands with prefix *dt\_*
+provide limited access to specific parts of the frontend, whereas the commands
+with prefix *ex\_* provide access to the state of the
+__[textutil::expander](\.\./textutil/expander\.md)__ object which does the
+main parsing of the input within the frontend\. These commands should not be
+except under very special circumstances\.
+
+ - __dt\_copyright__
+
+ Query command\. It returns a string containing the copyright information the
+ doctools processor was configured with\. The relevant option is
+ __\-copyright__\)\.
+
+ - __dt\_file__
+
+ Query command\. It returns the full path of the file containing the input
+ currently processed by the engine\. This may be an included file\.
+
+ - __dt\_mainfile__
+
+ Query command\. It returns the full path of the toplevel file containing the
+ input currently processed by the engine\.
+
+ - __dt\_fileid__
+
+ Query command\. It returns the name of the file containing the input
+ currently processed by the engine, without path, nor extension\.
+
+ - __dt\_fmap__ *symfname*
+
+ Query command\. It returns the actual pathname to use in the output in place
+ of the symbolic filename *symfname*\. It will return the unchanged input if
+ no mapping was established for *symfname*\.
+
+ The required mappings are established with the method __map__ of a
+ frontend, as explained in section __OBJECT METHODS__ of the
+ documentation for the package __[doctools](doctools\.md)__\.
+
+ - __dt\_format__
+
+ Query command\. It returns the name of the format associated with the
+ doctools formatting engine\.
+
+ - __dt\_imgdata__ *key* *extensions*
+
+ Query command\. Access to the image map\. Looks for an image recorded under
+ the *key* and having on the specified *extension*\. If a matching image
+ is found its data is returned as the result of the command\. Otherwise an
+ empty string is returned\.
+
+ - __dt\_imgdst__ *key* *extensions*
+
+ Query command\. Access to the image map\. Looks for an image recorded under
+ the *key* and having on the specified *extension*\. If a matching image
+ is found its destination path in the output is returned as the result of the
+ command\. Otherwise an empty string is returned\.
+
+ - __dt\_imgsrc__ *key* *extensions*
+
+ Query command\. Access to the image map\. Looks for an image recorded under
+ the *key* and having on the specified *extension*\. If a matching image
+ is found its origin path is returned as the result of the command\. Otherwise
+ an empty string is returned\.
+
+ - __dt\_lnesting__
+
+ Query command\. It returns the number of lists currently open\.
+
+ - __dt\_module__
+
+ Query command\. It returns the name of the module the input currently
+ processed belongs to\.
+
+ - __dt\_read__ *file*
+
+ Controlled filesystem access\. Returns contents of *file* for whatever use
+ desired by the plugin\. Only files which are either in the same directory as
+ the file containing the engine, or below it, can be loaded\. Trying to load a
+ file outside of this directory causes an error\.
+
+ - __dt\_source__ *file*
+
+ Controlled filesystem access\. This command allows the doctools formatting
+ engine to load additional Tcl code it may need\. Only files which are either
+ in the same directory as the file containing the engine, or below it, can be
+ loaded\. Trying to load a file outside of this directory causes an error\.
+
+ - __dt\_user__
+
+ Query command\. It returns the name of the current user as known to the tcl
+ interpreter the frontend controlling the formatting engine resides in\.
+
+ - __ex\_cappend__ *text*
+
+ Appends a string to the output in the current context\. This command should
+ rarely be used by macros or application code\.
+
+ - __ex\_cget__ *varname*
+
+ Retrieves the value of variable *varname*, defined in the current context\.
+
+ - __ex\_cis__ *cname*
+
+ Determines whether or not the name of the current context is *cname*\.
+
+ - __ex\_cname__
+
+ Returns the name of the current context\.
+
+ - __ex\_cpop__ *cname*
+
+ Pops a context from the context stack, returning all accumulated output in
+ that context\. The context must be named *cname*, or an error results\.
+
+ - __ex\_cpush__ *cname*
+
+ Pushes a context named *cname* onto the context stack\. The context must be
+ popped by __cpop__ before expansion ends or an error results\.
+
+ - __ex\_cset__ *varname* *value*
+
+ Sets variable *varname* to *value* in the current context\.
+
+ - __ex\_lb__ ?*newbracket*?
+
+ Returns the current value of the left macro expansion bracket; this is for
+ use as or within a macro, when the bracket needs to be included in the
+ output text\. If *newbracket* is specified, it becomes the new bracket, and
+ is returned\.
+
+ - __ex\_rb__ ?*newbracket*?
+
+ Returns the current value of the right macro expansion bracket; this is for
+ use as or within a macro, when the bracket needs to be included in the
+ output text\. If *newbracket* is specified, it becomes the new bracket, and
+ is returned\.
+
+# PLUGIN COMMANDS
+
+The plugin has to provide its own set of commands which will then be called by
+the frontend in a specific sequence while processing input\. They fall into two
+categories, management and formatting\. Their expected names, signatures, and
+responsibilities are specified in the following two subsections\.
+
+## Management commands
+
+The management commands a plugin has to provide are used by the frontend to
+
+ 1. initialize and shutdown the plugin
+
+ 1. determine the number of passes it has to make over the input
+
+ 1. initialize and shutdown each pass
+
+ 1. query and initialize engine parameters
+
+After the plugin has been loaded and the frontend commands are established the
+commands will be called in the following sequence:
+
+ fmt\_numpasses \-> n
+ fmt\_listvariables \-> vars
+
+ fmt\_varset var1 value1
+ fmt\_varset var2 value2
+ \.\.\.
+ fmt\_varset varK valueK
+ fmt\_initialize
+ fmt\_setup 1
+ \.\.\.
+ fmt\_setup 2
+ \.\.\.
+ \.\.\.
+ fmt\_setup n
+ \.\.\.
+ fmt\_postprocess
+ fmt\_shutdown
+ \.\.\.
+
+I\.e\. first the number of passes and the set of available engine parameters is
+established, followed by calls setting the parameters\. That second part is
+optional\.
+
+After that the plugin is initialized, the specified number of passes executed,
+the final result run through a global post processing step and at last the
+plugin is shutdown again\. This can be followed by more conversions, restarting
+the sequence at __fmt\_varset__\.
+
+In each of the passes, i\.e\. after the calls of __fmt\_setup__ the frontend
+will process the input and call the formatting commands as markup is
+encountered\. This means that the sequence of formatting commands is determined
+by the grammar of the doctools markup language, as specified in the *[doctools
+language syntax](doctools\_lang\_syntax\.md)* specification\.
+
+A different way of looking at the sequence is:
+
+ - First some basic parameters are determined\.
+
+ - Then everything starting at the first __fmt\_varset__ to
+ __fmt\_shutdown__ forms a *run*, the formatting of a single input\. Each
+ run can be followed by more\.
+
+ - Embedded within each run we have one or more *passes*, each starting with
+ __fmt\_setup__ and going until either the next __fmt\_setup__ or
+ __fmt\_postprocess__ is reached\.
+
+ If more than one pass is required to perform the formatting only the output
+ of the last pass is relevant\. The output of all the previous, preparatory
+ passes is ignored\.
+
+The commands, their names, signatures, and responsibilities are, in detail:
+
+ - __fmt\_initialize__
+
+ *Initialization/Shutdown*\. This command is called at the beginning of
+ every conversion run, as the first command of that run\. Note that a run is
+ not a pass, but may consist of multiple passes\. It has to initialize the
+ general state of the plugin, beyond the initialization done during the load\.
+ No return value is expected, and any returned value is ignored\.
+
+ - __fmt\_listvariables__
+
+ *Initialization/Shutdown* and *Engine parameters*\. Second command is
+ called after the plugin code has been loaded, i\.e\. immediately after
+ __fmt\_numpasses__\. It has to return a list containing the names of the
+ parameters the frontend can set to configure the engine\. This list can be
+ empty\.
+
+ - __fmt\_numpasses__
+
+ *Initialization/Shutdown* and *Pass management*\. First command called
+ after the plugin code has been loaded\. No other command of the engine will
+ be called before it\. It has to return the number of passes this engine
+ requires to fully process the input document\. This value has to be an
+ integer number greater or equal to one\.
+
+ - __fmt\_postprocess__ *text*
+
+ *Initialization/Shutdown*\. This command is called immediately after the
+ last pass in a run\. Its argument is the result of the conversion generated
+ by that pass\. It is provided to allow the engine to perform any global
+ modifications of the generated document\. If no post\-processing is required
+ for a specific format the command has to just return the argument\.
+
+ Expected to return a value, the final result of formatting the input\.
+
+ - __fmt\_setup__ *n*
+
+ *Initialization/Shutdown* and *Pass management*\. This command is called
+ at the beginning of each pass over the input in a run\. Its argument is the
+ number of the pass which has begun\. Passes are counted from __1__
+ upward\. The command has to set up the internal state of the plugin for this
+ particular pass\. No return value is expected, and any returned value is
+ ignored\.
+
+ - __fmt\_shutdown__
+
+ *Initialization/Shutdown*\. This command is called at the end of every
+ conversion run\. It is the last command called in a run\. It has to clean up
+ of all the run\-specific state in the plugin\. After the call the engine has
+ to be in a state which allows the initiation of another run without fear
+ that information from the last run is leaked into this new run\. No return
+ value is expected, and any returned value is ignored\.
+
+ - __fmt\_varset__ *varname* *text*
+
+ *Engine parameters*\. This command is called by the frontend to set an
+ engine parameter to a particular value\. The parameter to change is specified
+ by *varname*, the value to set in *text*\.
+
+ The command has to throw an error if an unknown *varname* is used\. Only
+ the names returned by __fmt\_listvariables__ have to be considered as
+ known\.
+
+ The values of all engine parameters have to persist between passes and runs\.
+
+## Formatting commands
+
+The formatting commands have to implement the formatting for the output format,
+for all the markup commands of the doctools markup language, except __lb__,
+__rb__, __vset__, __include__, and
+__[comment](\.\./\.\./\.\./\.\./index\.md\#comment)__\. These exceptions are
+processed by the frontend and are never seen by the plugin\. In return a command
+for the formatting of plain text has to be provided, something which has no
+markup in the input at all\.
+
+This means, that each of the 49 markup commands specified in the *[doctools
+language command reference](doctools\_lang\_cmdref\.md)* and outside of the set
+of exceptions listed above has an equivalent formatting command which takes the
+same arguments as the markup command and whose name is the name of markup
+command with the prefix *fmt\_* added to it\.
+
+All commands are expected to format their input in some way per the semantics
+specified in the command reference and to return whatever part of this that they
+deem necessary as their result, which will be added to the output\.
+
+To avoid essentially duplicating the command reference we do not list any of the
+command here and simply refer the reader to the *[doctools language command
+reference](doctools\_lang\_cmdref\.md)* for their signature and description\.
+The sole exception is the plain text formatter, which has no equivalent markup
+command\.
+
+The calling sequence of formatting commands is not as rigid as for the
+management commands, but determined by the grammar of the doctools markup
+language, as specified in the *[doctools language
+syntax](doctools\_lang\_syntax\.md)* specification\.
+
+ - __fmt\_plain\_text__ *text*
+
+ *No associated markup command*\.
+
+ Called by the frontend for any plain text encountered in the input\. It has
+ to perform any and all special processing required for plain text\.
+
+ The formatted text is expected as the result of the command, and added to
+ the output\. If no special processing is required it has to simply return its
+ argument without change\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[doctools](doctools\.md), [doctools\_intro](doctools\_intro\.md),
+[doctools\_lang\_cmdref](doctools\_lang\_cmdref\.md),
+[doctools\_lang\_faq](doctools\_lang\_faq\.md),
+[doctools\_lang\_intro](doctools\_lang\_intro\.md),
+[doctools\_lang\_syntax](doctools\_lang\_syntax\.md)
+
+# KEYWORDS
+
+[document](\.\./\.\./\.\./\.\./index\.md\#document),
+[formatter](\.\./\.\./\.\./\.\./index\.md\#formatter), [formatting
+engine](\.\./\.\./\.\./\.\./index\.md\#formatting\_engine),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2007\-2010 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools/mpexpand.md
Index: embedded/md/tcllib/files/modules/doctools/mpexpand.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools/mpexpand.md
@@ -0,0 +1,142 @@
+
+[//000000001]: # (mpexpand \- Documentation toolbox)
+[//000000002]: # (Generated from file 'mpexpand\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2002 Andreas Kupries
+Copyright © 2003 Andreas Kupries )
+[//000000004]: # (mpexpand\(n\) 1\.0 tcllib "Documentation toolbox")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+mpexpand \- Markup processor
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [NOTES](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+[__mpexpand__ ?\-module *module*? *format* *infile*|\- *outfile*|\-](#1)
+[__mpexpand\.all__ ?*\-verbose*? ?*module*?](#2)
+
+# DESCRIPTION
+
+This manpage describes a processor / converter for manpages in the doctools
+format as specified in __doctools\_fmt__\. The processor is based upon the
+package __[doctools](doctools\.md)__\.
+
+ - __mpexpand__ ?\-module *module*? *format* *infile*|\- *outfile*|\-
+
+ The processor takes three arguments, namely the code describing which
+ formatting to generate as the output, the file to read the markup from, and
+ the file to write the generated output into\. If the *infile* is
+ "__\-__" the processor will read from __stdin__\. If *outfile* is
+ "__\-__" the processor will write to __stdout__\.
+
+ If the option *\-module* is present its value overrides the internal
+ definition of the module name\.
+
+ The currently known output formats are
+
+ * __nroff__
+
+ The processor generates \*roff output, the standard format for unix
+ manpages\.
+
+ * __html__
+
+ The processor generates HTML output, for usage in and display by web
+ browsers\.
+
+ * __tmml__
+
+ The processor generates TMML output, the Tcl Manpage Markup Language, a
+ derivative of XML\.
+
+ * __latex__
+
+ The processor generates LaTeX output\.
+
+ * __wiki__
+
+ The processor generates Wiki markup as understood by __wikit__\.
+
+ * __list__
+
+ The processor extracts the information provided by
+ __manpage\_begin__\.
+
+ * __null__
+
+ The processor does not generate any output\.
+
+ - __mpexpand\.all__ ?*\-verbose*? ?*module*?
+
+ This command uses __mpexpand__ to generate all possible output formats
+ for all manpages in the current directory\. The manpages are recognized
+ through the extension "\.man"\. If *\-verbose* is specified the command will
+ list its actions before executing them\.
+
+ The *module* information is passed to __mpexpand__\.
+
+# NOTES
+
+Possible future formats are plain text, pdf and postscript\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+expander\(n\), format\(n\), formatter\(n\)
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html), [TMML](\.\./\.\./\.\./\.\./index\.md\#tmml),
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2002 Andreas Kupries
+Copyright © 2003 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2base/html_cssdefaults.md
Index: embedded/md/tcllib/files/modules/doctools2base/html_cssdefaults.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2base/html_cssdefaults.md
@@ -0,0 +1,90 @@
+
+[//000000001]: # (doctools::html::cssdefaults \- Documentation tools)
+[//000000002]: # (Generated from file 'html\_cssdefaults\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::html::cssdefaults\(n\) 0\.1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::html::cssdefaults \- Default CSS style for HTML export plugins
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::html::cssdefaults ?0\.1?
+
+[__::doctools::html::cssdefaults::contents__](#1)
+
+# DESCRIPTION
+
+This package provides a single command providing access to the text of the
+default CSS style to use for HTML markup generated by the various HTML export
+plugins\.
+
+This is an internal package of doctools, for use by
+*[export](\.\./\.\./\.\./\.\./index\.md\#export)* plugins, i\.e\. the packages
+converting doctools related documented into other formats, most notably
+*[HTML](\.\./\.\./\.\./\.\./index\.md\#html)*\.
+
+# API
+
+ - __::doctools::html::cssdefaults::contents__
+
+ This command returns the text of the default CSS style to use for HTML
+ markup generated by the various HTML export plugins\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[CSS](\.\./\.\./\.\./\.\./index\.md\#css), [HTML](\.\./\.\./\.\./\.\./index\.md\#html),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin),
+[style](\.\./\.\./\.\./\.\./index\.md\#style)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2base/nroff_manmacros.md
Index: embedded/md/tcllib/files/modules/doctools2base/nroff_manmacros.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2base/nroff_manmacros.md
@@ -0,0 +1,91 @@
+
+[//000000001]: # (doctools::nroff::man\_macros \- Documentation tools)
+[//000000002]: # (Generated from file 'nroff\_manmacros\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::nroff::man\_macros\(n\) 0\.1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::nroff::man\_macros \- Default CSS style for NROFF export plugins
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::nroff::man\_macros ?0\.1?
+
+[__::doctools::nroff::man\_macros::contents__](#1)
+
+# DESCRIPTION
+
+This package provides a single command providing access to the definition of the
+nroff *man* macro set to use for NROFF markup generated by the various NROFF
+export plugins\.
+
+This is an internal package of doctools, for use by
+*[export](\.\./\.\./\.\./\.\./index\.md\#export)* plugins, i\.e\. the packages
+converting doctools related documented into other formats, most notably
+*[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff)*\.
+
+# API
+
+ - __::doctools::nroff::man\_macros::contents__
+
+ This command returns the text of the default CSS style to use for NROFF
+ generated by the various NROFF export plugins\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[macros](\.\./\.\./\.\./\.\./index\.md\#macros),
+[man\_macros](\.\./\.\./\.\./\.\./index\.md\#man\_macros),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2base/tcl_parse.md
Index: embedded/md/tcllib/files/modules/doctools2base/tcl_parse.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2base/tcl_parse.md
@@ -0,0 +1,213 @@
+
+[//000000001]: # (doctools::tcl::parse \- Documentation tools)
+[//000000002]: # (Generated from file 'tcl\_parse\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::tcl::parse\(n\) 1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::tcl::parse \- Processing text in 'subst \-novariables' format
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Error format](#section3)
+
+ - [Tree Structure](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require snit
+package require fileutil
+package require logger
+package require struct::list
+package require struct::stack
+package require struct::set
+package require treeql
+package require doctools::tcl::parse
+
+[__::doctools::tcl::parse__ __text__ *tree* *text* ?*root*?](#1)
+[__::doctools::tcl::parse__ __file__ *tree* *path* ?*root*?](#2)
+
+# DESCRIPTION
+
+This package provides commands for parsing text with embedded Tcl commands as
+accepted by the Tcl builtin command __subst \-novariables__\. The result of
+the parsing is an abstract syntax tree\.
+
+This is an internal package of doctools, for use by the higher level parsers
+processing the *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)*,
+*[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)*, and
+*[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)* markup languages\.
+
+# API
+
+ - __::doctools::tcl::parse__ __text__ *tree* *text* ?*root*?
+
+ The command takes the *text* and parses it under the assumption that it
+ contains a string acceptable to the Tcl builtin command __subst
+ \-novariables__\. Errors are thrown otherwise during the parsing\. The format
+ used for these errors in described in section [Error
+ format](#section3)\.
+
+ The command returns the empty string as it result\. The actual result of the
+ parsing is entered into the tree structure *tree*, under the node
+ *root*\. If *root* is not specified the root of *tree* is used\. The
+ *tree* has to exist and be the command of a tree object which supports the
+ same methods as trees created by the package
+ __[struct::tree](\.\./struct/struct\_tree\.md)__\.
+
+ In case of errors *tree* will be left in an undefined state\.
+
+ - __::doctools::tcl::parse__ __file__ *tree* *path* ?*root*?
+
+ The same as __text__, except that the text to parse is read from the
+ file specified by *path*\.
+
+# Error format
+
+When the parser encounters a problem in the input it will throw an error using
+the format described here\.
+
+ 1. The message will contain the reason for the problem \(unexpected character
+ or end of input in input\), the character in question, if any, and the line
+ and column the problem was found at, in a human readable form\. This part is
+ not documented further as its format may change as we see fit\. It is
+ intended for human consumption, not machine\.
+
+ 1. The error code however will contain a machine\-readable representation of
+ the problem, in the form of a 5\-element list containing, in the order
+ listed below
+
+ 1) the constant string __doctools::tcl::parse__
+
+ 1) the cause of the problem, one of
+
+ - __char__
+
+ Unexpected character in input
+
+ - __eof__
+
+ Unexpected end of the input
+
+ 1) The location of the problem as offset from the beginning of the input,
+ counted in characters\. Note: Line markers count as one character\.
+
+ 1) The line the problem was found on \(counted from 1 \(one\)\),
+
+ 1) The column the problem was found at \(counted from 0 \(zero\)\)
+
+# Tree Structure
+
+After successfully parsing a string the generated tree will have the following
+structure:
+
+ 1. In the following items the word 'root' refers to the node which was
+ specified as the root of the tree when invoking either __text__ or
+ __file__\. This may be the actual root of the tree\.
+
+ 1. All the following items further ignore the possibility of pre\-existing
+ attributes in the pre\-existing nodes\. If attributes exists with the same
+ names as the attributes used by the parser the pre\-existing values are
+ written over\. Attributes with names not clashing with the parser's
+ attributes are not touched\.
+
+ 1. The root node has no attributes\.
+
+ 1. All other nodes have the attributes
+
+ - type
+
+ The value is a string from the set \{ Command , Text , Word \}
+
+ - range
+
+ The value is either empty or a 2\-element list containing integer
+ numbers\. The numbers are the offsets of the first and last character in
+ the input text, of the token described by the node,\.
+
+ - line
+
+ The value is an integer, it describes the line in the input the token
+ described by the node ends on\. Lines are counted from 1 \(__one__\)\.
+
+ - col
+
+ The value is an integer, it describes the column in the line in the
+ input the token described by the node ends on\. Columns are counted from
+ 0 \(__zero__\)\.
+
+ 1. The children of the root, if any, are of type Command and Text, in
+ semi\-alternation\. This means: After a Text node a Command node has to
+ follow, and anything can follow a Command node, a Text or other Command
+ node\.
+
+ 1. The children of a Command node, if any, are of type Command, and Text, and
+ Word, they describe the arguments of the command\.
+
+ 1. The children of a Word node, if any, are of type Command, Text, in
+ semi\-alternation\. This means: After a Text node a Command node has to
+ follow, and anything can follow a Command node, a Text or other Command
+ node\.
+
+ 1. A Word node without children represents the empty string\.
+
+ 1. All Text nodes are leaves of the tree\.
+
+ 1. All leaves of the tree are either Text or Command nodes\. Word nodes cannot
+ be leaves\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[Tcl syntax](\.\./\.\./\.\./\.\./index\.md\#tcl\_syntax),
+[command](\.\./\.\./\.\./\.\./index\.md\#command),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[parser](\.\./\.\./\.\./\.\./index\.md\#parser),
+[subst](\.\./\.\./\.\./\.\./index\.md\#subst), [word](\.\./\.\./\.\./\.\./index\.md\#word)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2base/tcllib_msgcat.md
Index: embedded/md/tcllib/files/modules/doctools2base/tcllib_msgcat.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2base/tcllib_msgcat.md
@@ -0,0 +1,111 @@
+
+[//000000001]: # (doctools::msgcat \- Documentation tools)
+[//000000002]: # (Generated from file 'tcllib\_msgcat\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::msgcat\(n\) 0\.1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::msgcat \- Message catalog management for the various document parsers
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require msgcat
+package require doctools::msgcat ?0\.1?
+
+[__::doctools::msgcat::init__ *prefix*](#1)
+
+# DESCRIPTION
+
+The package __doctools::msgcat__ is a support module handling the selection
+of message catalogs for the various document processing packages in the doctools
+system version 2\. As such it is an internal package a regular user \(developer\)
+should not be in direct contact with\.
+
+If you are such please go the documentation of either
+
+ 1. __doctools::doc__,
+
+ 1. __[doctools::toc](\.\./doctools/doctoc\.md)__, or
+
+ 1. __[doctools::idx](\.\./doctools2idx/idx\_container\.md)__
+
+Within the system architecture this package resides under the various parser
+packages, and is shared by them\. Underneath it, but not explicit dependencies,
+are the packages providing the message catalogs for the various languages\.
+
+# API
+
+ - __::doctools::msgcat::init__ *prefix*
+
+ The command locates and loads the message catalogs for all the languages
+ returned by __msgcat::mcpreferences__, provided that they could be
+ found\. It returns an integer number describing how many packages were found
+ and loaded\.
+
+ The names of the packages the command will look for have the form
+ "doctools::msgcat::*prefix*::__langcode__", with *prefix* the
+ argument to the command, and the __langcode__ supplied by the result of
+ __msgcat::mcpreferences__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[catalog package](\.\./\.\./\.\./\.\./index\.md\#catalog\_package),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[i18n](\.\./\.\./\.\./\.\./index\.md\#i18n),
+[internationalization](\.\./\.\./\.\./\.\./index\.md\#internationalization),
+[l10n](\.\./\.\./\.\./\.\./index\.md\#l10n),
+[localization](\.\./\.\./\.\./\.\./index\.md\#localization), [message
+catalog](\.\./\.\./\.\./\.\./index\.md\#message\_catalog), [message
+package](\.\./\.\./\.\./\.\./index\.md\#message\_package)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/export_docidx.md
Index: embedded/md/tcllib/files/modules/doctools2idx/export_docidx.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/export_docidx.md
@@ -0,0 +1,253 @@
+
+[//000000001]: # (doctools::idx::export::docidx \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::export::docidx\(n\) 0\.1 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::export::docidx \- docidx export plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [\[docidx\] notation of keyword indices](#section3)
+
+ - [Configuration](#section4)
+
+ - [Keyword index serialization format](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::idx::export::docidx ?0\.1?
+
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools keyword index export plugin for the
+generation of docidx markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling keyword indices, especially
+__[doctools::idx::export](idx\_export\.md)__, the export manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::idx::export](idx\_export\.md)__ and the export
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the docidx
+export plugin API version 2\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ This command takes the canonical serialization of a keyword index, as
+ specified in section [Keyword index serialization format](#section5),
+ and contained in *serial*, the *configuration*, a dictionary, and
+ generates docidx markup encoding the index\. The created string is then
+ returned as the result of the command\.
+
+# \[docidx\] notation of keyword indices
+
+The docidx format for keyword indices, also called the *docidx markup
+language*, is too large to be covered in single section\. The interested reader
+should start with the document
+
+ 1. *[docidx language introduction](\.\./doctools/docidx\_lang\_intro\.md)*
+
+and then proceed from there to the formal specifications, i\.e\. the documents
+
+ 1. *[docidx language syntax](\.\./doctools/docidx\_lang\_syntax\.md)* and
+
+ 1. *[docidx language command
+ reference](\.\./doctools/docidx\_lang\_cmdref\.md)*\.
+
+to get a thorough understanding of the language\.
+
+# Configuration
+
+The docidx export plugin recognizes the following configuration variables and
+changes its behaviour as they specify\.
+
+ - string *user*
+
+ This standard configuration variable contains the name of the user running
+ the process which invoked the export plugin\. The plugin puts this
+ information into the provenance comment at the beginning of the generated
+ document\.
+
+ - string *file*
+
+ This standard configuration variable contains the name of the file the index
+ came from\. This variable may not be set or contain the empty string\. The
+ plugin puts this information, if defined, i\.e\. set and not the empty string,
+ into the provenance comment at the beginning of the generated document\.
+
+ - boolean *newlines*
+
+ If this flag is set the plugin will break the generated docidx code across
+ lines, with each markup command on a separate line\.
+
+ If this flag is not set \(the default\), the whole document will be written on
+ a single line, with minimum spacing between all elements\.
+
+ - boolean *indented*
+
+ If this flag is set the plugin will indent the markup commands according to
+ the structure of indices\. To make this work this also implies that
+ __newlines__ is set\. This effect is independent of the value for
+ __aligned__ however\.
+
+ If this flag is not set \(the default\), the output is formatted as per the
+ values of __newlines__ and __aligned__, and no indenting is done\.
+
+ - boolean *aligned*
+
+ If this flag is set the generator ensures that the arguments for the
+ __[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage)__ and
+ __[url](\.\./\.\./\.\./\.\./index\.md\#url)__ commands in a keyword section
+ are aligned vertically for a nice table effect\. To make this work this also
+ implies that __newlines__ is set\. This effect is independent of the
+ value for __indented__ however\.
+
+ If this flag is not set \(the default\), the output is formatted as per the
+ values of __newlines__ and __indented__, and no alignment is done\.
+
+*Note* that this plugin ignores the standard configuration variables
+__format__, and __map__, and their values\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[index](\.\./\.\./\.\./\.\./index\.md\#index),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_container.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_container.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_container.md
@@ -0,0 +1,443 @@
+
+[//000000001]: # (doctools::idx \- Documentation tools)
+[//000000002]: # (Generated from file 'idx\_container\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx\(n\) 2 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx \- Holding keyword indices
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Concepts](#section2)
+
+ - [API](#section3)
+
+ - [Package commands](#subsection1)
+
+ - [Object command](#subsection2)
+
+ - [Object methods](#subsection3)
+
+ - [Keyword index serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require doctools::idx ?2?
+package require Tcl 8\.4
+package require doctools::idx::structure
+package require snit
+
+[__::doctools::idx__ *objectName*](#1)
+[__objectName__ __method__ ?*arg arg \.\.\.*?](#2)
+[*objectName* __destroy__](#3)
+[*objectName* __key add__ *name*](#4)
+[*objectName* __key remove__ *name*](#5)
+[*objectName* __key references__ *name*](#6)
+[*objectName* __keys__](#7)
+[*objectName* __reference add__ *type* *key* *name* *label*](#8)
+[*objectName* __reference remove__ *name*](#9)
+[*objectName* __reference label__ *name*](#10)
+[*objectName* __reference keys__ *name*](#11)
+[*objectName* __reference type__ *name*](#12)
+[*objectName* __references__](#13)
+[*objectName* __title__](#14)
+[*objectName* __title__ *text*](#15)
+[*objectName* __label__](#16)
+[*objectName* __label__ *text*](#17)
+[*objectName* __importer__](#18)
+[*objectName* __importer__ *object*](#19)
+[*objectName* __exporter__](#20)
+[*objectName* __exporter__ *object*](#21)
+[*objectName* __deserialize =__ *data* ?*format*?](#22)
+[*objectName* __deserialize \+=__ *data* ?*format*?](#23)
+[*objectName* __serialize__ ?*format*?](#24)
+
+# DESCRIPTION
+
+This package provides a class to contain and programmatically manipulate keyword
+indices
+
+This is one of the three public pillars the management of keyword indices
+resides on\. The other two pillars are
+
+ 1. *[Exporting keyword indices](idx\_export\.md)*, and
+
+ 1. *[Importing keyword indices](idx\_import\.md)*
+
+For information about the [Concepts](#section2) of keyword indices, and
+their parts, see the same\-named section\. For information about the data
+structure which is used to encode keyword indices as values see the section
+[Keyword index serialization format](#section4)\. This is the only format
+directly known to this class\. Conversions from and to any other format are
+handled by export and import manager objects\. These may be attached to a
+container, but do not have to be, it is merely a convenience\.
+
+# Concepts
+
+ 1. A *[keyword index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index)* consists of a
+ \(possibly empty\) set of *[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords)*\.
+
+ 1. Each keyword in the set is identified by its name\.
+
+ 1. Each keyword has a \(possibly empty\) set of *references*\.
+
+ 1. A reference can be associated with more than one keyword\.
+
+ 1. A reference not associated with at least one keyword is not possible
+ however\.
+
+ 1. Each reference is identified by its target, specified as either an url or
+ symbolic filename, depending on the type of reference \(__url__, or
+ __manpage__\)\.
+
+ 1. The type of a reference \(url, or manpage\) depends only on the reference
+ itself, and not the keywords it is associated with\.
+
+ 1. In addition to a type each reference has a descriptive label as well\. This
+ label depends only on the reference itself, and not the keywords it is
+ associated with\.
+
+A few notes
+
+ 1. Manpage references are intended to be used for references to the documents
+ the index is made for\. Their target is a symbolic file name identifying the
+ document, and export plugins may replace symbolic with actual file names,
+ if specified\.
+
+ 1. Url references are intended on the othre hand are inteded to be used for
+ links to anything else, like websites\. Their target is an url\.
+
+ 1. While url and manpage references share a namespace for their identifiers,
+ this should be no problem, given that manpage identifiers are symbolic
+ filenames and as such they should never look like urls, the identifiers for
+ url references\.
+
+# API
+
+## Package commands
+
+ - __::doctools::idx__ *objectName*
+
+ This command creates a new container object with an associated Tcl command
+ whose name is *objectName*\. This
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)* command is explained in full
+ detail in the sections [Object command](#subsection2) and [Object
+ methods](#subsection3)\. The object command will be created under the
+ current namespace if the *objectName* is not fully qualified, and in the
+ specified namespace otherwise\.
+
+## Object command
+
+All objects created by the __::doctools::idx__ command have the following
+general form:
+
+ - __objectName__ __method__ ?*arg arg \.\.\.*?
+
+ The method __method__ and its *arg*'uments determine the exact
+ behavior of the command\. See section [Object methods](#subsection3) for
+ the detailed specifications\.
+
+## Object methods
+
+ - *objectName* __destroy__
+
+ This method destroys the object it is invoked for\.
+
+ - *objectName* __key add__ *name*
+
+ This method adds the keyword *name* to the index\. If the keyword is
+ already known nothing is done\. The result of the method is the empty string\.
+
+ - *objectName* __key remove__ *name*
+
+ This method removes the keyword *name* from the index\. If the keyword is
+ already gone nothing is done\. Any references for whom this keyword was the
+ last association are removed as well\. The result of the method is the empty
+ string\.
+
+ - *objectName* __key references__ *name*
+
+ This method returns a list containing the names of all references associated
+ with the keyword *name*\. An error is thrown in the keyword is not known to
+ the index\. The order of the references in the list is undefined\.
+
+ - *objectName* __keys__
+
+ This method returns a list containing the names of all keywords known to the
+ index\. The order of the keywords in the list is undefined\.
+
+ - *objectName* __reference add__ *type* *key* *name* *label*
+
+ This method adds the reference *name* to the index and associates it with
+ the keyword *key*\. The other two arguments hold the *type* and *label*
+ of the reference, respectively\. The type has to match the stored
+ information, should the reference exist already, i\.e\. this information is
+ immutable after the reference is known\. The only way to change it is delete
+ and recreate the reference\. The label on the other hand is automatically
+ updated to the value of the argument, overwriting any previously stored
+ information\. Should the reference exists already it is simply associated
+ with the *key*\. If that is true already as well nothing is done, but the
+ *label* updated to the new value\. The result of the method is the empty
+ string\.
+
+ The *type* argument has be to one of __manpage__ or __url__\.
+
+ - *objectName* __reference remove__ *name*
+
+ The reference *name* is removed from the index\. All associations with
+ keywords are released and the relevant reference labels removed\. The result
+ of the method is the empty string\.
+
+ - *objectName* __reference label__ *name*
+
+ This method returns the label associated with the reference *name*\. An
+ error is thrown if the reference is not known\.
+
+ - *objectName* __reference keys__ *name*
+
+ This method returns a list containing the names of all keywords associated
+ with the reference *name*\. An error is thrown in the reference is not
+ known to the index\. The order of the keywords in the list is undefined\.
+
+ - *objectName* __reference type__ *name*
+
+ This method returns the type of the reference *name*\. An error is thrown
+ in the reference is not known to the index\.
+
+ - *objectName* __references__
+
+ This method returns a list containing the names of all references known to
+ the index\. The order of the references in the list is undefined\.
+
+ - *objectName* __title__
+
+ Returns the currently defined title of the keyword index\.
+
+ - *objectName* __title__ *text*
+
+ Sets the title of the keyword index to *text*, and returns it as the
+ result of the command\.
+
+ - *objectName* __label__
+
+ Returns the currently defined label of the keyword index\.
+
+ - *objectName* __label__ *text*
+
+ Sets the label of the keyword index to *text*, and returns it as the
+ result of the command\.
+
+ - *objectName* __importer__
+
+ Returns the import manager object currently attached to the container, if
+ any\.
+
+ - *objectName* __importer__ *object*
+
+ Attaches the *object* as import manager to the container, and returns it
+ as the result of the command\. Note that the *object* is *not* put into
+ ownership of the container\. I\.e\., destruction of the container will *not*
+ destroy the *object*\.
+
+ It is expected that *object* provides a method named __import text__
+ which takes a text and a format name, and returns the canonical
+ serialization of the keyword index contained in the text, assuming the given
+ format\.
+
+ - *objectName* __exporter__
+
+ Returns the export manager object currently attached to the container, if
+ any\.
+
+ - *objectName* __exporter__ *object*
+
+ Attaches the *object* as export manager to the container, and returns it
+ as the result of the command\. Note that the *object* is *not* put into
+ ownership of the container\. I\.e\., destruction of the container will *not*
+ destroy the *object*\.
+
+ It is expected that *object* provides a method named __export object__
+ which takes the container and a format name, and returns a text encoding
+ keyword index stored in the container, in the given format\. It is further
+ expected that the *object* will use the container's method
+ __serialize__ to obtain the serialization of the keyword index from
+ which to generate the text\.
+
+ - *objectName* __deserialize =__ *data* ?*format*?
+
+ This method replaces the contents of the index object with the index
+ contained in the *data*\. If no *format* was specified it is assumed to
+ be the regular serialization of a keyword index\.
+
+ Otherwise the object will use the attached import manager to convert the
+ data from the specified format to a serialization it can handle\. In that
+ case an error will be thrown if the container has no import manager attached
+ to it\.
+
+ The result of the method is the empty string\.
+
+ - *objectName* __deserialize \+=__ *data* ?*format*?
+
+ This method behaves like __deserialize =__ in its essentials, except
+ that it merges the keyword index in the *data* to its contents instead of
+ replacing it\. The method will throw an error if merging is not possible,
+ i\.e\. would produce an invalid index\. The existing content is left unchanged
+ in that case\.
+
+ The result of the method is the empty string\.
+
+ - *objectName* __serialize__ ?*format*?
+
+ This method returns the keyword index contained in the object\. If no
+ *format* is not specified the returned result is the canonical
+ serialization of its contents\.
+
+ Otherwise the object will use the attached export manager to convert the
+ data to the specified format\. In that case an error will be thrown if the
+ container has no export manager attached to it\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html), [TMML](\.\./\.\./\.\./\.\./index\.md\#tmml),
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion), [docidx
+markup](\.\./\.\./\.\./\.\./index\.md\#docidx\_markup),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation),
+[formatting](\.\./\.\./\.\./\.\./index\.md\#formatting),
+[generation](\.\./\.\./\.\./\.\./index\.md\#generation),
+[index](\.\./\.\./\.\./\.\./index\.md\#index), [json](\.\./\.\./\.\./\.\./index\.md\#json),
+[keyword index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index),
+[latex](\.\./\.\./\.\./\.\./index\.md\#latex),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff),
+[parsing](\.\./\.\./\.\./\.\./index\.md\#parsing),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin),
+[reference](\.\./\.\./\.\./\.\./index\.md\#reference), [tcler's
+wiki](\.\./\.\./\.\./\.\./index\.md\#tcler\_s\_wiki),
+[text](\.\./\.\./\.\./\.\./index\.md\#text), [url](\.\./\.\./\.\./\.\./index\.md\#url),
+[wiki](\.\./\.\./\.\./\.\./index\.md\#wiki)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_export.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_export.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_export.md
@@ -0,0 +1,472 @@
+
+[//000000001]: # (doctools::idx::export \- Documentation tools)
+[//000000002]: # (Generated from file 'idx\_export\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009\-2018 Andreas Kupries )
+[//000000004]: # (doctools::idx::export\(n\) 0\.2 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::export \- Exporting keyword indices
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Concepts](#section2)
+
+ - [API](#section3)
+
+ - [Package commands](#subsection1)
+
+ - [Object command](#subsection2)
+
+ - [Object methods](#subsection3)
+
+ - [Export plugin API v2 reference](#section4)
+
+ - [Keyword index serialization format](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require doctools::idx::export ?0\.2?
+package require Tcl 8\.4
+package require doctools::config
+package require doctools::idx::structure
+package require snit
+package require pluginmgr
+
+[__::doctools::idx::export__ *objectName*](#1)
+[__objectName__ __method__ ?*arg arg \.\.\.*?](#2)
+[*objectName* __destroy__](#3)
+[*objectName* __export serial__ *serial* ?*format*?](#4)
+[*objectName* __export object__ *object* ?*format*?](#5)
+[*objectName* __config names__](#6)
+[*objectName* __config get__](#7)
+[*objectName* __config set__ *name* ?*value*?](#8)
+[*objectName* __config unset__ *pattern*\.\.\.](#9)
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#10)
+
+# DESCRIPTION
+
+This package provides a class to manage the plugins for the export of keyword
+indices to other formats, i\.e\. their conversion to, for example
+*[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)*,
+*[HTML](\.\./\.\./\.\./\.\./index\.md\#html)*, etc\.
+
+This is one of the three public pillars the management of keyword indices
+resides on\. The other two pillars are
+
+ 1. *[Importing keyword indices](idx\_import\.md)*, and
+
+ 1. *[Holding keyword indices](idx\_container\.md)*
+
+For information about the [Concepts](#section2) of keyword indices, and
+their parts, see the same\-named section\. For information about the data
+structure which is the major input to the manager objects provided by this
+package see the section [Keyword index serialization format](#section5)\.
+
+The plugin system of our class is based on the package
+__[pluginmgr](\.\./pluginmgr/pluginmgr\.md)__, and configured to look for
+plugins using
+
+ 1. the environment variable __DOCTOOLS\_IDX\_EXPORT\_PLUGINS__,
+
+ 1. the environment variable __DOCTOOLS\_IDX\_PLUGINS__,
+
+ 1. the environment variable __DOCTOOLS\_PLUGINS__,
+
+ 1. the path "~/\.doctools/idx/export/plugin"
+
+ 1. the path "~/\.doctools/idx/plugin"
+
+ 1. the path "~/\.doctools/plugin"
+
+ 1. the path "~/\.doctools/idx/export/plugins"
+
+ 1. the path "~/\.doctools/idx/plugins"
+
+ 1. the path "~/\.doctools/plugins"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\IDX\\EXPORT\\PLUGINS"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\IDX\\PLUGINS"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\PLUGINS"
+
+The last three are used only when the package is run on a machine using
+Windows\(tm\) operating system\.
+
+The whole system is delivered with six predefined export plugins, namely
+
+ - docidx
+
+ See *[docidx export plugin](export\_docidx\.md)* for details\.
+
+ - html
+
+ See *html export plugin* for details\.
+
+ - json
+
+ See *json export plugin* for details\.
+
+ - nroff
+
+ See *[nroff export plugin](\.\./doctools2toc/toc\_export\_nroff\.md)* for
+ details\.
+
+ - text
+
+ See *text export plugin* for details\.
+
+ - wiki
+
+ See *[wiki export plugin](\.\./doctools2toc/toc\_export\_wiki\.md)* for
+ details\.
+
+Readers wishing to write their own export plugin for some format, i\.e\. *plugin
+writer*s reading and understanding the section containing the [Export plugin
+API v2 reference](#section4) is an absolute necessity, as it specifies the
+interaction between this package and its plugins in detail\.
+
+# Concepts
+
+ 1. A *[keyword index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index)* consists of a
+ \(possibly empty\) set of *[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords)*\.
+
+ 1. Each keyword in the set is identified by its name\.
+
+ 1. Each keyword has a \(possibly empty\) set of *references*\.
+
+ 1. A reference can be associated with more than one keyword\.
+
+ 1. A reference not associated with at least one keyword is not possible
+ however\.
+
+ 1. Each reference is identified by its target, specified as either an url or
+ symbolic filename, depending on the type of reference \(__url__, or
+ __manpage__\)\.
+
+ 1. The type of a reference \(url, or manpage\) depends only on the reference
+ itself, and not the keywords it is associated with\.
+
+ 1. In addition to a type each reference has a descriptive label as well\. This
+ label depends only on the reference itself, and not the keywords it is
+ associated with\.
+
+A few notes
+
+ 1. Manpage references are intended to be used for references to the documents
+ the index is made for\. Their target is a symbolic file name identifying the
+ document, and export plugins may replace symbolic with actual file names,
+ if specified\.
+
+ 1. Url references are intended on the othre hand are inteded to be used for
+ links to anything else, like websites\. Their target is an url\.
+
+ 1. While url and manpage references share a namespace for their identifiers,
+ this should be no problem, given that manpage identifiers are symbolic
+ filenames and as such they should never look like urls, the identifiers for
+ url references\.
+
+# API
+
+## Package commands
+
+ - __::doctools::idx::export__ *objectName*
+
+ This command creates a new export manager object with an associated Tcl
+ command whose name is *objectName*\. This
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)* command is explained in full
+ detail in the sections [Object command](#subsection2) and [Object
+ methods](#subsection3)\. The object command will be created under the
+ current namespace if the *objectName* is not fully qualified, and in the
+ specified namespace otherwise\.
+
+## Object command
+
+All objects created by the __::doctools::idx::export__ command have the
+following general form:
+
+ - __objectName__ __method__ ?*arg arg \.\.\.*?
+
+ The method __method__ and its *arg*'uments determine the exact
+ behavior of the command\. See section [Object methods](#subsection3) for
+ the detailed specifications\.
+
+## Object methods
+
+ - *objectName* __destroy__
+
+ This method destroys the object it is invoked for\.
+
+ - *objectName* __export serial__ *serial* ?*format*?
+
+ This method takes the canonical serialization of a keyword index stored in
+ *serial* and converts it to the specified *format*, using the export
+ plugin for the format\. An error is thrown if no plugin could be found for
+ the format\. The string generated by the conversion process is returned as
+ the result of this method\.
+
+ If no format is specified the method defaults to __docidx__\.
+
+ The specification of what a *canonical* serialization is can be found in
+ the section [Keyword index serialization format](#section5)\.
+
+ The plugin has to conform to the interface specified in section [Export
+ plugin API v2 reference](#section4)\.
+
+ - *objectName* __export object__ *object* ?*format*?
+
+ This method is a convenient wrapper around the __export serial__ method
+ described by the previous item\. It expects that *object* is an object
+ command supporting a __serialize__ method returning the canonical
+ serialization of a keyword index\. It invokes that method, feeds the result
+ into __export serial__ and returns the resulting string as its own
+ result\.
+
+ - *objectName* __config names__
+
+ This method returns a list containing the names of all configuration
+ variables currently known to the object\.
+
+ - *objectName* __config get__
+
+ This method returns a dictionary containing the names and values of all
+ configuration variables currently known to the object\.
+
+ - *objectName* __config set__ *name* ?*value*?
+
+ This method sets the configuration variable *name* to the specified
+ *value* and returns the new value of the variable\.
+
+ If no value is specified it simply returns the current value, without
+ changing it\.
+
+ Note that while the user can set the predefined configuration variables
+ __user__ and __format__ doing so will have no effect, these values
+ will be internally overridden when invoking an import plugin\.
+
+ - *objectName* __config unset__ *pattern*\.\.\.
+
+ This method unsets all configuration variables matching the specified glob
+ *pattern*s\. If no pattern is specified it will unset all currently defined
+ configuration variables\.
+
+# Export plugin API v2 reference
+
+Plugins are what this package uses to manage the support for any output format
+beyond the [Keyword index serialization format](#section5)\. Here we specify
+the API the objects created by this package use to interact with their plugins\.
+
+A plugin for this package has to follow the rules listed below:
+
+ 1. A plugin is a package\.
+
+ 1. The name of a plugin package has the form
+ doctools::idx::export::__FOO__, where __FOO__ is the name of the
+ format the plugin will generate output for\. This name is also the argument
+ to provide to the various __export__ methods of export manager objects
+ to get a string encoding a keyword index in that format\.
+
+ 1. The plugin can expect that the package
+ __doctools::idx::export::plugin__ is present, as indicator that it was
+ invoked from a genuine plugin manager\.
+
+ 1. A plugin has to provide one command, with the signature shown below\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ Whenever an export manager of
+ __[doctools::idx](idx\_container\.md)__ has to generate output
+ for an index it will invoke this command\.
+
+ * string *serial*
+
+ This argument will contain the *canonical* serialization of the
+ index for which to generate the output\. The specification of what a
+ *canonical* serialization is can be found in the section
+ [Keyword index serialization format](#section5)\.
+
+ * dictionary *configuration*
+
+ This argument will contain the current configuration to apply to
+ the generation, as a dictionary mapping from variable names to
+ values\.
+
+ The following configuration variables have a predefined meaning all
+ plugins have to obey, although they can ignore this information at
+ their discretion\. Any other other configuration variables
+ recognized by a plugin will be described in the manpage for that
+ plugin\.
+
+ + user
+
+ This variable is expected to contain the name of the user
+ owning the process invoking the plugin\.
+
+ + format
+
+ This variable is expected to contain the name of the format
+ whose plugin is invoked\.
+
+ + file
+
+ This variable, if defined by the user of the index object is
+ expected to contain the name of the input file for which the
+ plugin is generating its output for\.
+
+ + map
+
+ This variable, if defined by the user of the index object is
+ expected to contain a dictionary mapping from symbolic file
+ names used in the references of type __manpage__ to actual
+ paths \(or urls\)\. A plugin has to be able to handle the
+ possibility that a symbolic name is without entry in this
+ mapping\.
+
+ 1. A single usage cycle of a plugin consists of the invokations of the command
+ __[export](\.\./\.\./\.\./\.\./index\.md\#export)__\. This call has to leave
+ the plugin in a state where another usage cycle can be run without
+ problems\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html),
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[formatting](\.\./\.\./\.\./\.\./index\.md\#formatting),
+[generation](\.\./\.\./\.\./\.\./index\.md\#generation),
+[index](\.\./\.\./\.\./\.\./index\.md\#index), [json](\.\./\.\./\.\./\.\./index\.md\#json),
+[keyword index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin),
+[reference](\.\./\.\./\.\./\.\./index\.md\#reference), [tcler's
+wiki](\.\./\.\./\.\./\.\./index\.md\#tcler\_s\_wiki),
+[text](\.\./\.\./\.\./\.\./index\.md\#text), [url](\.\./\.\./\.\./\.\./index\.md\#url),
+[wiki](\.\./\.\./\.\./\.\./index\.md\#wiki)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009\-2018 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_export_html.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_export_html.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_export_html.md
@@ -0,0 +1,351 @@
+
+[//000000001]: # (doctools::idx::export::html \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::export::html\(n\) 0\.2 tcllib "Documentation tools")
+
+
[ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::export::html \- HTML export plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Configuration](#section3)
+
+ - [Keyword index serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::idx::export::html ?0\.2?
+package require doctools::text
+package require doctools::html
+package require doctools::html::cssdefaults
+
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools keyword index export plugin for the
+generation of HTML markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling keyword indices, especially
+__[doctools::idx::export](idx\_export\.md)__, the export manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::idx::export](idx\_export\.md)__ and the export
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the docidx
+export plugin API version 2\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ This command takes the canonical serialization of a keyword index, as
+ specified in section [Keyword index serialization format](#section4),
+ and contained in *serial*, the *configuration*, a dictionary, and
+ generates HTML markup encoding the index\. The created string is then
+ returned as the result of the command\.
+
+# Configuration
+
+The html export plugin recognizes the following configuration variables and
+changes its behaviour as they specify\.
+
+ - string *user*
+
+ This standard configuration variable contains the name of the user running
+ the process which invoked the export plugin\. The plugin puts this
+ information into the provenance comment at the beginning of the generated
+ document\.
+
+ - string *file*
+
+ This standard configuration variable contains the name of the file the index
+ came from\. This variable may not be set or contain the empty string\. The
+ plugin puts this information, if defined, i\.e\. set and not the empty string,
+ into the provenance comment at the beginning of the generated document\.
+
+ - dictionary *map*
+
+ This standard configuration variable contains a dictionary mapping from the
+ symbolic files names in manpage references to the actual filenames and/or
+ urls to be used in the output\.
+
+ Url references and symbolic file names without a mapping are used unchanged\.
+
+ - boolean *newlines*
+
+ If this flag is set the plugin will break the generated html code across
+ lines, with each markup command on a separate line\.
+
+ If this flag is not set \(the default\), the whole document will be written on
+ a single line, with minimum spacing between all elements\.
+
+ - boolean *indented*
+
+ If this flag is set the plugin will indent the markup commands according to
+ the structure of indices\. To make this work this also implies that
+ __newlines__ is set\.
+
+ If this flag is not set \(the default\), the output is formatted as per the
+ value of __newlines__, and no indenting is done\.
+
+ - string *meta*
+
+ This variable is meant to hold a fragment of HTML \(default: empty\)\. The
+ fragment it contains will be inserted into the generated output in the
+ section of the document, just after the tag\.
+
+ - string *header*
+
+ This variable is meant to hold a fragment of HTML \(default: empty\)\. The
+ fragment it contains will be inserted into the generated output just after
+ the title tag in the body of the document, in the class\.header
+ 'ision\.
+
+ - string *footer*
+
+ This variable is meant to hold a fragment of HTML \(default: empty\)\. The
+ fragment it contains will be inserted into the generated output just before
+ the tag, in the class\.footer
'ision\.
+
+ - dictionary *kwid*
+
+ The value of this variable \(default: empty\) maps keywords to the identifiers
+ to use as their anchor names\. Each keyword __FOO__ not found in the
+ dictionary uses __KW\-____FOO__ as anchor, i\.e\. itself prefixed with
+ the string __KW\-__\.
+
+ - string *sepline*
+
+ The value of this variable is the string to use for the separator comments
+ inserted into the output when the outpout is broken across lines and/or
+ indented\. The default string consists of 60 dashes\.
+
+ - integer *kwidth*
+
+ This variable holds the size of the keyword column in the main table
+ generated by the plugin, in percent of the total width of the table\. This is
+ an integer number in the range of 1 to 99\. Choosing a value outside of that
+ range causes the generator to switch back to the defauly setting, 35
+ percent\.
+
+ - string *dot*
+
+ This variable contains a HTML fragment inserted between the entries of the
+ navigation bar, and the references associated with each keyword\. The default
+ is the HTML entity &\#183; i\.e\. the bullet character, also known as the
+ "Greek middle dot", i\.e\. the unicode character 00B7\.
+
+ - string *class\.main*
+
+ This variable contains the class name for the main
'ivision of the
+ generated document\. The default is __doctools__\.
+
+ - string *class\.header*
+
+ This variable contains the class name for the header
'ision of the
+ generated document\. The default is __idx\-header__\. This division
+ contains the document title, the user specified __header__, if any, a
+ visible separator line, and the navigation bar for quick access to each
+ keyword section\.
+
+ - string *class\.title*
+
+ This variable contains the class name for the
tag enclosing the
+ document title\. The default is __idx\-title__\.
+
+ - string *class\.navsep*
+
+ This variable contains the class name for the
separators in the header
+ and footer sections of the generated document\. The default is
+ __idx\-navsep__\.
+
+ - string *class\.navbar*
+
+ This variable contains the class name for the navigation 'ision
+ enclosing the navigation bar of the generated document\. The default is
+ __idx\-kwnav__\.
+
+ - string *class\.contents*
+
+ This variable contains the class name for the
holding the keywords
+ and their references in the generated document\. The default is
+ __idx\-contents__\.
+
+ - string *class\.leader*
+
+ This variable contains the class name for the anchor names the plugin
+ inserts into the keyword table when switching from one section to the next
+ \(Each section holds all keywords with a particular first character\)\. The
+ default is __idx\-leader__\.
+
+ - string *class\.row0*
+
+ This variable contains the class name used to label the even rows \(\) of
+ the keyword table\. The default is __idx\-even__\.
+
+ - string *class\.row1*
+
+ This variable contains the class name used to label the odd rows \(
\) of
+ the keyword table\. The default is __idx\-odd__\.
+
+ - string *class\.keyword*
+
+ This variable contains the class name used to label the keyword cells/column
+ \(\) in the keyword table of the document\. The default is
+ __idx\-keyword__\.
+
+ - string *class\.refs*
+
+ This variable contains the class name used to label the reference
+ cells/column \( | \) in the keyword table of the document\. The default is
+ __idx\-refs__\.
+
+ - string *class\.footer*
+
+ This variable contains the class name for the footer 'ision of the
+ generated document\. The default is __idx\-footer__\. This division
+ contains a browser\-visible separator line and the user specified
+ __footer__, if any\.
+
+*Note* that this plugin ignores the standard configuration variable
+__format__, and its value\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[index](\.\./\.\./\.\./\.\./index\.md\#index),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_export_json.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_export_json.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_export_json.md
@@ -0,0 +1,260 @@
+
+[//000000001]: # (doctools::idx::export::json \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::export::json\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::export::json \- JSON export plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [JSON notation of keyword indices](#section3)
+
+ - [Configuration](#section4)
+
+ - [Keyword index serialization format](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::idx::export::json ?0\.1?
+package require textutil::adjust
+
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools keyword index export plugin for the
+generation of JSON markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling keyword indices, especially
+__[doctools::idx::export](idx\_export\.md)__, the export manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::idx::export](idx\_export\.md)__ and the export
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the docidx
+export plugin API version 2\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ This command takes the canonical serialization of a keyword index, as
+ specified in section [Keyword index serialization format](#section5),
+ and contained in *serial*, the *configuration*, a dictionary, and
+ generates JSON markup encoding the index\. The created string is then
+ returned as the result of the command\.
+
+# JSON notation of keyword indices
+
+The JSON format used for keyword indices is a direct translation of the
+[Keyword index serialization format](#section5), mapping Tcl dictionaries
+as JSON objects and Tcl lists as JSON arrays\. For example, the Tcl serialization
+
+ doctools::idx \{
+ label \{Keyword Index\}
+ keywords \{
+ changelog \{changelog\.man cvs\.man\}
+ conversion \{doctools\.man docidx\.man doctoc\.man apps/dtplite\.man mpexpand\.man\}
+ cvs cvs\.man
+ \}
+ references \{
+ apps/dtplite\.man \{manpage dtplite\}
+ changelog\.man \{manpage doctools::changelog\}
+ cvs\.man \{manpage doctools::cvs\}
+ docidx\.man \{manpage doctools::idx\}
+ doctoc\.man \{manpage doctools::toc\}
+ doctools\.man \{manpage doctools\}
+ mpexpand\.man \{manpage mpexpand\}
+ \}
+ title \{\}
+ \}
+
+is equivalent to the JSON string
+
+ \{
+ "doctools::idx" : \{
+ "label" : "Keyword Index",
+ "keywords" : \{
+ "changelog" : \["changelog\.man","cvs\.man"\],
+ "conversion" : \["doctools\.man","docidx\.man","doctoc\.man","apps\\/dtplite\.man","mpexpand\.man"\],
+ "cvs" : \["cvs\.man"\],
+ \},
+ "references" : \{
+ "apps\\/dtplite\.man" : \["manpage","dtplite"\],
+ "changelog\.man" : \["manpage","doctools::changelog"\],
+ "cvs\.man" : \["manpage","doctools::cvs"\],
+ "docidx\.man" : \["manpage","doctools::idx"\],
+ "doctoc\.man" : \["manpage","doctools::toc"\],
+ "doctools\.man" : \["manpage","doctools"\],
+ "mpexpand\.man" : \["manpage","mpexpand"\]
+ \},
+ "title" : ""
+ \}
+ \}
+
+# Configuration
+
+The JSON export plugin recognizes the following configuration variables and
+changes its behaviour as they specify\.
+
+ - boolean *indented*
+
+ If this flag is set the plugin will break the generated JSON code across
+ lines and indent it according to its inner structure, with each key of a
+ dictionary on a separate line\.
+
+ If this flag is not set \(the default\), the whole JSON object will be written
+ on a single line, with minimum spacing between all elements\.
+
+ - boolean *aligned*
+
+ If this flag is set the generator ensures that the values for the keys in a
+ dictionary are vertically aligned with each other, for a nice table effect\.
+ To make this work this also implies that __indented__ is set\.
+
+ If this flag is not set \(the default\), the output is formatted as per the
+ value of __indented__, without trying to align the values for dictionary
+ keys\.
+
+*Note* that this plugin ignores the standard configuration variables
+__user__, __format__, __file__, and __map__ and their values\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[JSON](\.\./\.\./\.\./\.\./index\.md\#json),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[index](\.\./\.\./\.\./\.\./index\.md\#index),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_export_nroff.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_export_nroff.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_export_nroff.md
@@ -0,0 +1,215 @@
+
+[//000000001]: # (doctools::idx::export::nroff \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::export::nroff\(n\) 0\.3 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::export::nroff \- nroff export plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Configuration](#section3)
+
+ - [Keyword index serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::idx::export::nroff ?0\.3?
+package require doctools::text
+package require doctools::nroff::man\_macros
+
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools keyword index export plugin for the
+generation of nroff markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling keyword indices, especially
+__[doctools::idx::export](idx\_export\.md)__, the export manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::idx::export](idx\_export\.md)__ and the export
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the docidx
+export plugin API version 2\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ This command takes the canonical serialization of a keyword index, as
+ specified in section [Keyword index serialization format](#section4),
+ and contained in *serial*, the *configuration*, a dictionary, and
+ generates nroff markup encoding the index\. The created string is then
+ returned as the result of the command\.
+
+# Configuration
+
+The nroff export plugin recognizes the following configuration variables and
+changes its behaviour as they specify\.
+
+ - string *user*
+
+ This standard configuration variable contains the name of the user running
+ the process which invoked the export plugin\. The plugin puts this
+ information into the provenance comment at the beginning of the generated
+ document\.
+
+ - string *file*
+
+ This standard configuration variable contains the name of the file the index
+ came from\. This variable may not be set or contain the empty string\. The
+ plugin puts this information, if defined, i\.e\. set and not the empty string,
+ into the provenance comment at the beginning of the generated document\.
+
+ - boolean *inline*
+
+ If this flag is set \(default\) the plugin will place the definitions of the
+ man macro set directly into the output\.
+
+ If this flag is not set, the plugin will place a reference to the
+ definitions of the man macro set into the output, but not the macro
+ definitions themselves\.
+
+*Note* that this plugin ignores the standard configuration variables
+__format__, and __map__, and their values\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[index](\.\./\.\./\.\./\.\./index\.md\#index),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_export_text.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_export_text.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_export_text.md
@@ -0,0 +1,199 @@
+
+[//000000001]: # (doctools::idx::export::text \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::export::text\(n\) 0\.2 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::export::text \- plain text export plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Configuration](#section3)
+
+ - [Keyword index serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::idx::export::text ?0\.2?
+package require doctools::text
+
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools keyword index export plugin for the
+generation of plain text markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling keyword indices, especially
+__[doctools::idx::export](idx\_export\.md)__, the export manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::idx::export](idx\_export\.md)__ and the export
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the docidx
+export plugin API version 2\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ This command takes the canonical serialization of a keyword index, as
+ specified in section [Keyword index serialization format](#section4),
+ and contained in *serial*, the *configuration*, a dictionary, and
+ generates plain text markup encoding the index\. The created string is then
+ returned as the result of the command\.
+
+# Configuration
+
+The text export plugin recognizes the following configuration variables and
+changes its behaviour as they specify\.
+
+ - dictionary *map*
+
+ This standard configuration variable contains a dictionary mapping from the
+ symbolic files names in manpage references to the actual filenames and/or
+ urls to be used in the output\.
+
+ Url references and symbolic file names without a mapping are used unchanged\.
+
+*Note* that this plugin ignores the standard configuration variables
+__user__, __file__, and __format__, and their values\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[index](\.\./\.\./\.\./\.\./index\.md\#index), [plain
+text](\.\./\.\./\.\./\.\./index\.md\#plain\_text),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_export_wiki.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_export_wiki.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_export_wiki.md
@@ -0,0 +1,215 @@
+
+[//000000001]: # (doctools::idx::export::wiki \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::export::wiki\(n\) 0\.2 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::export::wiki \- wiki export plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Wiki markup](#section3)
+
+ - [Configuration](#section4)
+
+ - [Keyword index serialization format](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::idx::export::wiki ?0\.2?
+package require doctools::text
+
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools keyword index export plugin for the
+generation of wiki markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling keyword indices, especially
+__[doctools::idx::export](idx\_export\.md)__, the export manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::idx::export](idx\_export\.md)__ and the export
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the docidx
+export plugin API version 2\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ This command takes the canonical serialization of a keyword index, as
+ specified in section [Keyword index serialization format](#section5),
+ and contained in *serial*, the *configuration*, a dictionary, and
+ generates wiki markup encoding the index\. The created string is then
+ returned as the result of the command\.
+
+# Wiki markup
+
+The basic syntax of the wiki markup generated by this plugin are described at
+[http://wiki\.tcl\.tk/14](http://wiki\.tcl\.tk/14)\.
+
+The plugin goes beyond the classic markup to generate proper headers and either
+a table or indented list of the keywords and their references\.
+
+# Configuration
+
+The wiki export plugin recognizes the following configuration variables and
+changes its behaviour as they specify\.
+
+ - dictionary *map*
+
+ This standard configuration variable contains a dictionary mapping from the
+ symbolic files names in manpage references to the actual filenames and/or
+ urls to be used in the output\.
+
+ Url references and symbolic file names without a mapping are used unchanged\.
+
+ - enum *style*
+
+ This variable recognizes two values as legal, __list__ \(default\), and
+ __table__\. Depending on the value the plugin generates either a list\- or
+ table\-based wiki page for the index\.
+
+*Note* that this plugin ignores the standard configuration variables
+__user__, __file__ and __format__, and their values\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[index](\.\./\.\./\.\./\.\./index\.md\#index),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization),
+[wiki](\.\./\.\./\.\./\.\./index\.md\#wiki)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_import.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_import.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_import.md
@@ -0,0 +1,529 @@
+
+[//000000001]: # (doctools::idx::import \- Documentation tools)
+[//000000002]: # (Generated from file 'idx\_import\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009\-2018 Andreas Kupries )
+[//000000004]: # (doctools::idx::import\(n\) 0\.2 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::import \- Importing keyword indices
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Concepts](#section2)
+
+ - [API](#section3)
+
+ - [Package commands](#subsection1)
+
+ - [Object command](#subsection2)
+
+ - [Object methods](#subsection3)
+
+ - [Import plugin API v2 reference](#section4)
+
+ - [Keyword index serialization format](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require doctools::idx::import ?0\.2?
+package require Tcl 8\.4
+package require doctools::config
+package require doctools::idx::structure
+package require snit
+package require pluginmgr
+
+[__::doctools::idx::import__ *objectName*](#1)
+[__objectName__ __method__ ?*arg arg \.\.\.*?](#2)
+[*objectName* __destroy__](#3)
+[*objectName* __import text__ *text* ?*format*?](#4)
+[*objectName* __import file__ *path* ?*format*?](#5)
+[*objectName* __import object text__ *object* *text* ?*format*?](#6)
+[*objectName* __import object file__ *object* *path* ?*format*?](#7)
+[*objectName* __config names__](#8)
+[*objectName* __config get__](#9)
+[*objectName* __config set__ *name* ?*value*?](#10)
+[*objectName* __config unset__ *pattern*\.\.\.](#11)
+[*objectName* __includes__](#12)
+[*objectName* __include add__ *path*](#13)
+[*objectName* __include remove__ *path*](#14)
+[*objectName* __include clear__](#15)
+[__IncludeFile__ *currentfile* *path*](#16)
+[__[import](\.\./\.\./\.\./\.\./index\.md\#import)__ *text* *configuration*](#17)
+
+# DESCRIPTION
+
+This package provides a class to manage the plugins for the import of keyword
+indices from other formats, i\.e\. their conversion from, for example
+*[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)*,
+*[json](\.\./\.\./\.\./\.\./index\.md\#json)*, etc\.
+
+This is one of the three public pillars the management of keyword indices
+resides on\. The other two pillars are
+
+ 1. *[Exporting keyword indices](idx\_export\.md)*, and
+
+ 1. *[Holding keyword indices](idx\_container\.md)*
+
+For information about the [Concepts](#section2) of keyword indices, and
+their parts, see the same\-named section\. For information about the data
+structure which is the major output of the manager objects provided by this
+package see the section [Keyword index serialization format](#section5)\.
+
+The plugin system of our class is based on the package
+__[pluginmgr](\.\./pluginmgr/pluginmgr\.md)__, and configured to look for
+plugins using
+
+ 1. the environment variable __DOCTOOLS\_IDX\_IMPORT\_PLUGINS__,
+
+ 1. the environment variable __DOCTOOLS\_IDX\_PLUGINS__,
+
+ 1. the environment variable __DOCTOOLS\_PLUGINS__,
+
+ 1. the path "~/\.doctools/idx/import/plugin"
+
+ 1. the path "~/\.doctools/idx/plugin"
+
+ 1. the path "~/\.doctools/plugin"
+
+ 1. the path "~/\.doctools/idx/import/plugins"
+
+ 1. the path "~/\.doctools/idx/plugins"
+
+ 1. the path "~/\.doctools/plugins"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\IDX\\IMPORT\\PLUGINS"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\IDX\\PLUGINS"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\PLUGINS"
+
+The last three are used only when the package is run on a machine using
+Windows\(tm\) operating system\.
+
+The whole system is delivered with two predefined import plugins, namely
+
+ - docidx
+
+ See *[docidx import plugin](import\_docidx\.md)* for details\.
+
+ - json
+
+ See *json import plugin* for details\.
+
+Readers wishing to write their own import plugin for some format, i\.e\. *plugin
+writer*s reading and understanding the section containing the [Import plugin
+API v2 reference](#section4) is an absolute necessity, as it specifies the
+interaction between this package and its plugins in detail\.
+
+# Concepts
+
+ 1. A *[keyword index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index)* consists of a
+ \(possibly empty\) set of *[keywords](\.\./\.\./\.\./\.\./index\.md\#keywords)*\.
+
+ 1. Each keyword in the set is identified by its name\.
+
+ 1. Each keyword has a \(possibly empty\) set of *references*\.
+
+ 1. A reference can be associated with more than one keyword\.
+
+ 1. A reference not associated with at least one keyword is not possible
+ however\.
+
+ 1. Each reference is identified by its target, specified as either an url or
+ symbolic filename, depending on the type of reference \(__url__, or
+ __manpage__\)\.
+
+ 1. The type of a reference \(url, or manpage\) depends only on the reference
+ itself, and not the keywords it is associated with\.
+
+ 1. In addition to a type each reference has a descriptive label as well\. This
+ label depends only on the reference itself, and not the keywords it is
+ associated with\.
+
+A few notes
+
+ 1. Manpage references are intended to be used for references to the documents
+ the index is made for\. Their target is a symbolic file name identifying the
+ document, and export plugins may replace symbolic with actual file names,
+ if specified\.
+
+ 1. Url references are intended on the othre hand are inteded to be used for
+ links to anything else, like websites\. Their target is an url\.
+
+ 1. While url and manpage references share a namespace for their identifiers,
+ this should be no problem, given that manpage identifiers are symbolic
+ filenames and as such they should never look like urls, the identifiers for
+ url references\.
+
+# API
+
+## Package commands
+
+ - __::doctools::idx::import__ *objectName*
+
+ This command creates a new import manager object with an associated Tcl
+ command whose name is *objectName*\. This
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)* command is explained in full
+ detail in the sections [Object command](#subsection2) and [Object
+ methods](#subsection3)\. The object command will be created under the
+ current namespace if the *objectName* is not fully qualified, and in the
+ specified namespace otherwise\.
+
+## Object command
+
+All objects created by the __::doctools::idx::import__ command have the
+following general form:
+
+ - __objectName__ __method__ ?*arg arg \.\.\.*?
+
+ The method __method__ and its *arg*'uments determine the exact
+ behavior of the command\. See section [Object methods](#subsection3) for
+ the detailed specifications\.
+
+## Object methods
+
+ - *objectName* __destroy__
+
+ This method destroys the object it is invoked for\.
+
+ - *objectName* __import text__ *text* ?*format*?
+
+ This method takes the *text* and converts it from the specified *format*
+ to the canonical serialization of a keyword index using the import plugin
+ for the format\. An error is thrown if no plugin could be found for the
+ format\. The serialization generated by the conversion process is returned as
+ the result of this method\.
+
+ If no format is specified the method defaults to __docidx__\.
+
+ The specification of what a *canonical* serialization is can be found in
+ the section [Keyword index serialization format](#section5)\.
+
+ The plugin has to conform to the interface specified in section [Import
+ plugin API v2 reference](#section4)\.
+
+ - *objectName* __import file__ *path* ?*format*?
+
+ This method is a convenient wrapper around the __import text__ method
+ described by the previous item\. It reads the contents of the specified file
+ into memory, feeds the result into __import text__ and returns the
+ resulting serialization as its own result\.
+
+ - *objectName* __import object text__ *object* *text* ?*format*?
+
+ This method is a convenient wrapper around the __import text__ method
+ described by the previous item\. It expects that *object* is an object
+ command supporting a __deserialize__ method expecting the canonical
+ serialization of a keyword index\. It imports the text using __import
+ text__ and then feeds the resulting serialization into the *object* via
+ __deserialize__\. This method returns the empty string as it result\.
+
+ - *objectName* __import object file__ *object* *path* ?*format*?
+
+ This method behaves like __import object text__, except that it reads
+ the text to convert from the specified file instead of being given it as
+ argument\.
+
+ - *objectName* __config names__
+
+ This method returns a list containing the names of all configuration
+ variables currently known to the object\.
+
+ - *objectName* __config get__
+
+ This method returns a dictionary containing the names and values of all
+ configuration variables currently known to the object\.
+
+ - *objectName* __config set__ *name* ?*value*?
+
+ This method sets the configuration variable *name* to the specified
+ *value* and returns the new value of the variable\.
+
+ If no value is specified it simply returns the current value, without
+ changing it\.
+
+ Note that while the user can set the predefined configuration variables
+ __user__ and __format__ doing so will have no effect, these values
+ will be internally overridden when invoking an import plugin\.
+
+ - *objectName* __config unset__ *pattern*\.\.\.
+
+ This method unsets all configuration variables matching the specified glob
+ *pattern*s\. If no pattern is specified it will unset all currently defined
+ configuration variables\.
+
+ - *objectName* __includes__
+
+ This method returns a list containing the currently specified paths to use
+ to search for include files when processing input\. The order of paths in the
+ list corresponds to the order in which they are used, from first to last,
+ and also corresponds to the order in which they were added to the object\.
+
+ - *objectName* __include add__ *path*
+
+ This methods adds the specified *path* to the list of paths to use to
+ search for include files when processing input\. The path is added to the end
+ of the list, causing it to be searched after all previously added paths\. The
+ result of the command is the empty string\.
+
+ The method does nothing if the path is already known\.
+
+ - *objectName* __include remove__ *path*
+
+ This methods removes the specified *path* from the list of paths to use to
+ search for include files when processing input\. The result of the command is
+ the empty string\.
+
+ The method does nothing if the path is not known\.
+
+ - *objectName* __include clear__
+
+ This method clears the list of paths to use to search for include files when
+ processing input\. The result of the command is the empty string\.
+
+# Import plugin API v2 reference
+
+Plugins are what this package uses to manage the support for any input format
+beyond the [Keyword index serialization format](#section5)\. Here we specify
+the API the objects created by this package use to interact with their plugins\.
+
+A plugin for this package has to follow the rules listed below:
+
+ 1. A plugin is a package\.
+
+ 1. The name of a plugin package has the form
+ doctools::idx::import::__FOO__, where __FOO__ is the name of the
+ format the plugin will generate output for\. This name is also the argument
+ to provide to the various __import__ methods of import manager objects
+ to get a string encoding a keyword index in that format\.
+
+ 1. The plugin can expect that the package
+ __doctools::idx::export::plugin__ is present, as indicator that it was
+ invoked from a genuine plugin manager\.
+
+ 1. The plugin can expect that a command named __IncludeFile__ is present,
+ with the signature
+
+ - __IncludeFile__ *currentfile* *path*
+
+ This command has to be invoked by the plugin when it has to process an
+ included file, if the format has the concept of such\. An example of
+ such a format would be *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)*\.
+
+ The plugin has to supply the following arguments
+
+ * string *currentfile*
+
+ The path of the file it is currently processing\. This may be the
+ empty string if no such is known\.
+
+ * string *path*
+
+ The path of the include file as specified in the include directive
+ being processed\.
+
+ The result of the command will be a 5\-element list containing
+
+ A boolean flag indicating the success \(__True__\) or failure
+ \(__False__\) of the operation\.
+
+ In case of success the contents of the included file, and the empty
+ string otherwise\.
+
+ The resolved, i\.e\. absolute path of the included file, if possible, or
+ the unchanged *path* argument\. This is for display in an error
+ message, or as the *currentfile* argument of another call to
+ __IncludeFile__ should this file contain more files\.
+
+ In case of success an empty string, and for failure a code indicating
+ the reason for it, one of
+
+ * notfound
+
+ The specified file could not be found\.
+
+ * notread
+
+ The specified file was found, but not be read into memory\.
+
+ An empty string in case of success of a __notfound__ failure, and
+ an additional error message describing the reason for a __notread__
+ error in more detail\.
+
+ 1. A plugin has to provide one command, with the signature shown below\.
+
+ - __[import](\.\./\.\./\.\./\.\./index\.md\#import)__ *text* *configuration*
+
+ Whenever an import manager of
+ __[doctools::idx](idx\_container\.md)__ has to parse input for an
+ index it will invoke this command\.
+
+ * string *text*
+
+ This argument will contain the text encoding the index per the
+ format the plugin is for\.
+
+ * dictionary *configuration*
+
+ This argument will contain the current configuration to apply to
+ the parsing, as a dictionary mapping from variable names to values\.
+
+ The following configuration variables have a predefined meaning all
+ plugins have to obey, although they can ignore this information at
+ their discretion\. Any other other configuration variables
+ recognized by a plugin will be described in the manpage for that
+ plugin\.
+
+ + user
+
+ This variable is expected to contain the name of the user
+ owning the process invoking the plugin\.
+
+ + format
+
+ This variable is expected to contain the name of the format
+ whose plugin is invoked\.
+
+ 1. A single usage cycle of a plugin consists of the invokations of the command
+ __[import](\.\./\.\./\.\./\.\./index\.md\#import)__\. This call has to leave
+ the plugin in a state where another usage cycle can be run without
+ problems\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation),
+[import](\.\./\.\./\.\./\.\./index\.md\#import),
+[index](\.\./\.\./\.\./\.\./index\.md\#index), [json](\.\./\.\./\.\./\.\./index\.md\#json),
+[keyword index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[parsing](\.\./\.\./\.\./\.\./index\.md\#parsing),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin),
+[reference](\.\./\.\./\.\./\.\./index\.md\#reference),
+[url](\.\./\.\./\.\./\.\./index\.md\#url)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009\-2018 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_import_json.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_import_json.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_import_json.md
@@ -0,0 +1,232 @@
+
+[//000000001]: # (doctools::idx::import::json \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::import::json\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::import::json \- JSON import plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [JSON notation of keyword indices](#section3)
+
+ - [Keyword index serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::idx::import::json ?0\.1?
+package require doctools::idx::structure
+package require json
+
+[__[import](\.\./\.\./\.\./\.\./index\.md\#import)__ *string* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools keyword index import plugin for the parsing
+of JSON markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling keyword indices, especially
+__[doctools::idx::import](idx\_import\.md)__, the import manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::idx::import](idx\_import\.md)__ and the import
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the docidx
+import plugin API version 2\.
+
+ - __[import](\.\./\.\./\.\./\.\./index\.md\#import)__ *string* *configuration*
+
+ This command takes the *string* and parses it as JSON markup encoding a
+ keyword index, in the context of the specified *configuration* \(a
+ dictionary\)\. The result of the command is the canonical serialization of
+ that keyword index, in the form specified in section [Keyword index
+ serialization format](#section4)\.
+
+# JSON notation of keyword indices
+
+The JSON format used for keyword indices is a direct translation of the
+[Keyword index serialization format](#section4), mapping Tcl dictionaries
+as JSON objects and Tcl lists as JSON arrays\. For example, the Tcl serialization
+
+ doctools::idx \{
+ label \{Keyword Index\}
+ keywords \{
+ changelog \{changelog\.man cvs\.man\}
+ conversion \{doctools\.man docidx\.man doctoc\.man apps/dtplite\.man mpexpand\.man\}
+ cvs cvs\.man
+ \}
+ references \{
+ apps/dtplite\.man \{manpage dtplite\}
+ changelog\.man \{manpage doctools::changelog\}
+ cvs\.man \{manpage doctools::cvs\}
+ docidx\.man \{manpage doctools::idx\}
+ doctoc\.man \{manpage doctools::toc\}
+ doctools\.man \{manpage doctools\}
+ mpexpand\.man \{manpage mpexpand\}
+ \}
+ title \{\}
+ \}
+
+is equivalent to the JSON string
+
+ \{
+ "doctools::idx" : \{
+ "label" : "Keyword Index",
+ "keywords" : \{
+ "changelog" : \["changelog\.man","cvs\.man"\],
+ "conversion" : \["doctools\.man","docidx\.man","doctoc\.man","apps\\/dtplite\.man","mpexpand\.man"\],
+ "cvs" : \["cvs\.man"\],
+ \},
+ "references" : \{
+ "apps\\/dtplite\.man" : \["manpage","dtplite"\],
+ "changelog\.man" : \["manpage","doctools::changelog"\],
+ "cvs\.man" : \["manpage","doctools::cvs"\],
+ "docidx\.man" : \["manpage","doctools::idx"\],
+ "doctoc\.man" : \["manpage","doctools::toc"\],
+ "doctools\.man" : \["manpage","doctools"\],
+ "mpexpand\.man" : \["manpage","mpexpand"\]
+ \},
+ "title" : ""
+ \}
+ \}
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[JSON](\.\./\.\./\.\./\.\./index\.md\#json),
+[deserialization](\.\./\.\./\.\./\.\./index\.md\#deserialization),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[import](\.\./\.\./\.\./\.\./index\.md\#import),
+[index](\.\./\.\./\.\./\.\./index\.md\#index)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_introduction.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_introduction.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_introduction.md
@@ -0,0 +1,207 @@
+
+[//000000001]: # (doctools2idx\_introduction \- Documentation tools)
+[//000000002]: # (Generated from file 'idx\_introduction\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools2idx\_introduction\(n\) 2\.0 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools2idx\_introduction \- DocTools \- Keyword indices
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Description](#section1)
+
+ - [Related formats](#section2)
+
+ - [Package Overview](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [See Also](#seealso)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# DESCRIPTION
+
+*[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* \(short for *documentation
+indices*\) stands for a set of related, yet different, entities which are
+working together for the easy creation and transformation of keyword indices for
+documentation\.
+
+These are
+
+ 1. A tcl based language for the semantic markup of a keyword index\. Markup is
+ represented by Tcl commands\. Beginners should start with the *[docidx
+ language introduction](\.\./doctools/docidx\_lang\_intro\.md)*\. The formal
+ specification is split over two documents, one dealing with the *[docidx
+ language syntax](\.\./doctools/docidx\_lang\_syntax\.md)*, the other a
+ *[docidx language command
+ reference](\.\./doctools/docidx\_lang\_cmdref\.md)*\.
+
+ 1. A set of packages for the programmatic manipulation of keyword indices in
+ memory, and their conversion between various formats, reading and writing\.
+ The aforementioned markup language is one of the formats which can be both
+ read from and written to\.
+
+ 1. The system for the conversion of indices is based on a plugin mechanism,
+ for this we have two APIs describing the interface between the packages
+ above and the import/export plugins\.
+
+Which of the more detailed documents are relevant to the reader of this
+introduction depends on their role in the documentation process\.
+
+ 1. A *writer* of documentation has to understand the markup language itself\.
+ A beginner to docidx should read the more informally written *[docidx
+ language introduction](\.\./doctools/docidx\_lang\_intro\.md)* first\. Having
+ digested this the formal *[docidx language
+ syntax](\.\./doctools/docidx\_lang\_syntax\.md)* specification should become
+ understandable\. A writer experienced with docidx may only need the
+ *[docidx language command
+ reference](\.\./doctools/docidx\_lang\_cmdref\.md)* from time to time to
+ refresh her memory\.
+
+ While a document is written the __dtp__ application can be used to
+ validate it, and after completion it also performs the conversion into the
+ chosen system of visual markup, be it \*roff, HTML, plain text, wiki, etc\.
+ The simpler __[dtplite](\.\./\.\./apps/dtplite\.md)__ application makes
+ internal use of docidx when handling directories of documentation,
+ automatically generating a proper keyword index for them\.
+
+ 1. A *processor* of documentation written in the
+ *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* markup language has to know
+ which tools are available for use\.
+
+ The main tool is the aforementioned __dtp__ application provided by
+ Tcllib\. The simpler __[dtplite](\.\./\.\./apps/dtplite\.md)__ does not
+ expose docidx to the user\. At the bottom level, common to both
+ applications, however we find the three packages providing the basic
+ facilities to handle keyword indices, i\.e\. import from textual formats,
+ programmatic manipulation in memory, and export to textual formats\. These
+ are
+
+ - __[doctools::idx](idx\_container\.md)__
+
+ Programmatic manipulation of keyword indices in memory\.
+
+ - __[doctools::idx::import](idx\_import\.md)__
+
+ Import of keyword indices from various textual formats\. The set of
+ supported formats is extensible through plugin packages\.
+
+ - __[doctools::idx::export](idx\_export\.md)__
+
+ Export of keyword indices to various textual formats\. The set of
+ supported formats is extensible through plugin packages\.
+
+ See also section [Package Overview](#section3) for an overview of the
+ dependencies between these and other, supporting packages\.
+
+ 1. At last, but not least, *plugin writers* have to understand the
+ interaction between the import and export packages and their plugins\. These
+ APIs are described in the documentation for the two relevant packages, i\.e\.
+
+ - __[doctools::idx::import](idx\_import\.md)__
+
+ - __[doctools::idx::export](idx\_export\.md)__
+
+# Related formats
+
+The docidx format does not stand alone, it has two companion formats\. These are
+called *[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)* and
+*[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools)*, and they are intended for the
+markup of *tables of contents*, and of general documentation, respectively\.
+They are described in their own sets of documents, starting at the *DocTools \-
+Tables Of Contents* and the *DocTools \- General*, respectively\.
+
+# Package Overview
+
+ ~~~~~~~~~~~ doctools::idx ~~~~~~~~~~~
+ ~~ | ~~
+ doctools::idx::export ~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~ doctools::idx::import
+ | | |
+ \+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\+ | \+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\+
+ | | | | | | | | |
+ doctools::config = | | | = doctools::include doctools::config doctools::paths
+ | | | | |
+ doctools::idx::export::<\*> | | | doctools::idx::import::<\*>
+ docidx | | | docidx, json
+ json | | | | \\\\
+ html | | | doctools::idx::parse \\\\
+ nroff | | | | \\\\
+ wiki | | | \+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\+ json
+ text | | | | |
+ doctools::idx::structure |
+ |
+ \+\-\-\-\-\-\-\-\+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\+
+ | |
+ doctools::html doctools::html::cssdefaults doctools::tcl::parse doctools::msgcat
+ | |
+ doctools::text doctools::nroff::man\_macros =
+ |
+ doctools::msgcat::idx::<\*>
+ c, en, de, fr
+ \(fr == en for now\)
+ ~~ Interoperable objects, without actual package dependencies
+ \-\- Package dependency, higher requires lower package
+ = Dynamic dependency through plugin system
+ <\*> Multiple packages following the given form of naming\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# SEE ALSO
+
+[docidx\_intro](\.\./doctools/docidx\_intro\.md),
+[doctoc\_intro](\.\./doctools/doctoc\_intro\.md),
+[doctools](\.\./doctools/doctools\.md), doctools2doc\_introduction,
+[doctools2toc\_introduction](\.\./doctools2toc/toc\_introduction\.md),
+[doctools\_lang\_cmdref](\.\./doctools/doctools\_lang\_cmdref\.md),
+[doctools\_lang\_faq](\.\./doctools/doctools\_lang\_faq\.md),
+[doctools\_lang\_intro](\.\./doctools/doctools\_lang\_intro\.md),
+[doctools\_lang\_syntax](\.\./doctools/doctools\_lang\_syntax\.md),
+[doctools\_plugin\_apiref](\.\./doctools/doctools\_plugin\_apiref\.md)
+
+# KEYWORDS
+
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion),
+[formatting](\.\./\.\./\.\./\.\./index\.md\#formatting),
+[index](\.\./\.\./\.\./\.\./index\.md\#index), [keyword
+index](\.\./\.\./\.\./\.\./index\.md\#keyword\_index),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[parsing](\.\./\.\./\.\./\.\./index\.md\#parsing),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin), [semantic
+markup](\.\./\.\./\.\./\.\./index\.md\#semantic\_markup)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_c.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_c.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_c.md
@@ -0,0 +1,101 @@
+
+[//000000001]: # (doctools::msgcat::idx::c \- Documentation tools)
+[//000000002]: # (Generated from file 'msgcat\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::msgcat::idx::c\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::msgcat::idx::c \- Message catalog for the docidx parser \(C\)
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require msgcat
+package require doctools::msgcat::idx::c ?0\.1?
+
+# DESCRIPTION
+
+The package __doctools::msgcat::idx::c__ is a support module providing the C
+language message catalog for the docidx parser in the doctools system version 2\.
+As such it is an internal package a regular user \(developer\) should not be in
+direct contact with\.
+
+If you are such please go the documentation of either
+
+ 1. __doctools::doc__,
+
+ 1. __[doctools::toc](\.\./doctools/doctoc\.md)__, or
+
+ 1. __[doctools::idx](idx\_container\.md)__
+
+Within the system architecture this package resides under the package
+__[doctools::msgcat](\.\./doctools2base/tcllib\_msgcat\.md)__ providing the
+general message catalog management within the system\. *Note* that there is
+*no* explicit dependency between the manager and catalog packages\. The catalog
+is a plugin which is selected and loaded dynamically\.
+
+# API
+
+This package has no exported API\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[C](\.\./\.\./\.\./\.\./index\.md\#c), [catalog
+package](\.\./\.\./\.\./\.\./index\.md\#catalog\_package),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[i18n](\.\./\.\./\.\./\.\./index\.md\#i18n),
+[internationalization](\.\./\.\./\.\./\.\./index\.md\#internationalization),
+[l10n](\.\./\.\./\.\./\.\./index\.md\#l10n),
+[localization](\.\./\.\./\.\./\.\./index\.md\#localization), [message
+catalog](\.\./\.\./\.\./\.\./index\.md\#message\_catalog), [message
+package](\.\./\.\./\.\./\.\./index\.md\#message\_package)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_de.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_de.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_de.md
@@ -0,0 +1,101 @@
+
+[//000000001]: # (doctools::msgcat::idx::de \- Documentation tools)
+[//000000002]: # (Generated from file 'msgcat\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::msgcat::idx::de\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::msgcat::idx::de \- Message catalog for the docidx parser \(DE\)
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require msgcat
+package require doctools::msgcat::idx::de ?0\.1?
+
+# DESCRIPTION
+
+The package __doctools::msgcat::idx::de__ is a support module providing the
+DE \(german\) language message catalog for the docidx parser in the doctools
+system version 2\. As such it is an internal package a regular user \(developer\)
+should not be in direct contact with\.
+
+If you are such please go the documentation of either
+
+ 1. __doctools::doc__,
+
+ 1. __[doctools::toc](\.\./doctools/doctoc\.md)__, or
+
+ 1. __[doctools::idx](idx\_container\.md)__
+
+Within the system architecture this package resides under the package
+__[doctools::msgcat](\.\./doctools2base/tcllib\_msgcat\.md)__ providing the
+general message catalog management within the system\. *Note* that there is
+*no* explicit dependency between the manager and catalog packages\. The catalog
+is a plugin which is selected and loaded dynamically\.
+
+# API
+
+This package has no exported API\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[DE](\.\./\.\./\.\./\.\./index\.md\#de), [catalog
+package](\.\./\.\./\.\./\.\./index\.md\#catalog\_package),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[i18n](\.\./\.\./\.\./\.\./index\.md\#i18n),
+[internationalization](\.\./\.\./\.\./\.\./index\.md\#internationalization),
+[l10n](\.\./\.\./\.\./\.\./index\.md\#l10n),
+[localization](\.\./\.\./\.\./\.\./index\.md\#localization), [message
+catalog](\.\./\.\./\.\./\.\./index\.md\#message\_catalog), [message
+package](\.\./\.\./\.\./\.\./index\.md\#message\_package)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_en.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_en.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_en.md
@@ -0,0 +1,101 @@
+
+[//000000001]: # (doctools::msgcat::idx::en \- Documentation tools)
+[//000000002]: # (Generated from file 'msgcat\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::msgcat::idx::en\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::msgcat::idx::en \- Message catalog for the docidx parser \(EN\)
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require msgcat
+package require doctools::msgcat::idx::en ?0\.1?
+
+# DESCRIPTION
+
+The package __doctools::msgcat::idx::en__ is a support module providing the
+EN \(english\) language message catalog for the docidx parser in the doctools
+system version 2\. As such it is an internal package a regular user \(developer\)
+should not be in direct contact with\.
+
+If you are such please go the documentation of either
+
+ 1. __doctools::doc__,
+
+ 1. __[doctools::toc](\.\./doctools/doctoc\.md)__, or
+
+ 1. __[doctools::idx](idx\_container\.md)__
+
+Within the system architecture this package resides under the package
+__[doctools::msgcat](\.\./doctools2base/tcllib\_msgcat\.md)__ providing the
+general message catalog management within the system\. *Note* that there is
+*no* explicit dependency between the manager and catalog packages\. The catalog
+is a plugin which is selected and loaded dynamically\.
+
+# API
+
+This package has no exported API\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[EN](\.\./\.\./\.\./\.\./index\.md\#en), [catalog
+package](\.\./\.\./\.\./\.\./index\.md\#catalog\_package),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[i18n](\.\./\.\./\.\./\.\./index\.md\#i18n),
+[internationalization](\.\./\.\./\.\./\.\./index\.md\#internationalization),
+[l10n](\.\./\.\./\.\./\.\./index\.md\#l10n),
+[localization](\.\./\.\./\.\./\.\./index\.md\#localization), [message
+catalog](\.\./\.\./\.\./\.\./index\.md\#message\_catalog), [message
+package](\.\./\.\./\.\./\.\./index\.md\#message\_package)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_fr.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_fr.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_msgcat_fr.md
@@ -0,0 +1,101 @@
+
+[//000000001]: # (doctools::msgcat::idx::fr \- Documentation tools)
+[//000000002]: # (Generated from file 'msgcat\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::msgcat::idx::fr\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::msgcat::idx::fr \- Message catalog for the docidx parser \(FR\)
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Bugs, Ideas, Feedback](#section3)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require msgcat
+package require doctools::msgcat::idx::fr ?0\.1?
+
+# DESCRIPTION
+
+The package __doctools::msgcat::idx::fr__ is a support module providing the
+FR \(french\) language message catalog for the docidx parser in the doctools
+system version 2\. As such it is an internal package a regular user \(developer\)
+should not be in direct contact with\.
+
+If you are such please go the documentation of either
+
+ 1. __doctools::doc__,
+
+ 1. __[doctools::toc](\.\./doctools/doctoc\.md)__, or
+
+ 1. __[doctools::idx](idx\_container\.md)__
+
+Within the system architecture this package resides under the package
+__[doctools::msgcat](\.\./doctools2base/tcllib\_msgcat\.md)__ providing the
+general message catalog management within the system\. *Note* that there is
+*no* explicit dependency between the manager and catalog packages\. The catalog
+is a plugin which is selected and loaded dynamically\.
+
+# API
+
+This package has no exported API\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[FR](\.\./\.\./\.\./\.\./index\.md\#fr), [catalog
+package](\.\./\.\./\.\./\.\./index\.md\#catalog\_package),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[i18n](\.\./\.\./\.\./\.\./index\.md\#i18n),
+[internationalization](\.\./\.\./\.\./\.\./index\.md\#internationalization),
+[l10n](\.\./\.\./\.\./\.\./index\.md\#l10n),
+[localization](\.\./\.\./\.\./\.\./index\.md\#localization), [message
+catalog](\.\./\.\./\.\./\.\./index\.md\#message\_catalog), [message
+package](\.\./\.\./\.\./\.\./index\.md\#message\_package)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_parse.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_parse.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_parse.md
@@ -0,0 +1,308 @@
+
+[//000000001]: # (doctools::idx::parse \- Documentation tools)
+[//000000002]: # (Generated from file 'idx\_parse\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::parse\(n\) 1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::parse \- Parsing text in docidx format
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Parse errors](#section3)
+
+ - [\[docidx\] notation of keyword indices](#section4)
+
+ - [Keyword index serialization format](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require doctools::idx::parse ?0\.1?
+package require Tcl 8\.4
+package require doctools::idx::structure
+package require doctools::msgcat
+package require doctools::tcl::parse
+package require fileutil
+package require logger
+package require snit
+package require struct::list
+package require struct::stack
+
+[__::doctools::idx::parse__ __text__ *text*](#1)
+[__::doctools::idx::parse__ __file__ *path*](#2)
+[__::doctools::idx::parse__ __includes__](#3)
+[__::doctools::idx::parse__ __include add__ *path*](#4)
+[__::doctools::idx::parse__ __include remove__ *path*](#5)
+[__::doctools::idx::parse__ __include clear__](#6)
+[__::doctools::idx::parse__ __vars__](#7)
+[__::doctools::idx::parse__ __var set__ *name* *value*](#8)
+[__::doctools::idx::parse__ __var unset__ *name*](#9)
+[__::doctools::idx::parse__ __var clear__ ?*pattern*?](#10)
+
+# DESCRIPTION
+
+This package provides commands to parse text written in the
+*[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* markup language and convert it
+into the canonical serialization of the keyword index encoded in the text\. See
+the section [Keyword index serialization format](#section5) for
+specification of their format\.
+
+This is an internal package of doctools, for use by the higher level packages
+handling *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* documents\.
+
+# API
+
+ - __::doctools::idx::parse__ __text__ *text*
+
+ The command takes the string contained in *text* and parses it under the
+ assumption that it contains a document written using the
+ *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* markup language\. An error is
+ thrown if this assumption is found to be false\. The format of these errors
+ is described in section [Parse errors](#section3)\.
+
+ When successful the command returns the canonical serialization of the
+ keyword index which was encoded in the text\. See the section [Keyword index
+ serialization format](#section5) for specification of that format\.
+
+ - __::doctools::idx::parse__ __file__ *path*
+
+ The same as __text__, except that the text to parse is read from the
+ file specified by *path*\.
+
+ - __::doctools::idx::parse__ __includes__
+
+ This method returns the current list of search paths used when looking for
+ include files\.
+
+ - __::doctools::idx::parse__ __include add__ *path*
+
+ This method adds the *path* to the list of paths searched when looking for
+ an include file\. The call is ignored if the path is already in the list of
+ paths\. The method returns the empty string as its result\.
+
+ - __::doctools::idx::parse__ __include remove__ *path*
+
+ This method removes the *path* from the list of paths searched when
+ looking for an include file\. The call is ignored if the path is not
+ contained in the list of paths\. The method returns the empty string as its
+ result\.
+
+ - __::doctools::idx::parse__ __include clear__
+
+ This method clears the list of search paths for include files\.
+
+ - __::doctools::idx::parse__ __vars__
+
+ This method returns a dictionary containing the current set of predefined
+ variables known to the __vset__ markup command during processing\.
+
+ - __::doctools::idx::parse__ __var set__ *name* *value*
+
+ This method adds the variable *name* to the set of predefined variables
+ known to the __vset__ markup command during processing, and gives it the
+ specified *value*\. The method returns the empty string as its result\.
+
+ - __::doctools::idx::parse__ __var unset__ *name*
+
+ This method removes the variable *name* from the set of predefined
+ variables known to the __vset__ markup command during processing\. The
+ method returns the empty string as its result\.
+
+ - __::doctools::idx::parse__ __var clear__ ?*pattern*?
+
+ This method removes all variables matching the *pattern* from the set of
+ predefined variables known to the __vset__ markup command during
+ processing\. The method returns the empty string as its result\.
+
+ The pattern matching is done with __string match__, and the default
+ pattern used when none is specified, is __\*__\.
+
+# Parse errors
+
+The format of the parse error messages thrown when encountering violations of
+the *[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* markup syntax is human
+readable and not intended for processing by machines\. As such it is not
+documented\.
+
+*However*, the errorCode attached to the message is machine\-readable and has
+the following format:
+
+ 1. The error code will be a list, each element describing a single error found
+ in the input\. The list has at least one element, possibly more\.
+
+ 1. Each error element will be a list containing six strings describing an
+ error in detail\. The strings will be
+
+ 1) The path of the file the error occurred in\. This may be empty\.
+
+ 1) The range of the token the error was found at\. This range is a
+ two\-element list containing the offset of the first and last character
+ in the range, counted from the beginning of the input \(file\)\. Offsets
+ are counted from zero\.
+
+ 1) The line the first character after the error is on\. Lines are counted
+ from one\.
+
+ 1) The column the first character after the error is at\. Columns are
+ counted from zero\.
+
+ 1) The message code of the error\. This value can be used as argument to
+ __msgcat::mc__ to obtain a localized error message, assuming that
+ the application had a suitable call of __doctools::msgcat::init__
+ to initialize the necessary message catalogs \(See package
+ __[doctools::msgcat](\.\./doctools2base/tcllib\_msgcat\.md)__\)\.
+
+ 1) A list of details for the error, like the markup command involved\. In
+ the case of message code __docidx/include/syntax__ this value is
+ the set of errors found in the included file, using the format
+ described here\.
+
+# \[docidx\] notation of keyword indices
+
+The docidx format for keyword indices, also called the *docidx markup
+language*, is too large to be covered in single section\. The interested reader
+should start with the document
+
+ 1. *[docidx language introduction](\.\./doctools/docidx\_lang\_intro\.md)*
+
+and then proceed from there to the formal specifications, i\.e\. the documents
+
+ 1. *[docidx language syntax](\.\./doctools/docidx\_lang\_syntax\.md)* and
+
+ 1. *[docidx language command
+ reference](\.\./doctools/docidx\_lang\_cmdref\.md)*\.
+
+to get a thorough understanding of the language\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[lexer](\.\./\.\./\.\./\.\./index\.md\#lexer),
+[parser](\.\./\.\./\.\./\.\./index\.md\#parser)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/idx_structure.md
Index: embedded/md/tcllib/files/modules/doctools2idx/idx_structure.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/idx_structure.md
@@ -0,0 +1,234 @@
+
+[//000000001]: # (doctools::idx::structure \- Documentation tools)
+[//000000002]: # (Generated from file 'idx\_structure\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::structure\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::structure \- Docidx serialization utilities
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Keyword index serialization format](#section3)
+
+ - [Bugs, Ideas, Feedback](#section4)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require doctools::idx::structure ?0\.1?
+package require Tcl 8\.4
+package require logger
+package require snit
+
+[__::doctools::idx::structure__ __verify__ *serial* ?*canonvar*?](#1)
+[__::doctools::idx::structure__ __verify\-as\-canonical__ *serial*](#2)
+[__::doctools::idx::structure__ __canonicalize__ *serial*](#3)
+[__::doctools::idx::structure__ __print__ *serial*](#4)
+[__::doctools::idx::structure__ __merge__ *seriala* *serialb*](#5)
+
+# DESCRIPTION
+
+This package provides commands to work with the serializations of keyword
+indices as managed by the doctools system v2, and specified in section [Keyword
+index serialization format](#section3)\.
+
+This is an internal package of doctools, for use by the higher level packages
+handling keyword indices and their conversion into and out of various other
+formats, like documents written using
+*[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx)* markup\.
+
+# API
+
+ - __::doctools::idx::structure__ __verify__ *serial* ?*canonvar*?
+
+ This command verifies that the content of *serial* is a valid *regular*
+ serialization of a keyword index and will throw an error if that is not the
+ case\. The result of the command is the empty string\.
+
+ If the argument *canonvar* is specified it is interpreted as the name of a
+ variable in the calling context\. This variable will be written to if and
+ only if *serial* is a valid regular serialization\. Its value will be a
+ boolean, with __True__ indicating that the serialization is not only
+ valid, but also *canonical*\. __False__ will be written for a valid,
+ but non\-canonical serialization\.
+
+ For the specification of regular and canonical keyword index serializations
+ see the section [Keyword index serialization format](#section3)\.
+
+ - __::doctools::idx::structure__ __verify\-as\-canonical__ *serial*
+
+ This command verifies that the content of *serial* is a valid
+ *canonical* serialization of a keyword index and will throw an error if
+ that is not the case\. The result of the command is the empty string\.
+
+ For the specification of canonical keyword index serializations see the
+ section [Keyword index serialization format](#section3)\.
+
+ - __::doctools::idx::structure__ __canonicalize__ *serial*
+
+ This command assumes that the content of *serial* is a valid *regular*
+ serialization of a keyword index and will throw an error if that is not the
+ case\.
+
+ It will then convert the input into the *canonical* serialization of the
+ contained keyword index and return it as its result\. If the input is already
+ canonical it will be returned unchanged\.
+
+ For the specification of regular and canonical keyword index serializations
+ see the section [Keyword index serialization format](#section3)\.
+
+ - __::doctools::idx::structure__ __print__ *serial*
+
+ This command assumes that the argument *serial* contains a valid regular
+ serialization of a keyword index and returns a string containing that index
+ in a human readable form\.
+
+ The exact format of this form is not specified and cannot be relied on for
+ parsing or other machine\-based activities\.
+
+ For the specification of regular keyword index serializations see the
+ section [Keyword index serialization format](#section3)\.
+
+ - __::doctools::idx::structure__ __merge__ *seriala* *serialb*
+
+ This command accepts the regular serializations of two keyword indices and
+ uses them to create their union\. The result of the command is the canonical
+ serialization of this unified keyword index\.
+
+ Title and label of the resulting index are taken from the index contained in
+ *serialb*\. The set of keys, references and their connections is the union
+ of the set of keys and references of the two inputs\.
+
+ For the specification of regular and canonical keyword index serializations
+ see the section [Keyword index serialization format](#section3)\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[deserialization](\.\./\.\./\.\./\.\./index\.md\#deserialization),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2idx/import_docidx.md
Index: embedded/md/tcllib/files/modules/doctools2idx/import_docidx.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2idx/import_docidx.md
@@ -0,0 +1,211 @@
+
+[//000000001]: # (doctools::idx::import::docidx \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::idx::import::docidx\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::idx::import::docidx \- docidx import plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [\[docidx\] notation of keyword indices](#section3)
+
+ - [Keyword index serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::idx::import::docidx ?0\.1?
+package require doctools::idx::parse
+package require doctools::idx::structure
+package require doctools::msgcat
+package require doctools::tcl::parse
+package require fileutil
+package require logger
+package require snit
+package require struct::list
+package require struct::set
+package require struct::stack
+package require struct::tree
+package require treeql
+
+[__[import](\.\./\.\./\.\./\.\./index\.md\#import)__ *string* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools keyword index import plugin for the parsing
+of docidx markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling keyword indices, especially
+__[doctools::idx::import](idx\_import\.md)__, the import manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::idx::import](idx\_import\.md)__ and the import
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the docidx
+import plugin API version 2\.
+
+ - __[import](\.\./\.\./\.\./\.\./index\.md\#import)__ *string* *configuration*
+
+ This command takes the *string* and parses it as docidx markup encoding a
+ keyword index, in the context of the specified *configuration* \(a
+ dictionary\)\. The result of the command is the canonical serialization of
+ that keyword index, in the form specified in section [Keyword index
+ serialization format](#section4)\.
+
+# \[docidx\] notation of keyword indices
+
+The docidx format for keyword indices, also called the *docidx markup
+language*, is too large to be covered in single section\. The interested reader
+should start with the document
+
+ 1. *[docidx language introduction](\.\./doctools/docidx\_lang\_intro\.md)*
+
+and then proceed from there to the formal specifications, i\.e\. the documents
+
+ 1. *[docidx language syntax](\.\./doctools/docidx\_lang\_syntax\.md)* and
+
+ 1. *[docidx language command
+ reference](\.\./doctools/docidx\_lang\_cmdref\.md)*\.
+
+to get a thorough understanding of the language\.
+
+# Keyword index serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize keyword
+indices as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+keyword index may have more than one regular serialization only exactly one of
+them will be *canonical*\.
+
+ - regular serialization
+
+ An index serialization is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::idx__, and its value\.
+ This value holds the contents of the index\.
+
+ The contents of the index are a Tcl dictionary holding the title of the
+ index, a label, and the keywords and references\. The relevant keys and their
+ values are
+
+ * __title__
+
+ The value is a string containing the title of the index\.
+
+ * __label__
+
+ The value is a string containing a label for the index\.
+
+ * __keywords__
+
+ The value is a Tcl dictionary, using the keywords known to the
+ index as keys\. The associated values are lists containing the
+ identifiers of the references associated with that particular
+ keyword\.
+
+ Any reference identifier used in these lists has to exist as a key
+ in the __references__ dictionary, see the next item for its
+ definition\.
+
+ * __references__
+
+ The value is a Tcl dictionary, using the identifiers for the
+ references known to the index as keys\. The associated values are
+ 2\-element lists containing the type and label of the reference, in
+ this order\.
+
+ Any key here has to be associated with at least one keyword, i\.e\.
+ occur in at least one of the reference lists which are the values
+ in the __keywords__ dictionary, see previous item for its
+ definition\.
+
+ The *[type](\.\./\.\./\.\./\.\./index\.md\#type)* of a reference can be one of
+ two values,
+
+ * __manpage__
+
+ The identifier of the reference is interpreted as symbolic file
+ name, referring to one of the documents the index was made for\.
+
+ * __url__
+
+ The identifier of the reference is interpreted as an url, referring
+ to some external location, like a website, etc\.
+
+ - canonical serialization
+
+ The canonical serialization of a keyword index has the format as specified
+ in the previous item, and then additionally satisfies the constraints below,
+ which make it unique among all the possible serializations of the keyword
+ index\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+ The references listed for each keyword of the index, if any, are listed in
+ ascending dictionary order of their *labels*, as generated by Tcl's
+ builtin command __lsort \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[deserialization](\.\./\.\./\.\./\.\./index\.md\#deserialization),
+[docidx](\.\./\.\./\.\./\.\./index\.md\#docidx),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[import](\.\./\.\./\.\./\.\./index\.md\#import),
+[index](\.\./\.\./\.\./\.\./index\.md\#index)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2toc/export_doctoc.md
Index: embedded/md/tcllib/files/modules/doctools2toc/export_doctoc.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2toc/export_doctoc.md
@@ -0,0 +1,281 @@
+
+[//000000001]: # (doctools::toc::export::doctoc \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::toc::export::doctoc\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::toc::export::doctoc \- doctoc export plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [\[doctoc\] notation of tables of contents](#section3)
+
+ - [Configuration](#section4)
+
+ - [ToC serialization format](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::toc::export::doctoc ?0\.1?
+
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools table of contents export plugin for the
+generation of doctoc markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling tables of contents, especially
+__[doctools::toc::export](toc\_export\.md)__, the export manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::toc::export](toc\_export\.md)__ and the export
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the doctoc
+export plugin API version 2\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ This command takes the canonical serialization of a table of contents, as
+ specified in section [ToC serialization format](#section5), and
+ contained in *serial*, the *configuration*, a dictionary, and generates
+ doctoc markup encoding the table\. The created string is then returned as the
+ result of the command\.
+
+# \[doctoc\] notation of tables of contents
+
+The doctoc format for tables of contents, also called the *doctoc markup
+language*, is too large to be covered in single section\. The interested reader
+should start with the document
+
+ 1. *[doctoc language introduction](\.\./doctools/doctoc\_lang\_intro\.md)*
+
+and then proceed from there to the formal specifications, i\.e\. the documents
+
+ 1. *[doctoc language syntax](\.\./doctools/doctoc\_lang\_syntax\.md)* and
+
+ 1. *[doctoc language command
+ reference](\.\./doctools/doctoc\_lang\_cmdref\.md)*\.
+
+to get a thorough understanding of the language\.
+
+# Configuration
+
+The doctoc export plugin recognizes the following configuration variables and
+changes its behaviour as they specify\.
+
+ - string *user*
+
+ This standard configuration variable contains the name of the user running
+ the process which invoked the export plugin\. The plugin puts this
+ information into the provenance comment at the beginning of the generated
+ document\.
+
+ - string *file*
+
+ This standard configuration variable contains the name of the file the table
+ of contents came from\. This variable may not be set or contain the empty
+ string\. The plugin puts this information, if defined, i\.e\. set and not the
+ empty string, into the provenance comment at the beginning of the generated
+ document\.
+
+ - boolean *newlines*
+
+ If this flag is set the plugin will break the generated doctoc code across
+ lines, with each markup command on a separate line\.
+
+ If this flag is not set \(the default\), the whole document will be written on
+ a single line, with minimum spacing between all elements\.
+
+ - boolean *indented*
+
+ If this flag is set the plugin will indent the markup commands according to
+ the structure of tables of contents\. To make this work this also implies
+ that __newlines__ is set\. This effect is independent of the value for
+ __aligned__ however\.
+
+ If this flag is not set \(the default\), the output is formatted as per the
+ value of __newlines__, and no indenting is done\.
+
+ - boolean *aligned*
+
+ If this flag is set the generator ensures that the arguments for the
+ __item__ commands in a division are aligned vertically for a nice table
+ effect\. To make this work this also implies that __newlines__ is set\.
+ This effect is independent of the value for __indented__ however\.
+
+ If this flag is not set \(the default\), the output is formatted as per the
+ values of __newlines__ and __indented__, and no alignment is done\.
+
+*Note* that this plugin ignores the standard configuration variables
+__format__, and __map__, and their values\.
+
+# ToC serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize tables
+of contents as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+table of contents may have more than one regular serialization only exactly one
+of them will be *canonical*\.
+
+ - regular serialization
+
+ The serialization of any table of contents is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::toc__, and its value\.
+ This value holds the contents of the table of contents\.
+
+ The contents of the table of contents are a Tcl dictionary holding the title
+ of the table of contents, a label, and its elements\. The relevant keys and
+ their values are
+
+ * __title__
+
+ The value is a string containing the title of the table of
+ contents\.
+
+ * __label__
+
+ The value is a string containing a label for the table of contents\.
+
+ * __items__
+
+ The value is a Tcl list holding the elements of the table, in the
+ order they are to be shown\.
+
+ Each element is a Tcl list holding the type of the item, and its
+ description, in this order\. An alternative description would be
+ that it is a Tcl dictionary holding a single key, the item type,
+ mapped to the item description\.
+
+ The two legal item types and their descriptions are
+
+ + __reference__
+
+ This item describes a single entry in the table of contents,
+ referencing a single document\. To this end its value is a Tcl
+ dictionary containing an id for the referenced document, a
+ label, and a longer textual description which can be associated
+ with the entry\. The relevant keys and their values are
+
+ - __id__
+
+ The value is a string containing the id of the document
+ associated with the entry\.
+
+ - __label__
+
+ The value is a string containing a label for this entry\.
+ This string also identifies the entry, and no two entries
+ \(references and divisions\) in the containing list are
+ allowed to have the same label\.
+
+ - __desc__
+
+ The value is a string containing a longer description for
+ this entry\.
+
+ + __division__
+
+ This item describes a group of entries in the table of
+ contents, inducing a hierarchy of entries\. To this end its
+ value is a Tcl dictionary containing a label for the group, an
+ optional id to a document for the whole group, and the list of
+ entries in the group\. The relevant keys and their values are
+
+ - __id__
+
+ The value is a string containing the id of the document
+ associated with the whole group\. This key is optional\.
+
+ - __label__
+
+ The value is a string containing a label for the group\.
+ This string also identifies the entry, and no two entries
+ \(references and divisions\) in the containing list are
+ allowed to have the same label\.
+
+ - __items__
+
+ The value is a Tcl list holding the elements of the group,
+ in the order they are to be shown\. This list has the same
+ structure as the value for the keyword __items__ used
+ to describe the whole table of contents, see above\. This
+ closes the recusrive definition of the structure, with
+ divisions holding the same type of elements as the whole
+ table of contents, including other divisions\.
+
+ - canonical serialization
+
+ The canonical serialization of a table of contents has the format as
+ specified in the previous item, and then additionally satisfies the
+ constraints below, which make it unique among all the possible
+ serializations of this table of contents\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[serialization](\.\./\.\./\.\./\.\./index\.md\#serialization), [table of
+contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents),
+[toc](\.\./\.\./\.\./\.\./index\.md\#toc)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2toc/import_doctoc.md
Index: embedded/md/tcllib/files/modules/doctools2toc/import_doctoc.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2toc/import_doctoc.md
@@ -0,0 +1,240 @@
+
+[//000000001]: # (doctools::toc::import::doctoc \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::toc::import::doctoc\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::toc::import::doctoc \- doctoc import plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [\[doctoc\] notation of tables of contents](#section3)
+
+ - [ToC serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::toc::import::doctoc ?0\.1?
+package require doctools::toc::parse
+package require doctools::toc::structure
+package require doctools::msgcat
+package require doctools::tcl::parse
+package require fileutil
+package require logger
+package require snit
+package require struct::list
+package require struct::set
+package require struct::stack
+package require struct::tree
+package require treeql
+
+[__[import](\.\./\.\./\.\./\.\./index\.md\#import)__ *string* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools table of contents import plugin for the
+parsing of doctoc markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling tables of contents, especially
+__[doctools::toc::import](toc\_import\.md)__, the import manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::toc::import](toc\_import\.md)__ and the import
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the doctoc
+import plugin API version 2\.
+
+ - __[import](\.\./\.\./\.\./\.\./index\.md\#import)__ *string* *configuration*
+
+ This command takes the *string* and parses it as doctoc markup encoding a
+ table of contents, in the context of the specified *configuration* \(a
+ dictionary\)\. The result of the command is the canonical serialization of
+ that table of contents, in the form specified in section [ToC serialization
+ format](#section4)\.
+
+# \[doctoc\] notation of tables of contents
+
+The doctoc format for tables of contents, also called the *doctoc markup
+language*, is too large to be covered in single section\. The interested reader
+should start with the document
+
+ 1. *[doctoc language introduction](\.\./doctools/doctoc\_lang\_intro\.md)*
+
+and then proceed from there to the formal specifications, i\.e\. the documents
+
+ 1. *[doctoc language syntax](\.\./doctools/doctoc\_lang\_syntax\.md)* and
+
+ 1. *[doctoc language command
+ reference](\.\./doctools/doctoc\_lang\_cmdref\.md)*\.
+
+to get a thorough understanding of the language\.
+
+# ToC serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize tables
+of contents as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+table of contents may have more than one regular serialization only exactly one
+of them will be *canonical*\.
+
+ - regular serialization
+
+ The serialization of any table of contents is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::toc__, and its value\.
+ This value holds the contents of the table of contents\.
+
+ The contents of the table of contents are a Tcl dictionary holding the title
+ of the table of contents, a label, and its elements\. The relevant keys and
+ their values are
+
+ * __title__
+
+ The value is a string containing the title of the table of
+ contents\.
+
+ * __label__
+
+ The value is a string containing a label for the table of contents\.
+
+ * __items__
+
+ The value is a Tcl list holding the elements of the table, in the
+ order they are to be shown\.
+
+ Each element is a Tcl list holding the type of the item, and its
+ description, in this order\. An alternative description would be
+ that it is a Tcl dictionary holding a single key, the item type,
+ mapped to the item description\.
+
+ The two legal item types and their descriptions are
+
+ + __reference__
+
+ This item describes a single entry in the table of contents,
+ referencing a single document\. To this end its value is a Tcl
+ dictionary containing an id for the referenced document, a
+ label, and a longer textual description which can be associated
+ with the entry\. The relevant keys and their values are
+
+ - __id__
+
+ The value is a string containing the id of the document
+ associated with the entry\.
+
+ - __label__
+
+ The value is a string containing a label for this entry\.
+ This string also identifies the entry, and no two entries
+ \(references and divisions\) in the containing list are
+ allowed to have the same label\.
+
+ - __desc__
+
+ The value is a string containing a longer description for
+ this entry\.
+
+ + __division__
+
+ This item describes a group of entries in the table of
+ contents, inducing a hierarchy of entries\. To this end its
+ value is a Tcl dictionary containing a label for the group, an
+ optional id to a document for the whole group, and the list of
+ entries in the group\. The relevant keys and their values are
+
+ - __id__
+
+ The value is a string containing the id of the document
+ associated with the whole group\. This key is optional\.
+
+ - __label__
+
+ The value is a string containing a label for the group\.
+ This string also identifies the entry, and no two entries
+ \(references and divisions\) in the containing list are
+ allowed to have the same label\.
+
+ - __items__
+
+ The value is a Tcl list holding the elements of the group,
+ in the order they are to be shown\. This list has the same
+ structure as the value for the keyword __items__ used
+ to describe the whole table of contents, see above\. This
+ closes the recusrive definition of the structure, with
+ divisions holding the same type of elements as the whole
+ table of contents, including other divisions\.
+
+ - canonical serialization
+
+ The canonical serialization of a table of contents has the format as
+ specified in the previous item, and then additionally satisfies the
+ constraints below, which make it unique among all the possible
+ serializations of this table of contents\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[deserialization](\.\./\.\./\.\./\.\./index\.md\#deserialization),
+[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc),
+[doctools](\.\./\.\./\.\./\.\./index\.md\#doctools),
+[import](\.\./\.\./\.\./\.\./index\.md\#import), [table of
+contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents),
+[toc](\.\./\.\./\.\./\.\./index\.md\#toc)
+
+# CATEGORY
+
+Text formatter plugin
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2toc/toc_container.md
Index: embedded/md/tcllib/files/modules/doctools2toc/toc_container.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2toc/toc_container.md
@@ -0,0 +1,517 @@
+
+[//000000001]: # (doctools::toc \- Documentation tools)
+[//000000002]: # (Generated from file 'toc\_container\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::toc\(n\) 2 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::toc \- Holding tables of contents
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Concepts](#section2)
+
+ - [API](#section3)
+
+ - [Package commands](#subsection1)
+
+ - [Object command](#subsection2)
+
+ - [Object methods](#subsection3)
+
+ - [ToC serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require doctools::toc ?2?
+package require Tcl 8\.4
+package require doctools::toc::structure
+package require struct::tree
+package require snit
+
+[__::doctools::toc__ *objectName*](#1)
+[__objectName__ __method__ ?*arg arg \.\.\.*?](#2)
+[*objectName* __destroy__](#3)
+[*objectName* __\+ reference__ *id* *label* *docid* *desc*](#4)
+[*objectName* __\+ division__ *id* *label* ?*docid*?](#5)
+[*objectName* __remove__ *id*](#6)
+[*objectName* __up__ *id*](#7)
+[*objectName* __next__ *id*](#8)
+[*objectName* __prev__ *id*](#9)
+[*objectName* __child__ *id* *label* ?*\.\.\.*?](#10)
+[*objectName* __element__ ?*\.\.\.*?](#11)
+[*objectName* __children__ *id*](#12)
+[*objectName* __type__ *id*](#13)
+[*objectName* __full\-label__ *id*](#14)
+[*objectName* __elabel__ *id* ?*newlabel*?](#15)
+[*objectName* __description__ *id* ?*newdesc*?](#16)
+[*objectName* __document__ *id* ?*newdocid*?](#17)
+[*objectName* __title__](#18)
+[*objectName* __title__ *text*](#19)
+[*objectName* __label__](#20)
+[*objectName* __label__ *text*](#21)
+[*objectName* __importer__](#22)
+[*objectName* __importer__ *object*](#23)
+[*objectName* __exporter__](#24)
+[*objectName* __exporter__ *object*](#25)
+[*objectName* __deserialize =__ *data* ?*format*?](#26)
+[*objectName* __deserialize \+=__ *data* ?*format*?](#27)
+[*objectName* __serialize__ ?*format*?](#28)
+
+# DESCRIPTION
+
+This package provides a class to contain and programmatically manipulate tables
+of contents\.
+
+This is one of the three public pillars the management of tables of contents
+resides on\. The other two pillars are
+
+ 1. *[Exporting tables of contents](toc\_export\.md)*, and
+
+ 1. *Importing tables of contents*
+
+For information about the [Concepts](#section2) of tables of contents, and
+their parts, see the same\-named section\. For information about the data
+structure which is used to encode tables of contents as values see the section
+[ToC serialization format](#section4)\. This is the only format directly
+known to this class\. Conversions from and to any other format are handled by
+export and import manager objects\. These may be attached to a container, but do
+not have to be, it is merely a convenience\.
+
+# Concepts
+
+ 1. A *[table of contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents)*
+ consists of a \(possibly empty\) list of *elements*\.
+
+ 1. Each element in the list is identified by its label\.
+
+ 1. Each element is either a
+ *[reference](\.\./\.\./\.\./\.\./index\.md\#reference)*, or a *division*\.
+
+ 1. Each reference has an associated document, identified by a symbolic id, and
+ a textual description\.
+
+ 1. Each division may have an associated document, identified by a symbolic id\.
+
+ 1. Each division consists consists of a \(possibly empty\) list of *elements*,
+ with each element following the rules as specified in item 2 and above\.
+
+A few notes
+
+ 1. The above rules span up a tree of elements, with references as the leaf
+ nodes, and divisions as the inner nodes, and each element representing an
+ entry in the whole table of contents\.
+
+ 1. The identifying labels of any element E are unique within their division
+ \(or toc\), and the full label of any element E is the list of labels for all
+ nodes on the unique path from the root of the tree to E, including E\.
+
+# API
+
+## Package commands
+
+ - __::doctools::toc__ *objectName*
+
+ This command creates a new container object with an associated Tcl command
+ whose name is *objectName*\. This
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)* command is explained in full
+ detail in the sections [Object command](#subsection2) and [Object
+ methods](#subsection3)\. The object command will be created under the
+ current namespace if the *objectName* is not fully qualified, and in the
+ specified namespace otherwise\.
+
+## Object command
+
+All objects created by the __::doctools::toc__ command have the following
+general form:
+
+ - __objectName__ __method__ ?*arg arg \.\.\.*?
+
+ The method __method__ and its *arg*'uments determine the exact
+ behavior of the command\. See section [Object methods](#subsection3) for
+ the detailed specifications\.
+
+## Object methods
+
+ - *objectName* __destroy__
+
+ This method destroys the object it is invoked for\.
+
+ - *objectName* __\+ reference__ *id* *label* *docid* *desc*
+
+ This method adds a new reference element to the table of contents, under the
+ element specified via its handle *id*\. This parent element has to be a
+ division element, or the root\. An error is thrown otherwise\. The new element
+ will be externally identified by its *label*, which has to be be unique
+ within the parent element\. An error is thrown otherwise\.
+
+ As a reference element it will refer to a document identified by the
+ symbolic *docid*\. This reference must not be the empty string, an error is
+ thrown otherwise\. Beyond the label the element also has a longer descriptive
+ string, supplied via *desc*\.
+
+ The result of the method is the handle \(id\) of the new element\.
+
+ - *objectName* __\+ division__ *id* *label* ?*docid*?
+
+ This method adds a new division element to the table of contents, under the
+ element specified via its handle *id*\. This parent element has to be a
+ division element, or the root\. An error is thrown otherwise\. The new element
+ will be externally identified by its *label*, which has to be be unique
+ within the parent element\. An error is thrown otherwise\.
+
+ As a division element it is can refer to a document, identified by the
+ symbolic *docid*, but may choose not to\.
+
+ The result of the method is the handle \(id\) of the new element\.
+
+ - *objectName* __remove__ *id*
+
+ This method removes the element identified by the handle *id* from the
+ table of contents\. If the element is a division all of its children, if any,
+ are removed as well\. The root element/division of the table of contents
+ cannot be removed however, only its children\.
+
+ The result of the method is the empty string\.
+
+ - *objectName* __up__ *id*
+
+ This method returns the handle of the parent for the element identified by
+ its handle *id*, or the empty string if *id* referred to the root
+ element\.
+
+ - *objectName* __next__ *id*
+
+ This method returns the handle of the right sibling for the element
+ identified by its handle *id*, or the handle of the parent if the element
+ has no right sibling, or the empty string if *id* referred to the root
+ element\.
+
+ - *objectName* __prev__ *id*
+
+ This method returns the handle of the left sibling for the element
+ identified by its handle *id*, or the handle of the parent if the element
+ has no left sibling, or the empty string if *id* referred to the root
+ element\.
+
+ - *objectName* __child__ *id* *label* ?*\.\.\.*?
+
+ This method returns the handle of a child of the element identified by its
+ handle *id*\. The child itself is identified by a series of labels\.
+
+ - *objectName* __element__ ?*\.\.\.*?
+
+ This method returns the handle of the element identified by a series of
+ labels, starting from the root of the table of contents\. The series of
+ labels is allowed to be empty, in which case the handle of the root element
+ is returned\.
+
+ - *objectName* __children__ *id*
+
+ This method returns a list containing the handles of all children of the
+ element identified by the handle *id*, from first to last, in that order\.
+
+ - *objectName* __type__ *id*
+
+ This method returns the type of the element, either __reference__, or
+ __division__\.
+
+ - *objectName* __full\-label__ *id*
+
+ This method is the complement of the method __element__, converting the
+ handle *id* of an element into a list of labels full identifying the
+ element within the whole table of contents\.
+
+ - *objectName* __elabel__ *id* ?*newlabel*?
+
+ This method queries and/or changes the label of the element identified by
+ the handle *id*\. If the argument *newlabel* is present then the label is
+ changed to that value\. Regardless of this, the result of the method is the
+ current value of the label\.
+
+ If the label is changed the new label has to be unique within the containing
+ division, or an error is thrown\.
+
+ Further, of the *id* refers to the root element of the table of contents,
+ then using this method is equivalent to using the method *label*, i\.e\. it
+ is accessing the global label for the whole table\.
+
+ - *objectName* __description__ *id* ?*newdesc*?
+
+ This method queries and/or changes the description of the element identified
+ by the handle *id*\. If the argument *newdesc* is present then the
+ description is changed to that value\. Regardless of this, the result of the
+ method is the current value of the description\.
+
+ The element this method operates on has to be a reference element, or an
+ error will be thrown\.
+
+ - *objectName* __document__ *id* ?*newdocid*?
+
+ This method queries and/or changes the document reference of the element
+ identified by the handle *id*\. If the argument *newdocid* is present
+ then the description is changed to that value\. Regardless of this, the
+ result of the method is the current value of the document reference\.
+
+ Setting the reference to the empty string means unsetting it, and is allowed
+ only for division elements\. Conversely, if the result is the empty string
+ then the element has no document reference, and this can happen only for
+ division elements\.
+
+ - *objectName* __title__
+
+ Returns the currently defined title of the table of contents\.
+
+ - *objectName* __title__ *text*
+
+ Sets the title of the table of contents to *text*, and returns it as the
+ result of the command\.
+
+ - *objectName* __label__
+
+ Returns the currently defined label of the table of contents\.
+
+ - *objectName* __label__ *text*
+
+ Sets the label of the table of contents to *text*, and returns it as the
+ result of the command\.
+
+ - *objectName* __importer__
+
+ Returns the import manager object currently attached to the container, if
+ any\.
+
+ - *objectName* __importer__ *object*
+
+ Attaches the *object* as import manager to the container, and returns it
+ as the result of the command\. Note that the *object* is *not* put into
+ ownership of the container\. I\.e\., destruction of the container will *not*
+ destroy the *object*\.
+
+ It is expected that *object* provides a method named __import text__
+ which takes a text and a format name, and returns the canonical
+ serialization of the table of contents contained in the text, assuming the
+ given format\.
+
+ - *objectName* __exporter__
+
+ Returns the export manager object currently attached to the container, if
+ any\.
+
+ - *objectName* __exporter__ *object*
+
+ Attaches the *object* as export manager to the container, and returns it
+ as the result of the command\. Note that the *object* is *not* put into
+ ownership of the container\. I\.e\., destruction of the container will *not*
+ destroy the *object*\.
+
+ It is expected that *object* provides a method named __export object__
+ which takes the container and a format name, and returns a text encoding
+ table of contents stored in the container, in the given format\. It is
+ further expected that the *object* will use the container's method
+ __serialize__ to obtain the serialization of the table of contents from
+ which to generate the text\.
+
+ - *objectName* __deserialize =__ *data* ?*format*?
+
+ This method replaces the contents of the table object with the table
+ contained in the *data*\. If no *format* was specified it is assumed to
+ be the regular serialization of a table of contents\.
+
+ Otherwise the object will use the attached import manager to convert the
+ data from the specified format to a serialization it can handle\. In that
+ case an error will be thrown if the container has no import manager attached
+ to it\.
+
+ The result of the method is the empty string\.
+
+ - *objectName* __deserialize \+=__ *data* ?*format*?
+
+ This method behaves like __deserialize =__ in its essentials, except
+ that it merges the table of contents in the *data* to its contents instead
+ of replacing it\. The method will throw an error if merging is not possible,
+ i\.e\. would produce an invalid table\. The existing content is left unchanged
+ in that case\.
+
+ The result of the method is the empty string\.
+
+ - *objectName* __serialize__ ?*format*?
+
+ This method returns the table of contents contained in the object\. If no
+ *format* is not specified the returned result is the canonical
+ serialization of its contents\.
+
+ Otherwise the object will use the attached export manager to convert the
+ data to the specified format\. In that case an error will be thrown if the
+ container has no export manager attached to it\.
+
+# ToC serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize tables
+of contents as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+table of contents may have more than one regular serialization only exactly one
+of them will be *canonical*\.
+
+ - regular serialization
+
+ The serialization of any table of contents is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::toc__, and its value\.
+ This value holds the contents of the table of contents\.
+
+ The contents of the table of contents are a Tcl dictionary holding the title
+ of the table of contents, a label, and its elements\. The relevant keys and
+ their values are
+
+ * __title__
+
+ The value is a string containing the title of the table of
+ contents\.
+
+ * __label__
+
+ The value is a string containing a label for the table of contents\.
+
+ * __items__
+
+ The value is a Tcl list holding the elements of the table, in the
+ order they are to be shown\.
+
+ Each element is a Tcl list holding the type of the item, and its
+ description, in this order\. An alternative description would be
+ that it is a Tcl dictionary holding a single key, the item type,
+ mapped to the item description\.
+
+ The two legal item types and their descriptions are
+
+ + __reference__
+
+ This item describes a single entry in the table of contents,
+ referencing a single document\. To this end its value is a Tcl
+ dictionary containing an id for the referenced document, a
+ label, and a longer textual description which can be associated
+ with the entry\. The relevant keys and their values are
+
+ - __id__
+
+ The value is a string containing the id of the document
+ associated with the entry\.
+
+ - __label__
+
+ The value is a string containing a label for this entry\.
+ This string also identifies the entry, and no two entries
+ \(references and divisions\) in the containing list are
+ allowed to have the same label\.
+
+ - __desc__
+
+ The value is a string containing a longer description for
+ this entry\.
+
+ + __division__
+
+ This item describes a group of entries in the table of
+ contents, inducing a hierarchy of entries\. To this end its
+ value is a Tcl dictionary containing a label for the group, an
+ optional id to a document for the whole group, and the list of
+ entries in the group\. The relevant keys and their values are
+
+ - __id__
+
+ The value is a string containing the id of the document
+ associated with the whole group\. This key is optional\.
+
+ - __label__
+
+ The value is a string containing a label for the group\.
+ This string also identifies the entry, and no two entries
+ \(references and divisions\) in the containing list are
+ allowed to have the same label\.
+
+ - __items__
+
+ The value is a Tcl list holding the elements of the group,
+ in the order they are to be shown\. This list has the same
+ structure as the value for the keyword __items__ used
+ to describe the whole table of contents, see above\. This
+ closes the recusrive definition of the structure, with
+ divisions holding the same type of elements as the whole
+ table of contents, including other divisions\.
+
+ - canonical serialization
+
+ The canonical serialization of a table of contents has the format as
+ specified in the previous item, and then additionally satisfies the
+ constraints below, which make it unique among all the possible
+ serializations of this table of contents\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html), [TMML](\.\./\.\./\.\./\.\./index\.md\#tmml),
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion), [doctoc
+markup](\.\./\.\./\.\./\.\./index\.md\#doctoc\_markup),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation),
+[formatting](\.\./\.\./\.\./\.\./index\.md\#formatting),
+[generation](\.\./\.\./\.\./\.\./index\.md\#generation),
+[json](\.\./\.\./\.\./\.\./index\.md\#json), [latex](\.\./\.\./\.\./\.\./index\.md\#latex),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff),
+[parsing](\.\./\.\./\.\./\.\./index\.md\#parsing),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin),
+[reference](\.\./\.\./\.\./\.\./index\.md\#reference),
+[table](\.\./\.\./\.\./\.\./index\.md\#table), [table of
+contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents), [tcler's
+wiki](\.\./\.\./\.\./\.\./index\.md\#tcler\_s\_wiki),
+[text](\.\./\.\./\.\./\.\./index\.md\#text), [wiki](\.\./\.\./\.\./\.\./index\.md\#wiki)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2toc/toc_export.md
Index: embedded/md/tcllib/files/modules/doctools2toc/toc_export.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2toc/toc_export.md
@@ -0,0 +1,486 @@
+
+[//000000001]: # (doctools::toc::export \- Documentation tools)
+[//000000002]: # (Generated from file 'toc\_export\.man' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009\-2018 Andreas Kupries )
+[//000000004]: # (doctools::toc::export\(n\) 0\.2 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::toc::export \- Exporting tables of contents
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [Concepts](#section2)
+
+ - [API](#section3)
+
+ - [Package commands](#subsection1)
+
+ - [Object command](#subsection2)
+
+ - [Object methods](#subsection3)
+
+ - [Export plugin API v2 reference](#section4)
+
+ - [ToC serialization format](#section5)
+
+ - [Bugs, Ideas, Feedback](#section6)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require doctools::toc::export ?0\.2?
+package require Tcl 8\.4
+package require doctools::config
+package require doctools::toc::structure
+package require snit
+package require pluginmgr
+
+[__::doctools::toc::export__ *objectName*](#1)
+[__objectName__ __method__ ?*arg arg \.\.\.*?](#2)
+[*objectName* __destroy__](#3)
+[*objectName* __export serial__ *serial* ?*format*?](#4)
+[*objectName* __export object__ *object* ?*format*?](#5)
+[*objectName* __config names__](#6)
+[*objectName* __config get__](#7)
+[*objectName* __config set__ *name* ?*value*?](#8)
+[*objectName* __config unset__ *pattern*\.\.\.](#9)
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#10)
+
+# DESCRIPTION
+
+This package provides a class to manage the plugins for the export of tables of
+contents to other formats, i\.e\. their conversion to, for example
+*[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc)*,
+*[HTML](\.\./\.\./\.\./\.\./index\.md\#html)*, etc\.
+
+This is one of the three public pillars the management of tables of contents
+resides on\. The other two pillars are
+
+ 1. *Importing tables of contents*, and
+
+ 1. *[Holding tables of contents](toc\_container\.md)*
+
+For information about the [Concepts](#section2) of tables of contents, and
+their parts, see the same\-named section\. For information about the data
+structure which is the major input to the manager objects provided by this
+package see the section [ToC serialization format](#section5)\.
+
+The plugin system of our class is based on the package
+__[pluginmgr](\.\./pluginmgr/pluginmgr\.md)__, and configured to look for
+plugins using
+
+ 1. the environment variable __DOCTOOLS\_TOC\_EXPORT\_PLUGINS__,
+
+ 1. the environment variable __DOCTOOLS\_TOC\_PLUGINS__,
+
+ 1. the environment variable __DOCTOOLS\_PLUGINS__,
+
+ 1. the path "~/\.doctools/toc/export/plugin"
+
+ 1. the path "~/\.doctools/toc/plugin"
+
+ 1. the path "~/\.doctools/plugin"
+
+ 1. the path "~/\.doctools/toc/export/plugins"
+
+ 1. the path "~/\.doctools/toc/plugins"
+
+ 1. the path "~/\.doctools/plugins"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\TOC\\EXPORT\\PLUGINS"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\TOC\\PLUGINS"
+
+ 1. the registry entry "HKEY\_CURRENT\_USER\\SOFTWARE\\DOCTOOLS\\PLUGINS"
+
+The last three are used only when the package is run on a machine using
+Windows\(tm\) operating system\.
+
+The whole system is delivered with six predefined export plugins, namely
+
+ - doctoc
+
+ See *[doctoc export plugin](export\_doctoc\.md)* for details\.
+
+ - html
+
+ See *html export plugin* for details\.
+
+ - json
+
+ See *json export plugin* for details\.
+
+ - nroff
+
+ See *[nroff export plugin](toc\_export\_nroff\.md)* for details\.
+
+ - text
+
+ See *text export plugin* for details\.
+
+ - wiki
+
+ See *[wiki export plugin](toc\_export\_wiki\.md)* for details\.
+
+Readers wishing to write their own export plugin for some format, i\.e\. *plugin
+writer*s reading and understanding the section containing the [Export plugin
+API v2 reference](#section4) is an absolute necessity, as it specifies the
+interaction between this package and its plugins in detail\.
+
+# Concepts
+
+ 1. A *[table of contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents)*
+ consists of a \(possibly empty\) list of *elements*\.
+
+ 1. Each element in the list is identified by its label\.
+
+ 1. Each element is either a
+ *[reference](\.\./\.\./\.\./\.\./index\.md\#reference)*, or a *division*\.
+
+ 1. Each reference has an associated document, identified by a symbolic id, and
+ a textual description\.
+
+ 1. Each division may have an associated document, identified by a symbolic id\.
+
+ 1. Each division consists consists of a \(possibly empty\) list of *elements*,
+ with each element following the rules as specified in item 2 and above\.
+
+A few notes
+
+ 1. The above rules span up a tree of elements, with references as the leaf
+ nodes, and divisions as the inner nodes, and each element representing an
+ entry in the whole table of contents\.
+
+ 1. The identifying labels of any element E are unique within their division
+ \(or toc\), and the full label of any element E is the list of labels for all
+ nodes on the unique path from the root of the tree to E, including E\.
+
+# API
+
+## Package commands
+
+ - __::doctools::toc::export__ *objectName*
+
+ This command creates a new export manager object with an associated Tcl
+ command whose name is *objectName*\. This
+ *[object](\.\./\.\./\.\./\.\./index\.md\#object)* command is explained in full
+ detail in the sections [Object command](#subsection2) and [Object
+ methods](#subsection3)\. The object command will be created under the
+ current namespace if the *objectName* is not fully qualified, and in the
+ specified namespace otherwise\.
+
+## Object command
+
+All objects created by the __::doctools::toc::export__ command have the
+following general form:
+
+ - __objectName__ __method__ ?*arg arg \.\.\.*?
+
+ The method __method__ and its *arg*'uments determine the exact
+ behavior of the command\. See section [Object methods](#subsection3) for
+ the detailed specifications\.
+
+## Object methods
+
+ - *objectName* __destroy__
+
+ This method destroys the object it is invoked for\.
+
+ - *objectName* __export serial__ *serial* ?*format*?
+
+ This method takes the canonical serialization of a table of contents stored
+ in *serial* and converts it to the specified *format*, using the export
+ plugin for the format\. An error is thrown if no plugin could be found for
+ the format\. The string generated by the conversion process is returned as
+ the result of this method\.
+
+ If no format is specified the method defaults to __doctoc__\.
+
+ The specification of what a *canonical* serialization is can be found in
+ the section [ToC serialization format](#section5)\.
+
+ The plugin has to conform to the interface specified in section [Export
+ plugin API v2 reference](#section4)\.
+
+ - *objectName* __export object__ *object* ?*format*?
+
+ This method is a convenient wrapper around the __export serial__ method
+ described by the previous item\. It expects that *object* is an object
+ command supporting a __serialize__ method returning the canonical
+ serialization of a table of contents\. It invokes that method, feeds the
+ result into __export serial__ and returns the resulting string as its
+ own result\.
+
+ - *objectName* __config names__
+
+ This method returns a list containing the names of all configuration
+ variables currently known to the object\.
+
+ - *objectName* __config get__
+
+ This method returns a dictionary containing the names and values of all
+ configuration variables currently known to the object\.
+
+ - *objectName* __config set__ *name* ?*value*?
+
+ This method sets the configuration variable *name* to the specified
+ *value* and returns the new value of the variable\.
+
+ If no value is specified it simply returns the current value, without
+ changing it\.
+
+ Note that while the user can set the predefined configuration variables
+ __user__ and __format__ doing so will have no effect, these values
+ will be internally overridden when invoking an import plugin\.
+
+ - *objectName* __config unset__ *pattern*\.\.\.
+
+ This method unsets all configuration variables matching the specified glob
+ *pattern*s\. If no pattern is specified it will unset all currently defined
+ configuration variables\.
+
+# Export plugin API v2 reference
+
+Plugins are what this package uses to manage the support for any output format
+beyond the [ToC serialization format](#section5)\. Here we specify the API
+the objects created by this package use to interact with their plugins\.
+
+A plugin for this package has to follow the rules listed below:
+
+ 1. A plugin is a package\.
+
+ 1. The name of a plugin package has the form
+ doctools::toc::export::__FOO__, where __FOO__ is the name of the
+ format the plugin will generate output for\. This name is also the argument
+ to provide to the various __export__ methods of export manager objects
+ to get a string encoding a table of contents in that format\.
+
+ 1. The plugin can expect that the package
+ __doctools::toc::export::plugin__ is present, as indicator that it was
+ invoked from a genuine plugin manager\.
+
+ 1. A plugin has to provide one command, with the signature shown below\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ Whenever an export manager of
+ __[doctools::toc](\.\./doctools/doctoc\.md)__ has to generate
+ output for a table of contents it will invoke this command\.
+
+ * string *serial*
+
+ This argument will contain the *canonical* serialization of the
+ table of contents for which to generate the output\. The
+ specification of what a *canonical* serialization is can be found
+ in the section [ToC serialization format](#section5)\.
+
+ * dictionary *configuration*
+
+ This argument will contain the current configuration to apply to
+ the generation, as a dictionary mapping from variable names to
+ values\.
+
+ The following configuration variables have a predefined meaning all
+ plugins have to obey, although they can ignore this information at
+ their discretion\. Any other other configuration variables
+ recognized by a plugin will be described in the manpage for that
+ plugin\.
+
+ + user
+
+ This variable is expected to contain the name of the user
+ owning the process invoking the plugin\.
+
+ + format
+
+ This variable is expected to contain the name of the format
+ whose plugin is invoked\.
+
+ + file
+
+ This variable, if defined by the user of the table object is
+ expected to contain the name of the input file for which the
+ plugin is generating its output for\.
+
+ + map
+
+ This variable, if defined by the user of the table object is
+ expected to contain a dictionary mapping from symbolic document
+ ids used in the table entries to actual paths \(or urls\)\. A
+ plugin has to be able to handle the possibility that a document
+ id is without entry in this mapping\.
+
+ 1. A single usage cycle of a plugin consists of the invokations of the command
+ __[export](\.\./\.\./\.\./\.\./index\.md\#export)__\. This call has to leave
+ the plugin in a state where another usage cycle can be run without
+ problems\.
+
+# ToC serialization format
+
+Here we specify the format used by the doctools v2 packages to serialize tables
+of contents as immutable values for transport, comparison, etc\.
+
+We distinguish between *regular* and *canonical* serializations\. While a
+table of contents may have more than one regular serialization only exactly one
+of them will be *canonical*\.
+
+ - regular serialization
+
+ The serialization of any table of contents is a nested Tcl dictionary\.
+
+ This dictionary holds a single key, __doctools::toc__, and its value\.
+ This value holds the contents of the table of contents\.
+
+ The contents of the table of contents are a Tcl dictionary holding the title
+ of the table of contents, a label, and its elements\. The relevant keys and
+ their values are
+
+ * __title__
+
+ The value is a string containing the title of the table of
+ contents\.
+
+ * __label__
+
+ The value is a string containing a label for the table of contents\.
+
+ * __items__
+
+ The value is a Tcl list holding the elements of the table, in the
+ order they are to be shown\.
+
+ Each element is a Tcl list holding the type of the item, and its
+ description, in this order\. An alternative description would be
+ that it is a Tcl dictionary holding a single key, the item type,
+ mapped to the item description\.
+
+ The two legal item types and their descriptions are
+
+ + __reference__
+
+ This item describes a single entry in the table of contents,
+ referencing a single document\. To this end its value is a Tcl
+ dictionary containing an id for the referenced document, a
+ label, and a longer textual description which can be associated
+ with the entry\. The relevant keys and their values are
+
+ - __id__
+
+ The value is a string containing the id of the document
+ associated with the entry\.
+
+ - __label__
+
+ The value is a string containing a label for this entry\.
+ This string also identifies the entry, and no two entries
+ \(references and divisions\) in the containing list are
+ allowed to have the same label\.
+
+ - __desc__
+
+ The value is a string containing a longer description for
+ this entry\.
+
+ + __division__
+
+ This item describes a group of entries in the table of
+ contents, inducing a hierarchy of entries\. To this end its
+ value is a Tcl dictionary containing a label for the group, an
+ optional id to a document for the whole group, and the list of
+ entries in the group\. The relevant keys and their values are
+
+ - __id__
+
+ The value is a string containing the id of the document
+ associated with the whole group\. This key is optional\.
+
+ - __label__
+
+ The value is a string containing a label for the group\.
+ This string also identifies the entry, and no two entries
+ \(references and divisions\) in the containing list are
+ allowed to have the same label\.
+
+ - __items__
+
+ The value is a Tcl list holding the elements of the group,
+ in the order they are to be shown\. This list has the same
+ structure as the value for the keyword __items__ used
+ to describe the whole table of contents, see above\. This
+ closes the recusrive definition of the structure, with
+ divisions holding the same type of elements as the whole
+ table of contents, including other divisions\.
+
+ - canonical serialization
+
+ The canonical serialization of a table of contents has the format as
+ specified in the previous item, and then additionally satisfies the
+ constraints below, which make it unique among all the possible
+ serializations of this table of contents\.
+
+ The keys found in all the nested Tcl dictionaries are sorted in ascending
+ dictionary order, as generated by Tcl's builtin command __lsort
+ \-increasing \-dict__\.
+
+# Bugs, Ideas, Feedback
+
+This document, and the package it describes, will undoubtedly contain bugs and
+other problems\. Please report such in the category *doctools* of the [Tcllib
+Trackers](http://core\.tcl\.tk/tcllib/reportlist)\. Please also report any ideas
+for enhancements you may have for either package and/or documentation\.
+
+When proposing code changes, please provide *unified diffs*, i\.e the output of
+__diff \-u__\.
+
+Note further that *attachments* are strongly preferred over inlined patches\.
+Attachments can be made by going to the __Edit__ form of the ticket
+immediately after its creation, and then using the left\-most button in the
+secondary navigation bar\.
+
+# KEYWORDS
+
+[HTML](\.\./\.\./\.\./\.\./index\.md\#html),
+[conversion](\.\./\.\./\.\./\.\./index\.md\#conversion),
+[doctoc](\.\./\.\./\.\./\.\./index\.md\#doctoc),
+[documentation](\.\./\.\./\.\./\.\./index\.md\#documentation),
+[export](\.\./\.\./\.\./\.\./index\.md\#export),
+[formatting](\.\./\.\./\.\./\.\./index\.md\#formatting),
+[generation](\.\./\.\./\.\./\.\./index\.md\#generation),
+[json](\.\./\.\./\.\./\.\./index\.md\#json),
+[manpage](\.\./\.\./\.\./\.\./index\.md\#manpage),
+[markup](\.\./\.\./\.\./\.\./index\.md\#markup),
+[nroff](\.\./\.\./\.\./\.\./index\.md\#nroff),
+[plugin](\.\./\.\./\.\./\.\./index\.md\#plugin),
+[reference](\.\./\.\./\.\./\.\./index\.md\#reference),
+[table](\.\./\.\./\.\./\.\./index\.md\#table), [table of
+contents](\.\./\.\./\.\./\.\./index\.md\#table\_of\_contents), [tcler's
+wiki](\.\./\.\./\.\./\.\./index\.md\#tcler\_s\_wiki),
+[text](\.\./\.\./\.\./\.\./index\.md\#text), [url](\.\./\.\./\.\./\.\./index\.md\#url),
+[wiki](\.\./\.\./\.\./\.\./index\.md\#wiki)
+
+# CATEGORY
+
+Documentation tools
+
+# COPYRIGHT
+
+Copyright © 2009\-2018 Andreas Kupries
ADDED embedded/md/tcllib/files/modules/doctools2toc/toc_export_html.md
Index: embedded/md/tcllib/files/modules/doctools2toc/toc_export_html.md
==================================================================
--- /dev/null
+++ embedded/md/tcllib/files/modules/doctools2toc/toc_export_html.md
@@ -0,0 +1,340 @@
+
+[//000000001]: # (doctools::toc::export::html \- Documentation tools)
+[//000000002]: # (Generated from file 'plugin\.inc' by tcllib/doctools with format 'markdown')
+[//000000003]: # (Copyright © 2009 Andreas Kupries )
+[//000000004]: # (doctools::toc::export::html\(n\) 0\.1 tcllib "Documentation tools")
+
+ [ Main Table Of Contents | Table Of Contents | Keyword Index | Categories | Modules | Applications ]
+
+# NAME
+
+doctools::toc::export::html \- HTML export plugin
+
+# Table Of Contents
+
+ - [Table Of Contents](#toc)
+
+ - [Synopsis](#synopsis)
+
+ - [Description](#section1)
+
+ - [API](#section2)
+
+ - [Configuration](#section3)
+
+ - [ToC serialization format](#section4)
+
+ - [Bugs, Ideas, Feedback](#section5)
+
+ - [Keywords](#keywords)
+
+ - [Category](#category)
+
+ - [Copyright](#copyright)
+
+# SYNOPSIS
+
+package require Tcl 8\.4
+package require doctools::toc::export::html ?0\.1?
+package require doctools::text
+package require doctools::html
+package require doctools::html::cssdefaults
+
+[__[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*](#1)
+
+# DESCRIPTION
+
+This package implements the doctools table of contents export plugin for the
+generation of HTML markup\.
+
+This is an internal package of doctools, for use by the higher level management
+packages handling tables of contents, especially
+__[doctools::toc::export](toc\_export\.md)__, the export manager\.
+
+Using it from a regular interpreter is possible, however only with contortions,
+and is not recommended\. The proper way to use this functionality is through the
+package __[doctools::toc::export](toc\_export\.md)__ and the export
+manager objects it provides\.
+
+# API
+
+The API provided by this package satisfies the specification of the doctoc
+export plugin API version 2\.
+
+ - __[export](\.\./\.\./\.\./\.\./index\.md\#export)__ *serial* *configuration*
+
+ This command takes the canonical serialization of a table of contents, as
+ specified in section [ToC serialization format](#section4), and
+ contained in *serial*, the *configuration*, a dictionary, and generates
+ HTML markup encoding the table\. The created string is then returned as the
+ result of the command\.
+
+# Configuration
+
+The html export plugin recognizes the following configuration variables and
+changes its behaviour as they specify\.
+
+ - string *user*
+
+ This standard configuration variable contains the name of the user running
+ the process which invoked the export plugin\. The plugin puts this
+ information into the provenance comment at the beginning of the generated
+ document\.
+
+ - string *file*
+
+ This standard configuration variable contains the name of the file the table
+ of contents came from\. This variable may not be set or contain the empty
+ string\. The plugin puts this information, if defined, i\.e\. set and not the
+ empty string, into the provenance comment at the beginning of the generated
+ document\.
+
+ - dictionary *map*
+
+ This standard configuration variable contains a dictionary mapping from the
+ \(symbolic\) document ids in reference entries to the actual filenames and/or
+ urls to be used in the output\.
+
+ Document ids without a mapping are used unchanged\.
+
+ - boolean *newlines*
+
+ If this flag is set the plugin will break the generated html code across
+ lines, with each markup command on a separate line\.
+
+ If this flag is not set \(the default\), the whole document will be written on
+ a single line, with minimum spacing between all elements\.
+
+ - boolean *indented*
+
+ If this flag is set the plugin will indent the markup commands according to
+ the structure of indices\. To make this work this also implies that
+ __newlines__ is set\.
+
+ If this flag is not set \(the default\), the output is formatted as per the
+ value of __newlines__, and no indenting is done\.
+
+ - string *meta*
+
+ This variable is meant to hold a fragment of HTML \(default: empty\)\. The
+ fragment it contains will be inserted into the generated output in the
+ section of the document, just after the tag\.
+
+ - string *header*
+
+ This variable is meant to hold a fragment of HTML \(default: empty\)\. The
+ fragment it contains will be inserted into the generated output just after
+ the title tag in the body of the document, in the class\.header
+ 'ision\.
+
+ - string *footer*
+
+ This variable is meant to hold a fragment of HTML \(default: empty\)\. The
+ fragment it contains will be inserted into the generated output just before
+ the tag, in the class\.footer 'ision\.
+
+ - dictionary *rid*
+
+ The value of this variable \(default: empty\) maps references to the
+ identifiers to use as their anchor names\. Each reference __FOO__ not
+ found in the dictionary uses __REF\-____FOO__ as anchor, i\.e\. itself
+ prefixed with the string __REF\-__\.
+
+ - string *sepline*
+
+ The value of this variable is the string to use for the separator comments
+ inserted into the output when the outpout is broken across lines and/or
+ indented\. The default string consists of 60 dashes\.
+
+ - string *class\.main*
+
+ This variable contains the class name for the main 'ivision of the
+ generated document\. The default is __doctools__\.
+
+ - string *class\.header*
+
+ This variable contains the class name for the header 'ision of the
+ generated document\. The default is __toc\-header__\. This division
+ contains the document title, the user specified __header__, if any, and
+ a visible separator line\.
+
+ - string *class\.title*
+
+ This variable contains the class name for the tag enclosing the
+ document title\. The default is __toc\-title__\.
+
+ - string *class\.navsep*
+
+ This variable contains the class name for the separators in the header
+ and footer sections of the generated document\. The default is
+ __toc\-navsep__\.
+
+ - string *class\.contents*
+
+ This variable contains the class name for the XXXXX holding the keywords and
+ their references in the generated document\. The default is
+ __toc\-contents__\.
+
+ - string *class\.ref*
+
+ This variable contains the class name for the table elements which are
+ references to other documents\. The default is __toc\-ref__\.
+
+ - string *class\.div*
+
+ This variable contains the class name for the table elements which are
+ divisions\. The default is __toc\-div__\.
+
+ - string *class\.footer*
+
+ This variable contains the class name for the footer 'ision of the
+ generated document\. The default is __toc\-footer__\. This division
+ contains a browser\-visible separator line and the user specified
+ __footer__, if any\.
+
+*Note* that this plugin ignores the standard configuration variable
+__format__, and its value\.
+
+# |