summaryrefslogtreecommitdiff
path: root/dev-tcltk/tcllib
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
committerV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
commit4f2d7949f03e1c198bc888f2d05f421d35c57e21 (patch)
treeba5f07bf3f9d22d82e54a462313f5d244036c768 /dev-tcltk/tcllib
reinit the tree, so we can have metadata
Diffstat (limited to 'dev-tcltk/tcllib')
-rw-r--r--dev-tcltk/tcllib/Manifest14
-rw-r--r--dev-tcltk/tcllib/files/tcllib-1.15-XSS-vuln.patch907
-rw-r--r--dev-tcltk/tcllib/files/tcllib-1.15-tcl8.6-test.patch411
-rw-r--r--dev-tcltk/tcllib/files/tcllib-1.15-test.patch81
-rw-r--r--dev-tcltk/tcllib/files/tcllib-1.16-XSS-vuln.patch572
-rw-r--r--dev-tcltk/tcllib/files/tcllib-1.16-test.patch81
-rw-r--r--dev-tcltk/tcllib/metadata.xml11
-rw-r--r--dev-tcltk/tcllib/tcllib-1.15-r2.ebuild54
-rw-r--r--dev-tcltk/tcllib/tcllib-1.16.ebuild58
9 files changed, 2189 insertions, 0 deletions
diff --git a/dev-tcltk/tcllib/Manifest b/dev-tcltk/tcllib/Manifest
new file mode 100644
index 000000000000..6104c04b7838
--- /dev/null
+++ b/dev-tcltk/tcllib/Manifest
@@ -0,0 +1,14 @@
+AUX tcllib-1.15-XSS-vuln.patch 29465 SHA256 bcb0741c2645137ca22db7fbeb74ba74cf5282dd35a6070ea197ecd77a2f6ddd SHA512 e3df9ae6c6bdf1da78ea7dc239e934608647fef47728de003a0f129d554c612ed4db17f8ed7119c57d4b16a5203a79fd958d399fcdfc8bdccfb7219e73d9ce02 WHIRLPOOL 18fbb0703c661b1caed5e54e3bb1ee155fd65b83f01c3a21b954684b92d2def675c4b4b7da56ce0614444abc863022f116bcaa71a4da1fb35bedce31736a7a97
+AUX tcllib-1.15-tcl8.6-test.patch 12441 SHA256 613fcb1e6a738ee90e5f0fe93604444a8da7cb3c58c5cfd6550ee632f19d81d4 SHA512 76e1a4f3a18a357bbff8e0b1d997842b3a5ba1ab96079bea046cd82c0aa3ca8c8933b63f284ef5a50968a54bd2d31ecbc951f1b6605d359eca0bcfe70955373c WHIRLPOOL f862a9ccf81490a54b2aa22f12ba06a96d495d7bb74dce5bc5cec9f0d0c37ffed891e6e6053b0b15a2b9da2b11d805dee135bca198a0d7523f115e8c27c1ffcc
+AUX tcllib-1.15-test.patch 4150 SHA256 0eba3215d5a8304f3fad0f10ca3bd4fdc80015d46056e24341d5dd636adb4924 SHA512 05660c3f6a0c051addb5a15a20773382119a0482b0f76982a6c5dc3f0ba300c1c963c77e749c49c1c7615cbe3521cd4a467d85ce865684276a8f2ebf9546334f WHIRLPOOL 3f35def949eb85e97d2ae34e7c77f9953a0e82d9ffa49e2864692264c6ddbbe2a5f8d258206b5ef5e822bd3a0551afa42753d8dca1fb8991dc02d8c43aa39cea
+AUX tcllib-1.16-XSS-vuln.patch 17543 SHA256 9301ecdf6a19bd6d1413fdacb994851f50df4aececb496ee51b36388cf3de185 SHA512 d1b60e33d642bf04960078c17962efcb834a4dfe3dc26d2adb6327784435760cb984de34f5ad9769f5bcc27c871f3ef0b23ac3d909312c972d1299bcaed27dad WHIRLPOOL e283850ca1948694352628f4eb93d56e8a54e84a6edf94e23d0e5e1c78df9075315671fccb9e1a34f86c3de73ed542dfa6d8a0f6d6f6465435976384d71aa66f
+AUX tcllib-1.16-test.patch 4150 SHA256 328d69dbfc8500df59bd0419802758fefb5549bf7ea8218073c2486e26f381ed SHA512 ea7c3f59b9423f9df3b37fe1189f51597a0690ed822190e06b89b7f72180f5cc164c7c1a15ab724a99f2bca14593d39e557100d938ee644382131324747cadc0 WHIRLPOOL aacf44de5254fb1c9556611b49b5f0ac5846496e20ba31ba306135004c37dad948c81e4cee123e9d1104f5d91ea5e0ba8496963207f9c9f757f4a13403cb9262
+DIST Tcllib-1.16.tar.bz2 6089076 SHA256 033334306d3ffc499c8830d393bf7528227e49c68077b3e9247c4171b15be012 SHA512 5e0656c178c0fae907c101b5324f04ba1bb5c26f4d1015868194dbb393e88a281ecf66bc4701167db24ddb526b87acfd88223e0e9e6db1f9d0ffb919b3372752 WHIRLPOOL 543f5ef8b337eb2c34f90201c829f20cfd3beb0f7dcf146f4d27b66f0b8796bf518d44dad31e2be66857b50a515b5a10ae8e394d6b393e1b202903b6b68f04aa
+DIST tcllib-1.15-manpage-rename.patch.xz 3188 SHA256 d86f60e98013fe35a1038247e1992a0afc9314462d693ee10ee30ded501e1869 SHA512 9bcdb6c7dcb492a58e767529a8bb5a2c83912577ae124fec40f3bbd6fb283a4befb2dfc3d7a986b287ba9709bba7261b676d78441c8be0f614f31bc123d81126 WHIRLPOOL 1ac9fd5fddba5adab9560cabb0a5df9a3e0c2bafda861cabb6519bcef2a94c54f2dcd2e04e3b3892cda2c374c0186d7e21e4e435f109a8915eaa507019a53db8
+DIST tcllib-1.15-test.patch.xz 3208 SHA256 16fbf7d564f3b0f338d3f21774199738ca0014e4d689b053bef8840023cf8889 SHA512 8b9de181cdc39e0f9361694fb1bb9ee42b3fba269d13e91be31643ce3509c34e3e6b74b043e067dda49d75b6f4a009a79361f7a9ecf4613a509decb3eacf8447 WHIRLPOOL 1b138a1d742e8b7aeb574ec1eb1d7688b9a7bcf469269b4b27004f23f9d7947b9dd4828322739606bd3a9aecc11202d3712f15cd459448f18f6e9a2896911a12
+DIST tcllib-1.15.tar.bz2 5030648 SHA256 7a1e27f6d2e625af15d13df6117958815c8482e662a914fc1cbd7f0b0e780e71 SHA512 544b1193266e860eb59a4c313645376bba8488711b2afc629d99d0e719252db79caae73022ae1dc21dc123f949fa8930f81112c3f80328fc83952b64f93ca3c4 WHIRLPOOL 75ef40710859c0f669fdac96ee7ed5d76d6a10081649d890cadc970c21478b2daddd8289853e38239d68ad9aae0dd9ee5ee94827f1bf0e4b5b511134024e062c
+EBUILD tcllib-1.15-r2.ebuild 1134 SHA256 661b6977d993906a016362ef2831a05f0dcdf5ca0e32922a6c92f400e176d21b SHA512 e9d5b31f783a1bf7a273813befd9968219372ae11f0efeaee4ef3c5f3988d7ab8114e7fbcd1107d3815e09dd04f627be1b06a8bc17144722ed8fbd1a88d0f09c WHIRLPOOL 00309c4e1dcc68281dbdfcaa05dec06324d5a996c1deb13786d5ba5488dd869b0af4dea9249003e9aa354733f3f2ccacbeb45e6ad4212549dc01c1cc7693a963
+EBUILD tcllib-1.16.ebuild 1061 SHA256 feadbb965e315c2503941db246657438e51661721229c3f570e535577549dd55 SHA512 3fa48d32141bd0a1295ce497b372d80fee47685451bad915ad456ffaf6e59cca8cbc41f079ddd3179347b6a1900ebc7b00f528983fe9cc50f7ec6e79a33ac1ea WHIRLPOOL 1c1d3b0c665ae5308676d2b5b5f4cc74b1604cab1479abb0750038579e54e41a3c4e6add74ea8ed775db6cf9b1b24936d7e928e634165b87541e4f6d25996f75
+MISC ChangeLog 3105 SHA256 89efe4f4882cbb59fad301afb92ac9bace9fe990ba2f740bd87d39ca571192b4 SHA512 5e87adeaf4636ced2e275b99752f4cbd38168d6c46ba8220cfc513b97c72eb2b56059aa0e19a9e7662acbc74c7fede0aec5c349100452cc6273d6e586e5b157f WHIRLPOOL 36390111568f1ff0b12211c560a53f63ddaefdb78e5ac71e14650ec162b3abffad6d26829018200a5f60587c31045c6b723741558fbc36a4de9fb04fc7b4a7e1
+MISC ChangeLog-2015 7694 SHA256 4f4a580ccae45f159153145bff028c64232352946bd571c0bdc308c0ef811db1 SHA512 006aae881a8b27b8d88421ca6b340d3008f590cd2b2f38d4c67f30f321234e502d0e9869ac9f03bfd0c8fa4135ad0d2a5183c8b10ce015f092b9f1ce6dfbb5b6 WHIRLPOOL 4ef9079376e6ccfc0d7218289f6570440fa844a2cea67928f9ebc212308b4c25164003a991d85d109a70ab67852247c16249f4bf9a08c7f1f02642d1c3152380
+MISC metadata.xml 329 SHA256 71788a64c142cb63fd9274317a1507c6eedf850715a16ab111edbf441af58823 SHA512 c16db3fedc73cc41391e15f198396908ebd047c165c2bbe3c465f126dfb8266818d79f11ec343a2880058850a8164801616632f361b69db914e7d66823bb1851 WHIRLPOOL 31ca88d7d8cabf6167504446b3fbc97e7f883163468a07939a9a1107cc67cc87edf25ee19f15414c189e750a7af3365f70df93dab6d8fae4721e45b1c11dc4e9
diff --git a/dev-tcltk/tcllib/files/tcllib-1.15-XSS-vuln.patch b/dev-tcltk/tcllib/files/tcllib-1.15-XSS-vuln.patch
new file mode 100644
index 000000000000..4b3502dd86ff
--- /dev/null
+++ b/dev-tcltk/tcllib/files/tcllib-1.15-XSS-vuln.patch
@@ -0,0 +1,907 @@
+ modules/html/html.man | 146 +++++++++++++++++-------------
+ modules/html/html.tcl | 55 +++++++++---
+ modules/html/html.test | 224 +++++++++++++++++++++++++++++++++++-----------
+ modules/html/pkgIndex.tcl | 2 +-
+ 4 files changed, 297 insertions(+), 130 deletions(-)
+
+diff --git a/modules/html/html.man b/modules/html/html.man
+index efb41fc..f18cf4b 100644
+--- a/modules/html/html.man
++++ b/modules/html/html.man
+@@ -1,10 +1,19 @@
+ [comment {-*- tcl -*- doctools manpage}]
+-[manpage_begin html n 1.4]
++[vset HTML_VERSION 1.4.4]
++[manpage_begin html n [vset HTML_VERSION]]
++[see_also htmlparse]
++[see_also ncgi]
++[keywords checkbox]
++[keywords checkbutton]
++[keywords form]
++[keywords html]
++[keywords radiobutton]
++[keywords table]
+ [moddesc {HTML Generation}]
+ [titledesc {Procedures to generate HTML structures}]
+ [category {CGI programming}]
+ [require Tcl 8.2]
+-[require html [opt 1.4]]
++[require html [opt [vset HTML_VERSION]]]
+ [description]
+ [para]
+
+@@ -26,13 +35,11 @@ for HTML tag parameters.
+ define an author for the page. The author is noted in a comment in
+ the HEAD section.
+
+-
+ [call [cmd ::html::bodyTag] [arg args]]
+
+ Generate a [term body] tag. The tag parameters are taken from [arg args] or
+ from the body.* attributes define with [cmd ::html::init].
+
+-
+ [call [cmd ::html::cell] [arg {param value}] [opt [arg tag]]]
+
+ Generate a [term td] (or [term th]) tag, a value, and a closing
+@@ -41,13 +48,11 @@ tag parameters come from [arg param] or TD.* attributes defined with
+ [cmd ::html::init]. This uses [cmd ::html::font] to insert a standard
+ [term font] tag into the table cell. The [arg tag] argument defaults to "td".
+
+-
+ [call [cmd ::html::checkbox] [arg {name value}]]
+
+ Generate a [term checkbox] form element with the specified name and value.
+ This uses [cmd ::html::checkValue].
+
+-
+ [call [cmd ::html::checkSet] [arg {key sep list}]]
+
+ Generate a set of [term checkbox] form elements and associated labels. The
+@@ -56,21 +61,18 @@ This uses [cmd ::html::checkbox]. All the [term checkbox] buttons share the
+ same [arg key] for their name. The [arg sep] is text used to separate
+ the elements.
+
+-
+ [call [cmd ::html::checkValue] [arg name] [opt [arg value]]]
+
+-Generate the "name=[arg name] value=[arg value] for a [term checkbox] form
++Generate the "name=[arg name] value=[arg value]" for a [term checkbox] form
+ element. If the CGI variable [arg name] has the value [arg value],
+ then SELECTED is added to the return value. [arg value] defaults to
+ "1".
+
+-
+ [call [cmd ::html::closeTag]]
+
+ Pop a tag off the stack created by [cmd ::html::openTag] and generate
+ the corresponding close tag (e.g., </body>).
+
+-
+ [call [cmd ::html::default] [arg key] [opt [arg param]]]
+
+ This procedure is used by [cmd ::html::tagParam] to generate the name,
+@@ -83,27 +85,23 @@ identified by [arg key]. The [arg key] has the form "tag.parameter"
+ (e.g., body.bgcolor). Use [cmd ::html::init] to register default
+ values. [arg param] defaults to the empty string.
+
+-
+ [call [cmd ::html::description] [arg description]]
+
+ [emph {Side effect only}]. Call this before [cmd ::html::head] to
+ define a description [term meta] tag for the page. This tag is generated
+ later in the call to [cmd ::html::head].
+
+-
+ [call [cmd ::html::end]]
+
+ Pop all open tags from the stack and generate the corresponding close
+ HTML tags, (e.g., </body></html>).
+
+-
+ [call [cmd ::html::eval] [arg arg] [opt [arg args]]]
+
+ This procedure is similar to the built-in Tcl [cmd eval] command. The
+ only difference is that it returns "" so it can be called from an HTML
+ template file without appending unwanted results.
+
+-
+ [call [cmd ::html::extractParam] [arg {param key}] [opt [arg varName]]]
+
+ This is a parsing procedure that extracts the value of [arg key] from
+@@ -115,13 +113,11 @@ parameter was found in [arg param], otherwise it returns 0. If the
+ [arg varName] is not specified, then [arg key] is used as the variable
+ name.
+
+-
+ [call [cmd ::html::font] [arg args]]
+
+ Generate a standard [term font] tag. The parameters to the tag are taken
+ from [arg args] and the HTML defaults defined with [cmd ::html::init].
+
+-
+ [call [cmd ::html::for] [arg {start test next body}]]
+
+ This procedure is similar to the built-in Tcl [cmd for] control
+@@ -129,7 +125,6 @@ structure. Rather than evaluating the body, it returns the subst'ed
+ [arg body]. Each iteration of the loop causes another string to be
+ concatenated to the result value.
+
+-
+ [call [cmd ::html::foreach] [arg {varlist1 list1}] [opt [arg {varlist2 list2 ...}]] [arg body]]
+
+ This procedure is similar to the built-in Tcl [cmd foreach] control
+@@ -137,7 +132,6 @@ structure. Rather than evaluating the body, it returns the subst'ed
+ [arg body]. Each iteration of the loop causes another string to be
+ concatenated to the result value.
+
+-
+ [call [cmd ::html::formValue] [arg name] [opt [arg defvalue]]]
+
+ Return a name and value pair, where the value is initialized from
+@@ -148,20 +142,17 @@ existing CGI data, if any. The result has this form:
+ name="fred" value="freds value"
+ }]
+
+-
+ [call [cmd ::html::getFormInfo] [arg args]]
+
+ Generate hidden fields to capture form values. If [arg args] is
+ empty, then hidden fields are generated for all CGI values. Otherwise
+ args is a list of string match patterns for form element names.
+
+-
+ [call [cmd ::html::getTitle]]
+
+ Return the title string, with out the surrounding [term title] tag,
+ set with a previous call to [cmd ::html::title].
+
+-
+ [call [cmd ::html::h] [arg {level string}] [opt [arg param]]]
+
+ Generate a heading (e.g., [term h[var level]]) tag. The [arg string] is nested in the
+@@ -191,28 +182,25 @@ Generate an [term h5] tag. See [cmd ::html::h].
+
+ Generate an [term h6] tag. See [cmd ::html::h].
+
+-
+ [call [cmd ::html::hdrRow] [arg args]]
+
+ Generate a table row, including [term tr] and [term th] tags.
+ Each value in [arg args] is place into its own table cell.
+ This uses [cmd ::html::cell].
+
+-
+ [call [cmd ::html::head] [arg title]]
+
+ Generate the [term head] section that includes the page [term title].
+ If previous calls have been made to
+-[cmd ::html::author],
+-[cmd ::html::keywords],
+-[cmd ::html::description],
++[cmd ::html::author],
++[cmd ::html::keywords],
++[cmd ::html::description],
+ or
+ [cmd ::html::meta]
+ then additional tags are inserted into the [term head] section.
+ This leaves an open [term html] tag pushed on the stack with
+ [cmd ::html::openTag].
+
+-
+ [call [cmd ::html::headTag] [arg string]]
+
+ Save a tag for inclusion in the [term head] section generated by
+@@ -220,13 +208,11 @@ Save a tag for inclusion in the [term head] section generated by
+ [cmd ::html::head]. The [arg string] is everything in the tag except
+ the enclosing angle brackets, < >.
+
+-
+ [call [cmd ::html::html_entities] [arg string]]
+
+ This command replaces all special characters in the [arg string] with
+ their HTML entities and returns the modified text.
+
+-
+ [call [cmd ::html::if] [arg {expr1 body1}] [opt "[const elseif] [arg {expr2 body2 ...}]"] [opt "[const else] [arg bodyN]"]]
+
+ This procedure is similar to the built-in Tcl [cmd if] control
+@@ -235,7 +221,6 @@ taken, it returns the subst'ed [arg body]. Note that the syntax is
+ slightly more restrictive than that of the built-in Tcl [cmd if]
+ control structure.
+
+-
+ [call [cmd ::html::init] [opt [arg list]]]
+
+ [cmd ::html::init] accepts a Tcl-style name-value list that defines
+@@ -243,19 +228,16 @@ values for items with a name of the form "tag.parameter". For
+ example, a default with key "body.bgcolor" defines the background
+ color for the [term body] tag.
+
+-
+ [call [cmd ::html::keywords] [arg args]]
+
+ [emph {Side effect only}]. Call this before [cmd ::html::head] to
+ define a keyword [term meta] tag for the page. The [term meta] tag
+ is included in the result of [cmd ::html::head].
+
+-
+ [call [cmd ::html::mailto] [arg email] [opt [arg subject]]]
+
+ Generate a hypertext link to a mailto: URL.
+
+-
+ [call [cmd ::html::meta] [arg args]]
+
+ [emph {Side effect only}]. Call this before [cmd ::html::head] to
+@@ -264,6 +246,50 @@ value list that is used for the name= and value= parameters for the
+ [term meta] tag. The [term meta] tag is included in the result of
+ [cmd ::html::head].
+
++[call [cmd ::html::css] [arg href]]
++
++[emph {Side effect only}]. Call this before [cmd ::html::head] to
++define a [term link] tag for a linked CSS document. The [arg href]
++value is a HTTP URL to a CSS document. The [term link] tag is included
++in the result of [cmd ::html::head].
++
++[para]
++
++Multiple calls of this command are allowed, enabling the use of
++multiple CSS document references. In other words, the arguments
++of multiple calls are accumulated, and do not overwrite each other.
++
++[call [cmd ::html::css-clear]]
++
++[emph {Side effect only}]. Call this before [cmd ::html::head] to
++clear all links to CSS documents.
++[para]
++
++Multiple calls of this command are allowed, doing nothing after the
++first of a sequence with no intervening [cmd ::html::css].
++
++[call [cmd ::html::js] [arg href]]
++
++[emph {Side effect only}]. Call this before [cmd ::html::head] to
++define a [term script] tag for a linked JavaScript document. The
++[arg href] is a HTTP URL to a JavaScript document. The [term script]
++tag is included in the result of [cmd ::html::head].
++
++[para]
++
++Multiple calls of this command are allowed, enabling the use of
++multiple JavaScript document references. In other words, the arguments
++of multiple calls are accumulated, and do not overwrite each other.
++
++
++[call [cmd ::html::js-clear]]
++
++[emph {Side effect only}]. Call this before [cmd ::html::head] to
++clear all links to JavaScript documents.
++[para]
++
++Multiple calls of this command are allowed, doing nothing after the
++first of a sequence with no intervening [cmd ::html::js].
+
+ [call [cmd ::html::minorList] [arg list] [opt [arg ordered]]]
+
+@@ -273,20 +299,17 @@ Tcl-style name, value list of labels and urls for the links.
+ [arg ordered] is a boolean used to choose between an ordered or
+ unordered list. It defaults to [const false].
+
+-
+ [call [cmd ::html::minorMenu] [arg list] [opt [arg sep]]]
+
+ Generate a series of hypertext links. The [arg list] is a Tcl-style
+ name, value list of labels and urls for the links. The [arg sep] is
+ the text to put between each link. It defaults to " | ".
+
+-
+ [call [cmd ::html::nl2br] [arg string]]
+
+ This command replaces all line-endings in the [arg string] with a
+ [term br] tag and returns the modified text.
+
+-
+ [call [cmd ::html::openTag] [arg tag] [opt [arg param]]]
+
+ Push [arg tag] onto a stack and generate the opening tag for
+@@ -295,7 +318,6 @@ stack. The second argument provides any tag arguments, as a
+ list whose elements are formatted to be in the form
+ "[var key]=[const value]".
+
+-
+ [call [cmd ::html::paramRow] [arg list] [opt [arg rparam]] [opt [arg cparam]]]
+
+ Generate a table row, including [term tr] and [term td] tags. Each value in
+@@ -306,25 +328,21 @@ Generate a table row, including [term tr] and [term td] tags. Each value in
+ the [term tr] tag. The value of [arg cparam] is passed to [cmd ::html::cell]
+ as parameter for the [term td] tags.
+
+-
+ [call [cmd ::html::passwordInput] [opt [arg name]]]
+
+ Generate an [term input] tag of type [term password]. The [arg name] defaults to
+ "password".
+
+-
+ [call [cmd ::html::passwordInputRow] [arg label] [opt [arg name]]]
+
+ Format a table row containing a label and an [term input] tag of type
+ [term password]. The [arg name] defaults to "password".
+
+-
+ [call [cmd ::html::quoteFormValue] [arg value]]
+
+ Quote special characters in [arg value] by replacing them with HTML
+ entities for quotes, ampersand, and angle brackets.
+
+-
+ [call [cmd ::html::radioSet] [arg {key sep list}]]
+
+ Generate a set of [term input] tags of type [term radio] and an associated text
+@@ -332,14 +350,12 @@ label. All the radio buttons share the same [arg key] for their name.
+ The [arg sep] is text used to separate the elements. The [arg list]
+ is a Tcl-style label, value list.
+
+-
+ [call [cmd ::html::radioValue] [arg {name value}]]
+
+-Generate the "name=[arg name] value=[arg value] for a [term radio] form
++Generate the "name=[arg name] value=[arg value]" for a [term radio] form
+ element. If the CGI variable [arg name] has the value [arg value],
+ then SELECTED is added to the return value.
+
+-
+ [call [cmd ::html::refresh] [arg {seconds url}]]
+
+ Set up a refresh [term meta] tag. Call this before [cmd ::html::head] and the
+@@ -347,7 +363,6 @@ HEAD section will contain a [term meta] tag that causes the document to
+ refresh in [arg seconds] seconds. The [arg url] is optional. If
+ specified, it specifies a new page to load after the refresh interval.
+
+-
+ [call [cmd ::html::row] [arg args]]
+
+ Generate a table row, including [term tr] and [term td] tags. Each value in
+@@ -355,14 +370,12 @@ Generate a table row, including [term tr] and [term td] tags. Each value in
+ [cmd ::html::cell]. Ignores any default information set up via
+ [cmd ::html::init].
+
+-
+ [call [cmd ::html::select] [arg {name param choices}] [opt [arg current]]]
+
+ Generate a [term select] form element and nested [term option] tags. The [arg name]
+ and [arg param] are used to generate the [term select] tag. The [arg choices]
+ list is a Tcl-style name, value list.
+
+-
+ [call [cmd ::html::selectPlain] [arg {name param choices}] [opt [arg current]]]
+
+ Like [cmd ::html::select] except that [arg choices] is a Tcl list of
+@@ -376,12 +389,10 @@ main difference is that it returns "" so it can be called from an HTML
+ template file without appending unwanted results. The other
+ difference is that it must take two arguments.
+
+-
+ [call [cmd ::html::submit] [arg label] [opt [arg name]]]
+
+ Generate an [term input] tag of type [term submit]. [arg name] defaults to "submit".
+
+-
+ [call [cmd ::html::tableFromArray] [arg arrname] [opt [arg param]] [opt [arg pat]]]
+
+ Generate a two-column [term table] and nested rows to display a Tcl array. The
+@@ -404,7 +415,6 @@ pre-formatted string.
+
+ Generate a [term textarea] tag wrapped around its current values.
+
+-
+ [call [cmd ::html::textInput] [arg {name value args}]]
+
+ Generate an [term input] form tag with type [term text]. This uses
+@@ -412,7 +422,6 @@ Generate an [term input] form tag with type [term text]. This uses
+ [cmd ::html::formValue]. The args is any additional tag attributes
+ you want to put into the [term input] tag.
+
+-
+ [call [cmd ::html::textInputRow] [arg {label name value args}]]
+
+ Generate an [term input] form tag with type [term text] formatted into a table row
+@@ -431,7 +440,6 @@ define the [term title] for a page.
+ This returns 1 if the named variable either does not exist or has the
+ empty string for its value.
+
+-
+ [call [cmd ::html::while] [arg {test body}]]
+
+ This procedure is similar to the built-in Tcl [cmd while] control
+@@ -439,20 +447,30 @@ structure. Rather than evaluating the body, it returns the subst'ed
+ [arg body]. Each iteration of the loop causes another string to be
+ concatenated to the result value.
+
+-[list_end]
+-
+-[section {BUGS, IDEAS, FEEDBACK}]
+-
+-This document, and the package it describes, will undoubtedly contain
+-bugs and other problems.
++[call [cmd ::html::doctype] [arg id]]
+
+-Please report such in the category [emph html] of the
+-[uri {http://sourceforge.net/tracker/?group_id=12883} {Tcllib SF Trackers}].
++This procedure can be used to build the standard DOCTYPE
++declaration string. It will return the standard declaration
++string for the id, or throw an error if the id is not known.
++The following id's are defined:
+
+-Please also report any ideas for enhancements you may have for either
+-package and/or documentation.
++[list_begin enumerated]
++[enum] HTML32
++[enum] HTML40
++[enum] HTML40T
++[enum] HTML40F
++[enum] HTML401
++[enum] HTML401T
++[enum] HTML401F
++[enum] XHTML10S
++[enum] XHTML10T
++[enum] XHTML10F
++[enum] XHTML11
++[enum] XHTMLB
++[list_end]
+
++[list_end]
+
+-[see_also ncgi htmlparse]
+-[keywords html form table checkbox radiobutton checkbutton]
++[vset CATEGORY html]
++[include ../doctools2base/include/feedback.inc]
+ [manpage_end]
+diff --git a/modules/html/html.tcl b/modules/html/html.tcl
+index 77e517e..3c0c443 100644
+--- a/modules/html/html.tcl
++++ b/modules/html/html.tcl
+@@ -15,7 +15,7 @@
+
+ package require Tcl 8.2
+ package require ncgi
+-package provide html 1.4
++package provide html 1.4.4
+
+ namespace eval ::html {
+
+@@ -510,7 +510,7 @@ proc ::html::refresh {content {url {}}} {
+ ::if {[string length $url]} {
+ append html "; url=$url"
+ }
+- append html "\">\n"
++ append html "\">"
+ lappend page(meta) $html
+ return ""
+ }
+@@ -912,7 +912,7 @@ proc ::html::selectPlain {name param choices {current {}}} {
+ # The html fragment
+
+ proc ::html::textarea {name {param {}} {current {}}} {
+- ::set value [ncgi::value $name $current]
++ ::set value [quoteFormValue [ncgi::value $name $current]]
+ return "<[string trimright \
+ "textarea name=\"$name\"\
+ [tagParam textarea $param]"]>$value</textarea>\n"
+@@ -1405,7 +1405,7 @@ proc ::html::html_entities {s} {
+ # The text with <br> in place of line-endings.
+
+ proc ::html::nl2br {s} {
+- return [string map [list \n\r <br> \n <br> \r <br>] $s]
++ return [string map [list \n\r <br> \r\n <br> \n <br> \r <br>] $s]
+ }
+
+ # ::html::doctype
+@@ -1419,9 +1419,10 @@ proc ::html::nl2br {s} {
+
+ proc ::html::doctype {arg} {
+ variable doctypes
+- set code [string toupper $arg]
+- if {![info exists doctypes($code)]} {
+- return -code error "Unknown doctype \"$arg\""
++ ::set code [string toupper $arg]
++ ::if {![info exists doctypes($code)]} {
++ return -code error -errorcode {HTML DOCTYPE BAD} \
++ "Unknown doctype \"$arg\""
+ }
+ return $doctypes($code)
+ }
+@@ -1451,12 +1452,26 @@ namespace eval ::html {
+ # href The location of the css file to include the filename and path
+ #
+ # Results:
+-# HTML for the section
++# None.
+
+ proc ::html::css {href} {
+ variable page
+- set page(css) \
+- "<link rel=\"stylesheet\" type=\"text/css\" href=\"[quoteFormValue $href]\">\n"
++ lappend page(css) "<link rel=\"stylesheet\" type=\"text/css\" href=\"[quoteFormValue $href]\">"
++ return
++}
++
++# ::html::css-clear
++# Drop all text/css references.
++#
++# Arguments:
++# None.
++#
++# Results:
++# None.
++
++proc ::html::css-clear {} {
++ variable page
++ catch { unset page(css) }
+ return
+ }
+
+@@ -1467,11 +1482,25 @@ proc ::html::css {href} {
+ # href The location of the javascript file to include the filename and path
+ #
+ # Results:
+-# HTML for the section
++# None.
+
+ proc ::html::js {href} {
+ variable page
+- set page(js) \
+- "<script language=\"javascript\" type=\"text/javascript\" src=\"[quoteFormValue $href]\"></script>\n"
++ lappend page(js) "<script language=\"javascript\" type=\"text/javascript\" src=\"[quoteFormValue $href]\"></script>"
++ return
++}
++
++# ::html::js-clear
++# Drop all text/javascript references.
++#
++# Arguments:
++# None.
++#
++# Results:
++# None.
++
++proc ::html::js-clear {} {
++ variable page
++ catch { unset page(js) }
+ return
+ }
+diff --git a/modules/html/html.test b/modules/html/html.test
+index 7a03c54..6646fb6 100644
+--- a/modules/html/html.test
++++ b/modules/html/html.test
+@@ -17,8 +17,8 @@ source [file join \
+ [file dirname [file dirname [file join [pwd] [info script]]]] \
+ devtools testutilities.tcl]
+
+-testsNeedTcl 8.2
+-testsNeedTcltest 1.0
++testsNeedTcl 8.4
++testsNeedTcltest 2.0
+
+ testing {
+ useLocal html.tcl html
+@@ -26,45 +26,46 @@ testing {
+
+ # -------------------------------------------------------------------------
+
+-test html-1.1 {html::init} {
++test html-1.1 {html::init} -body {
+ html::init
+- list [array exists html::defaults] \
+- [array size html::defaults] \
+- [info exists html::page]
+-} {1 0 0}
++ list \
++ [array exists html::defaults] \
++ [array size html::defaults] \
++ [info exists html::page]
++} -result {1 0 0}
+
+-test html-1.2 {html::init} {
++test html-1.2 {html::init} -body {
+ html::init {
+ font.face arial
+ body.bgcolor white
+ body.text black
+ }
+ lsort [array names html::defaults]
+-} {body.bgcolor body.text font.face}
++} -result {body.bgcolor body.text font.face}
+
+-test html-1.3 {html::init} {
+- catch {html::init wrong num args}
+-} 1
++test html-1.3 {html::init, too many args} -body {
++ html::init wrong num args
++} -returnCodes error -result {wrong # args: should be "html::init ?nvlist?"}
+
+-test html-1.4 {html::init} {
+- catch {html::init {wrong num args}}
+-} 1
++test html-1.4 {html::init, bad arg, odd-length list} -body {
++ html::init {wrong num args}
++} -returnCodes error -result {list must have an even number of elements}
+
+-test html-2.1 {html::head} {
+- catch {html::head}
+-} 1
++test html-2.1 {html::head, not enough args} -body {
++ html::head
++} -returnCodes error -result {wrong # args: should be "html::head title"}
+
+-test html-2.2 {html::head} {
++test html-2.2 {html::head} -body {
+ html::head "The Title"
+-} "<html><head>\n\t<title>The Title</title>\n</head>\n"
++} -result "<html><head>\n\t<title>The Title</title>\n</head>\n"
+
+-test html-2.3 {html::head} {
++test html-2.3 {html::head} -body {
+ html::description "The Description"
+ html::keywords key word
+ html::author "Cathy Coder"
+ html::meta metakey metavalue
+ html::head "The Title"
+-} {<html><head>
++} -result {<html><head>
+ <title>The Title</title>
+ <!-- Cathy Coder -->
+ <meta name="description" content="The Description">
+@@ -73,24 +74,24 @@ test html-2.3 {html::head} {
+ </head>
+ }
+
+-test html-3.1 {html::title} {
+- catch html::title
+-} 1
++test html-3.1 {html::title, not enough args} -body {
++ html::title
++} -returnCodes error -result {wrong # args: should be "html::title title"}
+
+-test html-3.2 {html::title} {
++test html-3.2 {html::title} -body {
+ html::title "blah blah"
+-} "<title>blah blah</title>\n"
++} -result "<title>blah blah</title>\n"
+
+-test html-4.1 {html::getTitle} {
++test html-4.1 {html::getTitle} -body {
+ html::init
+ html::getTitle
+-} ""
++} -result ""
+
+-test html-4.2 {html::getTitle} {
++test html-4.2 {html::getTitle} -body {
+ html::init
+ html::title "blah blah"
+ html::getTitle
+-} {blah blah}
++} -result {blah blah}
+
+ test html-5.1 {html::meta} {
+ html::init
+@@ -453,6 +454,18 @@ test html-23.2 {html::textarea} {
+ } {<textarea name="info" cols="50" rows="8">The textarea value.</textarea>
+ }
+
++test html-23.3 {html::textarea, dangerous input} {
++ html::init {
++ textarea.cols 50
++ textarea.rows 8
++ }
++ ncgi::reset info=[ncgi::encode "</textarea><script>alert(1)</script>"]
++ ncgi::parse
++ html::textarea info
++} {<textarea name="info" cols="50" rows="8">&lt;/textarea&gt;&lt;script&gt;alert(1)&lt;/script&gt;</textarea>
++}
++
++
+ test html-24.1 {html::submit} {
+ catch {html::submit}
+ } {1}
+@@ -516,7 +529,6 @@ test html-26.4 {html::refresh} {
+ } {<html><head>
+ <title>title</title>
+ <meta http-equiv="Refresh" content="4">
+-
+ </head>
+ }
+ test html-26.5 {html::refresh} {
+@@ -526,7 +538,6 @@ test html-26.5 {html::refresh} {
+ } {<html><head>
+ <title>title</title>
+ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
+-
+ </head>
+ }
+
+@@ -794,6 +805,7 @@ test html-32.1 {single argument} {
+ set result [html::eval {set x [format 22]}]
+ list $result $x
+ } {{} 22}
++
+ test html-32.2 {multiple arguments} {
+ set a {$b}
+ set b xyzzy
+@@ -801,38 +813,146 @@ test html-32.2 {multiple arguments} {
+ set result [html::eval {set x [eval format $a]}]
+ list $result $x
+ } {{} xyzzy}
++
+ test html-32.3 {single argument} {
+ set x [list]
+ set y 1
+ set result [html::eval lappend x a b c d {$y} e f g]
+ list $result $x
+ } {{} {a b c d 1 e f g}}
+-test html-32.4 {error: not enough arguments} {catch html::eval} 1
+-test html-32.5 {error: not enough arguments} {
+- catch html::eval msg
+- set msg
+-} {wrong # args: should be "uplevel ?level? command ?arg ...?"}
+-test html-32.6 {error in eval'ed command} {
+- catch {html::eval {error "test error"}}
+-} 1
+-test html-32.7 {error in eval'ed command} {
+- catch {html::eval {error "test error"}} msg
+- set msg
+-} {test error}
+
++test html-32.4 {error: not enough arguments} -body {
++ html::eval
++} -returnCodes error -result {wrong # args: should be "uplevel ?level? command ?arg ...?"}
+
+-test html-33.0 {html::font} {
++test html-32.6 {error in eval'ed command} -body {
++ html::eval {error "test error"}
++} -returnCodes error -result {test error}
++
++test html-33.0 {html::font} -body {
+ html::font
+-} {}
++} -result {}
+
+-test html-33.1 {html::font} {
++test html-33.1 {html::font} -body {
+ html::font size=18
+-} {<font size=18>}
++} -result {<font size=18>}
+
+-
+-test html-34.0 {html::nl2br} {
++test html-34.0 {html::nl2br} -body {
+ html::nl2br "a\n\rb\nc\rd"
+-} {a<br>b<br>c<br>d}
++} -result {a<br>b<br>c<br>d}
+
++test html-34.1 {html::nl2br, ticket 1742078} -body {
++ html::nl2br "a\r\nb"
++} -result {a<br>b}
+
++# -------------------------------------------------------------------------
++
++test html-tkt3439702-35.0 {html::css, not enough arguments} -body {
++ html::css
++} -returnCodes error -result {wrong # args: should be "html::css href"}
++
++test html-tkt3439702-35.1 {html::css, too many arguments} -body {
++ html::css REF X
++} -returnCodes error -result {wrong # args: should be "html::css href"}
++
++test html-tkt3439702-35.2 {html::css, single ref} -setup {
++ html::css-clear
++} -body {
++ html::css "http://test.css"
++ string trim [html::head T]
++} -cleanup {
++ html::css-clear
++} -result "<html><head>\n\t<title>T</title>\n\t<meta http-equiv=\"Refresh\" content=\"9; url=http://www.scriptics.com\">\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"http://test.css\">\n</head>"
++
++test html-tkt3439702-35.3 {html::css, multiple ref} -setup {
++ html::css-clear
++} -body {
++ html::css "http://test1.css"
++ html::css "http://test2.css"
++ string trim [html::head T]
++} -cleanup {
++ html::css-clear
++} -result {<html><head>
++ <title>T</title>
++ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
++ <link rel="stylesheet" type="text/css" href="http://test1.css">
++ <link rel="stylesheet" type="text/css" href="http://test2.css">
++</head>}
++
++# -------------------------------------------------------------------------
++
++test html-tkt3439702-36.0 {html::js, not enough arguments} -body {
++ html::js
++} -returnCodes error -result {wrong # args: should be "html::js href"}
++
++test html-tkt3439702-36.1 {html::js, too many arguments} -body {
++ html::js REF X
++} -returnCodes error -result {wrong # args: should be "html::js href"}
++
++test html-tkt3439702-36.2 {html::js, single ref} -setup {
++ html::js-clear
++} -body {
++ html::js "http://test.js"
++ string trim [html::head T]
++} -cleanup {
++ html::js-clear
++} -result {<html><head>
++ <title>T</title>
++ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
++ <script language="javascript" type="text/javascript" src="http://test.js"></script>
++</head>}
++
++test html-tkt3439702-36.3 {html::js, multiple ref} -setup {
++ html::js-clear
++} -body {
++ html::js "http://test1.js"
++ html::js "http://test2.js"
++ string trim [html::head T]
++} -cleanup {
++ html::js-clear
++} -result {<html><head>
++ <title>T</title>
++ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
++ <script language="javascript" type="text/javascript" src="http://test1.js"></script>
++ <script language="javascript" type="text/javascript" src="http://test2.js"></script>
++</head>}
++
++test html-tkt3439702-37.0 {html::js, html::css, mixed} -setup {
++ html::css-clear
++ html::js-clear
++} -body {
++ html::css "http://test.css"
++ html::js "http://test.js"
++ string trim [html::head T]
++} -cleanup {
++ html::js-clear
++ html::css-clear
++} -result {<html><head>
++ <title>T</title>
++ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
++ <link rel="stylesheet" type="text/css" href="http://test.css">
++ <script language="javascript" type="text/javascript" src="http://test.js"></script>
++</head>}
++
++# -------------------------------------------------------------------------
++# TODO: html::css-clear, html::js-clear
++
++
++test html-tktafe4366e2e-38.0 {html::doctype, not enough args} -body {
++ html::doctype
++} -returnCodes error -result {wrong # args: should be "html::doctype arg"}
++
++test html-tktafe4366e2e-38.1 {html::doctype, too many args} -body {
++ html::doctype HTML401T X
++} -returnCodes error -result {wrong # args: should be "html::doctype arg"}
++
++test html-tktafe4366e2e-38.2 {html::doctype, unknown type} -body {
++ html::doctype HTML401TXXX
++} -returnCodes error -result {Unknown doctype "HTML401TXXX"}
++
++test html-tktafe4366e2e-38.3 {html::doctype} -body {
++ html::doctype HTML401T
++} -result {<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">}
++
++# -------------------------------------------------------------------------
+ testsuiteCleanup
+diff --git a/modules/html/pkgIndex.tcl b/modules/html/pkgIndex.tcl
+index 88a71b2..9d91097 100644
+--- a/modules/html/pkgIndex.tcl
++++ b/modules/html/pkgIndex.tcl
+@@ -1,2 +1,2 @@
+ if {![package vsatisfies [package provide Tcl] 8.2]} {return}
+-package ifneeded html 1.4 [list source [file join $dir html.tcl]]
++package ifneeded html 1.4.4 [list source [file join $dir html.tcl]]
diff --git a/dev-tcltk/tcllib/files/tcllib-1.15-tcl8.6-test.patch b/dev-tcltk/tcllib/files/tcllib-1.15-tcl8.6-test.patch
new file mode 100644
index 000000000000..2256c5a50a0d
--- /dev/null
+++ b/dev-tcltk/tcllib/files/tcllib-1.15-tcl8.6-test.patch
@@ -0,0 +1,411 @@
+ modules/clock/iso8601.test | 5 ++---
+ modules/doctools/mpformats/_nroff.tcl | 18 ++++++++++--------
+ modules/doctools/mpformats/fmt.nroff | 4 ++--
+ modules/doctools/tests/nroff/00 | 8 ++++----
+ modules/doctools/tests/nroff/01 | 4 ++--
+ modules/doctools/tests/nroff/02 | 10 +++++-----
+ modules/doctools/tests/nroff/03 | 16 ++++++++--------
+ modules/doctools/tests/nroff/04 | 8 ++++----
+ modules/doctools/tests/nroff/05 | 8 ++++----
+ modules/doctools/tests/nroff/06 | 8 ++++----
+ modules/doctools/tests/nroff/07 | 8 ++++----
+ modules/doctools/tests/nroff/08 | 18 +++++++++---------
+ support/devel/sak/validate/syntax.tcl | 4 +++-
+ support/devel/sak/validate/testsuites.tcl | 4 +++-
+ 14 files changed, 64 insertions(+), 59 deletions(-)
+
+diff --git a/modules/clock/iso8601.test b/modules/clock/iso8601.test
+index 85d6416..6fce938 100644
+--- a/modules/clock/iso8601.test
++++ b/modules/clock/iso8601.test
+@@ -40,9 +40,8 @@ test clock-iso8601-2.0 {parse_date, bad input} -body {
+ } -returnCodes error -result {not an iso8601 date string}
+
+ test clock-iso8601-2.1 {parse_date} -body {
+- clock::iso8601 parse_date 1994-11-05
+- # It is unclear if this is influenced by TZ.
+-} -result 784022400
++ clock format [clock::iso8601 parse_date 1994-11-05] -format %D
++} -result 11/05/1994
+
+ # -------------------------------------------------------------------------
+
+diff --git a/modules/doctools/mpformats/_nroff.tcl b/modules/doctools/mpformats/_nroff.tcl
+index be73a02..7669d07 100644
+--- a/modules/doctools/mpformats/_nroff.tcl
++++ b/modules/doctools/mpformats/_nroff.tcl
+@@ -15,7 +15,7 @@
+
+
+ proc nr_lp {} {return \n\1.LP}
+-proc nr_ta {{text {}}} {return ".ta$text"}
++proc nr_ta {{text {}}} {return "\1.ta$text"}
+ proc nr_bld {} {return \1\\fB}
+ proc nr_bldt {t} {return "\n\1.B $t\n"}
+ proc nr_ul {} {return \1\\fI}
+@@ -75,6 +75,7 @@ set finalMap [list \
+ "\1\\" "\\" \
+ "\1'" "'" \
+ "\1." "." \
++ "." "\\&." \
+ "\\" "\\\\"]
+ global textMap
+ set textMap [list "\\" "\\\\"]
+@@ -103,8 +104,8 @@ proc nroff_postprocess {nroff} {
+ # - Exceptions to the above: Keep empty lines and leading
+ # whitespace when in verbatim sections (no-fill-mode)
+
+- set nfMode [list .nf .CS] ; # commands which start no-fill mode
+- set fiMode [list .fi .CE] ; # commands which terminate no-fill mode
++ set nfMode [list \1.nf \1.CS] ; # commands which start no-fill mode
++ set fiMode [list \1.fi \1.CE] ; # commands which terminate no-fill mode
+ set lines [list] ; # Result buffer
+ set verbatim 0 ; # Automaton mode/state
+
+@@ -139,7 +140,7 @@ proc nroff_postprocess {nroff} {
+ set lines [lreplace $lines end end]
+ set line "$last $line"
+ }
+- } elseif {[string match {['.]*} $line]} {
++ } elseif {[string match {[']*} $line]} {
+ # Apostrophes or periods at the beginning of a line have to
+ # quoted to prevent misinterpretation as comments or directives.
+ # The true comments and directive are quoted with \1
+@@ -166,10 +167,11 @@ proc nroff_postprocess {nroff} {
+ # Remove superfluous .IP commands (empty paragraph). The first
+ # identity mapping is there to avoid smashing a man macro
+ # definition.
+- set lines [string map [list \
+- \n\1.IP\n\1..\n \n\1.IP\n\1..\n \
+- \n\1.IP\n\1. \n\1.] \
+- $lines]
++
++ lappend map \n\1.IP\n\1.\1.\n \n\1.IP\n\1.\1.\n
++ lappend map \n\1.IP\n\1. \n\1.
++
++ set lines [string map $map $lines]
+
+ # Return the modified result buffer
+ return [string map $finalMap $lines]
+diff --git a/modules/doctools/mpformats/fmt.nroff b/modules/doctools/mpformats/fmt.nroff
+index e844dbf..5230688 100644
+--- a/modules/doctools/mpformats/fmt.nroff
++++ b/modules/doctools/mpformats/fmt.nroff
+@@ -269,11 +269,11 @@ proc fmt_image {text {label {}}} {
+
+ set img [dt_imgdata $text {pic}]
+ if {$img ne {}} {
+- return \n.PS\n$img\n.PE\n
++ return \n\1.PS\n$img\n\1.PE\n
+ }
+ set img [dt_imgdata $text {txt}]
+ if {$img ne {}} {
+- return \n.PS\n.nf\n$img\n.fi\n.PE\n
++ return \n\1.PS\n\1.nf\n$img\n\1.fi\n\1.PE\n
+ }
+ if {$label eq {}} {
+ return "IMAGE: $text"
+diff --git a/modules/doctools/tests/nroff/00 b/modules/doctools/tests/nroff/00
+index 8ac0ebf..8f68ee1 100644
+--- a/modules/doctools/tests/nroff/00
++++ b/modules/doctools/tests/nroff/00
+@@ -1,15 +1,15 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
+-'\" Copyright (c) .COPYRIGHT.
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
++'\" Copyright (c) \&.COPYRIGHT\&.
+ '\"
+ .so man.macros
+-.TH "TEST" z 3.14.15.926 .MODULE. ""
++.TH "TEST" z 3\&.14\&.15\&.926 \&.MODULE\&. ""
+ .BS
+ .SH NAME
+ TEST \-
+ .SH DESCRIPTION
+ .SH COPYRIGHT
+ .nf
+-Copyright (c) .COPYRIGHT.
++Copyright (c) \&.COPYRIGHT\&.
+
+ .fi
+\ No newline at end of file
+diff --git a/modules/doctools/tests/nroff/01 b/modules/doctools/tests/nroff/01
+index 3a4563f..588894a 100644
+--- a/modules/doctools/tests/nroff/01
++++ b/modules/doctools/tests/nroff/01
+@@ -1,9 +1,9 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
+ '\" Copyright (c) **Copyright**
+ '\"
+ .so man.macros
+-.TH "TEST" z 3.14.15.926 .MODULE. ""
++.TH "TEST" z 3\&.14\&.15\&.926 \&.MODULE\&. ""
+ .BS
+ .SH NAME
+ TEST \-
+diff --git a/modules/doctools/tests/nroff/02 b/modules/doctools/tests/nroff/02
+index 89d6cb7..49fbf18 100644
+--- a/modules/doctools/tests/nroff/02
++++ b/modules/doctools/tests/nroff/02
+@@ -1,12 +1,12 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
+-'\" Copyright (c) .COPYRIGHT.
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
++'\" Copyright (c) \&.COPYRIGHT\&.
+ '\"
+ .so man.macros
+-.TH "TEST" z 3.14.15.926 .MODULE. "..THE_MODULE.."
++.TH "TEST" z 3\&.14\&.15\&.926 \&.MODULE\&. "\&.\&.THE_MODULE\&.\&."
+ .BS
+ .SH NAME
+-TEST \- ..THE_TITLE..
++TEST \- \&.\&.THE_TITLE\&.\&.
+ .SH SYNOPSIS
+ package require \fBAAA \fR
+ .sp
+@@ -20,6 +20,6 @@ ELSE, OTHER
+ KEYA, KEYZ
+ .SH COPYRIGHT
+ .nf
+-Copyright (c) .COPYRIGHT.
++Copyright (c) \&.COPYRIGHT\&.
+
+ .fi
+\ No newline at end of file
+diff --git a/modules/doctools/tests/nroff/03 b/modules/doctools/tests/nroff/03
+index eb0bdd3..6393ecb 100644
+--- a/modules/doctools/tests/nroff/03
++++ b/modules/doctools/tests/nroff/03
+@@ -1,9 +1,9 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
+-'\" Copyright (c) .COPYRIGHT.
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
++'\" Copyright (c) \&.COPYRIGHT\&.
+ '\"
+ .so man.macros
+-.TH "TEST" z 3.14.15.926 .MODULE. ""
++.TH "TEST" z 3\&.14\&.15\&.926 \&.MODULE\&. ""
+ .BS
+ .SH NAME
+ TEST \-
+@@ -12,18 +12,18 @@ TEST \-
+ 1
+ .SH BBB
+ 22
+-.SS BBB.CCC
++.SS BBB\&.CCC
+ 333
+-.SS BBB.DDD
++.SS BBB\&.DDD
+ 4444
+ .SH EEE
+ 5555
+ .PP
+-At \fBAaA\fR.
++At \fBAaA\fR\&.
+ .PP
+-At \fB__undefined__\fR.
++At \fB__undefined__\fR\&.
+ .SH COPYRIGHT
+ .nf
+-Copyright (c) .COPYRIGHT.
++Copyright (c) \&.COPYRIGHT\&.
+
+ .fi
+\ No newline at end of file
+diff --git a/modules/doctools/tests/nroff/04 b/modules/doctools/tests/nroff/04
+index ee22d7a..27aa037 100644
+--- a/modules/doctools/tests/nroff/04
++++ b/modules/doctools/tests/nroff/04
+@@ -1,9 +1,9 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
+-'\" Copyright (c) .COPYRIGHT.
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
++'\" Copyright (c) \&.COPYRIGHT\&.
+ '\"
+ .so man.macros
+-.TH "TEST" z 3.14.15.926 .MODULE. ""
++.TH "TEST" z 3\&.14\&.15\&.926 \&.MODULE\&. ""
+ .BS
+ .SH NAME
+ TEST \-
+@@ -27,6 +27,6 @@ Next Line
+ FERTIG
+ .SH COPYRIGHT
+ .nf
+-Copyright (c) .COPYRIGHT.
++Copyright (c) \&.COPYRIGHT\&.
+
+ .fi
+\ No newline at end of file
+diff --git a/modules/doctools/tests/nroff/05 b/modules/doctools/tests/nroff/05
+index c25c179..3df0180 100644
+--- a/modules/doctools/tests/nroff/05
++++ b/modules/doctools/tests/nroff/05
+@@ -1,9 +1,9 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
+-'\" Copyright (c) .COPYRIGHT.
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
++'\" Copyright (c) \&.COPYRIGHT\&.
+ '\"
+ .so man.macros
+-.TH "BASIC" a 5 .MODULE. ""
++.TH "BASIC" a 5 \&.MODULE\&. ""
+ .BS
+ .SH NAME
+ BASIC \-
+@@ -91,6 +91,6 @@ caramel
+ KO
+ .SH COPYRIGHT
+ .nf
+-Copyright (c) .COPYRIGHT.
++Copyright (c) \&.COPYRIGHT\&.
+
+ .fi
+\ No newline at end of file
+diff --git a/modules/doctools/tests/nroff/06 b/modules/doctools/tests/nroff/06
+index e7fee7c..10fed25 100644
+--- a/modules/doctools/tests/nroff/06
++++ b/modules/doctools/tests/nroff/06
+@@ -1,9 +1,9 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
+-'\" Copyright (c) .COPYRIGHT.
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
++'\" Copyright (c) \&.COPYRIGHT\&.
+ '\"
+ .so man.macros
+-.TH "TEST" z 3.14.15.926 .MODULE. ""
++.TH "TEST" z 3\&.14\&.15\&.926 \&.MODULE\&. ""
+ .BS
+ .SH NAME
+ TEST \-
+@@ -50,6 +50,6 @@ c
+ .PP
+ .SH COPYRIGHT
+ .nf
+-Copyright (c) .COPYRIGHT.
++Copyright (c) \&.COPYRIGHT\&.
+
+ .fi
+\ No newline at end of file
+diff --git a/modules/doctools/tests/nroff/07 b/modules/doctools/tests/nroff/07
+index 696a715..08ff9ee 100644
+--- a/modules/doctools/tests/nroff/07
++++ b/modules/doctools/tests/nroff/07
+@@ -1,9 +1,9 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
+-'\" Copyright (c) .COPYRIGHT.
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
++'\" Copyright (c) \&.COPYRIGHT\&.
+ '\"
+ .so man.macros
+-.TH "TEST" z 3.14.15.926 .MODULE. ""
++.TH "TEST" z 3\&.14\&.15\&.926 \&.MODULE\&. ""
+ .BS
+ .SH NAME
+ TEST \-
+@@ -40,6 +40,6 @@ a
+ .PP
+ .SH COPYRIGHT
+ .nf
+-Copyright (c) .COPYRIGHT.
++Copyright (c) \&.COPYRIGHT\&.
+
+ .fi
+\ No newline at end of file
+diff --git a/modules/doctools/tests/nroff/08 b/modules/doctools/tests/nroff/08
+index b1bc4ea..50cecb6 100644
+--- a/modules/doctools/tests/nroff/08
++++ b/modules/doctools/tests/nroff/08
+@@ -1,12 +1,12 @@
+ '\"
+-'\" Generated from file '.FILE.' by tcllib/doctools with format 'nroff'
++'\" Generated from file '\&.FILE\&.' by tcllib/doctools with format 'nroff'
+ '\" Copyright (c) **Copyright**
+ '\"
+ .so man.macros
+-.TH "ALL" a 5 .MODULE. "..THE_MODULE.."
++.TH "ALL" a 5 \&.MODULE\&. "\&.\&.THE_MODULE\&.\&."
+ .BS
+ .SH NAME
+-ALL \- ..THE_TITLE..
++ALL \- \&.\&.THE_TITLE\&.\&.
+ .SH SYNOPSIS
+ package require \fBAAA \fR
+ .sp
+@@ -14,11 +14,11 @@ package require \fBBBB VVV\fR
+ .sp
+ package require \fBCCC ?VVV?\fR
+ .sp
+-CMDNAME ...
++CMDNAME \&.\&.\&.
+ .sp
+-CMDNAME ...
++CMDNAME \&.\&.\&.
+ .sp
+-CMDNAME ...
++CMDNAME \&.\&.\&.
+ .sp
+ .BE
+ .SH DESCRIPTION
+@@ -75,7 +75,7 @@ DESCRIPTION ::\fBMethod\fR::
+ TERM
+ DESCRIPTION
+ .TP
+-CMDNAME ...
++CMDNAME \&.\&.\&.
+ DESCRIPTION ::\fBNamespace\fR::
+ .RS
+ .TP
+@@ -96,10 +96,10 @@ DESCRIPTION ::?Optional?::
+ .CE
+ .RE
+ .TP
+-CMDNAME ...
++CMDNAME \&.\&.\&.
+ DESCRIPTION ::\fBPackage\fR::
+ .TP
+-CMDNAME ...
++CMDNAME \&.\&.\&.
+ DESCRIPTION ::\fBSystemCommand\fR::
+ .RS
+ .TP
+diff --git a/support/devel/sak/validate/syntax.tcl b/support/devel/sak/validate/syntax.tcl
+index 20b7d33..24e06d2 100644
+--- a/support/devel/sak/validate/syntax.tcl
++++ b/support/devel/sak/validate/syntax.tcl
+@@ -194,7 +194,9 @@ proc ::sak::validate::syntax::Setup {} {
+ interp eval $ip [list ::rename $c {}]
+ }
+
+- interp eval $ip [list ::namespace delete ::tcl]
++ if {![package vsatisfies [package present Tcl] 8.6]} {
++ interp eval $ip [list ::namespace delete ::tcl]
++ }
+ interp eval $ip [list ::rename namespace {}]
+ interp eval $ip [list ::rename rename {}]
+
+diff --git a/support/devel/sak/validate/testsuites.tcl b/support/devel/sak/validate/testsuites.tcl
+index 7072662..71ea694 100644
+--- a/support/devel/sak/validate/testsuites.tcl
++++ b/support/devel/sak/validate/testsuites.tcl
+@@ -139,7 +139,9 @@ proc ::sak::validate::testsuites::Setup {} {
+ interp eval $ip [list ::rename $c {}]
+ }
+
+- interp eval $ip [list ::namespace delete ::tcl]
++ if {![package vsatisfies [package present Tcl] 8.6]} {
++ interp eval $ip [list ::namespace delete ::tcl]
++ }
+ interp eval $ip [list ::rename namespace {}]
+ interp eval $ip [list ::rename rename {}]
+
diff --git a/dev-tcltk/tcllib/files/tcllib-1.15-test.patch b/dev-tcltk/tcllib/files/tcllib-1.15-test.patch
new file mode 100644
index 000000000000..8692cf2cd2df
--- /dev/null
+++ b/dev-tcltk/tcllib/files/tcllib-1.15-test.patch
@@ -0,0 +1,81 @@
+ modules/clock/iso8601.test | 2 +-
+ modules/multiplexer/multiplexer.test | 2 +-
+ modules/snit/snit.test | 4 ++--
+ modules/struct/sets.testsuite | 2 +-
+ modules/uev/uevent.test | 2 +-
+ 5 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/modules/clock/iso8601.test b/modules/clock/iso8601.test
+index 85d6416..f1b478e 100644
+--- a/modules/clock/iso8601.test
++++ b/modules/clock/iso8601.test
+@@ -26,7 +26,7 @@ test clock-iso8601-1.0.1 {parse_date wrong\#args} -constraints {tcl8.6plus} -bod
+
+ test clock-iso8601-1.1 {parse_date, bad option} -body {
+ clock::iso8601 parse_date 1994-11-05 -foo x
+-} -returnCodes error -result {bad switch "-foo", must be -base, -format, -gmt, -locale or -timezone}
++} -returnCodes error -result {bad option "-foo", must be -base, -format, -gmt, -locale or -timezone}
+
+ # NOTE: While listed as legal, -format is NOT. This is because the
+ # command simply hands off to clock scan, and we are seeing its error
+diff --git a/modules/multiplexer/multiplexer.test b/modules/multiplexer/multiplexer.test
+index d778253..e5dfeff 100644
+--- a/modules/multiplexer/multiplexer.test
++++ b/modules/multiplexer/multiplexer.test
+@@ -189,7 +189,7 @@ proc DenyAccessFilter {chan clientaddress clientport} {
+ return -1
+ }
+
+-test multiplexer-5.2 {add access filter which denies access} {
++test multiplexer-5.2 {add access filter which denies access} {broken without network} {
+ set ::forever {}
+ set mp [multiplexer::create]
+ ${mp}::Init 37465
+diff --git a/modules/snit/snit.test b/modules/snit/snit.test
+index 66d7bd1..00c0769 100644
+--- a/modules/snit/snit.test
++++ b/modules/snit/snit.test
+@@ -783,7 +783,7 @@ test dtypemethod-1.6a {delegating unknown typemethod to existing typecomponent w
+ snit2
+ } -returnCodes {
+ error
+-} -result {unknown or ambiguous subcommand "foo": must be bytelength, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}
++} -result {unknown or ambiguous subcommand "foo": must be bytelength, cat, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}
+
+ test dtypemethod-1.7 {can't delegate local typemethod: order 1} -body {
+ type dog {
+@@ -3339,7 +3339,7 @@ test dmethod-1.6a {delegating unknown method to existing component with error} -
+ error
+ } -cleanup {
+ dog destroy
+-} -result {unknown or ambiguous subcommand "foo": must be bytelength, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}
++} -result {unknown or ambiguous subcommand "foo": must be bytelength, cat, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}
+
+ test dmethod-1.7 {can't delegate local method: order 1} -body {
+ type cat {
+diff --git a/modules/struct/sets.testsuite b/modules/struct/sets.testsuite
+index 29fd3ef..28a9dd6 100644
+--- a/modules/struct/sets.testsuite
++++ b/modules/struct/sets.testsuite
+@@ -13,7 +13,7 @@
+ test set-${impl}-1.0 {nothing} {
+ catch {setop} msg
+ set msg
+-} [Nothing]
++} {wrong # args: should be "::struct::set cmd ?arg ...?"}
+
+ test set-${impl}-1.1 {bogus} {
+ catch {setop foo} msg
+diff --git a/modules/uev/uevent.test b/modules/uev/uevent.test
+index 91754a7..6544112 100644
+--- a/modules/uev/uevent.test
++++ b/modules/uev/uevent.test
+@@ -453,7 +453,7 @@ test uevent-10.3 {watch events, watch after bind, glob} {
+ ::uevent::unbind $t4
+ ::uevent::watch::event::remove $tw
+ set res
+-} {bound TAG EX bound TAGX EX bound TAG E bound TAGX E unbound TAGX E unbound TAG E unbound TAGX EX unbound TAG EX}
++} {bound TAGX E bound TAGX EX bound TAG E bound TAG EX unbound TAGX E unbound TAG E unbound TAGX EX unbound TAG EX}
+
+ # -------------------------------------------------------------------------
+ rename EVENT {}
diff --git a/dev-tcltk/tcllib/files/tcllib-1.16-XSS-vuln.patch b/dev-tcltk/tcllib/files/tcllib-1.16-XSS-vuln.patch
new file mode 100644
index 000000000000..4a08e31e330b
--- /dev/null
+++ b/dev-tcltk/tcllib/files/tcllib-1.16-XSS-vuln.patch
@@ -0,0 +1,572 @@
+ modules/html/html.man | 76 +++++++++++++++-
+ modules/html/html.tcl | 55 +++++++++---
+ modules/html/html.test | 224 +++++++++++++++++++++++++++++++++++-----------
+ modules/html/pkgIndex.tcl | 2 +-
+ 4 files changed, 287 insertions(+), 70 deletions(-)
+
+diff --git a/modules/html/html.man b/modules/html/html.man
+index 705a8a2..f18cf4b 100644
+--- a/modules/html/html.man
++++ b/modules/html/html.man
+@@ -1,5 +1,6 @@
+ [comment {-*- tcl -*- doctools manpage}]
+-[manpage_begin html n 1.4]
++[vset HTML_VERSION 1.4.4]
++[manpage_begin html n [vset HTML_VERSION]]
+ [see_also htmlparse]
+ [see_also ncgi]
+ [keywords checkbox]
+@@ -12,7 +13,7 @@
+ [titledesc {Procedures to generate HTML structures}]
+ [category {CGI programming}]
+ [require Tcl 8.2]
+-[require html [opt 1.4]]
++[require html [opt [vset HTML_VERSION]]]
+ [description]
+ [para]
+
+@@ -62,7 +63,7 @@ the elements.
+
+ [call [cmd ::html::checkValue] [arg name] [opt [arg value]]]
+
+-Generate the "name=[arg name] value=[arg value] for a [term checkbox] form
++Generate the "name=[arg name] value=[arg value]" for a [term checkbox] form
+ element. If the CGI variable [arg name] has the value [arg value],
+ then SELECTED is added to the return value. [arg value] defaults to
+ "1".
+@@ -245,6 +246,51 @@ value list that is used for the name= and value= parameters for the
+ [term meta] tag. The [term meta] tag is included in the result of
+ [cmd ::html::head].
+
++[call [cmd ::html::css] [arg href]]
++
++[emph {Side effect only}]. Call this before [cmd ::html::head] to
++define a [term link] tag for a linked CSS document. The [arg href]
++value is a HTTP URL to a CSS document. The [term link] tag is included
++in the result of [cmd ::html::head].
++
++[para]
++
++Multiple calls of this command are allowed, enabling the use of
++multiple CSS document references. In other words, the arguments
++of multiple calls are accumulated, and do not overwrite each other.
++
++[call [cmd ::html::css-clear]]
++
++[emph {Side effect only}]. Call this before [cmd ::html::head] to
++clear all links to CSS documents.
++[para]
++
++Multiple calls of this command are allowed, doing nothing after the
++first of a sequence with no intervening [cmd ::html::css].
++
++[call [cmd ::html::js] [arg href]]
++
++[emph {Side effect only}]. Call this before [cmd ::html::head] to
++define a [term script] tag for a linked JavaScript document. The
++[arg href] is a HTTP URL to a JavaScript document. The [term script]
++tag is included in the result of [cmd ::html::head].
++
++[para]
++
++Multiple calls of this command are allowed, enabling the use of
++multiple JavaScript document references. In other words, the arguments
++of multiple calls are accumulated, and do not overwrite each other.
++
++
++[call [cmd ::html::js-clear]]
++
++[emph {Side effect only}]. Call this before [cmd ::html::head] to
++clear all links to JavaScript documents.
++[para]
++
++Multiple calls of this command are allowed, doing nothing after the
++first of a sequence with no intervening [cmd ::html::js].
++
+ [call [cmd ::html::minorList] [arg list] [opt [arg ordered]]]
+
+ Generate an ordered or unordered list of links. The [arg list] is a
+@@ -306,7 +352,7 @@ is a Tcl-style label, value list.
+
+ [call [cmd ::html::radioValue] [arg {name value}]]
+
+-Generate the "name=[arg name] value=[arg value] for a [term radio] form
++Generate the "name=[arg name] value=[arg value]" for a [term radio] form
+ element. If the CGI variable [arg name] has the value [arg value],
+ then SELECTED is added to the return value.
+
+@@ -401,6 +447,28 @@ structure. Rather than evaluating the body, it returns the subst'ed
+ [arg body]. Each iteration of the loop causes another string to be
+ concatenated to the result value.
+
++[call [cmd ::html::doctype] [arg id]]
++
++This procedure can be used to build the standard DOCTYPE
++declaration string. It will return the standard declaration
++string for the id, or throw an error if the id is not known.
++The following id's are defined:
++
++[list_begin enumerated]
++[enum] HTML32
++[enum] HTML40
++[enum] HTML40T
++[enum] HTML40F
++[enum] HTML401
++[enum] HTML401T
++[enum] HTML401F
++[enum] XHTML10S
++[enum] XHTML10T
++[enum] XHTML10F
++[enum] XHTML11
++[enum] XHTMLB
++[list_end]
++
+ [list_end]
+
+ [vset CATEGORY html]
+diff --git a/modules/html/html.tcl b/modules/html/html.tcl
+index 77e517e..3c0c443 100644
+--- a/modules/html/html.tcl
++++ b/modules/html/html.tcl
+@@ -15,7 +15,7 @@
+
+ package require Tcl 8.2
+ package require ncgi
+-package provide html 1.4
++package provide html 1.4.4
+
+ namespace eval ::html {
+
+@@ -510,7 +510,7 @@ proc ::html::refresh {content {url {}}} {
+ ::if {[string length $url]} {
+ append html "; url=$url"
+ }
+- append html "\">\n"
++ append html "\">"
+ lappend page(meta) $html
+ return ""
+ }
+@@ -912,7 +912,7 @@ proc ::html::selectPlain {name param choices {current {}}} {
+ # The html fragment
+
+ proc ::html::textarea {name {param {}} {current {}}} {
+- ::set value [ncgi::value $name $current]
++ ::set value [quoteFormValue [ncgi::value $name $current]]
+ return "<[string trimright \
+ "textarea name=\"$name\"\
+ [tagParam textarea $param]"]>$value</textarea>\n"
+@@ -1405,7 +1405,7 @@ proc ::html::html_entities {s} {
+ # The text with <br> in place of line-endings.
+
+ proc ::html::nl2br {s} {
+- return [string map [list \n\r <br> \n <br> \r <br>] $s]
++ return [string map [list \n\r <br> \r\n <br> \n <br> \r <br>] $s]
+ }
+
+ # ::html::doctype
+@@ -1419,9 +1419,10 @@ proc ::html::nl2br {s} {
+
+ proc ::html::doctype {arg} {
+ variable doctypes
+- set code [string toupper $arg]
+- if {![info exists doctypes($code)]} {
+- return -code error "Unknown doctype \"$arg\""
++ ::set code [string toupper $arg]
++ ::if {![info exists doctypes($code)]} {
++ return -code error -errorcode {HTML DOCTYPE BAD} \
++ "Unknown doctype \"$arg\""
+ }
+ return $doctypes($code)
+ }
+@@ -1451,12 +1452,26 @@ namespace eval ::html {
+ # href The location of the css file to include the filename and path
+ #
+ # Results:
+-# HTML for the section
++# None.
+
+ proc ::html::css {href} {
+ variable page
+- set page(css) \
+- "<link rel=\"stylesheet\" type=\"text/css\" href=\"[quoteFormValue $href]\">\n"
++ lappend page(css) "<link rel=\"stylesheet\" type=\"text/css\" href=\"[quoteFormValue $href]\">"
++ return
++}
++
++# ::html::css-clear
++# Drop all text/css references.
++#
++# Arguments:
++# None.
++#
++# Results:
++# None.
++
++proc ::html::css-clear {} {
++ variable page
++ catch { unset page(css) }
+ return
+ }
+
+@@ -1467,11 +1482,25 @@ proc ::html::css {href} {
+ # href The location of the javascript file to include the filename and path
+ #
+ # Results:
+-# HTML for the section
++# None.
+
+ proc ::html::js {href} {
+ variable page
+- set page(js) \
+- "<script language=\"javascript\" type=\"text/javascript\" src=\"[quoteFormValue $href]\"></script>\n"
++ lappend page(js) "<script language=\"javascript\" type=\"text/javascript\" src=\"[quoteFormValue $href]\"></script>"
++ return
++}
++
++# ::html::js-clear
++# Drop all text/javascript references.
++#
++# Arguments:
++# None.
++#
++# Results:
++# None.
++
++proc ::html::js-clear {} {
++ variable page
++ catch { unset page(js) }
+ return
+ }
+diff --git a/modules/html/html.test b/modules/html/html.test
+index 7a03c54..6646fb6 100644
+--- a/modules/html/html.test
++++ b/modules/html/html.test
+@@ -17,8 +17,8 @@ source [file join \
+ [file dirname [file dirname [file join [pwd] [info script]]]] \
+ devtools testutilities.tcl]
+
+-testsNeedTcl 8.2
+-testsNeedTcltest 1.0
++testsNeedTcl 8.4
++testsNeedTcltest 2.0
+
+ testing {
+ useLocal html.tcl html
+@@ -26,45 +26,46 @@ testing {
+
+ # -------------------------------------------------------------------------
+
+-test html-1.1 {html::init} {
++test html-1.1 {html::init} -body {
+ html::init
+- list [array exists html::defaults] \
+- [array size html::defaults] \
+- [info exists html::page]
+-} {1 0 0}
++ list \
++ [array exists html::defaults] \
++ [array size html::defaults] \
++ [info exists html::page]
++} -result {1 0 0}
+
+-test html-1.2 {html::init} {
++test html-1.2 {html::init} -body {
+ html::init {
+ font.face arial
+ body.bgcolor white
+ body.text black
+ }
+ lsort [array names html::defaults]
+-} {body.bgcolor body.text font.face}
++} -result {body.bgcolor body.text font.face}
+
+-test html-1.3 {html::init} {
+- catch {html::init wrong num args}
+-} 1
++test html-1.3 {html::init, too many args} -body {
++ html::init wrong num args
++} -returnCodes error -result {wrong # args: should be "html::init ?nvlist?"}
+
+-test html-1.4 {html::init} {
+- catch {html::init {wrong num args}}
+-} 1
++test html-1.4 {html::init, bad arg, odd-length list} -body {
++ html::init {wrong num args}
++} -returnCodes error -result {list must have an even number of elements}
+
+-test html-2.1 {html::head} {
+- catch {html::head}
+-} 1
++test html-2.1 {html::head, not enough args} -body {
++ html::head
++} -returnCodes error -result {wrong # args: should be "html::head title"}
+
+-test html-2.2 {html::head} {
++test html-2.2 {html::head} -body {
+ html::head "The Title"
+-} "<html><head>\n\t<title>The Title</title>\n</head>\n"
++} -result "<html><head>\n\t<title>The Title</title>\n</head>\n"
+
+-test html-2.3 {html::head} {
++test html-2.3 {html::head} -body {
+ html::description "The Description"
+ html::keywords key word
+ html::author "Cathy Coder"
+ html::meta metakey metavalue
+ html::head "The Title"
+-} {<html><head>
++} -result {<html><head>
+ <title>The Title</title>
+ <!-- Cathy Coder -->
+ <meta name="description" content="The Description">
+@@ -73,24 +74,24 @@ test html-2.3 {html::head} {
+ </head>
+ }
+
+-test html-3.1 {html::title} {
+- catch html::title
+-} 1
++test html-3.1 {html::title, not enough args} -body {
++ html::title
++} -returnCodes error -result {wrong # args: should be "html::title title"}
+
+-test html-3.2 {html::title} {
++test html-3.2 {html::title} -body {
+ html::title "blah blah"
+-} "<title>blah blah</title>\n"
++} -result "<title>blah blah</title>\n"
+
+-test html-4.1 {html::getTitle} {
++test html-4.1 {html::getTitle} -body {
+ html::init
+ html::getTitle
+-} ""
++} -result ""
+
+-test html-4.2 {html::getTitle} {
++test html-4.2 {html::getTitle} -body {
+ html::init
+ html::title "blah blah"
+ html::getTitle
+-} {blah blah}
++} -result {blah blah}
+
+ test html-5.1 {html::meta} {
+ html::init
+@@ -453,6 +454,18 @@ test html-23.2 {html::textarea} {
+ } {<textarea name="info" cols="50" rows="8">The textarea value.</textarea>
+ }
+
++test html-23.3 {html::textarea, dangerous input} {
++ html::init {
++ textarea.cols 50
++ textarea.rows 8
++ }
++ ncgi::reset info=[ncgi::encode "</textarea><script>alert(1)</script>"]
++ ncgi::parse
++ html::textarea info
++} {<textarea name="info" cols="50" rows="8">&lt;/textarea&gt;&lt;script&gt;alert(1)&lt;/script&gt;</textarea>
++}
++
++
+ test html-24.1 {html::submit} {
+ catch {html::submit}
+ } {1}
+@@ -516,7 +529,6 @@ test html-26.4 {html::refresh} {
+ } {<html><head>
+ <title>title</title>
+ <meta http-equiv="Refresh" content="4">
+-
+ </head>
+ }
+ test html-26.5 {html::refresh} {
+@@ -526,7 +538,6 @@ test html-26.5 {html::refresh} {
+ } {<html><head>
+ <title>title</title>
+ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
+-
+ </head>
+ }
+
+@@ -794,6 +805,7 @@ test html-32.1 {single argument} {
+ set result [html::eval {set x [format 22]}]
+ list $result $x
+ } {{} 22}
++
+ test html-32.2 {multiple arguments} {
+ set a {$b}
+ set b xyzzy
+@@ -801,38 +813,146 @@ test html-32.2 {multiple arguments} {
+ set result [html::eval {set x [eval format $a]}]
+ list $result $x
+ } {{} xyzzy}
++
+ test html-32.3 {single argument} {
+ set x [list]
+ set y 1
+ set result [html::eval lappend x a b c d {$y} e f g]
+ list $result $x
+ } {{} {a b c d 1 e f g}}
+-test html-32.4 {error: not enough arguments} {catch html::eval} 1
+-test html-32.5 {error: not enough arguments} {
+- catch html::eval msg
+- set msg
+-} {wrong # args: should be "uplevel ?level? command ?arg ...?"}
+-test html-32.6 {error in eval'ed command} {
+- catch {html::eval {error "test error"}}
+-} 1
+-test html-32.7 {error in eval'ed command} {
+- catch {html::eval {error "test error"}} msg
+- set msg
+-} {test error}
+
++test html-32.4 {error: not enough arguments} -body {
++ html::eval
++} -returnCodes error -result {wrong # args: should be "uplevel ?level? command ?arg ...?"}
+
+-test html-33.0 {html::font} {
++test html-32.6 {error in eval'ed command} -body {
++ html::eval {error "test error"}
++} -returnCodes error -result {test error}
++
++test html-33.0 {html::font} -body {
+ html::font
+-} {}
++} -result {}
+
+-test html-33.1 {html::font} {
++test html-33.1 {html::font} -body {
+ html::font size=18
+-} {<font size=18>}
++} -result {<font size=18>}
+
+-
+-test html-34.0 {html::nl2br} {
++test html-34.0 {html::nl2br} -body {
+ html::nl2br "a\n\rb\nc\rd"
+-} {a<br>b<br>c<br>d}
++} -result {a<br>b<br>c<br>d}
+
++test html-34.1 {html::nl2br, ticket 1742078} -body {
++ html::nl2br "a\r\nb"
++} -result {a<br>b}
+
++# -------------------------------------------------------------------------
++
++test html-tkt3439702-35.0 {html::css, not enough arguments} -body {
++ html::css
++} -returnCodes error -result {wrong # args: should be "html::css href"}
++
++test html-tkt3439702-35.1 {html::css, too many arguments} -body {
++ html::css REF X
++} -returnCodes error -result {wrong # args: should be "html::css href"}
++
++test html-tkt3439702-35.2 {html::css, single ref} -setup {
++ html::css-clear
++} -body {
++ html::css "http://test.css"
++ string trim [html::head T]
++} -cleanup {
++ html::css-clear
++} -result "<html><head>\n\t<title>T</title>\n\t<meta http-equiv=\"Refresh\" content=\"9; url=http://www.scriptics.com\">\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"http://test.css\">\n</head>"
++
++test html-tkt3439702-35.3 {html::css, multiple ref} -setup {
++ html::css-clear
++} -body {
++ html::css "http://test1.css"
++ html::css "http://test2.css"
++ string trim [html::head T]
++} -cleanup {
++ html::css-clear
++} -result {<html><head>
++ <title>T</title>
++ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
++ <link rel="stylesheet" type="text/css" href="http://test1.css">
++ <link rel="stylesheet" type="text/css" href="http://test2.css">
++</head>}
++
++# -------------------------------------------------------------------------
++
++test html-tkt3439702-36.0 {html::js, not enough arguments} -body {
++ html::js
++} -returnCodes error -result {wrong # args: should be "html::js href"}
++
++test html-tkt3439702-36.1 {html::js, too many arguments} -body {
++ html::js REF X
++} -returnCodes error -result {wrong # args: should be "html::js href"}
++
++test html-tkt3439702-36.2 {html::js, single ref} -setup {
++ html::js-clear
++} -body {
++ html::js "http://test.js"
++ string trim [html::head T]
++} -cleanup {
++ html::js-clear
++} -result {<html><head>
++ <title>T</title>
++ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
++ <script language="javascript" type="text/javascript" src="http://test.js"></script>
++</head>}
++
++test html-tkt3439702-36.3 {html::js, multiple ref} -setup {
++ html::js-clear
++} -body {
++ html::js "http://test1.js"
++ html::js "http://test2.js"
++ string trim [html::head T]
++} -cleanup {
++ html::js-clear
++} -result {<html><head>
++ <title>T</title>
++ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
++ <script language="javascript" type="text/javascript" src="http://test1.js"></script>
++ <script language="javascript" type="text/javascript" src="http://test2.js"></script>
++</head>}
++
++test html-tkt3439702-37.0 {html::js, html::css, mixed} -setup {
++ html::css-clear
++ html::js-clear
++} -body {
++ html::css "http://test.css"
++ html::js "http://test.js"
++ string trim [html::head T]
++} -cleanup {
++ html::js-clear
++ html::css-clear
++} -result {<html><head>
++ <title>T</title>
++ <meta http-equiv="Refresh" content="9; url=http://www.scriptics.com">
++ <link rel="stylesheet" type="text/css" href="http://test.css">
++ <script language="javascript" type="text/javascript" src="http://test.js"></script>
++</head>}
++
++# -------------------------------------------------------------------------
++# TODO: html::css-clear, html::js-clear
++
++
++test html-tktafe4366e2e-38.0 {html::doctype, not enough args} -body {
++ html::doctype
++} -returnCodes error -result {wrong # args: should be "html::doctype arg"}
++
++test html-tktafe4366e2e-38.1 {html::doctype, too many args} -body {
++ html::doctype HTML401T X
++} -returnCodes error -result {wrong # args: should be "html::doctype arg"}
++
++test html-tktafe4366e2e-38.2 {html::doctype, unknown type} -body {
++ html::doctype HTML401TXXX
++} -returnCodes error -result {Unknown doctype "HTML401TXXX"}
++
++test html-tktafe4366e2e-38.3 {html::doctype} -body {
++ html::doctype HTML401T
++} -result {<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">}
++
++# -------------------------------------------------------------------------
+ testsuiteCleanup
+diff --git a/modules/html/pkgIndex.tcl b/modules/html/pkgIndex.tcl
+index 88a71b2..9d91097 100644
+--- a/modules/html/pkgIndex.tcl
++++ b/modules/html/pkgIndex.tcl
+@@ -1,2 +1,2 @@
+ if {![package vsatisfies [package provide Tcl] 8.2]} {return}
+-package ifneeded html 1.4 [list source [file join $dir html.tcl]]
++package ifneeded html 1.4.4 [list source [file join $dir html.tcl]]
diff --git a/dev-tcltk/tcllib/files/tcllib-1.16-test.patch b/dev-tcltk/tcllib/files/tcllib-1.16-test.patch
new file mode 100644
index 000000000000..8b3c8ca25905
--- /dev/null
+++ b/dev-tcltk/tcllib/files/tcllib-1.16-test.patch
@@ -0,0 +1,81 @@
+ modules/clock/iso8601.test | 2 +-
+ modules/multiplexer/multiplexer.test | 2 +-
+ modules/snit/snit.test | 4 ++--
+ modules/struct/sets.testsuite | 2 +-
+ modules/uev/uevent.test | 2 +-
+ 5 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/modules/clock/iso8601.test b/modules/clock/iso8601.test
+index 6fce938..a9db5b0 100644
+--- a/modules/clock/iso8601.test
++++ b/modules/clock/iso8601.test
+@@ -26,7 +26,7 @@ test clock-iso8601-1.0.1 {parse_date wrong\#args} -constraints {tcl8.6plus} -bod
+
+ test clock-iso8601-1.1 {parse_date, bad option} -body {
+ clock::iso8601 parse_date 1994-11-05 -foo x
+-} -returnCodes error -result {bad switch "-foo", must be -base, -format, -gmt, -locale or -timezone}
++} -returnCodes error -result {bad option "-foo", must be -base, -format, -gmt, -locale or -timezone}
+
+ # NOTE: While listed as legal, -format is NOT. This is because the
+ # command simply hands off to clock scan, and we are seeing its error
+diff --git a/modules/multiplexer/multiplexer.test b/modules/multiplexer/multiplexer.test
+index d778253..e5dfeff 100644
+--- a/modules/multiplexer/multiplexer.test
++++ b/modules/multiplexer/multiplexer.test
+@@ -189,7 +189,7 @@ proc DenyAccessFilter {chan clientaddress clientport} {
+ return -1
+ }
+
+-test multiplexer-5.2 {add access filter which denies access} {
++test multiplexer-5.2 {add access filter which denies access} {broken without network} {
+ set ::forever {}
+ set mp [multiplexer::create]
+ ${mp}::Init 37465
+diff --git a/modules/snit/snit.test b/modules/snit/snit.test
+index 66d7bd1..00c0769 100644
+--- a/modules/snit/snit.test
++++ b/modules/snit/snit.test
+@@ -783,7 +783,7 @@ test dtypemethod-1.6a {delegating unknown typemethod to existing typecomponent w
+ snit2
+ } -returnCodes {
+ error
+-} -result {unknown or ambiguous subcommand "foo": must be bytelength, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}
++} -result {unknown or ambiguous subcommand "foo": must be bytelength, cat, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}
+
+ test dtypemethod-1.7 {can't delegate local typemethod: order 1} -body {
+ type dog {
+@@ -3339,7 +3339,7 @@ test dmethod-1.6a {delegating unknown method to existing component with error} -
+ error
+ } -cleanup {
+ dog destroy
+-} -result {unknown or ambiguous subcommand "foo": must be bytelength, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}
++} -result {unknown or ambiguous subcommand "foo": must be bytelength, cat, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}
+
+ test dmethod-1.7 {can't delegate local method: order 1} -body {
+ type cat {
+diff --git a/modules/struct/sets.testsuite b/modules/struct/sets.testsuite
+index 29fd3ef..28a9dd6 100644
+--- a/modules/struct/sets.testsuite
++++ b/modules/struct/sets.testsuite
+@@ -13,7 +13,7 @@
+ test set-${impl}-1.0 {nothing} {
+ catch {setop} msg
+ set msg
+-} [Nothing]
++} {wrong # args: should be "::struct::set cmd ?arg ...?"}
+
+ test set-${impl}-1.1 {bogus} {
+ catch {setop foo} msg
+diff --git a/modules/uev/uevent.test b/modules/uev/uevent.test
+index 91754a7..6544112 100644
+--- a/modules/uev/uevent.test
++++ b/modules/uev/uevent.test
+@@ -453,7 +453,7 @@ test uevent-10.3 {watch events, watch after bind, glob} {
+ ::uevent::unbind $t4
+ ::uevent::watch::event::remove $tw
+ set res
+-} {bound TAG EX bound TAGX EX bound TAG E bound TAGX E unbound TAGX E unbound TAG E unbound TAGX EX unbound TAG EX}
++} {bound TAGX E bound TAGX EX bound TAG E bound TAG EX unbound TAGX E unbound TAG E unbound TAGX EX unbound TAG EX}
+
+ # -------------------------------------------------------------------------
+ rename EVENT {}
diff --git a/dev-tcltk/tcllib/metadata.xml b/dev-tcltk/tcllib/metadata.xml
new file mode 100644
index 000000000000..f5ca0ddf0adf
--- /dev/null
+++ b/dev-tcltk/tcllib/metadata.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="project">
+ <email>tcltk@gentoo.org</email>
+ <name>Gentoo Tcltk Project</name>
+ </maintainer>
+ <upstream>
+ <remote-id type="sourceforge">tcllib</remote-id>
+ </upstream>
+</pkgmetadata>
diff --git a/dev-tcltk/tcllib/tcllib-1.15-r2.ebuild b/dev-tcltk/tcllib/tcllib-1.15-r2.ebuild
new file mode 100644
index 000000000000..38fc5f78a415
--- /dev/null
+++ b/dev-tcltk/tcllib/tcllib-1.15-r2.ebuild
@@ -0,0 +1,54 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+inherit eutils virtualx
+
+DESCRIPTION="Tcl Standard Library"
+HOMEPAGE="http://www.tcl.tk/software/tcllib/"
+SRC_URI="
+ https://dev.gentoo.org/~jlec/distfiles/${P}-manpage-rename.patch.xz
+ https://dev.gentoo.org/~jlec/distfiles/${P}-test.patch.xz
+ mirror://sourceforge/tcllib/${P}.tar.bz2"
+
+LICENSE="BSD"
+SLOT="0"
+IUSE="examples"
+KEYWORDS="alpha amd64 hppa ia64 ~mips ppc ppc64 s390 sparc x86 ~x86-fbsd ~amd64-linux ~x86-linux ~x86-macos"
+
+RDEPEND="dev-lang/tcl:0="
+DEPEND="${RDEPEND}"
+
+DOCS=( DESCRIPTION.txt STATUS )
+
+PATCHES=(
+ "${FILESDIR}"/${P}-tcl8.6-test.patch
+ "${WORKDIR}"/${P}-test.patch
+ "${WORKDIR}"/${P}-manpage-rename.patch
+ "${FILESDIR}"/${P}-XSS-vuln.patch
+)
+
+src_prepare() {
+ has_version ">=dev-lang/tcl-8.6" && \
+ PATCHES+=( "${FILESDIR}"/${P}-test.patch )
+ epatch "${PATCHES[@]}"
+}
+
+src_test() {
+ Xemake test_batch
+}
+
+src_install() {
+ default
+
+ dodoc devdoc/*.txt
+
+ dohtml devdoc/*.html
+ if use examples ; then
+ for f in $(find examples -type f); do
+ docinto $(dirname $f)
+ dodoc $f
+ done
+ fi
+}
diff --git a/dev-tcltk/tcllib/tcllib-1.16.ebuild b/dev-tcltk/tcllib/tcllib-1.16.ebuild
new file mode 100644
index 000000000000..4232724bc11a
--- /dev/null
+++ b/dev-tcltk/tcllib/tcllib-1.16.ebuild
@@ -0,0 +1,58 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+inherit eutils virtualx
+
+MY_PN=Tcllib
+MY_P=${MY_PN}-${PV}
+
+DESCRIPTION="Tcl Standard Library"
+HOMEPAGE="http://www.tcl.tk/software/tcllib/"
+SRC_URI="mirror://sourceforge//project/${PN}/${PN}/${PV}/${MY_P}.tar.bz2"
+
+LICENSE="BSD"
+SLOT="0"
+IUSE="examples"
+KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~mips ~ppc ~x86 ~x86-fbsd ~amd64-linux ~x86-linux ~x86-macos"
+
+RDEPEND="
+ dev-lang/tcl:0=
+ dev-tcltk/tdom
+ "
+DEPEND="${RDEPEND}"
+
+DOCS=( DESCRIPTION.txt STATUS )
+
+S="${WORKDIR}"/${MY_P}
+
+PATCHES=( "${FILESDIR}"/${P}-XSS-vuln.patch )
+
+src_prepare() {
+ has_version ">=dev-lang/tcl-8.6" && \
+ PATCHES+=( "${FILESDIR}"/${P}-test.patch )
+ epatch "${PATCHES[@]}"
+
+ sed \
+ -e '/testsNeedTcl/s:8.5:8.6:g' \
+ -i modules/tar/tar.test || die
+}
+
+src_test() {
+ Xemake test_batch
+}
+
+src_install() {
+ default
+
+ dodoc devdoc/*.txt
+
+ dohtml devdoc/*.html
+ if use examples ; then
+ for f in $(find examples -type f); do
+ docinto $(dirname $f)
+ dodoc $f
+ done
+ fi
+}